blob: 4953314ab899c8852c5f005c37962bf5d5680543 [file] [log] [blame]
Jon Skeet60c059b2008-10-23 21:17:56 +01001// 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:
Jon Skeet68036862008-10-22 13:30:34 +01005// http://code.google.com/p/protobuf/
6//
Jon Skeet60c059b2008-10-23 21:17:56 +01007// Redistribution and use in source and binary forms, with or without
8// modification, are permitted provided that the following conditions are
9// met:
Jon Skeet68036862008-10-22 13:30:34 +010010//
Jon Skeet60c059b2008-10-23 21:17:56 +010011// * 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.
Jon Skeet68036862008-10-22 13:30:34 +010020//
Jon Skeet60c059b2008-10-23 21:17:56 +010021// 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.
Jon Skeet68036862008-10-22 13:30:34 +010032using System;
33using Google.ProtocolBuffers.Descriptors;
34using Google.ProtocolBuffers.TestProtos;
35using NUnit.Framework;
36
37namespace Google.ProtocolBuffers {
38 /// <summary>
39 /// Performs the same things that the methods of TestUtil do, but
40 /// via the reflection interface. This is its own class because it needs
41 /// to know what descriptor to use.
42 /// </summary>
43 internal class ReflectionTester {
44 private readonly MessageDescriptor baseDescriptor;
45 private readonly ExtensionRegistry extensionRegistry;
46
47 private readonly FileDescriptor file;
48 private readonly FileDescriptor importFile;
49
50 private readonly MessageDescriptor optionalGroup;
51 private readonly MessageDescriptor repeatedGroup;
52 private readonly MessageDescriptor nestedMessage;
53 private readonly MessageDescriptor foreignMessage;
54 private readonly MessageDescriptor importMessage;
55
56 private readonly FieldDescriptor groupA;
57 private readonly FieldDescriptor repeatedGroupA;
58 private readonly FieldDescriptor nestedB;
59 private readonly FieldDescriptor foreignC;
60 private readonly FieldDescriptor importD;
61
62 private readonly EnumDescriptor nestedEnum;
63 private readonly EnumDescriptor foreignEnum;
64 private readonly EnumDescriptor importEnum;
65
66 private readonly EnumValueDescriptor nestedFoo;
67 private readonly EnumValueDescriptor nestedBar;
68 private readonly EnumValueDescriptor nestedBaz;
69 private readonly EnumValueDescriptor foreignFoo;
70 private readonly EnumValueDescriptor foreignBar;
71 private readonly EnumValueDescriptor foreignBaz;
72 private readonly EnumValueDescriptor importFoo;
73 private readonly EnumValueDescriptor importBar;
74 private readonly EnumValueDescriptor importBaz;
75
76 /// <summary>
77 /// Constructs an instance that will expect messages using the given
78 /// descriptor. Normally <paramref name="baseDescriptor"/> should be
79 /// a descriptor for TestAllTypes. However, if extensionRegistry is non-null,
80 /// then baseDescriptor should be for TestAllExtensions instead, and instead of
81 /// reading and writing normal fields, the tester will read and write extensions.
82 /// All of the TestAllExtensions extensions must be registered in the registry.
83 /// </summary>
84 private ReflectionTester(MessageDescriptor baseDescriptor,
85 ExtensionRegistry extensionRegistry) {
86 this.baseDescriptor = baseDescriptor;
87 this.extensionRegistry = extensionRegistry;
88
89 this.file = baseDescriptor.File;
Jon Skeet343d9f52009-01-16 11:52:44 +000090 // TODO(jonskeet): We've got 2 dependencies, not 1 - because of the C# options. Hmm.
Jon Skeet25a28582009-02-18 16:06:22 +000091 // Assert.AreEqual(1, file.Dependencies.Count);
Jon Skeet68036862008-10-22 13:30:34 +010092 // TODO(jonskeet): Find dependency by name instead of number?
Jon Skeet343d9f52009-01-16 11:52:44 +000093 this.importFile = file.Dependencies[1];
Jon Skeet68036862008-10-22 13:30:34 +010094
95 MessageDescriptor testAllTypes;
Jon Skeet25a28582009-02-18 16:06:22 +000096 if (baseDescriptor.Name == "TestAllTypes") {
Jon Skeet68036862008-10-22 13:30:34 +010097 testAllTypes = baseDescriptor;
98 } else {
99 testAllTypes = file.FindTypeByName<MessageDescriptor>("TestAllTypes");
100 Assert.IsNotNull(testAllTypes);
101 }
102
103 if (extensionRegistry == null) {
Jon Skeet25a28582009-02-18 16:06:22 +0000104 // Use testAllTypes, rather than baseDescriptor, to allow
105 // initialization using TestPackedTypes descriptors. These objects
106 // won't be used by the methods for packed fields.
Jon Skeet68036862008-10-22 13:30:34 +0100107 this.optionalGroup =
Jon Skeet25a28582009-02-18 16:06:22 +0000108 testAllTypes.FindDescriptor<MessageDescriptor>("OptionalGroup");
Jon Skeet68036862008-10-22 13:30:34 +0100109 this.repeatedGroup =
Jon Skeet25a28582009-02-18 16:06:22 +0000110 testAllTypes.FindDescriptor<MessageDescriptor>("RepeatedGroup");
Jon Skeet68036862008-10-22 13:30:34 +0100111 } else {
112 this.optionalGroup =
113 file.FindTypeByName<MessageDescriptor>("OptionalGroup_extension");
114 this.repeatedGroup =
115 file.FindTypeByName<MessageDescriptor>("RepeatedGroup_extension");
116 }
117 this.nestedMessage = testAllTypes.FindDescriptor<MessageDescriptor>("NestedMessage");
118 this.foreignMessage = file.FindTypeByName<MessageDescriptor>("ForeignMessage");
119 this.importMessage = importFile.FindTypeByName<MessageDescriptor>("ImportMessage");
120
121 this.nestedEnum = testAllTypes.FindDescriptor<EnumDescriptor>("NestedEnum");
122 this.foreignEnum = file.FindTypeByName<EnumDescriptor>("ForeignEnum");
123 this.importEnum = importFile.FindTypeByName<EnumDescriptor>("ImportEnum");
124
Jon Skeet25a28582009-02-18 16:06:22 +0000125 Assert.IsNotNull(optionalGroup);
126 Assert.IsNotNull(repeatedGroup);
127 Assert.IsNotNull(nestedMessage);
Jon Skeet68036862008-10-22 13:30:34 +0100128 Assert.IsNotNull(foreignMessage);
Jon Skeet25a28582009-02-18 16:06:22 +0000129 Assert.IsNotNull(importMessage);
130 Assert.IsNotNull(nestedEnum);
131 Assert.IsNotNull(foreignEnum);
132 Assert.IsNotNull(importEnum);
Jon Skeet68036862008-10-22 13:30:34 +0100133
Jon Skeet25a28582009-02-18 16:06:22 +0000134 this.nestedB = nestedMessage.FindDescriptor<FieldDescriptor>("bb");
Jon Skeet68036862008-10-22 13:30:34 +0100135 this.foreignC = foreignMessage.FindDescriptor<FieldDescriptor>("c");
Jon Skeet25a28582009-02-18 16:06:22 +0000136 this.importD = importMessage.FindDescriptor<FieldDescriptor>("d");
Jon Skeet68036862008-10-22 13:30:34 +0100137 this.nestedFoo = nestedEnum.FindValueByName("FOO");
138 this.nestedBar = nestedEnum.FindValueByName("BAR");
139 this.nestedBaz = nestedEnum.FindValueByName("BAZ");
140 this.foreignFoo = foreignEnum.FindValueByName("FOREIGN_FOO");
141 this.foreignBar = foreignEnum.FindValueByName("FOREIGN_BAR");
142 this.foreignBaz = foreignEnum.FindValueByName("FOREIGN_BAZ");
143 this.importFoo = importEnum.FindValueByName("IMPORT_FOO");
144 this.importBar = importEnum.FindValueByName("IMPORT_BAR");
145 this.importBaz = importEnum.FindValueByName("IMPORT_BAZ");
146
147 this.groupA = optionalGroup.FindDescriptor<FieldDescriptor>("a");
148 this.repeatedGroupA = repeatedGroup.FindDescriptor<FieldDescriptor>("a");
149
Jon Skeet25a28582009-02-18 16:06:22 +0000150 Assert.IsNotNull(groupA);
Jon Skeet68036862008-10-22 13:30:34 +0100151 Assert.IsNotNull(repeatedGroupA);
Jon Skeet25a28582009-02-18 16:06:22 +0000152 Assert.IsNotNull(nestedB);
153 Assert.IsNotNull(foreignC);
154 Assert.IsNotNull(importD);
155 Assert.IsNotNull(nestedFoo);
156 Assert.IsNotNull(nestedBar);
157 Assert.IsNotNull(nestedBaz);
158 Assert.IsNotNull(foreignFoo);
159 Assert.IsNotNull(foreignBar);
160 Assert.IsNotNull(foreignBaz);
161 Assert.IsNotNull(importFoo);
162 Assert.IsNotNull(importBar);
163 Assert.IsNotNull(importBaz);
Jon Skeet68036862008-10-22 13:30:34 +0100164 }
165
166 /// <summary>
167 /// Creates an instance for the TestAllTypes message, with no extension registry.
168 /// </summary>
169 public static ReflectionTester CreateTestAllTypesInstance() {
170 return new ReflectionTester(TestAllTypes.Descriptor, null);
171 }
172
173 /// <summary>
174 /// Creates an instance for the TestAllExtensions message, with an
175 /// extension registry from TestUtil.CreateExtensionRegistry.
176 /// </summary>
Jon Skeet25a28582009-02-18 16:06:22 +0000177 public static ReflectionTester CreateTestAllExtensionsInstance() {
Jon Skeet68036862008-10-22 13:30:34 +0100178 return new ReflectionTester(TestAllExtensions.Descriptor, TestUtil.CreateExtensionRegistry());
179 }
180
181 /// <summary>
Jon Skeet25a28582009-02-18 16:06:22 +0000182 /// Creates an instance for the TestPackedTypes message, with no extensions.
183 /// </summary>
184 public static ReflectionTester CreateTestPackedTypesInstance() {
185 return new ReflectionTester(TestPackedTypes.Descriptor, null);
186 }
187
188 /// <summary>
Jon Skeet68036862008-10-22 13:30:34 +0100189 /// Shorthand to get a FieldDescriptor for a field of unittest::TestAllTypes.
190 /// </summary>
191 private FieldDescriptor f(String name) {
192 FieldDescriptor result;
193 if (extensionRegistry == null) {
194 result = baseDescriptor.FindDescriptor<FieldDescriptor>(name);
195 } else {
196 result = file.FindTypeByName<FieldDescriptor>(name + "_extension");
197 }
198 Assert.IsNotNull(result);
199 return result;
200 }
201
202 /// <summary>
203 /// Calls parent.CreateBuilderForField() or uses the extension registry
204 /// to find an appropriate builder, depending on what type is being tested.
205 /// </summary>
206 private IBuilder CreateBuilderForField(IBuilder parent, FieldDescriptor field) {
207 if (extensionRegistry == null) {
208 return parent.CreateBuilderForField(field);
209 } else {
210 ExtensionInfo extension = extensionRegistry[field.ContainingType, field.FieldNumber];
211 Assert.IsNotNull(extension);
212 Assert.IsNotNull(extension.DefaultInstance);
213 return extension.DefaultInstance.WeakCreateBuilderForType();
214 }
215 }
216
217 /// <summary>
218 /// Sets every field of the message to the values expected by
219 /// AssertAllFieldsSet, using the reflection interface.
220 /// </summary>
221 /// <param name="message"></param>
222 internal void SetAllFieldsViaReflection(IBuilder message) {
Jon Skeet25a28582009-02-18 16:06:22 +0000223 message[f("optional_int32")] = 101;
224 message[f("optional_int64")] = 102L;
225 message[f("optional_uint32")] = 103U;
226 message[f("optional_uint64")] = 104UL;
227 message[f("optional_sint32")] = 105;
228 message[f("optional_sint64")] = 106L;
229 message[f("optional_fixed32")] = 107U;
230 message[f("optional_fixed64")] = 108UL;
231 message[f("optional_sfixed32")] = 109;
Jon Skeet68036862008-10-22 13:30:34 +0100232 message[f("optional_sfixed64")] = 110L;
Jon Skeet25a28582009-02-18 16:06:22 +0000233 message[f("optional_float")] = 111F;
234 message[f("optional_double")] = 112D;
235 message[f("optional_bool")] = true;
236 message[f("optional_string")] = "115";
Jon Skeet68036862008-10-22 13:30:34 +0100237 message[f("optional_bytes")] = TestUtil.ToBytes("116");
238
239 message[f("optionalgroup")] = CreateBuilderForField(message, f("optionalgroup")).SetField(groupA, 117).WeakBuild();
240 message[f("optional_nested_message")] = CreateBuilderForField(message, f("optional_nested_message")).SetField(nestedB, 118).WeakBuild();
241 message[f("optional_foreign_message")] = CreateBuilderForField(message, f("optional_foreign_message")).SetField(foreignC, 119).WeakBuild();
242 message[f("optional_import_message")] = CreateBuilderForField(message, f("optional_import_message")).SetField(importD, 120).WeakBuild();
243
Jon Skeet25a28582009-02-18 16:06:22 +0000244 message[f("optional_nested_enum")] = nestedBaz;
Jon Skeet68036862008-10-22 13:30:34 +0100245 message[f("optional_foreign_enum")] = foreignBaz;
Jon Skeet25a28582009-02-18 16:06:22 +0000246 message[f("optional_import_enum")] = importBaz;
Jon Skeet68036862008-10-22 13:30:34 +0100247
Jon Skeet25a28582009-02-18 16:06:22 +0000248 message[f("optional_string_piece")] = "124";
249 message[f("optional_cord")] = "125";
Jon Skeet68036862008-10-22 13:30:34 +0100250
251 // -----------------------------------------------------------------
252
Jon Skeet25a28582009-02-18 16:06:22 +0000253 message.WeakAddRepeatedField(f("repeated_int32"), 201);
254 message.WeakAddRepeatedField(f("repeated_int64"), 202L);
255 message.WeakAddRepeatedField(f("repeated_uint32"), 203U);
256 message.WeakAddRepeatedField(f("repeated_uint64"), 204UL);
257 message.WeakAddRepeatedField(f("repeated_sint32"), 205);
258 message.WeakAddRepeatedField(f("repeated_sint64"), 206L);
259 message.WeakAddRepeatedField(f("repeated_fixed32"), 207U);
260 message.WeakAddRepeatedField(f("repeated_fixed64"), 208UL);
261 message.WeakAddRepeatedField(f("repeated_sfixed32"), 209);
Jon Skeet68036862008-10-22 13:30:34 +0100262 message.WeakAddRepeatedField(f("repeated_sfixed64"), 210L);
Jon Skeet25a28582009-02-18 16:06:22 +0000263 message.WeakAddRepeatedField(f("repeated_float"), 211F);
264 message.WeakAddRepeatedField(f("repeated_double"), 212D);
265 message.WeakAddRepeatedField(f("repeated_bool"), true);
266 message.WeakAddRepeatedField(f("repeated_string"), "215");
267 message.WeakAddRepeatedField(f("repeated_bytes"), TestUtil.ToBytes("216"));
Jon Skeet68036862008-10-22 13:30:34 +0100268
269
270 message.WeakAddRepeatedField(f("repeatedgroup"), CreateBuilderForField(message, f("repeatedgroup")).SetField(repeatedGroupA, 217).WeakBuild());
271 message.WeakAddRepeatedField(f("repeated_nested_message"), CreateBuilderForField(message, f("repeated_nested_message")).SetField(nestedB, 218).WeakBuild());
272 message.WeakAddRepeatedField(f("repeated_foreign_message"), CreateBuilderForField(message, f("repeated_foreign_message")).SetField(foreignC, 219).WeakBuild());
273 message.WeakAddRepeatedField(f("repeated_import_message"), CreateBuilderForField(message, f("repeated_import_message")).SetField(importD, 220).WeakBuild());
274
Jon Skeet25a28582009-02-18 16:06:22 +0000275 message.WeakAddRepeatedField(f("repeated_nested_enum"), nestedBar);
Jon Skeet68036862008-10-22 13:30:34 +0100276 message.WeakAddRepeatedField(f("repeated_foreign_enum"), foreignBar);
Jon Skeet25a28582009-02-18 16:06:22 +0000277 message.WeakAddRepeatedField(f("repeated_import_enum"), importBar);
Jon Skeet68036862008-10-22 13:30:34 +0100278
Jon Skeet25a28582009-02-18 16:06:22 +0000279 message.WeakAddRepeatedField(f("repeated_string_piece"), "224");
280 message.WeakAddRepeatedField(f("repeated_cord"), "225");
Jon Skeet68036862008-10-22 13:30:34 +0100281
282 // Add a second one of each field.
Jon Skeet25a28582009-02-18 16:06:22 +0000283 message.WeakAddRepeatedField(f("repeated_int32"), 301);
284 message.WeakAddRepeatedField(f("repeated_int64"), 302L);
285 message.WeakAddRepeatedField(f("repeated_uint32"), 303U);
286 message.WeakAddRepeatedField(f("repeated_uint64"), 304UL);
287 message.WeakAddRepeatedField(f("repeated_sint32"), 305);
288 message.WeakAddRepeatedField(f("repeated_sint64"), 306L);
289 message.WeakAddRepeatedField(f("repeated_fixed32"), 307U);
290 message.WeakAddRepeatedField(f("repeated_fixed64"), 308UL);
291 message.WeakAddRepeatedField(f("repeated_sfixed32"), 309);
Jon Skeet68036862008-10-22 13:30:34 +0100292 message.WeakAddRepeatedField(f("repeated_sfixed64"), 310L);
Jon Skeet25a28582009-02-18 16:06:22 +0000293 message.WeakAddRepeatedField(f("repeated_float"), 311F);
294 message.WeakAddRepeatedField(f("repeated_double"), 312D);
295 message.WeakAddRepeatedField(f("repeated_bool"), false);
296 message.WeakAddRepeatedField(f("repeated_string"), "315");
297 message.WeakAddRepeatedField(f("repeated_bytes"), TestUtil.ToBytes("316"));
Jon Skeet68036862008-10-22 13:30:34 +0100298
299 message.WeakAddRepeatedField(f("repeatedgroup"),
300 CreateBuilderForField(message, f("repeatedgroup"))
301 .SetField(repeatedGroupA, 317).WeakBuild());
302 message.WeakAddRepeatedField(f("repeated_nested_message"),
303 CreateBuilderForField(message, f("repeated_nested_message"))
304 .SetField(nestedB, 318).WeakBuild());
305 message.WeakAddRepeatedField(f("repeated_foreign_message"),
306 CreateBuilderForField(message, f("repeated_foreign_message"))
307 .SetField(foreignC, 319).WeakBuild());
308 message.WeakAddRepeatedField(f("repeated_import_message"),
309 CreateBuilderForField(message, f("repeated_import_message"))
310 .SetField(importD, 320).WeakBuild());
311
Jon Skeet25a28582009-02-18 16:06:22 +0000312 message.WeakAddRepeatedField(f("repeated_nested_enum"), nestedBaz);
Jon Skeet68036862008-10-22 13:30:34 +0100313 message.WeakAddRepeatedField(f("repeated_foreign_enum"), foreignBaz);
Jon Skeet25a28582009-02-18 16:06:22 +0000314 message.WeakAddRepeatedField(f("repeated_import_enum"), importBaz);
Jon Skeet68036862008-10-22 13:30:34 +0100315
Jon Skeet25a28582009-02-18 16:06:22 +0000316 message.WeakAddRepeatedField(f("repeated_string_piece"), "324");
317 message.WeakAddRepeatedField(f("repeated_cord"), "325");
Jon Skeet68036862008-10-22 13:30:34 +0100318
319 // -----------------------------------------------------------------
320
Jon Skeet25a28582009-02-18 16:06:22 +0000321 message[f("default_int32")] = 401;
322 message[f("default_int64")] = 402L;
323 message[f("default_uint32")] = 403U;
324 message[f("default_uint64")] = 404UL;
325 message[f("default_sint32")] = 405;
326 message[f("default_sint64")] = 406L;
327 message[f("default_fixed32")] = 407U;
328 message[f("default_fixed64")] = 408UL;
329 message[f("default_sfixed32")] = 409;
Jon Skeet68036862008-10-22 13:30:34 +0100330 message[f("default_sfixed64")] = 410L;
Jon Skeet25a28582009-02-18 16:06:22 +0000331 message[f("default_float")] = 411F;
332 message[f("default_double")] = 412D;
333 message[f("default_bool")] = false;
334 message[f("default_string")] = "415";
335 message[f("default_bytes")] = TestUtil.ToBytes("416");
Jon Skeet68036862008-10-22 13:30:34 +0100336
Jon Skeet25a28582009-02-18 16:06:22 +0000337 message[f("default_nested_enum")] = nestedFoo;
Jon Skeet68036862008-10-22 13:30:34 +0100338 message[f("default_foreign_enum")] = foreignFoo;
Jon Skeet25a28582009-02-18 16:06:22 +0000339 message[f("default_import_enum")] = importFoo;
Jon Skeet68036862008-10-22 13:30:34 +0100340
Jon Skeet25a28582009-02-18 16:06:22 +0000341 message[f("default_string_piece")] = "424";
342 message[f("default_cord")] = "425";
Jon Skeet68036862008-10-22 13:30:34 +0100343 }
344
345 // -------------------------------------------------------------------
346
347 /// <summary>
348 /// Modify the repeated fields of the specified message to contain the
349 /// values expected by AssertRepeatedFieldsModified, using the IBuilder
350 /// reflection interface.
351 /// </summary>
352 internal void ModifyRepeatedFieldsViaReflection(IBuilder message) {
Jon Skeet25a28582009-02-18 16:06:22 +0000353 message[f("repeated_int32"), 1] = 501;
354 message[f("repeated_int64"), 1] = 502L;
355 message[f("repeated_uint32"), 1] = 503U;
356 message[f("repeated_uint64"), 1] = 504UL;
357 message[f("repeated_sint32"), 1] = 505;
358 message[f("repeated_sint64"), 1] = 506L;
359 message[f("repeated_fixed32"), 1] = 507U;
360 message[f("repeated_fixed64"), 1] = 508UL;
361 message[f("repeated_sfixed32"), 1] = 509;
Jon Skeet68036862008-10-22 13:30:34 +0100362 message[f("repeated_sfixed64"), 1] = 510L;
Jon Skeet25a28582009-02-18 16:06:22 +0000363 message[f("repeated_float"), 1] = 511F;
364 message[f("repeated_double"), 1] = 512D;
365 message[f("repeated_bool"), 1] = true;
366 message[f("repeated_string"), 1] = "515";
367 message.SetRepeatedField(f("repeated_bytes"), 1, TestUtil.ToBytes("516"));
Jon Skeet68036862008-10-22 13:30:34 +0100368
369 message.SetRepeatedField(f("repeatedgroup"), 1, CreateBuilderForField(message, f("repeatedgroup")).SetField(repeatedGroupA, 517).WeakBuild());
370 message.SetRepeatedField(f("repeated_nested_message"), 1, CreateBuilderForField(message, f("repeated_nested_message")).SetField(nestedB, 518).WeakBuild());
371 message.SetRepeatedField(f("repeated_foreign_message"), 1, CreateBuilderForField(message, f("repeated_foreign_message")).SetField(foreignC, 519).WeakBuild());
372 message.SetRepeatedField(f("repeated_import_message"), 1, CreateBuilderForField(message, f("repeated_import_message")).SetField(importD, 520).WeakBuild());
373
Jon Skeet25a28582009-02-18 16:06:22 +0000374 message[f("repeated_nested_enum"), 1] = nestedFoo;
Jon Skeet68036862008-10-22 13:30:34 +0100375 message[f("repeated_foreign_enum"), 1] = foreignFoo;
Jon Skeet25a28582009-02-18 16:06:22 +0000376 message[f("repeated_import_enum"), 1] = importFoo;
Jon Skeet68036862008-10-22 13:30:34 +0100377
378 message[f("repeated_string_piece"), 1] = "524";
379 message[f("repeated_cord"), 1] = "525";
380 }
381
382 // -------------------------------------------------------------------
383
384 /// <summary>
385 /// Asserts that all fields of the specified message are set to the values
386 /// assigned by SetAllFields, using the IMessage reflection interface.
387 /// </summary>
388 public void AssertAllFieldsSetViaReflection(IMessage message) {
Jon Skeet25a28582009-02-18 16:06:22 +0000389 Assert.IsTrue(message.HasField(f("optional_int32")));
390 Assert.IsTrue(message.HasField(f("optional_int64")));
391 Assert.IsTrue(message.HasField(f("optional_uint32")));
392 Assert.IsTrue(message.HasField(f("optional_uint64")));
393 Assert.IsTrue(message.HasField(f("optional_sint32")));
394 Assert.IsTrue(message.HasField(f("optional_sint64")));
395 Assert.IsTrue(message.HasField(f("optional_fixed32")));
396 Assert.IsTrue(message.HasField(f("optional_fixed64")));
Jon Skeet68036862008-10-22 13:30:34 +0100397 Assert.IsTrue(message.HasField(f("optional_sfixed32")));
398 Assert.IsTrue(message.HasField(f("optional_sfixed64")));
Jon Skeet25a28582009-02-18 16:06:22 +0000399 Assert.IsTrue(message.HasField(f("optional_float")));
400 Assert.IsTrue(message.HasField(f("optional_double")));
401 Assert.IsTrue(message.HasField(f("optional_bool")));
402 Assert.IsTrue(message.HasField(f("optional_string")));
403 Assert.IsTrue(message.HasField(f("optional_bytes")));
Jon Skeet68036862008-10-22 13:30:34 +0100404
Jon Skeet25a28582009-02-18 16:06:22 +0000405 Assert.IsTrue(message.HasField(f("optionalgroup")));
406 Assert.IsTrue(message.HasField(f("optional_nested_message")));
Jon Skeet68036862008-10-22 13:30:34 +0100407 Assert.IsTrue(message.HasField(f("optional_foreign_message")));
Jon Skeet25a28582009-02-18 16:06:22 +0000408 Assert.IsTrue(message.HasField(f("optional_import_message")));
Jon Skeet68036862008-10-22 13:30:34 +0100409
410 Assert.IsTrue(((IMessage)message[f("optionalgroup")]).HasField(groupA));
411 Assert.IsTrue(((IMessage)message[f("optional_nested_message")]).HasField(nestedB));
412 Assert.IsTrue(((IMessage)message[f("optional_foreign_message")]).HasField(foreignC));
413 Assert.IsTrue(((IMessage)message[f("optional_import_message")]).HasField(importD));
414
Jon Skeet25a28582009-02-18 16:06:22 +0000415 Assert.IsTrue(message.HasField(f("optional_nested_enum")));
Jon Skeet68036862008-10-22 13:30:34 +0100416 Assert.IsTrue(message.HasField(f("optional_foreign_enum")));
Jon Skeet25a28582009-02-18 16:06:22 +0000417 Assert.IsTrue(message.HasField(f("optional_import_enum")));
Jon Skeet68036862008-10-22 13:30:34 +0100418
419 Assert.IsTrue(message.HasField(f("optional_string_piece")));
420 Assert.IsTrue(message.HasField(f("optional_cord")));
421
Jon Skeet25a28582009-02-18 16:06:22 +0000422 Assert.AreEqual(101, message[f("optional_int32")]);
423 Assert.AreEqual(102L, message[f("optional_int64")]);
424 Assert.AreEqual(103U, message[f("optional_uint32")]);
425 Assert.AreEqual(104UL, message[f("optional_uint64")]);
426 Assert.AreEqual(105, message[f("optional_sint32")]);
427 Assert.AreEqual(106L, message[f("optional_sint64")]);
428 Assert.AreEqual(107U, message[f("optional_fixed32")]);
429 Assert.AreEqual(108UL, message[f("optional_fixed64")]);
430 Assert.AreEqual(109, message[f("optional_sfixed32")]);
431 Assert.AreEqual(110L, message[f("optional_sfixed64")]);
432 Assert.AreEqual(111F, message[f("optional_float")]);
433 Assert.AreEqual(112D, message[f("optional_double")]);
434 Assert.AreEqual(true, message[f("optional_bool")]);
435 Assert.AreEqual("115", message[f("optional_string")]);
Jon Skeet68036862008-10-22 13:30:34 +0100436 Assert.AreEqual(TestUtil.ToBytes("116"), message[f("optional_bytes")]);
437
Jon Skeet25a28582009-02-18 16:06:22 +0000438 Assert.AreEqual(117, ((IMessage)message[f("optionalgroup")])[groupA]);
439 Assert.AreEqual(118, ((IMessage)message[f("optional_nested_message")])[nestedB]);
440 Assert.AreEqual(119, ((IMessage)message[f("optional_foreign_message")])[foreignC]);
441 Assert.AreEqual(120, ((IMessage)message[f("optional_import_message")])[importD]);
Jon Skeet68036862008-10-22 13:30:34 +0100442
Jon Skeet25a28582009-02-18 16:06:22 +0000443 Assert.AreEqual(nestedBaz, message[f("optional_nested_enum")]);
Jon Skeet68036862008-10-22 13:30:34 +0100444 Assert.AreEqual(foreignBaz, message[f("optional_foreign_enum")]);
Jon Skeet25a28582009-02-18 16:06:22 +0000445 Assert.AreEqual(importBaz, message[f("optional_import_enum")]);
Jon Skeet68036862008-10-22 13:30:34 +0100446
447 Assert.AreEqual("124", message[f("optional_string_piece")]);
448 Assert.AreEqual("125", message[f("optional_cord")]);
449
450 // -----------------------------------------------------------------
451
Jon Skeet25a28582009-02-18 16:06:22 +0000452 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_int32")));
453 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_int64")));
454 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_uint32")));
455 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_uint64")));
456 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_sint32")));
457 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_sint64")));
458 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_fixed32")));
459 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_fixed64")));
Jon Skeet68036862008-10-22 13:30:34 +0100460 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_sfixed32")));
461 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_sfixed64")));
Jon Skeet25a28582009-02-18 16:06:22 +0000462 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_float")));
463 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_double")));
464 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_bool")));
465 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_string")));
466 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_bytes")));
Jon Skeet68036862008-10-22 13:30:34 +0100467
Jon Skeet25a28582009-02-18 16:06:22 +0000468 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeatedgroup")));
469 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_nested_message")));
Jon Skeet68036862008-10-22 13:30:34 +0100470 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_foreign_message")));
Jon Skeet25a28582009-02-18 16:06:22 +0000471 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_import_message")));
472 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_nested_enum")));
473 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_foreign_enum")));
474 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_import_enum")));
Jon Skeet68036862008-10-22 13:30:34 +0100475
476 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_string_piece")));
477 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_cord")));
478
Jon Skeet25a28582009-02-18 16:06:22 +0000479 Assert.AreEqual(201, message[f("repeated_int32"), 0]);
480 Assert.AreEqual(202L, message[f("repeated_int64"), 0]);
481 Assert.AreEqual(203U, message[f("repeated_uint32"), 0]);
482 Assert.AreEqual(204UL, message[f("repeated_uint64"), 0]);
483 Assert.AreEqual(205, message[f("repeated_sint32"), 0]);
484 Assert.AreEqual(206L, message[f("repeated_sint64"), 0]);
485 Assert.AreEqual(207U, message[f("repeated_fixed32"), 0]);
486 Assert.AreEqual(208UL, message[f("repeated_fixed64"), 0]);
487 Assert.AreEqual(209, message[f("repeated_sfixed32"), 0]);
488 Assert.AreEqual(210L, message[f("repeated_sfixed64"), 0]);
489 Assert.AreEqual(211F, message[f("repeated_float"), 0]);
490 Assert.AreEqual(212D, message[f("repeated_double"), 0]);
491 Assert.AreEqual(true, message[f("repeated_bool"), 0]);
492 Assert.AreEqual("215", message[f("repeated_string"), 0]);
Jon Skeet68036862008-10-22 13:30:34 +0100493 Assert.AreEqual(TestUtil.ToBytes("216"), message[f("repeated_bytes"), 0]);
494
Jon Skeet25a28582009-02-18 16:06:22 +0000495 Assert.AreEqual(217, ((IMessage)message[f("repeatedgroup"), 0])[repeatedGroupA]);
496 Assert.AreEqual(218, ((IMessage)message[f("repeated_nested_message"), 0])[nestedB]);
497 Assert.AreEqual(219, ((IMessage)message[f("repeated_foreign_message"), 0])[foreignC]);
498 Assert.AreEqual(220, ((IMessage)message[f("repeated_import_message"), 0])[importD]);
Jon Skeet68036862008-10-22 13:30:34 +0100499
Jon Skeet25a28582009-02-18 16:06:22 +0000500 Assert.AreEqual(nestedBar, message[f("repeated_nested_enum"), 0]);
501 Assert.AreEqual(foreignBar, message[f("repeated_foreign_enum"), 0]);
502 Assert.AreEqual(importBar, message[f("repeated_import_enum"), 0]);
Jon Skeet68036862008-10-22 13:30:34 +0100503
504 Assert.AreEqual("224", message[f("repeated_string_piece"), 0]);
505 Assert.AreEqual("225", message[f("repeated_cord"), 0]);
506
Jon Skeet25a28582009-02-18 16:06:22 +0000507 Assert.AreEqual(301, message[f("repeated_int32"), 1]);
508 Assert.AreEqual(302L, message[f("repeated_int64"), 1]);
509 Assert.AreEqual(303U, message[f("repeated_uint32"), 1]);
510 Assert.AreEqual(304UL, message[f("repeated_uint64"), 1]);
511 Assert.AreEqual(305, message[f("repeated_sint32"), 1]);
512 Assert.AreEqual(306L, message[f("repeated_sint64"), 1]);
513 Assert.AreEqual(307U, message[f("repeated_fixed32"), 1]);
514 Assert.AreEqual(308UL, message[f("repeated_fixed64"), 1]);
515 Assert.AreEqual(309, message[f("repeated_sfixed32"), 1]);
516 Assert.AreEqual(310L, message[f("repeated_sfixed64"), 1]);
517 Assert.AreEqual(311F, message[f("repeated_float"), 1]);
518 Assert.AreEqual(312D, message[f("repeated_double"), 1]);
519 Assert.AreEqual(false, message[f("repeated_bool"), 1]);
520 Assert.AreEqual("315", message[f("repeated_string"), 1]);
Jon Skeet68036862008-10-22 13:30:34 +0100521 Assert.AreEqual(TestUtil.ToBytes("316"), message[f("repeated_bytes"), 1]);
522
Jon Skeet25a28582009-02-18 16:06:22 +0000523 Assert.AreEqual(317, ((IMessage)message[f("repeatedgroup"), 1])[repeatedGroupA]);
524 Assert.AreEqual(318, ((IMessage)message[f("repeated_nested_message"), 1])[nestedB]);
525 Assert.AreEqual(319, ((IMessage)message[f("repeated_foreign_message"), 1])[foreignC]);
526 Assert.AreEqual(320, ((IMessage)message[f("repeated_import_message"), 1])[importD]);
Jon Skeet68036862008-10-22 13:30:34 +0100527
Jon Skeet25a28582009-02-18 16:06:22 +0000528 Assert.AreEqual(nestedBaz, message[f("repeated_nested_enum"), 1]);
529 Assert.AreEqual(foreignBaz, message[f("repeated_foreign_enum"), 1]);
530 Assert.AreEqual(importBaz, message[f("repeated_import_enum"), 1]);
Jon Skeet68036862008-10-22 13:30:34 +0100531
532 Assert.AreEqual("324", message[f("repeated_string_piece"), 1]);
533 Assert.AreEqual("325", message[f("repeated_cord"), 1]);
534
535 // -----------------------------------------------------------------
536
Jon Skeet25a28582009-02-18 16:06:22 +0000537 Assert.IsTrue(message.HasField(f("default_int32")));
538 Assert.IsTrue(message.HasField(f("default_int64")));
539 Assert.IsTrue(message.HasField(f("default_uint32")));
540 Assert.IsTrue(message.HasField(f("default_uint64")));
541 Assert.IsTrue(message.HasField(f("default_sint32")));
542 Assert.IsTrue(message.HasField(f("default_sint64")));
543 Assert.IsTrue(message.HasField(f("default_fixed32")));
544 Assert.IsTrue(message.HasField(f("default_fixed64")));
Jon Skeet68036862008-10-22 13:30:34 +0100545 Assert.IsTrue(message.HasField(f("default_sfixed32")));
546 Assert.IsTrue(message.HasField(f("default_sfixed64")));
Jon Skeet25a28582009-02-18 16:06:22 +0000547 Assert.IsTrue(message.HasField(f("default_float")));
548 Assert.IsTrue(message.HasField(f("default_double")));
549 Assert.IsTrue(message.HasField(f("default_bool")));
550 Assert.IsTrue(message.HasField(f("default_string")));
551 Assert.IsTrue(message.HasField(f("default_bytes")));
Jon Skeet68036862008-10-22 13:30:34 +0100552
Jon Skeet25a28582009-02-18 16:06:22 +0000553 Assert.IsTrue(message.HasField(f("default_nested_enum")));
Jon Skeet68036862008-10-22 13:30:34 +0100554 Assert.IsTrue(message.HasField(f("default_foreign_enum")));
Jon Skeet25a28582009-02-18 16:06:22 +0000555 Assert.IsTrue(message.HasField(f("default_import_enum")));
Jon Skeet68036862008-10-22 13:30:34 +0100556
557 Assert.IsTrue(message.HasField(f("default_string_piece")));
558 Assert.IsTrue(message.HasField(f("default_cord")));
559
Jon Skeet25a28582009-02-18 16:06:22 +0000560 Assert.AreEqual(401, message[f("default_int32")]);
561 Assert.AreEqual(402L, message[f("default_int64")]);
562 Assert.AreEqual(403U, message[f("default_uint32")]);
563 Assert.AreEqual(404UL, message[f("default_uint64")]);
564 Assert.AreEqual(405, message[f("default_sint32")]);
565 Assert.AreEqual(406L, message[f("default_sint64")]);
566 Assert.AreEqual(407U, message[f("default_fixed32")]);
567 Assert.AreEqual(408UL, message[f("default_fixed64")]);
568 Assert.AreEqual(409, message[f("default_sfixed32")]);
569 Assert.AreEqual(410L, message[f("default_sfixed64")]);
570 Assert.AreEqual(411F, message[f("default_float")]);
571 Assert.AreEqual(412D, message[f("default_double")]);
572 Assert.AreEqual(false, message[f("default_bool")]);
573 Assert.AreEqual("415", message[f("default_string")]);
Jon Skeet68036862008-10-22 13:30:34 +0100574 Assert.AreEqual(TestUtil.ToBytes("416"), message[f("default_bytes")]);
575
Jon Skeet25a28582009-02-18 16:06:22 +0000576 Assert.AreEqual(nestedFoo, message[f("default_nested_enum")]);
Jon Skeet68036862008-10-22 13:30:34 +0100577 Assert.AreEqual(foreignFoo, message[f("default_foreign_enum")]);
Jon Skeet25a28582009-02-18 16:06:22 +0000578 Assert.AreEqual(importFoo, message[f("default_import_enum")]);
Jon Skeet68036862008-10-22 13:30:34 +0100579
580 Assert.AreEqual("424", message[f("default_string_piece")]);
581 Assert.AreEqual("425", message[f("default_cord")]);
582 }
583
584 /// <summary>
585 /// Assert that all fields of the message are cleared, and that
586 /// getting the fields returns their default values, using the reflection interface.
587 /// </summary>
588 public void AssertClearViaReflection(IMessage message) {
589 // has_blah() should initially be false for all optional fields.
Jon Skeet25a28582009-02-18 16:06:22 +0000590 Assert.IsFalse(message.HasField(f("optional_int32")));
591 Assert.IsFalse(message.HasField(f("optional_int64")));
592 Assert.IsFalse(message.HasField(f("optional_uint32")));
593 Assert.IsFalse(message.HasField(f("optional_uint64")));
594 Assert.IsFalse(message.HasField(f("optional_sint32")));
595 Assert.IsFalse(message.HasField(f("optional_sint64")));
596 Assert.IsFalse(message.HasField(f("optional_fixed32")));
597 Assert.IsFalse(message.HasField(f("optional_fixed64")));
Jon Skeet68036862008-10-22 13:30:34 +0100598 Assert.IsFalse(message.HasField(f("optional_sfixed32")));
599 Assert.IsFalse(message.HasField(f("optional_sfixed64")));
Jon Skeet25a28582009-02-18 16:06:22 +0000600 Assert.IsFalse(message.HasField(f("optional_float")));
601 Assert.IsFalse(message.HasField(f("optional_double")));
602 Assert.IsFalse(message.HasField(f("optional_bool")));
603 Assert.IsFalse(message.HasField(f("optional_string")));
604 Assert.IsFalse(message.HasField(f("optional_bytes")));
Jon Skeet68036862008-10-22 13:30:34 +0100605
Jon Skeet25a28582009-02-18 16:06:22 +0000606 Assert.IsFalse(message.HasField(f("optionalgroup")));
607 Assert.IsFalse(message.HasField(f("optional_nested_message")));
Jon Skeet68036862008-10-22 13:30:34 +0100608 Assert.IsFalse(message.HasField(f("optional_foreign_message")));
Jon Skeet25a28582009-02-18 16:06:22 +0000609 Assert.IsFalse(message.HasField(f("optional_import_message")));
Jon Skeet68036862008-10-22 13:30:34 +0100610
Jon Skeet25a28582009-02-18 16:06:22 +0000611 Assert.IsFalse(message.HasField(f("optional_nested_enum")));
Jon Skeet68036862008-10-22 13:30:34 +0100612 Assert.IsFalse(message.HasField(f("optional_foreign_enum")));
Jon Skeet25a28582009-02-18 16:06:22 +0000613 Assert.IsFalse(message.HasField(f("optional_import_enum")));
Jon Skeet68036862008-10-22 13:30:34 +0100614
615 Assert.IsFalse(message.HasField(f("optional_string_piece")));
616 Assert.IsFalse(message.HasField(f("optional_cord")));
617
618 // Optional fields without defaults are set to zero or something like it.
Jon Skeet25a28582009-02-18 16:06:22 +0000619 Assert.AreEqual(0, message[f("optional_int32")]);
620 Assert.AreEqual(0L, message[f("optional_int64")]);
621 Assert.AreEqual(0U, message[f("optional_uint32")]);
622 Assert.AreEqual(0UL, message[f("optional_uint64")]);
623 Assert.AreEqual(0, message[f("optional_sint32")]);
624 Assert.AreEqual(0L, message[f("optional_sint64")]);
625 Assert.AreEqual(0U, message[f("optional_fixed32")]);
626 Assert.AreEqual(0UL, message[f("optional_fixed64")]);
627 Assert.AreEqual(0, message[f("optional_sfixed32")]);
628 Assert.AreEqual(0L, message[f("optional_sfixed64")]);
629 Assert.AreEqual(0F, message[f("optional_float")]);
630 Assert.AreEqual(0D, message[f("optional_double")]);
631 Assert.AreEqual(false, message[f("optional_bool")]);
632 Assert.AreEqual("", message[f("optional_string")]);
Jon Skeet68036862008-10-22 13:30:34 +0100633 Assert.AreEqual(ByteString.Empty, message[f("optional_bytes")]);
634
635 // Embedded messages should also be clear.
636 Assert.IsFalse(((IMessage)message[f("optionalgroup")]).HasField(groupA));
637 Assert.IsFalse(((IMessage)message[f("optional_nested_message")])
638 .HasField(nestedB));
639 Assert.IsFalse(((IMessage)message[f("optional_foreign_message")])
640 .HasField(foreignC));
641 Assert.IsFalse(((IMessage)message[f("optional_import_message")])
642 .HasField(importD));
643
Jon Skeet25a28582009-02-18 16:06:22 +0000644 Assert.AreEqual(0, ((IMessage)message[f("optionalgroup")])[groupA]);
645 Assert.AreEqual(0, ((IMessage)message[f("optional_nested_message")])[nestedB]);
646 Assert.AreEqual(0, ((IMessage)message[f("optional_foreign_message")])[foreignC]);
647 Assert.AreEqual(0, ((IMessage)message[f("optional_import_message")])[importD]);
Jon Skeet68036862008-10-22 13:30:34 +0100648
649 // Enums without defaults are set to the first value in the enum.
Jon Skeet25a28582009-02-18 16:06:22 +0000650 Assert.AreEqual(nestedFoo, message[f("optional_nested_enum")]);
Jon Skeet68036862008-10-22 13:30:34 +0100651 Assert.AreEqual(foreignFoo, message[f("optional_foreign_enum")]);
Jon Skeet25a28582009-02-18 16:06:22 +0000652 Assert.AreEqual(importFoo, message[f("optional_import_enum")]);
Jon Skeet68036862008-10-22 13:30:34 +0100653
654 Assert.AreEqual("", message[f("optional_string_piece")]);
655 Assert.AreEqual("", message[f("optional_cord")]);
656
657 // Repeated fields are empty.
Jon Skeet25a28582009-02-18 16:06:22 +0000658 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_int32")));
659 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_int64")));
660 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_uint32")));
661 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_uint64")));
662 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_sint32")));
663 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_sint64")));
664 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_fixed32")));
665 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_fixed64")));
Jon Skeet68036862008-10-22 13:30:34 +0100666 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_sfixed32")));
667 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_sfixed64")));
Jon Skeet25a28582009-02-18 16:06:22 +0000668 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_float")));
669 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_double")));
670 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_bool")));
671 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_string")));
672 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_bytes")));
Jon Skeet68036862008-10-22 13:30:34 +0100673
Jon Skeet25a28582009-02-18 16:06:22 +0000674 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeatedgroup")));
675 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_nested_message")));
Jon Skeet68036862008-10-22 13:30:34 +0100676 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_foreign_message")));
Jon Skeet25a28582009-02-18 16:06:22 +0000677 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_import_message")));
678 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_nested_enum")));
679 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_foreign_enum")));
680 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_import_enum")));
Jon Skeet68036862008-10-22 13:30:34 +0100681
682 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_string_piece")));
683 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_cord")));
684
685 // has_blah() should also be false for all default fields.
Jon Skeet25a28582009-02-18 16:06:22 +0000686 Assert.IsFalse(message.HasField(f("default_int32")));
687 Assert.IsFalse(message.HasField(f("default_int64")));
688 Assert.IsFalse(message.HasField(f("default_uint32")));
689 Assert.IsFalse(message.HasField(f("default_uint64")));
690 Assert.IsFalse(message.HasField(f("default_sint32")));
691 Assert.IsFalse(message.HasField(f("default_sint64")));
692 Assert.IsFalse(message.HasField(f("default_fixed32")));
693 Assert.IsFalse(message.HasField(f("default_fixed64")));
Jon Skeet68036862008-10-22 13:30:34 +0100694 Assert.IsFalse(message.HasField(f("default_sfixed32")));
695 Assert.IsFalse(message.HasField(f("default_sfixed64")));
Jon Skeet25a28582009-02-18 16:06:22 +0000696 Assert.IsFalse(message.HasField(f("default_float")));
697 Assert.IsFalse(message.HasField(f("default_double")));
698 Assert.IsFalse(message.HasField(f("default_bool")));
699 Assert.IsFalse(message.HasField(f("default_string")));
700 Assert.IsFalse(message.HasField(f("default_bytes")));
Jon Skeet68036862008-10-22 13:30:34 +0100701
Jon Skeet25a28582009-02-18 16:06:22 +0000702 Assert.IsFalse(message.HasField(f("default_nested_enum")));
Jon Skeet68036862008-10-22 13:30:34 +0100703 Assert.IsFalse(message.HasField(f("default_foreign_enum")));
Jon Skeet25a28582009-02-18 16:06:22 +0000704 Assert.IsFalse(message.HasField(f("default_import_enum")));
Jon Skeet68036862008-10-22 13:30:34 +0100705
Jon Skeet25a28582009-02-18 16:06:22 +0000706 Assert.IsFalse(message.HasField(f("default_string_piece")));
707 Assert.IsFalse(message.HasField(f("default_cord")));
Jon Skeet68036862008-10-22 13:30:34 +0100708
709 // Fields with defaults have their default values (duh).
Jon Skeet25a28582009-02-18 16:06:22 +0000710 Assert.AreEqual(41, message[f("default_int32")]);
711 Assert.AreEqual(42L, message[f("default_int64")]);
712 Assert.AreEqual(43U, message[f("default_uint32")]);
713 Assert.AreEqual(44UL, message[f("default_uint64")]);
714 Assert.AreEqual(-45, message[f("default_sint32")]);
715 Assert.AreEqual(46L, message[f("default_sint64")]);
716 Assert.AreEqual(47U, message[f("default_fixed32")]);
717 Assert.AreEqual(48UL, message[f("default_fixed64")]);
718 Assert.AreEqual(49, message[f("default_sfixed32")]);
719 Assert.AreEqual(-50L, message[f("default_sfixed64")]);
720 Assert.AreEqual(51.5F, message[f("default_float")]);
721 Assert.AreEqual(52e3D, message[f("default_double")]);
722 Assert.AreEqual(true, message[f("default_bool")]);
723 Assert.AreEqual("hello", message[f("default_string")]);
Jon Skeet68036862008-10-22 13:30:34 +0100724 Assert.AreEqual(TestUtil.ToBytes("world"), message[f("default_bytes")]);
725
Jon Skeet25a28582009-02-18 16:06:22 +0000726 Assert.AreEqual(nestedBar, message[f("default_nested_enum")]);
Jon Skeet68036862008-10-22 13:30:34 +0100727 Assert.AreEqual(foreignBar, message[f("default_foreign_enum")]);
Jon Skeet25a28582009-02-18 16:06:22 +0000728 Assert.AreEqual(importBar, message[f("default_import_enum")]);
Jon Skeet68036862008-10-22 13:30:34 +0100729
730 Assert.AreEqual("abc", message[f("default_string_piece")]);
731 Assert.AreEqual("123", message[f("default_cord")]);
732 }
733
734 // ---------------------------------------------------------------
735
736 internal void AssertRepeatedFieldsModifiedViaReflection(IMessage message) {
737 // ModifyRepeatedFields only sets the second repeated element of each
738 // field. In addition to verifying this, we also verify that the first
739 // element and size were *not* modified.
Jon Skeet25a28582009-02-18 16:06:22 +0000740 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_int32")));
741 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_int64")));
742 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_uint32")));
743 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_uint64")));
744 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_sint32")));
745 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_sint64")));
746 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_fixed32")));
747 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_fixed64")));
Jon Skeet68036862008-10-22 13:30:34 +0100748 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_sfixed32")));
749 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_sfixed64")));
Jon Skeet25a28582009-02-18 16:06:22 +0000750 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_float")));
751 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_double")));
752 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_bool")));
753 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_string")));
754 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_bytes")));
Jon Skeet68036862008-10-22 13:30:34 +0100755
Jon Skeet25a28582009-02-18 16:06:22 +0000756 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeatedgroup")));
757 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_nested_message")));
Jon Skeet68036862008-10-22 13:30:34 +0100758 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_foreign_message")));
Jon Skeet25a28582009-02-18 16:06:22 +0000759 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_import_message")));
760 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_nested_enum")));
761 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_foreign_enum")));
762 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_import_enum")));
Jon Skeet68036862008-10-22 13:30:34 +0100763
764 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_string_piece")));
765 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_cord")));
766
Jon Skeet25a28582009-02-18 16:06:22 +0000767 Assert.AreEqual(201, message[f("repeated_int32"), 0]);
768 Assert.AreEqual(202L, message[f("repeated_int64"), 0]);
769 Assert.AreEqual(203U, message[f("repeated_uint32"), 0]);
770 Assert.AreEqual(204UL, message[f("repeated_uint64"), 0]);
771 Assert.AreEqual(205, message[f("repeated_sint32"), 0]);
772 Assert.AreEqual(206L, message[f("repeated_sint64"), 0]);
773 Assert.AreEqual(207U, message[f("repeated_fixed32"), 0]);
774 Assert.AreEqual(208UL, message[f("repeated_fixed64"), 0]);
775 Assert.AreEqual(209, message[f("repeated_sfixed32"), 0]);
776 Assert.AreEqual(210L, message[f("repeated_sfixed64"), 0]);
777 Assert.AreEqual(211F, message[f("repeated_float"), 0]);
778 Assert.AreEqual(212D, message[f("repeated_double"), 0]);
779 Assert.AreEqual(true, message[f("repeated_bool"), 0]);
780 Assert.AreEqual("215", message[f("repeated_string"), 0]);
Jon Skeet68036862008-10-22 13:30:34 +0100781 Assert.AreEqual(TestUtil.ToBytes("216"), message[f("repeated_bytes"), 0]);
782
Jon Skeet25a28582009-02-18 16:06:22 +0000783 Assert.AreEqual(217, ((IMessage)message[f("repeatedgroup"), 0])[repeatedGroupA]);
784 Assert.AreEqual(218, ((IMessage)message[f("repeated_nested_message"), 0])[nestedB]);
785 Assert.AreEqual(219, ((IMessage)message[f("repeated_foreign_message"), 0])[foreignC]);
786 Assert.AreEqual(220, ((IMessage)message[f("repeated_import_message"), 0])[importD]);
Jon Skeet68036862008-10-22 13:30:34 +0100787
Jon Skeet25a28582009-02-18 16:06:22 +0000788 Assert.AreEqual(nestedBar, message[f("repeated_nested_enum"), 0]);
789 Assert.AreEqual(foreignBar, message[f("repeated_foreign_enum"), 0]);
790 Assert.AreEqual(importBar, message[f("repeated_import_enum"), 0]);
Jon Skeet68036862008-10-22 13:30:34 +0100791
792 Assert.AreEqual("224", message[f("repeated_string_piece"), 0]);
793 Assert.AreEqual("225", message[f("repeated_cord"), 0]);
794
Jon Skeet25a28582009-02-18 16:06:22 +0000795 Assert.AreEqual(501, message[f("repeated_int32"), 1]);
796 Assert.AreEqual(502L, message[f("repeated_int64"), 1]);
797 Assert.AreEqual(503U, message[f("repeated_uint32"), 1]);
798 Assert.AreEqual(504UL, message[f("repeated_uint64"), 1]);
799 Assert.AreEqual(505, message[f("repeated_sint32"), 1]);
800 Assert.AreEqual(506L, message[f("repeated_sint64"), 1]);
801 Assert.AreEqual(507U, message[f("repeated_fixed32"), 1]);
802 Assert.AreEqual(508UL, message[f("repeated_fixed64"), 1]);
803 Assert.AreEqual(509, message[f("repeated_sfixed32"), 1]);
804 Assert.AreEqual(510L, message[f("repeated_sfixed64"), 1]);
805 Assert.AreEqual(511F, message[f("repeated_float"), 1]);
806 Assert.AreEqual(512D, message[f("repeated_double"), 1]);
807 Assert.AreEqual(true, message[f("repeated_bool"), 1]);
808 Assert.AreEqual("515", message[f("repeated_string"), 1]);
Jon Skeet68036862008-10-22 13:30:34 +0100809 Assert.AreEqual(TestUtil.ToBytes("516"), message[f("repeated_bytes"), 1]);
810
Jon Skeet25a28582009-02-18 16:06:22 +0000811 Assert.AreEqual(517, ((IMessage)message[f("repeatedgroup"), 1])[repeatedGroupA]);
812 Assert.AreEqual(518, ((IMessage)message[f("repeated_nested_message"), 1])[nestedB]);
813 Assert.AreEqual(519, ((IMessage)message[f("repeated_foreign_message"), 1])[foreignC]);
814 Assert.AreEqual(520, ((IMessage)message[f("repeated_import_message"), 1])[importD]);
Jon Skeet68036862008-10-22 13:30:34 +0100815
Jon Skeet25a28582009-02-18 16:06:22 +0000816 Assert.AreEqual(nestedFoo, message[f("repeated_nested_enum"), 1]);
817 Assert.AreEqual(foreignFoo, message[f("repeated_foreign_enum"), 1]);
818 Assert.AreEqual(importFoo, message[f("repeated_import_enum"), 1]);
Jon Skeet68036862008-10-22 13:30:34 +0100819
820 Assert.AreEqual("524", message[f("repeated_string_piece"), 1]);
821 Assert.AreEqual("525", message[f("repeated_cord"), 1]);
822 }
Jon Skeet642a8142009-01-27 12:25:21 +0000823
824 /// <summary>
825 /// Verifies that the reflection setters for the given Builder object throw an
826 /// ArgumentNullException if they are passed a null value.
827 /// </summary>
828 public void AssertReflectionSettersRejectNull(IBuilder builder) {
829 TestUtil.AssertArgumentNullException(() => builder[f("optional_string")] = null);
830 TestUtil.AssertArgumentNullException(() => builder[f("optional_bytes")] = null);
831 TestUtil.AssertArgumentNullException(() => builder[f("optional_nested_enum")] = null);
832 TestUtil.AssertArgumentNullException(() => builder[f("optional_nested_message")] = null);
833 TestUtil.AssertArgumentNullException(() => builder[f("optional_nested_message")] = null);
834 TestUtil.AssertArgumentNullException(() => builder.WeakAddRepeatedField(f("repeated_string"), null));
835 TestUtil.AssertArgumentNullException(() => builder.WeakAddRepeatedField(f("repeated_bytes"), null));
836 TestUtil.AssertArgumentNullException(() => builder.WeakAddRepeatedField(f("repeated_nested_enum"), null));
837 TestUtil.AssertArgumentNullException(() => builder.WeakAddRepeatedField(f("repeated_nested_message"), null));
838 }
839
840 /// <summary>
841 /// Verifies that the reflection repeated setters for the given Builder object throw an
842 /// ArgumentNullException if they are passed a null value.
843 /// </summary>
844 public void AssertReflectionRepeatedSettersRejectNull(IBuilder builder) {
845 builder.WeakAddRepeatedField(f("repeated_string"), "one");
846 TestUtil.AssertArgumentNullException(() => builder.SetRepeatedField(f("repeated_string"), 0, null));
847 builder.WeakAddRepeatedField(f("repeated_bytes"), TestUtil.ToBytes("one"));
848 TestUtil.AssertArgumentNullException(() => builder.SetRepeatedField(f("repeated_bytes"), 0, null));
849 builder.WeakAddRepeatedField(f("repeated_nested_enum"), nestedBaz);
850 TestUtil.AssertArgumentNullException(() => builder.SetRepeatedField(f("repeated_nested_enum"), 0, null));
851 builder.WeakAddRepeatedField(f("repeated_nested_message"),
852 new TestAllTypes.Types.NestedMessage.Builder { Bb = 218 }.Build());
853 TestUtil.AssertArgumentNullException(() => builder.SetRepeatedField(f("repeated_nested_message"), 0, null));
854 }
Jon Skeet25a28582009-02-18 16:06:22 +0000855
856 public void SetPackedFieldsViaReflection(IBuilder message) {
857 message.WeakAddRepeatedField(f("packed_int32"), 601);
858 message.WeakAddRepeatedField(f("packed_int64"), 602L);
859 message.WeakAddRepeatedField(f("packed_uint32"), 603U);
860 message.WeakAddRepeatedField(f("packed_uint64"), 604UL);
861 message.WeakAddRepeatedField(f("packed_sint32"), 605);
862 message.WeakAddRepeatedField(f("packed_sint64"), 606L);
863 message.WeakAddRepeatedField(f("packed_fixed32"), 607U);
864 message.WeakAddRepeatedField(f("packed_fixed64"), 608UL);
865 message.WeakAddRepeatedField(f("packed_sfixed32"), 609);
866 message.WeakAddRepeatedField(f("packed_sfixed64"), 610L);
867 message.WeakAddRepeatedField(f("packed_float"), 611F);
868 message.WeakAddRepeatedField(f("packed_double"), 612D);
869 message.WeakAddRepeatedField(f("packed_bool"), true);
870 message.WeakAddRepeatedField(f("packed_enum"), foreignBar);
871 // Add a second one of each field.
872 message.WeakAddRepeatedField(f("packed_int32"), 701);
873 message.WeakAddRepeatedField(f("packed_int64"), 702L);
874 message.WeakAddRepeatedField(f("packed_uint32"), 703U);
875 message.WeakAddRepeatedField(f("packed_uint64"), 704UL);
876 message.WeakAddRepeatedField(f("packed_sint32"), 705);
877 message.WeakAddRepeatedField(f("packed_sint64"), 706L);
878 message.WeakAddRepeatedField(f("packed_fixed32"), 707U);
879 message.WeakAddRepeatedField(f("packed_fixed64"), 708UL);
880 message.WeakAddRepeatedField(f("packed_sfixed32"), 709);
881 message.WeakAddRepeatedField(f("packed_sfixed64"), 710L);
882 message.WeakAddRepeatedField(f("packed_float"), 711F);
883 message.WeakAddRepeatedField(f("packed_double"), 712D);
884 message.WeakAddRepeatedField(f("packed_bool"), false);
885 message.WeakAddRepeatedField(f("packed_enum"), foreignBaz);
886 }
887
888 public void AssertPackedFieldsSetViaReflection(IMessage message) {
889 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_int32")));
890 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_int64")));
891 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_uint32")));
892 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_uint64")));
893 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_sint32")));
894 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_sint64")));
895 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_fixed32")));
896 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_fixed64")));
897 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_sfixed32")));
898 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_sfixed64")));
899 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_float")));
900 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_double")));
901 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_bool")));
902 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_enum")));
903 Assert.AreEqual(601, message[f("packed_int32"), 0]);
904 Assert.AreEqual(602L, message[f("packed_int64"), 0]);
905 Assert.AreEqual(603, message[f("packed_uint32"), 0]);
906 Assert.AreEqual(604L, message[f("packed_uint64"), 0]);
907 Assert.AreEqual(605, message[f("packed_sint32"), 0]);
908 Assert.AreEqual(606L, message[f("packed_sint64"), 0]);
909 Assert.AreEqual(607, message[f("packed_fixed32"), 0]);
910 Assert.AreEqual(608L, message[f("packed_fixed64"), 0]);
911 Assert.AreEqual(609, message[f("packed_sfixed32"), 0]);
912 Assert.AreEqual(610L, message[f("packed_sfixed64"), 0]);
913 Assert.AreEqual(611F, message[f("packed_float"), 0]);
914 Assert.AreEqual(612D, message[f("packed_double"), 0]);
915 Assert.AreEqual(true, message[f("packed_bool"), 0]);
916 Assert.AreEqual(foreignBar, message[f("packed_enum"), 0]);
917 Assert.AreEqual(701, message[f("packed_int32"), 1]);
918 Assert.AreEqual(702L, message[f("packed_int64"), 1]);
919 Assert.AreEqual(703, message[f("packed_uint32"), 1]);
920 Assert.AreEqual(704L, message[f("packed_uint64"), 1]);
921 Assert.AreEqual(705, message[f("packed_sint32"), 1]);
922 Assert.AreEqual(706L, message[f("packed_sint64"), 1]);
923 Assert.AreEqual(707, message[f("packed_fixed32"), 1]);
924 Assert.AreEqual(708L, message[f("packed_fixed64"), 1]);
925 Assert.AreEqual(709, message[f("packed_sfixed32"), 1]);
926 Assert.AreEqual(710L, message[f("packed_sfixed64"), 1]);
927 Assert.AreEqual(711F, message[f("packed_float"), 1]);
928 Assert.AreEqual(712D, message[f("packed_double"), 1]);
929 Assert.AreEqual(false, message[f("packed_bool"), 1]);
930 Assert.AreEqual(foreignBaz, message[f("packed_enum"), 1]);
931 }
Jon Skeet68036862008-10-22 13:30:34 +0100932 }
933}