blob: 5f323228b99f640451d36de3be7f58e0b989117d [file] [log] [blame]
csharptest71f662c2011-05-20 15:15:34 -05001#region Copyright notice and license
2
3// Protocol Buffers - Google's data interchange format
4// Copyright 2008 Google Inc. All rights reserved.
5// http://github.com/jskeet/dotnet-protobufs/
6// Original C++/Java/Python code:
7// http://code.google.com/p/protobuf/
8//
9// Redistribution and use in source and binary forms, with or without
10// modification, are permitted provided that the following conditions are
11// met:
12//
13// * Redistributions of source code must retain the above copyright
14// notice, this list of conditions and the following disclaimer.
15// * Redistributions in binary form must reproduce the above
16// copyright notice, this list of conditions and the following disclaimer
17// in the documentation and/or other materials provided with the
18// distribution.
19// * Neither the name of Google Inc. nor the names of its
20// contributors may be used to endorse or promote products derived from
21// this software without specific prior written permission.
22//
23// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
35#endregion
36
37using System;
38using Google.ProtocolBuffers.Descriptors;
39using Google.ProtocolBuffers.TestProtos;
40using NUnit.Framework;
41
42namespace Google.ProtocolBuffers
43{
44 /// <summary>
45 /// Performs the same things that the methods of TestUtil do, but
46 /// via the reflection interface. This is its own class because it needs
47 /// to know what descriptor to use.
48 /// </summary>
49 internal class ReflectionTester
50 {
51 private readonly MessageDescriptor baseDescriptor;
52 private readonly ExtensionRegistry extensionRegistry;
53
54 private readonly FileDescriptor file;
55 private readonly FileDescriptor importFile;
56
57 private readonly MessageDescriptor optionalGroup;
58 private readonly MessageDescriptor repeatedGroup;
59 private readonly MessageDescriptor nestedMessage;
60 private readonly MessageDescriptor foreignMessage;
61 private readonly MessageDescriptor importMessage;
62
63 private readonly FieldDescriptor groupA;
64 private readonly FieldDescriptor repeatedGroupA;
65 private readonly FieldDescriptor nestedB;
66 private readonly FieldDescriptor foreignC;
67 private readonly FieldDescriptor importD;
68
69 private readonly EnumDescriptor nestedEnum;
70 private readonly EnumDescriptor foreignEnum;
71 private readonly EnumDescriptor importEnum;
72
73 private readonly EnumValueDescriptor nestedFoo;
74 private readonly EnumValueDescriptor nestedBar;
75 private readonly EnumValueDescriptor nestedBaz;
76 private readonly EnumValueDescriptor foreignFoo;
77 private readonly EnumValueDescriptor foreignBar;
78 private readonly EnumValueDescriptor foreignBaz;
79 private readonly EnumValueDescriptor importFoo;
80 private readonly EnumValueDescriptor importBar;
81 private readonly EnumValueDescriptor importBaz;
82
83 /// <summary>
84 /// Constructs an instance that will expect messages using the given
85 /// descriptor. Normally <paramref name="baseDescriptor"/> should be
86 /// a descriptor for TestAllTypes. However, if extensionRegistry is non-null,
87 /// then baseDescriptor should be for TestAllExtensions instead, and instead of
88 /// reading and writing normal fields, the tester will read and write extensions.
89 /// All of the TestAllExtensions extensions must be registered in the registry.
90 /// </summary>
91 private ReflectionTester(MessageDescriptor baseDescriptor,
92 ExtensionRegistry extensionRegistry)
93 {
94 this.baseDescriptor = baseDescriptor;
95 this.extensionRegistry = extensionRegistry;
96
97 this.file = baseDescriptor.File;
98 // TODO(jonskeet): We've got 2 dependencies, not 1 - because of the C# options. Hmm.
99 // Assert.AreEqual(1, file.Dependencies.Count);
100 // TODO(jonskeet): Find dependency by name instead of number?
101 this.importFile = file.Dependencies[1];
102
103 MessageDescriptor testAllTypes;
104 if (baseDescriptor.Name == "TestAllTypes")
105 {
106 testAllTypes = baseDescriptor;
107 }
108 else
109 {
110 testAllTypes = file.FindTypeByName<MessageDescriptor>("TestAllTypes");
111 Assert.IsNotNull(testAllTypes);
112 }
113
114 if (extensionRegistry == null)
115 {
116 // Use testAllTypes, rather than baseDescriptor, to allow
117 // initialization using TestPackedTypes descriptors. These objects
118 // won't be used by the methods for packed fields.
119 this.optionalGroup =
120 testAllTypes.FindDescriptor<MessageDescriptor>("OptionalGroup");
121 this.repeatedGroup =
122 testAllTypes.FindDescriptor<MessageDescriptor>("RepeatedGroup");
123 }
124 else
125 {
126 this.optionalGroup =
127 file.FindTypeByName<MessageDescriptor>("OptionalGroup_extension");
128 this.repeatedGroup =
129 file.FindTypeByName<MessageDescriptor>("RepeatedGroup_extension");
130 }
131 this.nestedMessage = testAllTypes.FindDescriptor<MessageDescriptor>("NestedMessage");
132 this.foreignMessage = file.FindTypeByName<MessageDescriptor>("ForeignMessage");
133 this.importMessage = importFile.FindTypeByName<MessageDescriptor>("ImportMessage");
134
135 this.nestedEnum = testAllTypes.FindDescriptor<EnumDescriptor>("NestedEnum");
136 this.foreignEnum = file.FindTypeByName<EnumDescriptor>("ForeignEnum");
137 this.importEnum = importFile.FindTypeByName<EnumDescriptor>("ImportEnum");
138
139 Assert.IsNotNull(optionalGroup);
140 Assert.IsNotNull(repeatedGroup);
141 Assert.IsNotNull(nestedMessage);
142 Assert.IsNotNull(foreignMessage);
143 Assert.IsNotNull(importMessage);
144 Assert.IsNotNull(nestedEnum);
145 Assert.IsNotNull(foreignEnum);
146 Assert.IsNotNull(importEnum);
147
148 this.nestedB = nestedMessage.FindDescriptor<FieldDescriptor>("bb");
149 this.foreignC = foreignMessage.FindDescriptor<FieldDescriptor>("c");
150 this.importD = importMessage.FindDescriptor<FieldDescriptor>("d");
151 this.nestedFoo = nestedEnum.FindValueByName("FOO");
152 this.nestedBar = nestedEnum.FindValueByName("BAR");
153 this.nestedBaz = nestedEnum.FindValueByName("BAZ");
154 this.foreignFoo = foreignEnum.FindValueByName("FOREIGN_FOO");
155 this.foreignBar = foreignEnum.FindValueByName("FOREIGN_BAR");
156 this.foreignBaz = foreignEnum.FindValueByName("FOREIGN_BAZ");
157 this.importFoo = importEnum.FindValueByName("IMPORT_FOO");
158 this.importBar = importEnum.FindValueByName("IMPORT_BAR");
159 this.importBaz = importEnum.FindValueByName("IMPORT_BAZ");
160
161 this.groupA = optionalGroup.FindDescriptor<FieldDescriptor>("a");
162 this.repeatedGroupA = repeatedGroup.FindDescriptor<FieldDescriptor>("a");
163
164 Assert.IsNotNull(groupA);
165 Assert.IsNotNull(repeatedGroupA);
166 Assert.IsNotNull(nestedB);
167 Assert.IsNotNull(foreignC);
168 Assert.IsNotNull(importD);
169 Assert.IsNotNull(nestedFoo);
170 Assert.IsNotNull(nestedBar);
171 Assert.IsNotNull(nestedBaz);
172 Assert.IsNotNull(foreignFoo);
173 Assert.IsNotNull(foreignBar);
174 Assert.IsNotNull(foreignBaz);
175 Assert.IsNotNull(importFoo);
176 Assert.IsNotNull(importBar);
177 Assert.IsNotNull(importBaz);
178 }
179
180 /// <summary>
181 /// Creates an instance for the TestAllTypes message, with no extension registry.
182 /// </summary>
183 public static ReflectionTester CreateTestAllTypesInstance()
184 {
185 return new ReflectionTester(TestAllTypes.Descriptor, null);
186 }
187
188 /// <summary>
189 /// Creates an instance for the TestAllExtensions message, with an
190 /// extension registry from TestUtil.CreateExtensionRegistry.
191 /// </summary>
192 public static ReflectionTester CreateTestAllExtensionsInstance()
193 {
194 return new ReflectionTester(TestAllExtensions.Descriptor, TestUtil.CreateExtensionRegistry());
195 }
196
197 /// <summary>
198 /// Creates an instance for the TestPackedTypes message, with no extensions.
199 /// </summary>
200 public static ReflectionTester CreateTestPackedTypesInstance()
201 {
202 return new ReflectionTester(TestPackedTypes.Descriptor, null);
203 }
204
205 /// <summary>
206 /// Shorthand to get a FieldDescriptor for a field of unittest::TestAllTypes.
207 /// </summary>
208 private FieldDescriptor f(String name)
209 {
210 FieldDescriptor result;
211 if (extensionRegistry == null)
212 {
213 result = baseDescriptor.FindDescriptor<FieldDescriptor>(name);
214 }
215 else
216 {
217 result = file.FindTypeByName<FieldDescriptor>(name + "_extension");
218 }
219 Assert.IsNotNull(result);
220 return result;
221 }
222
223 /// <summary>
224 /// Calls parent.CreateBuilderForField() or uses the extension registry
225 /// to find an appropriate builder, depending on what type is being tested.
226 /// </summary>
227 private IBuilder CreateBuilderForField(IBuilder parent, FieldDescriptor field)
228 {
229 if (extensionRegistry == null)
230 {
231 return parent.CreateBuilderForField(field);
232 }
233 else
234 {
235 ExtensionInfo extension = extensionRegistry[field.ContainingType, field.FieldNumber];
236 Assert.IsNotNull(extension);
237 Assert.IsNotNull(extension.DefaultInstance);
238 return (IBuilder) extension.DefaultInstance.WeakCreateBuilderForType();
239 }
240 }
241
242 /// <summary>
243 /// Sets every field of the message to the values expected by
244 /// AssertAllFieldsSet, using the reflection interface.
245 /// </summary>
246 /// <param name="message"></param>
247 internal void SetAllFieldsViaReflection(IBuilder message)
248 {
249 message[f("optional_int32")] = 101;
250 message[f("optional_int64")] = 102L;
251 message[f("optional_uint32")] = 103U;
252 message[f("optional_uint64")] = 104UL;
253 message[f("optional_sint32")] = 105;
254 message[f("optional_sint64")] = 106L;
255 message[f("optional_fixed32")] = 107U;
256 message[f("optional_fixed64")] = 108UL;
257 message[f("optional_sfixed32")] = 109;
258 message[f("optional_sfixed64")] = 110L;
259 message[f("optional_float")] = 111F;
260 message[f("optional_double")] = 112D;
261 message[f("optional_bool")] = true;
262 message[f("optional_string")] = "115";
263 message[f("optional_bytes")] = TestUtil.ToBytes("116");
264
265 message[f("optionalgroup")] =
266 CreateBuilderForField(message, f("optionalgroup")).SetField(groupA, 117).WeakBuild();
267 message[f("optional_nested_message")] =
268 CreateBuilderForField(message, f("optional_nested_message")).SetField(nestedB, 118).WeakBuild();
269 message[f("optional_foreign_message")] =
270 CreateBuilderForField(message, f("optional_foreign_message")).SetField(foreignC, 119).WeakBuild();
271 message[f("optional_import_message")] =
272 CreateBuilderForField(message, f("optional_import_message")).SetField(importD, 120).WeakBuild();
273
274 message[f("optional_nested_enum")] = nestedBaz;
275 message[f("optional_foreign_enum")] = foreignBaz;
276 message[f("optional_import_enum")] = importBaz;
277
278 message[f("optional_string_piece")] = "124";
279 message[f("optional_cord")] = "125";
280
281 // -----------------------------------------------------------------
282
283 message.WeakAddRepeatedField(f("repeated_int32"), 201);
284 message.WeakAddRepeatedField(f("repeated_int64"), 202L);
285 message.WeakAddRepeatedField(f("repeated_uint32"), 203U);
286 message.WeakAddRepeatedField(f("repeated_uint64"), 204UL);
287 message.WeakAddRepeatedField(f("repeated_sint32"), 205);
288 message.WeakAddRepeatedField(f("repeated_sint64"), 206L);
289 message.WeakAddRepeatedField(f("repeated_fixed32"), 207U);
290 message.WeakAddRepeatedField(f("repeated_fixed64"), 208UL);
291 message.WeakAddRepeatedField(f("repeated_sfixed32"), 209);
292 message.WeakAddRepeatedField(f("repeated_sfixed64"), 210L);
293 message.WeakAddRepeatedField(f("repeated_float"), 211F);
294 message.WeakAddRepeatedField(f("repeated_double"), 212D);
295 message.WeakAddRepeatedField(f("repeated_bool"), true);
296 message.WeakAddRepeatedField(f("repeated_string"), "215");
297 message.WeakAddRepeatedField(f("repeated_bytes"), TestUtil.ToBytes("216"));
298
299
300 message.WeakAddRepeatedField(f("repeatedgroup"),
301 CreateBuilderForField(message, f("repeatedgroup")).SetField(repeatedGroupA, 217)
302 .WeakBuild());
303 message.WeakAddRepeatedField(f("repeated_nested_message"),
304 CreateBuilderForField(message, f("repeated_nested_message")).SetField(nestedB,
305 218).
306 WeakBuild());
307 message.WeakAddRepeatedField(f("repeated_foreign_message"),
308 CreateBuilderForField(message, f("repeated_foreign_message")).SetField(
309 foreignC, 219).WeakBuild());
310 message.WeakAddRepeatedField(f("repeated_import_message"),
311 CreateBuilderForField(message, f("repeated_import_message")).SetField(importD,
312 220).
313 WeakBuild());
314
315 message.WeakAddRepeatedField(f("repeated_nested_enum"), nestedBar);
316 message.WeakAddRepeatedField(f("repeated_foreign_enum"), foreignBar);
317 message.WeakAddRepeatedField(f("repeated_import_enum"), importBar);
318
319 message.WeakAddRepeatedField(f("repeated_string_piece"), "224");
320 message.WeakAddRepeatedField(f("repeated_cord"), "225");
321
322 // Add a second one of each field.
323 message.WeakAddRepeatedField(f("repeated_int32"), 301);
324 message.WeakAddRepeatedField(f("repeated_int64"), 302L);
325 message.WeakAddRepeatedField(f("repeated_uint32"), 303U);
326 message.WeakAddRepeatedField(f("repeated_uint64"), 304UL);
327 message.WeakAddRepeatedField(f("repeated_sint32"), 305);
328 message.WeakAddRepeatedField(f("repeated_sint64"), 306L);
329 message.WeakAddRepeatedField(f("repeated_fixed32"), 307U);
330 message.WeakAddRepeatedField(f("repeated_fixed64"), 308UL);
331 message.WeakAddRepeatedField(f("repeated_sfixed32"), 309);
332 message.WeakAddRepeatedField(f("repeated_sfixed64"), 310L);
333 message.WeakAddRepeatedField(f("repeated_float"), 311F);
334 message.WeakAddRepeatedField(f("repeated_double"), 312D);
335 message.WeakAddRepeatedField(f("repeated_bool"), false);
336 message.WeakAddRepeatedField(f("repeated_string"), "315");
337 message.WeakAddRepeatedField(f("repeated_bytes"), TestUtil.ToBytes("316"));
338
339 message.WeakAddRepeatedField(f("repeatedgroup"),
340 CreateBuilderForField(message, f("repeatedgroup"))
341 .SetField(repeatedGroupA, 317).WeakBuild());
342 message.WeakAddRepeatedField(f("repeated_nested_message"),
343 CreateBuilderForField(message, f("repeated_nested_message"))
344 .SetField(nestedB, 318).WeakBuild());
345 message.WeakAddRepeatedField(f("repeated_foreign_message"),
346 CreateBuilderForField(message, f("repeated_foreign_message"))
347 .SetField(foreignC, 319).WeakBuild());
348 message.WeakAddRepeatedField(f("repeated_import_message"),
349 CreateBuilderForField(message, f("repeated_import_message"))
350 .SetField(importD, 320).WeakBuild());
351
352 message.WeakAddRepeatedField(f("repeated_nested_enum"), nestedBaz);
353 message.WeakAddRepeatedField(f("repeated_foreign_enum"), foreignBaz);
354 message.WeakAddRepeatedField(f("repeated_import_enum"), importBaz);
355
356 message.WeakAddRepeatedField(f("repeated_string_piece"), "324");
357 message.WeakAddRepeatedField(f("repeated_cord"), "325");
358
359 // -----------------------------------------------------------------
360
361 message[f("default_int32")] = 401;
362 message[f("default_int64")] = 402L;
363 message[f("default_uint32")] = 403U;
364 message[f("default_uint64")] = 404UL;
365 message[f("default_sint32")] = 405;
366 message[f("default_sint64")] = 406L;
367 message[f("default_fixed32")] = 407U;
368 message[f("default_fixed64")] = 408UL;
369 message[f("default_sfixed32")] = 409;
370 message[f("default_sfixed64")] = 410L;
371 message[f("default_float")] = 411F;
372 message[f("default_double")] = 412D;
373 message[f("default_bool")] = false;
374 message[f("default_string")] = "415";
375 message[f("default_bytes")] = TestUtil.ToBytes("416");
376
377 message[f("default_nested_enum")] = nestedFoo;
378 message[f("default_foreign_enum")] = foreignFoo;
379 message[f("default_import_enum")] = importFoo;
380
381 message[f("default_string_piece")] = "424";
382 message[f("default_cord")] = "425";
383 }
384
385 // -------------------------------------------------------------------
386
387 /// <summary>
388 /// Modify the repeated fields of the specified message to contain the
389 /// values expected by AssertRepeatedFieldsModified, using the IBuilder
390 /// reflection interface.
391 /// </summary>
392 internal void ModifyRepeatedFieldsViaReflection(IBuilder message)
393 {
394 message[f("repeated_int32"), 1] = 501;
395 message[f("repeated_int64"), 1] = 502L;
396 message[f("repeated_uint32"), 1] = 503U;
397 message[f("repeated_uint64"), 1] = 504UL;
398 message[f("repeated_sint32"), 1] = 505;
399 message[f("repeated_sint64"), 1] = 506L;
400 message[f("repeated_fixed32"), 1] = 507U;
401 message[f("repeated_fixed64"), 1] = 508UL;
402 message[f("repeated_sfixed32"), 1] = 509;
403 message[f("repeated_sfixed64"), 1] = 510L;
404 message[f("repeated_float"), 1] = 511F;
405 message[f("repeated_double"), 1] = 512D;
406 message[f("repeated_bool"), 1] = true;
407 message[f("repeated_string"), 1] = "515";
408 message.SetRepeatedField(f("repeated_bytes"), 1, TestUtil.ToBytes("516"));
409
410 message.SetRepeatedField(f("repeatedgroup"), 1,
411 CreateBuilderForField(message, f("repeatedgroup")).SetField(repeatedGroupA, 517).
412 WeakBuild());
413 message.SetRepeatedField(f("repeated_nested_message"), 1,
414 CreateBuilderForField(message, f("repeated_nested_message")).SetField(nestedB, 518)
415 .WeakBuild());
416 message.SetRepeatedField(f("repeated_foreign_message"), 1,
417 CreateBuilderForField(message, f("repeated_foreign_message")).SetField(foreignC,
418 519).
419 WeakBuild());
420 message.SetRepeatedField(f("repeated_import_message"), 1,
421 CreateBuilderForField(message, f("repeated_import_message")).SetField(importD, 520)
422 .WeakBuild());
423
424 message[f("repeated_nested_enum"), 1] = nestedFoo;
425 message[f("repeated_foreign_enum"), 1] = foreignFoo;
426 message[f("repeated_import_enum"), 1] = importFoo;
427
428 message[f("repeated_string_piece"), 1] = "524";
429 message[f("repeated_cord"), 1] = "525";
430 }
431
432 // -------------------------------------------------------------------
433
434 /// <summary>
435 /// Asserts that all fields of the specified message are set to the values
436 /// assigned by SetAllFields, using the IMessage reflection interface.
437 /// </summary>
438 public void AssertAllFieldsSetViaReflection(IMessage message)
439 {
440 Assert.IsTrue(message.HasField(f("optional_int32")));
441 Assert.IsTrue(message.HasField(f("optional_int64")));
442 Assert.IsTrue(message.HasField(f("optional_uint32")));
443 Assert.IsTrue(message.HasField(f("optional_uint64")));
444 Assert.IsTrue(message.HasField(f("optional_sint32")));
445 Assert.IsTrue(message.HasField(f("optional_sint64")));
446 Assert.IsTrue(message.HasField(f("optional_fixed32")));
447 Assert.IsTrue(message.HasField(f("optional_fixed64")));
448 Assert.IsTrue(message.HasField(f("optional_sfixed32")));
449 Assert.IsTrue(message.HasField(f("optional_sfixed64")));
450 Assert.IsTrue(message.HasField(f("optional_float")));
451 Assert.IsTrue(message.HasField(f("optional_double")));
452 Assert.IsTrue(message.HasField(f("optional_bool")));
453 Assert.IsTrue(message.HasField(f("optional_string")));
454 Assert.IsTrue(message.HasField(f("optional_bytes")));
455
456 Assert.IsTrue(message.HasField(f("optionalgroup")));
457 Assert.IsTrue(message.HasField(f("optional_nested_message")));
458 Assert.IsTrue(message.HasField(f("optional_foreign_message")));
459 Assert.IsTrue(message.HasField(f("optional_import_message")));
460
461 Assert.IsTrue(((IMessage) message[f("optionalgroup")]).HasField(groupA));
462 Assert.IsTrue(((IMessage) message[f("optional_nested_message")]).HasField(nestedB));
463 Assert.IsTrue(((IMessage) message[f("optional_foreign_message")]).HasField(foreignC));
464 Assert.IsTrue(((IMessage) message[f("optional_import_message")]).HasField(importD));
465
466 Assert.IsTrue(message.HasField(f("optional_nested_enum")));
467 Assert.IsTrue(message.HasField(f("optional_foreign_enum")));
468 Assert.IsTrue(message.HasField(f("optional_import_enum")));
469
470 Assert.IsTrue(message.HasField(f("optional_string_piece")));
471 Assert.IsTrue(message.HasField(f("optional_cord")));
472
473 Assert.AreEqual(101, message[f("optional_int32")]);
474 Assert.AreEqual(102L, message[f("optional_int64")]);
475 Assert.AreEqual(103U, message[f("optional_uint32")]);
476 Assert.AreEqual(104UL, message[f("optional_uint64")]);
477 Assert.AreEqual(105, message[f("optional_sint32")]);
478 Assert.AreEqual(106L, message[f("optional_sint64")]);
479 Assert.AreEqual(107U, message[f("optional_fixed32")]);
480 Assert.AreEqual(108UL, message[f("optional_fixed64")]);
481 Assert.AreEqual(109, message[f("optional_sfixed32")]);
482 Assert.AreEqual(110L, message[f("optional_sfixed64")]);
483 Assert.AreEqual(111F, message[f("optional_float")]);
484 Assert.AreEqual(112D, message[f("optional_double")]);
485 Assert.AreEqual(true, message[f("optional_bool")]);
486 Assert.AreEqual("115", message[f("optional_string")]);
487 Assert.AreEqual(TestUtil.ToBytes("116"), message[f("optional_bytes")]);
488
489 Assert.AreEqual(117, ((IMessage) message[f("optionalgroup")])[groupA]);
490 Assert.AreEqual(118, ((IMessage) message[f("optional_nested_message")])[nestedB]);
491 Assert.AreEqual(119, ((IMessage) message[f("optional_foreign_message")])[foreignC]);
492 Assert.AreEqual(120, ((IMessage) message[f("optional_import_message")])[importD]);
493
494 Assert.AreEqual(nestedBaz, message[f("optional_nested_enum")]);
495 Assert.AreEqual(foreignBaz, message[f("optional_foreign_enum")]);
496 Assert.AreEqual(importBaz, message[f("optional_import_enum")]);
497
498 Assert.AreEqual("124", message[f("optional_string_piece")]);
499 Assert.AreEqual("125", message[f("optional_cord")]);
500
501 // -----------------------------------------------------------------
502
503 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_int32")));
504 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_int64")));
505 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_uint32")));
506 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_uint64")));
507 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_sint32")));
508 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_sint64")));
509 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_fixed32")));
510 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_fixed64")));
511 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_sfixed32")));
512 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_sfixed64")));
513 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_float")));
514 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_double")));
515 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_bool")));
516 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_string")));
517 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_bytes")));
518
519 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeatedgroup")));
520 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_nested_message")));
521 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_foreign_message")));
522 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_import_message")));
523 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_nested_enum")));
524 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_foreign_enum")));
525 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_import_enum")));
526
527 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_string_piece")));
528 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_cord")));
529
530 Assert.AreEqual(201, message[f("repeated_int32"), 0]);
531 Assert.AreEqual(202L, message[f("repeated_int64"), 0]);
532 Assert.AreEqual(203U, message[f("repeated_uint32"), 0]);
533 Assert.AreEqual(204UL, message[f("repeated_uint64"), 0]);
534 Assert.AreEqual(205, message[f("repeated_sint32"), 0]);
535 Assert.AreEqual(206L, message[f("repeated_sint64"), 0]);
536 Assert.AreEqual(207U, message[f("repeated_fixed32"), 0]);
537 Assert.AreEqual(208UL, message[f("repeated_fixed64"), 0]);
538 Assert.AreEqual(209, message[f("repeated_sfixed32"), 0]);
539 Assert.AreEqual(210L, message[f("repeated_sfixed64"), 0]);
540 Assert.AreEqual(211F, message[f("repeated_float"), 0]);
541 Assert.AreEqual(212D, message[f("repeated_double"), 0]);
542 Assert.AreEqual(true, message[f("repeated_bool"), 0]);
543 Assert.AreEqual("215", message[f("repeated_string"), 0]);
544 Assert.AreEqual(TestUtil.ToBytes("216"), message[f("repeated_bytes"), 0]);
545
546 Assert.AreEqual(217, ((IMessage) message[f("repeatedgroup"), 0])[repeatedGroupA]);
547 Assert.AreEqual(218, ((IMessage) message[f("repeated_nested_message"), 0])[nestedB]);
548 Assert.AreEqual(219, ((IMessage) message[f("repeated_foreign_message"), 0])[foreignC]);
549 Assert.AreEqual(220, ((IMessage) message[f("repeated_import_message"), 0])[importD]);
550
551 Assert.AreEqual(nestedBar, message[f("repeated_nested_enum"), 0]);
552 Assert.AreEqual(foreignBar, message[f("repeated_foreign_enum"), 0]);
553 Assert.AreEqual(importBar, message[f("repeated_import_enum"), 0]);
554
555 Assert.AreEqual("224", message[f("repeated_string_piece"), 0]);
556 Assert.AreEqual("225", message[f("repeated_cord"), 0]);
557
558 Assert.AreEqual(301, message[f("repeated_int32"), 1]);
559 Assert.AreEqual(302L, message[f("repeated_int64"), 1]);
560 Assert.AreEqual(303U, message[f("repeated_uint32"), 1]);
561 Assert.AreEqual(304UL, message[f("repeated_uint64"), 1]);
562 Assert.AreEqual(305, message[f("repeated_sint32"), 1]);
563 Assert.AreEqual(306L, message[f("repeated_sint64"), 1]);
564 Assert.AreEqual(307U, message[f("repeated_fixed32"), 1]);
565 Assert.AreEqual(308UL, message[f("repeated_fixed64"), 1]);
566 Assert.AreEqual(309, message[f("repeated_sfixed32"), 1]);
567 Assert.AreEqual(310L, message[f("repeated_sfixed64"), 1]);
568 Assert.AreEqual(311F, message[f("repeated_float"), 1]);
569 Assert.AreEqual(312D, message[f("repeated_double"), 1]);
570 Assert.AreEqual(false, message[f("repeated_bool"), 1]);
571 Assert.AreEqual("315", message[f("repeated_string"), 1]);
572 Assert.AreEqual(TestUtil.ToBytes("316"), message[f("repeated_bytes"), 1]);
573
574 Assert.AreEqual(317, ((IMessage) message[f("repeatedgroup"), 1])[repeatedGroupA]);
575 Assert.AreEqual(318, ((IMessage) message[f("repeated_nested_message"), 1])[nestedB]);
576 Assert.AreEqual(319, ((IMessage) message[f("repeated_foreign_message"), 1])[foreignC]);
577 Assert.AreEqual(320, ((IMessage) message[f("repeated_import_message"), 1])[importD]);
578
579 Assert.AreEqual(nestedBaz, message[f("repeated_nested_enum"), 1]);
580 Assert.AreEqual(foreignBaz, message[f("repeated_foreign_enum"), 1]);
581 Assert.AreEqual(importBaz, message[f("repeated_import_enum"), 1]);
582
583 Assert.AreEqual("324", message[f("repeated_string_piece"), 1]);
584 Assert.AreEqual("325", message[f("repeated_cord"), 1]);
585
586 // -----------------------------------------------------------------
587
588 Assert.IsTrue(message.HasField(f("default_int32")));
589 Assert.IsTrue(message.HasField(f("default_int64")));
590 Assert.IsTrue(message.HasField(f("default_uint32")));
591 Assert.IsTrue(message.HasField(f("default_uint64")));
592 Assert.IsTrue(message.HasField(f("default_sint32")));
593 Assert.IsTrue(message.HasField(f("default_sint64")));
594 Assert.IsTrue(message.HasField(f("default_fixed32")));
595 Assert.IsTrue(message.HasField(f("default_fixed64")));
596 Assert.IsTrue(message.HasField(f("default_sfixed32")));
597 Assert.IsTrue(message.HasField(f("default_sfixed64")));
598 Assert.IsTrue(message.HasField(f("default_float")));
599 Assert.IsTrue(message.HasField(f("default_double")));
600 Assert.IsTrue(message.HasField(f("default_bool")));
601 Assert.IsTrue(message.HasField(f("default_string")));
602 Assert.IsTrue(message.HasField(f("default_bytes")));
603
604 Assert.IsTrue(message.HasField(f("default_nested_enum")));
605 Assert.IsTrue(message.HasField(f("default_foreign_enum")));
606 Assert.IsTrue(message.HasField(f("default_import_enum")));
607
608 Assert.IsTrue(message.HasField(f("default_string_piece")));
609 Assert.IsTrue(message.HasField(f("default_cord")));
610
611 Assert.AreEqual(401, message[f("default_int32")]);
612 Assert.AreEqual(402L, message[f("default_int64")]);
613 Assert.AreEqual(403U, message[f("default_uint32")]);
614 Assert.AreEqual(404UL, message[f("default_uint64")]);
615 Assert.AreEqual(405, message[f("default_sint32")]);
616 Assert.AreEqual(406L, message[f("default_sint64")]);
617 Assert.AreEqual(407U, message[f("default_fixed32")]);
618 Assert.AreEqual(408UL, message[f("default_fixed64")]);
619 Assert.AreEqual(409, message[f("default_sfixed32")]);
620 Assert.AreEqual(410L, message[f("default_sfixed64")]);
621 Assert.AreEqual(411F, message[f("default_float")]);
622 Assert.AreEqual(412D, message[f("default_double")]);
623 Assert.AreEqual(false, message[f("default_bool")]);
624 Assert.AreEqual("415", message[f("default_string")]);
625 Assert.AreEqual(TestUtil.ToBytes("416"), message[f("default_bytes")]);
626
627 Assert.AreEqual(nestedFoo, message[f("default_nested_enum")]);
628 Assert.AreEqual(foreignFoo, message[f("default_foreign_enum")]);
629 Assert.AreEqual(importFoo, message[f("default_import_enum")]);
630
631 Assert.AreEqual("424", message[f("default_string_piece")]);
632 Assert.AreEqual("425", message[f("default_cord")]);
633 }
634
635 /// <summary>
636 /// Assert that all fields of the message are cleared, and that
637 /// getting the fields returns their default values, using the reflection interface.
638 /// </summary>
639 public void AssertClearViaReflection(IMessage message)
640 {
641 // has_blah() should initially be false for all optional fields.
642 Assert.IsFalse(message.HasField(f("optional_int32")));
643 Assert.IsFalse(message.HasField(f("optional_int64")));
644 Assert.IsFalse(message.HasField(f("optional_uint32")));
645 Assert.IsFalse(message.HasField(f("optional_uint64")));
646 Assert.IsFalse(message.HasField(f("optional_sint32")));
647 Assert.IsFalse(message.HasField(f("optional_sint64")));
648 Assert.IsFalse(message.HasField(f("optional_fixed32")));
649 Assert.IsFalse(message.HasField(f("optional_fixed64")));
650 Assert.IsFalse(message.HasField(f("optional_sfixed32")));
651 Assert.IsFalse(message.HasField(f("optional_sfixed64")));
652 Assert.IsFalse(message.HasField(f("optional_float")));
653 Assert.IsFalse(message.HasField(f("optional_double")));
654 Assert.IsFalse(message.HasField(f("optional_bool")));
655 Assert.IsFalse(message.HasField(f("optional_string")));
656 Assert.IsFalse(message.HasField(f("optional_bytes")));
657
658 Assert.IsFalse(message.HasField(f("optionalgroup")));
659 Assert.IsFalse(message.HasField(f("optional_nested_message")));
660 Assert.IsFalse(message.HasField(f("optional_foreign_message")));
661 Assert.IsFalse(message.HasField(f("optional_import_message")));
662
663 Assert.IsFalse(message.HasField(f("optional_nested_enum")));
664 Assert.IsFalse(message.HasField(f("optional_foreign_enum")));
665 Assert.IsFalse(message.HasField(f("optional_import_enum")));
666
667 Assert.IsFalse(message.HasField(f("optional_string_piece")));
668 Assert.IsFalse(message.HasField(f("optional_cord")));
669
670 // Optional fields without defaults are set to zero or something like it.
671 Assert.AreEqual(0, message[f("optional_int32")]);
672 Assert.AreEqual(0L, message[f("optional_int64")]);
673 Assert.AreEqual(0U, message[f("optional_uint32")]);
674 Assert.AreEqual(0UL, message[f("optional_uint64")]);
675 Assert.AreEqual(0, message[f("optional_sint32")]);
676 Assert.AreEqual(0L, message[f("optional_sint64")]);
677 Assert.AreEqual(0U, message[f("optional_fixed32")]);
678 Assert.AreEqual(0UL, message[f("optional_fixed64")]);
679 Assert.AreEqual(0, message[f("optional_sfixed32")]);
680 Assert.AreEqual(0L, message[f("optional_sfixed64")]);
681 Assert.AreEqual(0F, message[f("optional_float")]);
682 Assert.AreEqual(0D, message[f("optional_double")]);
683 Assert.AreEqual(false, message[f("optional_bool")]);
684 Assert.AreEqual("", message[f("optional_string")]);
685 Assert.AreEqual(ByteString.Empty, message[f("optional_bytes")]);
686
687 // Embedded messages should also be clear.
688 Assert.IsFalse(((IMessage) message[f("optionalgroup")]).HasField(groupA));
689 Assert.IsFalse(((IMessage) message[f("optional_nested_message")])
690 .HasField(nestedB));
691 Assert.IsFalse(((IMessage) message[f("optional_foreign_message")])
692 .HasField(foreignC));
693 Assert.IsFalse(((IMessage) message[f("optional_import_message")])
694 .HasField(importD));
695
696 Assert.AreEqual(0, ((IMessage) message[f("optionalgroup")])[groupA]);
697 Assert.AreEqual(0, ((IMessage) message[f("optional_nested_message")])[nestedB]);
698 Assert.AreEqual(0, ((IMessage) message[f("optional_foreign_message")])[foreignC]);
699 Assert.AreEqual(0, ((IMessage) message[f("optional_import_message")])[importD]);
700
701 // Enums without defaults are set to the first value in the enum.
702 Assert.AreEqual(nestedFoo, message[f("optional_nested_enum")]);
703 Assert.AreEqual(foreignFoo, message[f("optional_foreign_enum")]);
704 Assert.AreEqual(importFoo, message[f("optional_import_enum")]);
705
706 Assert.AreEqual("", message[f("optional_string_piece")]);
707 Assert.AreEqual("", message[f("optional_cord")]);
708
709 // Repeated fields are empty.
710 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_int32")));
711 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_int64")));
712 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_uint32")));
713 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_uint64")));
714 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_sint32")));
715 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_sint64")));
716 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_fixed32")));
717 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_fixed64")));
718 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_sfixed32")));
719 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_sfixed64")));
720 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_float")));
721 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_double")));
722 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_bool")));
723 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_string")));
724 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_bytes")));
725
726 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeatedgroup")));
727 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_nested_message")));
728 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_foreign_message")));
729 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_import_message")));
730 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_nested_enum")));
731 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_foreign_enum")));
732 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_import_enum")));
733
734 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_string_piece")));
735 Assert.AreEqual(0, message.GetRepeatedFieldCount(f("repeated_cord")));
736
737 // has_blah() should also be false for all default fields.
738 Assert.IsFalse(message.HasField(f("default_int32")));
739 Assert.IsFalse(message.HasField(f("default_int64")));
740 Assert.IsFalse(message.HasField(f("default_uint32")));
741 Assert.IsFalse(message.HasField(f("default_uint64")));
742 Assert.IsFalse(message.HasField(f("default_sint32")));
743 Assert.IsFalse(message.HasField(f("default_sint64")));
744 Assert.IsFalse(message.HasField(f("default_fixed32")));
745 Assert.IsFalse(message.HasField(f("default_fixed64")));
746 Assert.IsFalse(message.HasField(f("default_sfixed32")));
747 Assert.IsFalse(message.HasField(f("default_sfixed64")));
748 Assert.IsFalse(message.HasField(f("default_float")));
749 Assert.IsFalse(message.HasField(f("default_double")));
750 Assert.IsFalse(message.HasField(f("default_bool")));
751 Assert.IsFalse(message.HasField(f("default_string")));
752 Assert.IsFalse(message.HasField(f("default_bytes")));
753
754 Assert.IsFalse(message.HasField(f("default_nested_enum")));
755 Assert.IsFalse(message.HasField(f("default_foreign_enum")));
756 Assert.IsFalse(message.HasField(f("default_import_enum")));
757
758 Assert.IsFalse(message.HasField(f("default_string_piece")));
759 Assert.IsFalse(message.HasField(f("default_cord")));
760
761 // Fields with defaults have their default values (duh).
762 Assert.AreEqual(41, message[f("default_int32")]);
763 Assert.AreEqual(42L, message[f("default_int64")]);
764 Assert.AreEqual(43U, message[f("default_uint32")]);
765 Assert.AreEqual(44UL, message[f("default_uint64")]);
766 Assert.AreEqual(-45, message[f("default_sint32")]);
767 Assert.AreEqual(46L, message[f("default_sint64")]);
768 Assert.AreEqual(47U, message[f("default_fixed32")]);
769 Assert.AreEqual(48UL, message[f("default_fixed64")]);
770 Assert.AreEqual(49, message[f("default_sfixed32")]);
771 Assert.AreEqual(-50L, message[f("default_sfixed64")]);
772 Assert.AreEqual(51.5F, message[f("default_float")]);
773 Assert.AreEqual(52e3D, message[f("default_double")]);
774 Assert.AreEqual(true, message[f("default_bool")]);
775 Assert.AreEqual("hello", message[f("default_string")]);
776 Assert.AreEqual(TestUtil.ToBytes("world"), message[f("default_bytes")]);
777
778 Assert.AreEqual(nestedBar, message[f("default_nested_enum")]);
779 Assert.AreEqual(foreignBar, message[f("default_foreign_enum")]);
780 Assert.AreEqual(importBar, message[f("default_import_enum")]);
781
782 Assert.AreEqual("abc", message[f("default_string_piece")]);
783 Assert.AreEqual("123", message[f("default_cord")]);
784 }
785
786 // ---------------------------------------------------------------
787
788 internal void AssertRepeatedFieldsModifiedViaReflection(IMessage message)
789 {
790 // ModifyRepeatedFields only sets the second repeated element of each
791 // field. In addition to verifying this, we also verify that the first
792 // element and size were *not* modified.
793 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_int32")));
794 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_int64")));
795 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_uint32")));
796 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_uint64")));
797 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_sint32")));
798 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_sint64")));
799 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_fixed32")));
800 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_fixed64")));
801 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_sfixed32")));
802 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_sfixed64")));
803 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_float")));
804 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_double")));
805 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_bool")));
806 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_string")));
807 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_bytes")));
808
809 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeatedgroup")));
810 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_nested_message")));
811 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_foreign_message")));
812 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_import_message")));
813 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_nested_enum")));
814 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_foreign_enum")));
815 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_import_enum")));
816
817 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_string_piece")));
818 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("repeated_cord")));
819
820 Assert.AreEqual(201, message[f("repeated_int32"), 0]);
821 Assert.AreEqual(202L, message[f("repeated_int64"), 0]);
822 Assert.AreEqual(203U, message[f("repeated_uint32"), 0]);
823 Assert.AreEqual(204UL, message[f("repeated_uint64"), 0]);
824 Assert.AreEqual(205, message[f("repeated_sint32"), 0]);
825 Assert.AreEqual(206L, message[f("repeated_sint64"), 0]);
826 Assert.AreEqual(207U, message[f("repeated_fixed32"), 0]);
827 Assert.AreEqual(208UL, message[f("repeated_fixed64"), 0]);
828 Assert.AreEqual(209, message[f("repeated_sfixed32"), 0]);
829 Assert.AreEqual(210L, message[f("repeated_sfixed64"), 0]);
830 Assert.AreEqual(211F, message[f("repeated_float"), 0]);
831 Assert.AreEqual(212D, message[f("repeated_double"), 0]);
832 Assert.AreEqual(true, message[f("repeated_bool"), 0]);
833 Assert.AreEqual("215", message[f("repeated_string"), 0]);
834 Assert.AreEqual(TestUtil.ToBytes("216"), message[f("repeated_bytes"), 0]);
835
836 Assert.AreEqual(217, ((IMessage) message[f("repeatedgroup"), 0])[repeatedGroupA]);
837 Assert.AreEqual(218, ((IMessage) message[f("repeated_nested_message"), 0])[nestedB]);
838 Assert.AreEqual(219, ((IMessage) message[f("repeated_foreign_message"), 0])[foreignC]);
839 Assert.AreEqual(220, ((IMessage) message[f("repeated_import_message"), 0])[importD]);
840
841 Assert.AreEqual(nestedBar, message[f("repeated_nested_enum"), 0]);
842 Assert.AreEqual(foreignBar, message[f("repeated_foreign_enum"), 0]);
843 Assert.AreEqual(importBar, message[f("repeated_import_enum"), 0]);
844
845 Assert.AreEqual("224", message[f("repeated_string_piece"), 0]);
846 Assert.AreEqual("225", message[f("repeated_cord"), 0]);
847
848 Assert.AreEqual(501, message[f("repeated_int32"), 1]);
849 Assert.AreEqual(502L, message[f("repeated_int64"), 1]);
850 Assert.AreEqual(503U, message[f("repeated_uint32"), 1]);
851 Assert.AreEqual(504UL, message[f("repeated_uint64"), 1]);
852 Assert.AreEqual(505, message[f("repeated_sint32"), 1]);
853 Assert.AreEqual(506L, message[f("repeated_sint64"), 1]);
854 Assert.AreEqual(507U, message[f("repeated_fixed32"), 1]);
855 Assert.AreEqual(508UL, message[f("repeated_fixed64"), 1]);
856 Assert.AreEqual(509, message[f("repeated_sfixed32"), 1]);
857 Assert.AreEqual(510L, message[f("repeated_sfixed64"), 1]);
858 Assert.AreEqual(511F, message[f("repeated_float"), 1]);
859 Assert.AreEqual(512D, message[f("repeated_double"), 1]);
860 Assert.AreEqual(true, message[f("repeated_bool"), 1]);
861 Assert.AreEqual("515", message[f("repeated_string"), 1]);
862 Assert.AreEqual(TestUtil.ToBytes("516"), message[f("repeated_bytes"), 1]);
863
864 Assert.AreEqual(517, ((IMessage) message[f("repeatedgroup"), 1])[repeatedGroupA]);
865 Assert.AreEqual(518, ((IMessage) message[f("repeated_nested_message"), 1])[nestedB]);
866 Assert.AreEqual(519, ((IMessage) message[f("repeated_foreign_message"), 1])[foreignC]);
867 Assert.AreEqual(520, ((IMessage) message[f("repeated_import_message"), 1])[importD]);
868
869 Assert.AreEqual(nestedFoo, message[f("repeated_nested_enum"), 1]);
870 Assert.AreEqual(foreignFoo, message[f("repeated_foreign_enum"), 1]);
871 Assert.AreEqual(importFoo, message[f("repeated_import_enum"), 1]);
872
873 Assert.AreEqual("524", message[f("repeated_string_piece"), 1]);
874 Assert.AreEqual("525", message[f("repeated_cord"), 1]);
875 }
876
877 /// <summary>
878 /// Verifies that the reflection setters for the given Builder object throw an
879 /// ArgumentNullException if they are passed a null value.
880 /// </summary>
881 public void AssertReflectionSettersRejectNull(IBuilder builder)
882 {
883 TestUtil.AssertArgumentNullException(() => builder[f("optional_string")] = null);
884 TestUtil.AssertArgumentNullException(() => builder[f("optional_bytes")] = null);
885 TestUtil.AssertArgumentNullException(() => builder[f("optional_nested_enum")] = null);
886 TestUtil.AssertArgumentNullException(() => builder[f("optional_nested_message")] = null);
887 TestUtil.AssertArgumentNullException(() => builder[f("optional_nested_message")] = null);
888 TestUtil.AssertArgumentNullException(() => builder.WeakAddRepeatedField(f("repeated_string"), null));
889 TestUtil.AssertArgumentNullException(() => builder.WeakAddRepeatedField(f("repeated_bytes"), null));
890 TestUtil.AssertArgumentNullException(() => builder.WeakAddRepeatedField(f("repeated_nested_enum"), null));
891 TestUtil.AssertArgumentNullException(() => builder.WeakAddRepeatedField(f("repeated_nested_message"), null));
892 }
893
894 /// <summary>
895 /// Verifies that the reflection repeated setters for the given Builder object throw an
896 /// ArgumentNullException if they are passed a null value.
897 /// </summary>
898 public void AssertReflectionRepeatedSettersRejectNull(IBuilder builder)
899 {
900 builder.WeakAddRepeatedField(f("repeated_string"), "one");
901 TestUtil.AssertArgumentNullException(() => builder.SetRepeatedField(f("repeated_string"), 0, null));
902 builder.WeakAddRepeatedField(f("repeated_bytes"), TestUtil.ToBytes("one"));
903 TestUtil.AssertArgumentNullException(() => builder.SetRepeatedField(f("repeated_bytes"), 0, null));
904 builder.WeakAddRepeatedField(f("repeated_nested_enum"), nestedBaz);
905 TestUtil.AssertArgumentNullException(() => builder.SetRepeatedField(f("repeated_nested_enum"), 0, null));
906 builder.WeakAddRepeatedField(f("repeated_nested_message"),
907 new TestAllTypes.Types.NestedMessage.Builder {Bb = 218}.Build());
908 TestUtil.AssertArgumentNullException(() => builder.SetRepeatedField(f("repeated_nested_message"), 0, null));
909 }
910
911 public void SetPackedFieldsViaReflection(IBuilder message)
912 {
913 message.WeakAddRepeatedField(f("packed_int32"), 601);
914 message.WeakAddRepeatedField(f("packed_int64"), 602L);
915 message.WeakAddRepeatedField(f("packed_uint32"), 603U);
916 message.WeakAddRepeatedField(f("packed_uint64"), 604UL);
917 message.WeakAddRepeatedField(f("packed_sint32"), 605);
918 message.WeakAddRepeatedField(f("packed_sint64"), 606L);
919 message.WeakAddRepeatedField(f("packed_fixed32"), 607U);
920 message.WeakAddRepeatedField(f("packed_fixed64"), 608UL);
921 message.WeakAddRepeatedField(f("packed_sfixed32"), 609);
922 message.WeakAddRepeatedField(f("packed_sfixed64"), 610L);
923 message.WeakAddRepeatedField(f("packed_float"), 611F);
924 message.WeakAddRepeatedField(f("packed_double"), 612D);
925 message.WeakAddRepeatedField(f("packed_bool"), true);
926 message.WeakAddRepeatedField(f("packed_enum"), foreignBar);
927 // Add a second one of each field.
928 message.WeakAddRepeatedField(f("packed_int32"), 701);
929 message.WeakAddRepeatedField(f("packed_int64"), 702L);
930 message.WeakAddRepeatedField(f("packed_uint32"), 703U);
931 message.WeakAddRepeatedField(f("packed_uint64"), 704UL);
932 message.WeakAddRepeatedField(f("packed_sint32"), 705);
933 message.WeakAddRepeatedField(f("packed_sint64"), 706L);
934 message.WeakAddRepeatedField(f("packed_fixed32"), 707U);
935 message.WeakAddRepeatedField(f("packed_fixed64"), 708UL);
936 message.WeakAddRepeatedField(f("packed_sfixed32"), 709);
937 message.WeakAddRepeatedField(f("packed_sfixed64"), 710L);
938 message.WeakAddRepeatedField(f("packed_float"), 711F);
939 message.WeakAddRepeatedField(f("packed_double"), 712D);
940 message.WeakAddRepeatedField(f("packed_bool"), false);
941 message.WeakAddRepeatedField(f("packed_enum"), foreignBaz);
942 }
943
944 public void AssertPackedFieldsSetViaReflection(IMessage message)
945 {
946 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_int32")));
947 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_int64")));
948 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_uint32")));
949 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_uint64")));
950 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_sint32")));
951 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_sint64")));
952 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_fixed32")));
953 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_fixed64")));
954 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_sfixed32")));
955 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_sfixed64")));
956 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_float")));
957 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_double")));
958 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_bool")));
959 Assert.AreEqual(2, message.GetRepeatedFieldCount(f("packed_enum")));
960 Assert.AreEqual(601, message[f("packed_int32"), 0]);
961 Assert.AreEqual(602L, message[f("packed_int64"), 0]);
962 Assert.AreEqual(603, message[f("packed_uint32"), 0]);
963 Assert.AreEqual(604L, message[f("packed_uint64"), 0]);
964 Assert.AreEqual(605, message[f("packed_sint32"), 0]);
965 Assert.AreEqual(606L, message[f("packed_sint64"), 0]);
966 Assert.AreEqual(607, message[f("packed_fixed32"), 0]);
967 Assert.AreEqual(608L, message[f("packed_fixed64"), 0]);
968 Assert.AreEqual(609, message[f("packed_sfixed32"), 0]);
969 Assert.AreEqual(610L, message[f("packed_sfixed64"), 0]);
970 Assert.AreEqual(611F, message[f("packed_float"), 0]);
971 Assert.AreEqual(612D, message[f("packed_double"), 0]);
972 Assert.AreEqual(true, message[f("packed_bool"), 0]);
973 Assert.AreEqual(foreignBar, message[f("packed_enum"), 0]);
974 Assert.AreEqual(701, message[f("packed_int32"), 1]);
975 Assert.AreEqual(702L, message[f("packed_int64"), 1]);
976 Assert.AreEqual(703, message[f("packed_uint32"), 1]);
977 Assert.AreEqual(704L, message[f("packed_uint64"), 1]);
978 Assert.AreEqual(705, message[f("packed_sint32"), 1]);
979 Assert.AreEqual(706L, message[f("packed_sint64"), 1]);
980 Assert.AreEqual(707, message[f("packed_fixed32"), 1]);
981 Assert.AreEqual(708L, message[f("packed_fixed64"), 1]);
982 Assert.AreEqual(709, message[f("packed_sfixed32"), 1]);
983 Assert.AreEqual(710L, message[f("packed_sfixed64"), 1]);
984 Assert.AreEqual(711F, message[f("packed_float"), 1]);
985 Assert.AreEqual(712D, message[f("packed_double"), 1]);
986 Assert.AreEqual(false, message[f("packed_bool"), 1]);
987 Assert.AreEqual(foreignBaz, message[f("packed_enum"), 1]);
988 }
989 }
990}