GeneratedMessageTest.cs 19 KB

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