GeneratedMessageTest.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. #region Copyright notice and license
  2. // Protocol Buffers - Google's data interchange format
  3. // Copyright 2008 Google Inc. All rights reserved.
  4. // http://github.com/jskeet/dotnet-protobufs/
  5. // Original C++/Java/Python code:
  6. // http://code.google.com/p/protobuf/
  7. //
  8. // Redistribution and use in source and binary forms, with or without
  9. // modification, are permitted provided that the following conditions are
  10. // met:
  11. //
  12. // * Redistributions of source code must retain the above copyright
  13. // notice, this list of conditions and the following disclaimer.
  14. // * Redistributions in binary form must reproduce the above
  15. // copyright notice, this list of conditions and the following disclaimer
  16. // in the documentation and/or other materials provided with the
  17. // distribution.
  18. // * Neither the name of Google Inc. nor the names of its
  19. // contributors may be used to endorse or promote products derived from
  20. // this software without specific prior written permission.
  21. //
  22. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  23. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  24. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  25. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  26. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  27. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  28. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  29. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  30. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  31. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  32. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  33. #endregion
  34. using System;
  35. using System.Collections.Generic;
  36. using Google.ProtocolBuffers.Collections;
  37. using Google.ProtocolBuffers.TestProtos;
  38. using NUnit.Framework;
  39. namespace Google.ProtocolBuffers
  40. {
  41. [TestFixture]
  42. public class GeneratedMessageTest
  43. {
  44. private ReflectionTester reflectionTester;
  45. private ReflectionTester extensionsReflectionTester;
  46. [SetUp]
  47. public void SetUp()
  48. {
  49. reflectionTester = ReflectionTester.CreateTestAllTypesInstance();
  50. extensionsReflectionTester = ReflectionTester.CreateTestAllExtensionsInstance();
  51. }
  52. [Test]
  53. public void RepeatedAddPrimitiveBeforeBuild()
  54. {
  55. TestAllTypes message = new TestAllTypes.Builder {RepeatedInt32List = {1, 2, 3}}.Build();
  56. TestUtil.AssertEqual(new int[] {1, 2, 3}, message.RepeatedInt32List);
  57. }
  58. [Test]
  59. public void AddPrimitiveFailsAfterBuild()
  60. {
  61. TestAllTypes.Builder builder = new TestAllTypes.Builder();
  62. IList<int> list = builder.RepeatedInt32List;
  63. list.Add(1); // Fine
  64. builder.Build();
  65. try
  66. {
  67. list.Add(2);
  68. Assert.Fail("List should be frozen");
  69. }
  70. catch (NotSupportedException)
  71. {
  72. // Expected
  73. }
  74. }
  75. [Test]
  76. public void RepeatedAddMessageBeforeBuild()
  77. {
  78. TestAllTypes message = new TestAllTypes.Builder
  79. {
  80. RepeatedNestedMessageList =
  81. {new TestAllTypes.Types.NestedMessage.Builder {Bb = 10}.Build()}
  82. }.Build();
  83. Assert.AreEqual(1, message.RepeatedNestedMessageCount);
  84. Assert.AreEqual(10, message.RepeatedNestedMessageList[0].Bb);
  85. }
  86. [Test]
  87. public void AddMessageFailsAfterBuild()
  88. {
  89. TestAllTypes.Builder builder = new TestAllTypes.Builder();
  90. IList<TestAllTypes.Types.NestedMessage> list = builder.RepeatedNestedMessageList;
  91. builder.Build();
  92. try
  93. {
  94. list.Add(new TestAllTypes.Types.NestedMessage.Builder {Bb = 10}.Build());
  95. Assert.Fail("List should be frozen");
  96. }
  97. catch (NotSupportedException)
  98. {
  99. // Expected
  100. }
  101. }
  102. [Test]
  103. public void DefaultInstance()
  104. {
  105. Assert.AreSame(TestAllTypes.DefaultInstance, TestAllTypes.DefaultInstance.DefaultInstanceForType);
  106. Assert.AreSame(TestAllTypes.DefaultInstance, TestAllTypes.CreateBuilder().DefaultInstanceForType);
  107. }
  108. [Test]
  109. public void Accessors()
  110. {
  111. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
  112. TestUtil.SetAllFields(builder);
  113. TestAllTypes message = builder.Build();
  114. TestUtil.AssertAllFieldsSet(message);
  115. }
  116. [Test]
  117. public void SettersRejectNull()
  118. {
  119. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
  120. TestUtil.AssertArgumentNullException(() => builder.SetOptionalString(null));
  121. TestUtil.AssertArgumentNullException(() => builder.SetOptionalBytes(null));
  122. TestUtil.AssertArgumentNullException(
  123. () => builder.SetOptionalNestedMessage((TestAllTypes.Types.NestedMessage) null));
  124. TestUtil.AssertArgumentNullException(
  125. () => builder.SetOptionalNestedMessage((TestAllTypes.Types.NestedMessage.Builder) null));
  126. TestUtil.AssertArgumentNullException(() => builder.AddRepeatedString(null));
  127. TestUtil.AssertArgumentNullException(() => builder.AddRepeatedBytes(null));
  128. TestUtil.AssertArgumentNullException(
  129. () => builder.AddRepeatedNestedMessage((TestAllTypes.Types.NestedMessage) null));
  130. TestUtil.AssertArgumentNullException(
  131. () => builder.AddRepeatedNestedMessage((TestAllTypes.Types.NestedMessage.Builder) null));
  132. }
  133. [Test]
  134. public void RepeatedSetters()
  135. {
  136. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
  137. TestUtil.SetAllFields(builder);
  138. TestUtil.ModifyRepeatedFields(builder);
  139. TestAllTypes message = builder.Build();
  140. TestUtil.AssertRepeatedFieldsModified(message);
  141. }
  142. [Test]
  143. public void RepeatedAppend()
  144. {
  145. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
  146. builder.AddRangeRepeatedInt32(new int[] {1, 2, 3, 4});
  147. builder.AddRangeRepeatedForeignEnum((new ForeignEnum[] {ForeignEnum.FOREIGN_BAZ}));
  148. ForeignMessage foreignMessage = ForeignMessage.CreateBuilder().SetC(12).Build();
  149. builder.AddRangeRepeatedForeignMessage(new ForeignMessage[] {foreignMessage});
  150. TestAllTypes message = builder.Build();
  151. TestUtil.AssertEqual(message.RepeatedInt32List, new int[] {1, 2, 3, 4});
  152. TestUtil.AssertEqual(message.RepeatedForeignEnumList, new ForeignEnum[] {ForeignEnum.FOREIGN_BAZ});
  153. Assert.AreEqual(1, message.RepeatedForeignMessageCount);
  154. Assert.AreEqual(12, message.GetRepeatedForeignMessage(0).C);
  155. }
  156. [Test]
  157. public void RepeatedAppendRejectsNull()
  158. {
  159. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
  160. ForeignMessage foreignMessage = ForeignMessage.CreateBuilder().SetC(12).Build();
  161. TestUtil.AssertArgumentNullException(
  162. () => builder.AddRangeRepeatedForeignMessage(new[] {foreignMessage, null}));
  163. TestUtil.AssertArgumentNullException(() => builder.AddRangeRepeatedForeignMessage(null));
  164. TestUtil.AssertArgumentNullException(() => builder.AddRangeRepeatedForeignEnum(null));
  165. TestUtil.AssertArgumentNullException(() => builder.AddRangeRepeatedString(new[] {"one", null}));
  166. TestUtil.AssertArgumentNullException(
  167. () => builder.AddRangeRepeatedBytes(new[] {TestUtil.ToBytes("one"), null}));
  168. }
  169. [Test]
  170. public void SettingForeignMessageUsingBuilder()
  171. {
  172. TestAllTypes message = TestAllTypes.CreateBuilder()
  173. // Pass builder for foreign message instance.
  174. .SetOptionalForeignMessage(ForeignMessage.CreateBuilder().SetC(123))
  175. .Build();
  176. TestAllTypes expectedMessage = TestAllTypes.CreateBuilder()
  177. // Create expected version passing foreign message instance explicitly.
  178. .SetOptionalForeignMessage(ForeignMessage.CreateBuilder().SetC(123).Build())
  179. .Build();
  180. Assert.AreEqual(expectedMessage, message);
  181. }
  182. [Test]
  183. public void SettingRepeatedForeignMessageUsingBuilder()
  184. {
  185. TestAllTypes message = TestAllTypes.CreateBuilder()
  186. // Pass builder for foreign message instance.
  187. .AddRepeatedForeignMessage(ForeignMessage.CreateBuilder().SetC(456))
  188. .Build();
  189. TestAllTypes expectedMessage = TestAllTypes.CreateBuilder()
  190. // Create expected version passing foreign message instance explicitly.
  191. .AddRepeatedForeignMessage(ForeignMessage.CreateBuilder().SetC(456).Build())
  192. .Build();
  193. Assert.AreEqual(expectedMessage, message);
  194. }
  195. [Test]
  196. public void SettingRepeatedValuesUsingRangeInCollectionInitializer()
  197. {
  198. int[] values = {1, 2, 3};
  199. TestAllTypes message = new TestAllTypes.Builder
  200. {
  201. RepeatedSint32List = {values}
  202. }.Build();
  203. Assert.IsTrue(Lists.Equals(values, message.RepeatedSint32List));
  204. }
  205. [Test]
  206. public void SettingRepeatedValuesUsingIndividualValuesInCollectionInitializer()
  207. {
  208. TestAllTypes message = new TestAllTypes.Builder
  209. {
  210. RepeatedSint32List = {6, 7}
  211. }.Build();
  212. Assert.IsTrue(Lists.Equals(new int[] {6, 7}, message.RepeatedSint32List));
  213. }
  214. [Test]
  215. public void Defaults()
  216. {
  217. TestUtil.AssertClear(TestAllTypes.DefaultInstance);
  218. TestUtil.AssertClear(TestAllTypes.CreateBuilder().Build());
  219. Assert.AreEqual("\u1234", TestExtremeDefaultValues.DefaultInstance.Utf8String);
  220. }
  221. [Test]
  222. public void ReflectionGetters()
  223. {
  224. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
  225. TestUtil.SetAllFields(builder);
  226. TestAllTypes message = builder.Build();
  227. reflectionTester.AssertAllFieldsSetViaReflection(message);
  228. }
  229. [Test]
  230. public void ReflectionSetters()
  231. {
  232. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
  233. reflectionTester.SetAllFieldsViaReflection(builder);
  234. TestAllTypes message = builder.Build();
  235. TestUtil.AssertAllFieldsSet(message);
  236. }
  237. [Test]
  238. public void ReflectionSettersRejectNull()
  239. {
  240. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
  241. reflectionTester.AssertReflectionSettersRejectNull(builder);
  242. }
  243. [Test]
  244. public void ReflectionRepeatedSetters()
  245. {
  246. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
  247. reflectionTester.SetAllFieldsViaReflection(builder);
  248. reflectionTester.ModifyRepeatedFieldsViaReflection(builder);
  249. TestAllTypes message = builder.Build();
  250. TestUtil.AssertRepeatedFieldsModified(message);
  251. }
  252. [Test]
  253. public void TestReflectionRepeatedSettersRejectNull()
  254. {
  255. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
  256. reflectionTester.AssertReflectionRepeatedSettersRejectNull(builder);
  257. }
  258. [Test]
  259. public void ReflectionDefaults()
  260. {
  261. TestUtil.TestInMultipleCultures(() =>
  262. {
  263. reflectionTester.AssertClearViaReflection(
  264. TestAllTypes.DefaultInstance);
  265. reflectionTester.AssertClearViaReflection(
  266. TestAllTypes.CreateBuilder().Build());
  267. });
  268. }
  269. // =================================================================
  270. // Extensions.
  271. [Test]
  272. public void ExtensionAccessors()
  273. {
  274. TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
  275. TestUtil.SetAllExtensions(builder);
  276. TestAllExtensions message = builder.Build();
  277. TestUtil.AssertAllExtensionsSet(message);
  278. }
  279. [Test]
  280. public void ExtensionRepeatedSetters()
  281. {
  282. TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
  283. TestUtil.SetAllExtensions(builder);
  284. TestUtil.ModifyRepeatedExtensions(builder);
  285. TestAllExtensions message = builder.Build();
  286. TestUtil.AssertRepeatedExtensionsModified(message);
  287. }
  288. [Test]
  289. public void ExtensionDefaults()
  290. {
  291. TestUtil.AssertExtensionsClear(TestAllExtensions.DefaultInstance);
  292. TestUtil.AssertExtensionsClear(TestAllExtensions.CreateBuilder().Build());
  293. }
  294. [Test]
  295. public void ExtensionReflectionGetters()
  296. {
  297. TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
  298. TestUtil.SetAllExtensions(builder);
  299. TestAllExtensions message = builder.Build();
  300. extensionsReflectionTester.AssertAllFieldsSetViaReflection(message);
  301. }
  302. [Test]
  303. public void ExtensionReflectionSetters()
  304. {
  305. TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
  306. extensionsReflectionTester.SetAllFieldsViaReflection(builder);
  307. TestAllExtensions message = builder.Build();
  308. TestUtil.AssertAllExtensionsSet(message);
  309. }
  310. [Test]
  311. public void ExtensionReflectionSettersRejectNull()
  312. {
  313. TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
  314. extensionsReflectionTester.AssertReflectionSettersRejectNull(builder);
  315. }
  316. [Test]
  317. public void ExtensionReflectionRepeatedSetters()
  318. {
  319. TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
  320. extensionsReflectionTester.SetAllFieldsViaReflection(builder);
  321. extensionsReflectionTester.ModifyRepeatedFieldsViaReflection(builder);
  322. TestAllExtensions message = builder.Build();
  323. TestUtil.AssertRepeatedExtensionsModified(message);
  324. }
  325. [Test]
  326. public void ExtensionReflectionRepeatedSettersRejectNull()
  327. {
  328. TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
  329. extensionsReflectionTester.AssertReflectionRepeatedSettersRejectNull(builder);
  330. }
  331. [Test]
  332. public void ExtensionReflectionDefaults()
  333. {
  334. TestUtil.TestInMultipleCultures(() =>
  335. {
  336. extensionsReflectionTester.AssertClearViaReflection(
  337. TestAllExtensions.DefaultInstance);
  338. extensionsReflectionTester.AssertClearViaReflection(
  339. TestAllExtensions.CreateBuilder().Build());
  340. });
  341. }
  342. [Test]
  343. public void ClearExtension()
  344. {
  345. // ClearExtension() is not actually used in TestUtil, so try it manually.
  346. Assert.IsFalse(TestAllExtensions.CreateBuilder()
  347. .SetExtension(UnitTestProtoFile.OptionalInt32Extension, 1)
  348. .ClearExtension(UnitTestProtoFile.OptionalInt32Extension)
  349. .HasExtension(UnitTestProtoFile.OptionalInt32Extension));
  350. Assert.AreEqual(0, TestAllExtensions.CreateBuilder()
  351. .AddExtension(UnitTestProtoFile.RepeatedInt32Extension, 1)
  352. .ClearExtension(UnitTestProtoFile.RepeatedInt32Extension)
  353. .GetExtensionCount(UnitTestProtoFile.RepeatedInt32Extension));
  354. }
  355. [Test]
  356. public void ExtensionMergeFrom()
  357. {
  358. TestAllExtensions original = TestAllExtensions.CreateBuilder()
  359. .SetExtension(UnitTestProtoFile.OptionalInt32Extension, 1).Build();
  360. TestAllExtensions merged =
  361. TestAllExtensions.CreateBuilder().MergeFrom(original).Build();
  362. Assert.IsTrue((merged.HasExtension(UnitTestProtoFile.OptionalInt32Extension)));
  363. Assert.AreEqual(1, (int) merged.GetExtension(UnitTestProtoFile.OptionalInt32Extension));
  364. }
  365. /* Removed multiple files option for the moment
  366. [Test]
  367. public void MultipleFilesOption() {
  368. // We mostly just want to check that things compile.
  369. MessageWithNoOuter message = MessageWithNoOuter.CreateBuilder()
  370. .SetNested(MessageWithNoOuter.Types.NestedMessage.CreateBuilder().SetI(1))
  371. .AddForeign(TestAllTypes.CreateBuilder().SetOptionalInt32(1))
  372. .SetNestedEnum(MessageWithNoOuter.Types.NestedEnum.BAZ)
  373. .SetForeignEnum(EnumWithNoOuter.BAR)
  374. .Build();
  375. Assert.AreEqual(message, MessageWithNoOuter.ParseFrom(message.ToByteString()));
  376. Assert.AreEqual(MultiFileProto.Descriptor, MessageWithNoOuter.Descriptor.File);
  377. FieldDescriptor field = MessageWithNoOuter.Descriptor.FindDescriptor<FieldDescriptor>("foreign_enum");
  378. Assert.AreEqual(MultiFileProto.Descriptor.FindTypeByName<EnumDescriptor>("EnumWithNoOuter")
  379. .FindValueByNumber((int)EnumWithNoOuter.BAR), message[field]);
  380. Assert.AreEqual(MultiFileProto.Descriptor, ServiceWithNoOuter.Descriptor.File);
  381. Assert.IsFalse(TestAllExtensions.DefaultInstance.HasExtension(MultiFileProto.ExtensionWithOuter));
  382. }*/
  383. [Test]
  384. public void OptionalFieldWithRequiredSubfieldsOptimizedForSize()
  385. {
  386. TestOptionalOptimizedForSize message = TestOptionalOptimizedForSize.DefaultInstance;
  387. Assert.IsTrue(message.IsInitialized);
  388. message = TestOptionalOptimizedForSize.CreateBuilder().SetO(
  389. TestRequiredOptimizedForSize.CreateBuilder().BuildPartial()
  390. ).BuildPartial();
  391. Assert.IsFalse(message.IsInitialized);
  392. message = TestOptionalOptimizedForSize.CreateBuilder().SetO(
  393. TestRequiredOptimizedForSize.CreateBuilder().SetX(5).BuildPartial()
  394. ).BuildPartial();
  395. Assert.IsTrue(message.IsInitialized);
  396. }
  397. [Test]
  398. public void OptimizedForSizeMergeUsesAllFieldsFromTarget()
  399. {
  400. TestOptimizedForSize withFieldSet = new TestOptimizedForSize.Builder {I = 10}.Build();
  401. TestOptimizedForSize.Builder builder = new TestOptimizedForSize.Builder();
  402. builder.MergeFrom(withFieldSet);
  403. TestOptimizedForSize built = builder.Build();
  404. Assert.AreEqual(10, built.I);
  405. }
  406. [Test]
  407. public void UninitializedExtensionInOptimizedForSizeMakesMessageUninitialized()
  408. {
  409. TestOptimizedForSize.Builder builder = new TestOptimizedForSize.Builder();
  410. builder.SetExtension(TestOptimizedForSize.TestExtension2,
  411. new TestRequiredOptimizedForSize.Builder().BuildPartial());
  412. Assert.IsFalse(builder.IsInitialized);
  413. Assert.IsFalse(builder.BuildPartial().IsInitialized);
  414. builder = new TestOptimizedForSize.Builder();
  415. builder.SetExtension(TestOptimizedForSize.TestExtension2,
  416. new TestRequiredOptimizedForSize.Builder {X = 10}.BuildPartial());
  417. Assert.IsTrue(builder.IsInitialized);
  418. Assert.IsTrue(builder.BuildPartial().IsInitialized);
  419. }
  420. [Test]
  421. public void ToBuilder()
  422. {
  423. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
  424. TestUtil.SetAllFields(builder);
  425. TestAllTypes message = builder.Build();
  426. TestUtil.AssertAllFieldsSet(message.ToBuilder().Build());
  427. }
  428. [Test]
  429. public void FieldConstantValues()
  430. {
  431. Assert.AreEqual(TestAllTypes.Types.NestedMessage.BbFieldNumber, 1);
  432. Assert.AreEqual(TestAllTypes.OptionalInt32FieldNumber, 1);
  433. Assert.AreEqual(TestAllTypes.OptionalGroupFieldNumber, 16);
  434. Assert.AreEqual(TestAllTypes.OptionalNestedMessageFieldNumber, 18);
  435. Assert.AreEqual(TestAllTypes.OptionalNestedEnumFieldNumber, 21);
  436. Assert.AreEqual(TestAllTypes.RepeatedInt32FieldNumber, 31);
  437. Assert.AreEqual(TestAllTypes.RepeatedGroupFieldNumber, 46);
  438. Assert.AreEqual(TestAllTypes.RepeatedNestedMessageFieldNumber, 48);
  439. Assert.AreEqual(TestAllTypes.RepeatedNestedEnumFieldNumber, 51);
  440. }
  441. [Test]
  442. public void ExtensionConstantValues()
  443. {
  444. Assert.AreEqual(TestRequired.SingleFieldNumber, 1000);
  445. Assert.AreEqual(TestRequired.MultiFieldNumber, 1001);
  446. Assert.AreEqual(UnitTestProtoFile.OptionalInt32ExtensionFieldNumber, 1);
  447. Assert.AreEqual(UnitTestProtoFile.OptionalGroupExtensionFieldNumber, 16);
  448. Assert.AreEqual(UnitTestProtoFile.OptionalNestedMessageExtensionFieldNumber, 18);
  449. Assert.AreEqual(UnitTestProtoFile.OptionalNestedEnumExtensionFieldNumber, 21);
  450. Assert.AreEqual(UnitTestProtoFile.RepeatedInt32ExtensionFieldNumber, 31);
  451. Assert.AreEqual(UnitTestProtoFile.RepeatedGroupExtensionFieldNumber, 46);
  452. Assert.AreEqual(UnitTestProtoFile.RepeatedNestedMessageExtensionFieldNumber, 48);
  453. Assert.AreEqual(UnitTestProtoFile.RepeatedNestedEnumExtensionFieldNumber, 51);
  454. }
  455. [Test]
  456. public void EmptyPackedValue()
  457. {
  458. TestPackedTypes empty = new TestPackedTypes.Builder().Build();
  459. Assert.AreEqual(0, empty.SerializedSize);
  460. }
  461. }
  462. }