blob: f0be393c549e84e866f11fcb55dbbb21af248aa8 [file] [log] [blame]
Jon Skeet68036862008-10-22 13:30:34 +01001// 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.
16using System;
17using System.Collections.Generic;
18using Google.ProtocolBuffers.Descriptors;
19using Google.ProtocolBuffers.TestProtos;
20using NUnit.Framework;
21
22namespace Google.ProtocolBuffers {
23 [TestFixture]
24 public class GeneratedMessageTest {
25 ReflectionTester reflectionTester;
26 ReflectionTester extensionsReflectionTester;
27
28 [SetUp]
29 public void SetUp() {
30 reflectionTester = ReflectionTester.CreateTestAllTypesInstance();
31 extensionsReflectionTester = ReflectionTester.CreateTestAllExtensionsInstance();
32 }
33
34 [Test]
35 public void RepeatedAddPrimitiveBeforeBuild() {
36 TestAllTypes message = new TestAllTypes.Builder { RepeatedInt32List = { 1, 2, 3 } }.Build();
37 TestUtil.AssertEqual(new int[]{1, 2, 3}, message.RepeatedInt32List);
38 }
39
40 [Test]
41 public void AddPrimitiveFailsAfterBuild() {
42 TestAllTypes.Builder builder = new TestAllTypes.Builder();
43 IList<int> list = builder.RepeatedInt32List;
44 list.Add(1); // Fine
45 builder.Build();
46
47 try {
48 list.Add(2);
49 Assert.Fail("List should be frozen");
50 } catch (NotSupportedException) {
51 // Expected
52 }
53 }
54
55 [Test]
56 public void RepeatedAddMessageBeforeBuild() {
57 TestAllTypes message = new TestAllTypes.Builder {
58 RepeatedNestedMessageList = { new TestAllTypes.Types.NestedMessage.Builder { Bb = 10 }.Build() } }.Build();
59 Assert.AreEqual(1, message.RepeatedNestedMessageCount);
60 Assert.AreEqual(10, message.RepeatedNestedMessageList[0].Bb);
61 }
62
63 [Test]
64 public void AddMessageFailsAfterBuild() {
65 TestAllTypes.Builder builder = new TestAllTypes.Builder();
66 IList<TestAllTypes.Types.NestedMessage> list = builder.RepeatedNestedMessageList;
67 builder.Build();
68
69 try {
70 list.Add(new TestAllTypes.Types.NestedMessage.Builder { Bb = 10 }.Build());
71 Assert.Fail("List should be frozen");
72 } catch (NotSupportedException) {
73 // Expected
74 }
75 }
76
77 [Test]
78 public void DefaultInstance() {
79 Assert.AreSame(TestAllTypes.DefaultInstance, TestAllTypes.DefaultInstance.DefaultInstanceForType);
80 Assert.AreSame(TestAllTypes.DefaultInstance, TestAllTypes.CreateBuilder().DefaultInstanceForType);
81 }
82
83 [Test]
84 public void Accessors() {
85 TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
86 TestUtil.SetAllFields(builder);
87 TestAllTypes message = builder.Build();
88 TestUtil.AssertAllFieldsSet(message);
89 }
90
91 [Test]
92 public void RepeatedSetters() {
93 TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
94 TestUtil.SetAllFields(builder);
95 TestUtil.ModifyRepeatedFields(builder);
96 TestAllTypes message = builder.Build();
97 TestUtil.AssertRepeatedFieldsModified(message);
98 }
99
100 [Test]
101 public void RepeatedAppend() {
102 TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
103
104 builder.AddRangeRepeatedInt32(new int[]{1, 2, 3, 4});
105 builder.AddRangeRepeatedForeignEnum((new ForeignEnum[] { ForeignEnum.FOREIGN_BAZ }));
106
107 ForeignMessage foreignMessage = ForeignMessage.CreateBuilder().SetC(12).Build();
108 builder.AddRangeRepeatedForeignMessage(new ForeignMessage[] {foreignMessage});
109
110 TestAllTypes message = builder.Build();
111 TestUtil.AssertEqual(message.RepeatedInt32List, new int[]{1, 2, 3, 4});
112 TestUtil.AssertEqual(message.RepeatedForeignEnumList, new ForeignEnum[] {ForeignEnum.FOREIGN_BAZ});
113 Assert.AreEqual(1, message.RepeatedForeignMessageCount);
114 Assert.AreEqual(12, message.GetRepeatedForeignMessage(0).C);
115 }
116
117 [Test]
118 public void SettingForeignMessageUsingBuilder() {
119 TestAllTypes message = TestAllTypes.CreateBuilder()
120 // Pass builder for foreign message instance.
121 .SetOptionalForeignMessage(ForeignMessage.CreateBuilder().SetC(123))
122 .Build();
123 TestAllTypes expectedMessage = TestAllTypes.CreateBuilder()
124 // Create expected version passing foreign message instance explicitly.
125 .SetOptionalForeignMessage(ForeignMessage.CreateBuilder().SetC(123).Build())
126 .Build();
127 Assert.AreEqual(expectedMessage, message);
128 }
129
130 [Test]
131 public void SettingRepeatedForeignMessageUsingBuilder() {
132 TestAllTypes message = TestAllTypes.CreateBuilder()
133 // Pass builder for foreign message instance.
134 .AddRepeatedForeignMessage(ForeignMessage.CreateBuilder().SetC(456))
135 .Build();
136 TestAllTypes expectedMessage = TestAllTypes.CreateBuilder()
137 // Create expected version passing foreign message instance explicitly.
138 .AddRepeatedForeignMessage(ForeignMessage.CreateBuilder().SetC(456).Build())
139 .Build();
140 Assert.AreEqual(expectedMessage, message);
141 }
142
143
144 [Test]
145 public void Defaults() {
146 TestUtil.AssertClear(TestAllTypes.DefaultInstance);
147 TestUtil.AssertClear(TestAllTypes.CreateBuilder().Build());
148
149 Assert.AreEqual("\u1234", TestExtremeDefaultValues.DefaultInstance.Utf8String);
150 }
151
152 [Test]
153 public void ReflectionGetters() {
154 TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
155 TestUtil.SetAllFields(builder);
156 TestAllTypes message = builder.Build();
157 reflectionTester.AssertAllFieldsSetViaReflection(message);
158 }
159
160 [Test]
161 public void ReflectionSetters() {
162 TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
163 reflectionTester.SetAllFieldsViaReflection(builder);
164 TestAllTypes message = builder.Build();
165 TestUtil.AssertAllFieldsSet(message);
166 }
167
168 [Test]
169 public void ReflectionRepeatedSetters() {
170 TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
171 reflectionTester.SetAllFieldsViaReflection(builder);
172 reflectionTester.ModifyRepeatedFieldsViaReflection(builder);
173 TestAllTypes message = builder.Build();
174 TestUtil.AssertRepeatedFieldsModified(message);
175 }
176
177 [Test]
178 public void ReflectionDefaults() {
179 reflectionTester.AssertClearViaReflection(TestAllTypes.DefaultInstance);
180 reflectionTester.AssertClearViaReflection(TestAllTypes.CreateBuilder().Build());
181 }
182 // =================================================================
183 // Extensions.
184
185 [Test]
186 public void ExtensionAccessors() {
187 TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
188 TestUtil.SetAllExtensions(builder);
189 TestAllExtensions message = builder.Build();
190 TestUtil.AssertAllExtensionsSet(message);
191 }
192
193 [Test]
194 public void ExtensionRepeatedSetters() {
195 TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
196 TestUtil.SetAllExtensions(builder);
197 TestUtil.ModifyRepeatedExtensions(builder);
198 TestAllExtensions message = builder.Build();
199 TestUtil.AssertRepeatedExtensionsModified(message);
200 }
201
202 [Test]
203 public void ExtensionDefaults() {
204 TestUtil.AssertExtensionsClear(TestAllExtensions.DefaultInstance);
205 TestUtil.AssertExtensionsClear(TestAllExtensions.CreateBuilder().Build());
206 }
207
208 [Test]
209 public void ExtensionReflectionGetters() {
210 TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
211 TestUtil.SetAllExtensions(builder);
212 TestAllExtensions message = builder.Build();
213 extensionsReflectionTester.AssertAllFieldsSetViaReflection(message);
214 }
215
216 [Test]
217 public void ExtensionReflectionSetters() {
218 TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
219 extensionsReflectionTester.SetAllFieldsViaReflection(builder);
220 TestAllExtensions message = builder.Build();
221 TestUtil.AssertAllExtensionsSet(message);
222 }
223
224 [Test]
225 public void ExtensionReflectionRepeatedSetters() {
226 TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
227 extensionsReflectionTester.SetAllFieldsViaReflection(builder);
228 extensionsReflectionTester.ModifyRepeatedFieldsViaReflection(builder);
229 TestAllExtensions message = builder.Build();
230 TestUtil.AssertRepeatedExtensionsModified(message);
231 }
232
233 [Test]
234 public void ExtensionReflectionDefaults() {
235 extensionsReflectionTester.AssertClearViaReflection(TestAllExtensions.DefaultInstance);
236 extensionsReflectionTester.AssertClearViaReflection(TestAllExtensions.CreateBuilder().Build());
237 }
238
239 [Test]
240 public void ClearExtension() {
241 // ClearExtension() is not actually used in TestUtil, so try it manually.
242 Assert.IsFalse(TestAllExtensions.CreateBuilder()
243 .SetExtension(UnitTestProtoFile.OptionalInt32Extension, 1)
244 .ClearExtension(UnitTestProtoFile.OptionalInt32Extension)
245 .HasExtension(UnitTestProtoFile.OptionalInt32Extension));
246 Assert.AreEqual(0, TestAllExtensions.CreateBuilder()
247 .AddExtension(UnitTestProtoFile.RepeatedInt32Extension, 1)
248 .ClearExtension(UnitTestProtoFile.RepeatedInt32Extension)
249 .GetExtensionCount(UnitTestProtoFile.RepeatedInt32Extension));
250 }
251
252 /* Removed multiple files option for the moment
253 [Test]
254 public void MultipleFilesOption() {
255 // We mostly just want to check that things compile.
256 MessageWithNoOuter message = MessageWithNoOuter.CreateBuilder()
257 .SetNested(MessageWithNoOuter.Types.NestedMessage.CreateBuilder().SetI(1))
258 .AddForeign(TestAllTypes.CreateBuilder().SetOptionalInt32(1))
259 .SetNestedEnum(MessageWithNoOuter.Types.NestedEnum.BAZ)
260 .SetForeignEnum(EnumWithNoOuter.BAR)
261 .Build();
262 Assert.AreEqual(message, MessageWithNoOuter.ParseFrom(message.ToByteString()));
263
264 Assert.AreEqual(MultiFileProto.Descriptor, MessageWithNoOuter.Descriptor.File);
265
266 FieldDescriptor field = MessageWithNoOuter.Descriptor.FindDescriptor<FieldDescriptor>("foreign_enum");
267 Assert.AreEqual(MultiFileProto.Descriptor.FindTypeByName<EnumDescriptor>("EnumWithNoOuter")
268 .FindValueByNumber((int)EnumWithNoOuter.BAR), message[field]);
269
270 Assert.AreEqual(MultiFileProto.Descriptor, ServiceWithNoOuter.Descriptor.File);
271
272 Assert.IsFalse(TestAllExtensions.DefaultInstance.HasExtension(MultiFileProto.ExtensionWithOuter));
273 }*/
274
275 [Test]
276 public void OptionalFieldWithRequiredSubfieldsOptimizedForSize() {
277 TestOptionalOptimizedForSize message = TestOptionalOptimizedForSize.DefaultInstance;
278 Assert.IsTrue(message.IsInitialized);
279
280 message = TestOptionalOptimizedForSize.CreateBuilder().SetO(
281 TestRequiredOptimizedForSize.CreateBuilder().BuildPartial()
282 ).BuildPartial();
283 Assert.IsFalse(message.IsInitialized);
284
285 message = TestOptionalOptimizedForSize.CreateBuilder().SetO(
286 TestRequiredOptimizedForSize.CreateBuilder().SetX(5).BuildPartial()
287 ).BuildPartial();
288 Assert.IsTrue(message.IsInitialized);
289 }
Jon Skeet20bfd9b2008-10-23 21:05:58 +0100290
291 [Test]
292 public void TestOptimizedForSizeMergeUsesAllFieldsFromTarget() {
293 TestOptimizedForSize withFieldSet = new TestOptimizedForSize.Builder { I = 10 }.Build();
294 TestOptimizedForSize.Builder builder = new TestOptimizedForSize.Builder();
295 builder.MergeFrom(withFieldSet);
296 TestOptimizedForSize built = builder.Build();
297 Assert.AreEqual(10, built.I);
298 }
299
300 [Test]
301 public void UninitializedExtensionInOptimizedForSizeMakesMessageUninitialized() {
302 TestOptimizedForSize.Builder builder = new TestOptimizedForSize.Builder();
303 builder.SetExtension(TestOptimizedForSize.TestExtension2,
304 new TestRequiredOptimizedForSize.Builder().BuildPartial());
305 Assert.IsFalse(builder.IsInitialized);
306 Assert.IsFalse(builder.BuildPartial().IsInitialized);
307
308 builder = new TestOptimizedForSize.Builder();
309 builder.SetExtension(TestOptimizedForSize.TestExtension2,
310 new TestRequiredOptimizedForSize.Builder { X = 10 }.BuildPartial());
311 Assert.IsTrue(builder.IsInitialized);
312 Assert.IsTrue(builder.BuildPartial().IsInitialized);
313 }
Jon Skeet68036862008-10-22 13:30:34 +0100314 }
315}