GeneratedMessageTest.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. // Protocol Buffers - Google's data interchange format
  2. // Copyright 2008 Google Inc.
  3. // http://code.google.com/p/protobuf/
  4. //
  5. // Licensed under the Apache License, Version 2.0 (the "License");
  6. // you may not use this file except in compliance with the License.
  7. // You may obtain a copy of the License at
  8. //
  9. // http://www.apache.org/licenses/LICENSE-2.0
  10. //
  11. // Unless required by applicable law or agreed to in writing, software
  12. // distributed under the License is distributed on an "AS IS" BASIS,
  13. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. // See the License for the specific language governing permissions and
  15. // limitations under the License.
  16. using System;
  17. using System.Collections.Generic;
  18. using Google.ProtocolBuffers.Descriptors;
  19. using Google.ProtocolBuffers.TestProtos;
  20. using NUnit.Framework;
  21. namespace Google.ProtocolBuffers {
  22. [TestFixture]
  23. public class GeneratedMessageTest {
  24. ReflectionTester reflectionTester;
  25. ReflectionTester extensionsReflectionTester;
  26. [SetUp]
  27. public void SetUp() {
  28. reflectionTester = ReflectionTester.CreateTestAllTypesInstance();
  29. extensionsReflectionTester = ReflectionTester.CreateTestAllExtensionsInstance();
  30. }
  31. [Test]
  32. public void RepeatedAddPrimitiveBeforeBuild() {
  33. TestAllTypes message = new TestAllTypes.Builder { RepeatedInt32List = { 1, 2, 3 } }.Build();
  34. TestUtil.AssertEqual(new int[]{1, 2, 3}, message.RepeatedInt32List);
  35. }
  36. [Test]
  37. public void AddPrimitiveFailsAfterBuild() {
  38. TestAllTypes.Builder builder = new TestAllTypes.Builder();
  39. IList<int> list = builder.RepeatedInt32List;
  40. list.Add(1); // Fine
  41. builder.Build();
  42. try {
  43. list.Add(2);
  44. Assert.Fail("List should be frozen");
  45. } catch (NotSupportedException) {
  46. // Expected
  47. }
  48. }
  49. [Test]
  50. public void RepeatedAddMessageBeforeBuild() {
  51. TestAllTypes message = new TestAllTypes.Builder {
  52. RepeatedNestedMessageList = { new TestAllTypes.Types.NestedMessage.Builder { Bb = 10 }.Build() } }.Build();
  53. Assert.AreEqual(1, message.RepeatedNestedMessageCount);
  54. Assert.AreEqual(10, message.RepeatedNestedMessageList[0].Bb);
  55. }
  56. [Test]
  57. public void AddMessageFailsAfterBuild() {
  58. TestAllTypes.Builder builder = new TestAllTypes.Builder();
  59. IList<TestAllTypes.Types.NestedMessage> list = builder.RepeatedNestedMessageList;
  60. builder.Build();
  61. try {
  62. list.Add(new TestAllTypes.Types.NestedMessage.Builder { Bb = 10 }.Build());
  63. Assert.Fail("List should be frozen");
  64. } catch (NotSupportedException) {
  65. // Expected
  66. }
  67. }
  68. [Test]
  69. public void DefaultInstance() {
  70. Assert.AreSame(TestAllTypes.DefaultInstance, TestAllTypes.DefaultInstance.DefaultInstanceForType);
  71. Assert.AreSame(TestAllTypes.DefaultInstance, TestAllTypes.CreateBuilder().DefaultInstanceForType);
  72. }
  73. [Test]
  74. public void Accessors() {
  75. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
  76. TestUtil.SetAllFields(builder);
  77. TestAllTypes message = builder.Build();
  78. TestUtil.AssertAllFieldsSet(message);
  79. }
  80. [Test]
  81. public void RepeatedSetters() {
  82. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
  83. TestUtil.SetAllFields(builder);
  84. TestUtil.ModifyRepeatedFields(builder);
  85. TestAllTypes message = builder.Build();
  86. TestUtil.AssertRepeatedFieldsModified(message);
  87. }
  88. [Test]
  89. public void RepeatedAppend() {
  90. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
  91. builder.AddRangeRepeatedInt32(new int[]{1, 2, 3, 4});
  92. builder.AddRangeRepeatedForeignEnum((new ForeignEnum[] { ForeignEnum.FOREIGN_BAZ }));
  93. ForeignMessage foreignMessage = ForeignMessage.CreateBuilder().SetC(12).Build();
  94. builder.AddRangeRepeatedForeignMessage(new ForeignMessage[] {foreignMessage});
  95. TestAllTypes message = builder.Build();
  96. TestUtil.AssertEqual(message.RepeatedInt32List, new int[]{1, 2, 3, 4});
  97. TestUtil.AssertEqual(message.RepeatedForeignEnumList, new ForeignEnum[] {ForeignEnum.FOREIGN_BAZ});
  98. Assert.AreEqual(1, message.RepeatedForeignMessageCount);
  99. Assert.AreEqual(12, message.GetRepeatedForeignMessage(0).C);
  100. }
  101. [Test]
  102. public void SettingForeignMessageUsingBuilder() {
  103. TestAllTypes message = TestAllTypes.CreateBuilder()
  104. // Pass builder for foreign message instance.
  105. .SetOptionalForeignMessage(ForeignMessage.CreateBuilder().SetC(123))
  106. .Build();
  107. TestAllTypes expectedMessage = TestAllTypes.CreateBuilder()
  108. // Create expected version passing foreign message instance explicitly.
  109. .SetOptionalForeignMessage(ForeignMessage.CreateBuilder().SetC(123).Build())
  110. .Build();
  111. Assert.AreEqual(expectedMessage, message);
  112. }
  113. [Test]
  114. public void SettingRepeatedForeignMessageUsingBuilder() {
  115. TestAllTypes message = TestAllTypes.CreateBuilder()
  116. // Pass builder for foreign message instance.
  117. .AddRepeatedForeignMessage(ForeignMessage.CreateBuilder().SetC(456))
  118. .Build();
  119. TestAllTypes expectedMessage = TestAllTypes.CreateBuilder()
  120. // Create expected version passing foreign message instance explicitly.
  121. .AddRepeatedForeignMessage(ForeignMessage.CreateBuilder().SetC(456).Build())
  122. .Build();
  123. Assert.AreEqual(expectedMessage, message);
  124. }
  125. [Test]
  126. public void Defaults() {
  127. TestUtil.AssertClear(TestAllTypes.DefaultInstance);
  128. TestUtil.AssertClear(TestAllTypes.CreateBuilder().Build());
  129. Assert.AreEqual("\u1234", TestExtremeDefaultValues.DefaultInstance.Utf8String);
  130. }
  131. [Test]
  132. public void ReflectionGetters() {
  133. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
  134. TestUtil.SetAllFields(builder);
  135. TestAllTypes message = builder.Build();
  136. reflectionTester.AssertAllFieldsSetViaReflection(message);
  137. }
  138. [Test]
  139. public void ReflectionSetters() {
  140. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
  141. reflectionTester.SetAllFieldsViaReflection(builder);
  142. TestAllTypes message = builder.Build();
  143. TestUtil.AssertAllFieldsSet(message);
  144. }
  145. [Test]
  146. public void ReflectionRepeatedSetters() {
  147. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
  148. reflectionTester.SetAllFieldsViaReflection(builder);
  149. reflectionTester.ModifyRepeatedFieldsViaReflection(builder);
  150. TestAllTypes message = builder.Build();
  151. TestUtil.AssertRepeatedFieldsModified(message);
  152. }
  153. [Test]
  154. public void ReflectionDefaults() {
  155. reflectionTester.AssertClearViaReflection(TestAllTypes.DefaultInstance);
  156. reflectionTester.AssertClearViaReflection(TestAllTypes.CreateBuilder().Build());
  157. }
  158. // =================================================================
  159. // Extensions.
  160. [Test]
  161. public void ExtensionAccessors() {
  162. TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
  163. TestUtil.SetAllExtensions(builder);
  164. TestAllExtensions message = builder.Build();
  165. TestUtil.AssertAllExtensionsSet(message);
  166. }
  167. [Test]
  168. public void ExtensionRepeatedSetters() {
  169. TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
  170. TestUtil.SetAllExtensions(builder);
  171. TestUtil.ModifyRepeatedExtensions(builder);
  172. TestAllExtensions message = builder.Build();
  173. TestUtil.AssertRepeatedExtensionsModified(message);
  174. }
  175. [Test]
  176. public void ExtensionDefaults() {
  177. TestUtil.AssertExtensionsClear(TestAllExtensions.DefaultInstance);
  178. TestUtil.AssertExtensionsClear(TestAllExtensions.CreateBuilder().Build());
  179. }
  180. [Test]
  181. public void ExtensionReflectionGetters() {
  182. TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
  183. TestUtil.SetAllExtensions(builder);
  184. TestAllExtensions message = builder.Build();
  185. extensionsReflectionTester.AssertAllFieldsSetViaReflection(message);
  186. }
  187. [Test]
  188. public void ExtensionReflectionSetters() {
  189. TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
  190. extensionsReflectionTester.SetAllFieldsViaReflection(builder);
  191. TestAllExtensions message = builder.Build();
  192. TestUtil.AssertAllExtensionsSet(message);
  193. }
  194. [Test]
  195. public void ExtensionReflectionRepeatedSetters() {
  196. TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
  197. extensionsReflectionTester.SetAllFieldsViaReflection(builder);
  198. extensionsReflectionTester.ModifyRepeatedFieldsViaReflection(builder);
  199. TestAllExtensions message = builder.Build();
  200. TestUtil.AssertRepeatedExtensionsModified(message);
  201. }
  202. [Test]
  203. public void ExtensionReflectionDefaults() {
  204. extensionsReflectionTester.AssertClearViaReflection(TestAllExtensions.DefaultInstance);
  205. extensionsReflectionTester.AssertClearViaReflection(TestAllExtensions.CreateBuilder().Build());
  206. }
  207. [Test]
  208. public void ClearExtension() {
  209. // ClearExtension() is not actually used in TestUtil, so try it manually.
  210. Assert.IsFalse(TestAllExtensions.CreateBuilder()
  211. .SetExtension(UnitTestProtoFile.OptionalInt32Extension, 1)
  212. .ClearExtension(UnitTestProtoFile.OptionalInt32Extension)
  213. .HasExtension(UnitTestProtoFile.OptionalInt32Extension));
  214. Assert.AreEqual(0, TestAllExtensions.CreateBuilder()
  215. .AddExtension(UnitTestProtoFile.RepeatedInt32Extension, 1)
  216. .ClearExtension(UnitTestProtoFile.RepeatedInt32Extension)
  217. .GetExtensionCount(UnitTestProtoFile.RepeatedInt32Extension));
  218. }
  219. /* Removed multiple files option for the moment
  220. [Test]
  221. public void MultipleFilesOption() {
  222. // We mostly just want to check that things compile.
  223. MessageWithNoOuter message = MessageWithNoOuter.CreateBuilder()
  224. .SetNested(MessageWithNoOuter.Types.NestedMessage.CreateBuilder().SetI(1))
  225. .AddForeign(TestAllTypes.CreateBuilder().SetOptionalInt32(1))
  226. .SetNestedEnum(MessageWithNoOuter.Types.NestedEnum.BAZ)
  227. .SetForeignEnum(EnumWithNoOuter.BAR)
  228. .Build();
  229. Assert.AreEqual(message, MessageWithNoOuter.ParseFrom(message.ToByteString()));
  230. Assert.AreEqual(MultiFileProto.Descriptor, MessageWithNoOuter.Descriptor.File);
  231. FieldDescriptor field = MessageWithNoOuter.Descriptor.FindDescriptor<FieldDescriptor>("foreign_enum");
  232. Assert.AreEqual(MultiFileProto.Descriptor.FindTypeByName<EnumDescriptor>("EnumWithNoOuter")
  233. .FindValueByNumber((int)EnumWithNoOuter.BAR), message[field]);
  234. Assert.AreEqual(MultiFileProto.Descriptor, ServiceWithNoOuter.Descriptor.File);
  235. Assert.IsFalse(TestAllExtensions.DefaultInstance.HasExtension(MultiFileProto.ExtensionWithOuter));
  236. }*/
  237. [Test]
  238. public void OptionalFieldWithRequiredSubfieldsOptimizedForSize() {
  239. TestOptionalOptimizedForSize message = TestOptionalOptimizedForSize.DefaultInstance;
  240. Assert.IsTrue(message.IsInitialized);
  241. message = TestOptionalOptimizedForSize.CreateBuilder().SetO(
  242. TestRequiredOptimizedForSize.CreateBuilder().BuildPartial()
  243. ).BuildPartial();
  244. Assert.IsFalse(message.IsInitialized);
  245. message = TestOptionalOptimizedForSize.CreateBuilder().SetO(
  246. TestRequiredOptimizedForSize.CreateBuilder().SetX(5).BuildPartial()
  247. ).BuildPartial();
  248. Assert.IsTrue(message.IsInitialized);
  249. }
  250. }
  251. }