NanoTest.java revision 43325653beb4e5b6923d0380a84bf7e204be5c22
1// Protocol Buffers - Google's data interchange format
2// Copyright 2013 Google Inc.  All rights reserved.
3// http://code.google.com/p/protobuf/
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
8//
9//     * Redistributions of source code must retain the above copyright
10// notice, this list of conditions and the following disclaimer.
11//     * Redistributions in binary form must reproduce the above
12// copyright notice, this list of conditions and the following disclaimer
13// in the documentation and/or other materials provided with the
14// distribution.
15//     * Neither the name of Google Inc. nor the names of its
16// contributors may be used to endorse or promote products derived from
17// this software without specific prior written permission.
18//
19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31package com.google.protobuf;
32
33import com.google.protobuf.nano.InternalNano;
34import com.google.protobuf.nano.MessageNano;
35import com.google.protobuf.nano.NanoOuterClass;
36import com.google.protobuf.nano.NanoOuterClass.TestAllTypesNano;
37import com.google.protobuf.nano.RecursiveMessageNano;
38import com.google.protobuf.nano.SimpleMessageNano;
39import com.google.protobuf.nano.UnittestImportNano;
40import com.google.protobuf.nano.CodedInputByteBufferNano;
41
42import junit.framework.TestCase;
43
44/**
45 * Test nano runtime.
46 *
47 * @author ulas@google.com Ulas Kirazci
48 */
49public class NanoTest extends TestCase {
50  public void setUp() throws Exception {
51  }
52
53  public void testSimpleMessageNano() throws Exception {
54    SimpleMessageNano msg = new SimpleMessageNano();
55    assertEquals(123, msg.d);
56    assertEquals(null, msg.nestedMsg);
57    assertEquals(SimpleMessageNano.BAZ, msg.defaultNestedEnum);
58
59    msg.d = 456;
60    assertEquals(456, msg.d);
61
62    SimpleMessageNano.NestedMessage nestedMsg = new SimpleMessageNano.NestedMessage();
63    nestedMsg.bb = 2;
64    assertEquals(2, nestedMsg.bb);
65    msg.nestedMsg = nestedMsg;
66    assertEquals(2, msg.nestedMsg.bb);
67
68    msg.defaultNestedEnum = SimpleMessageNano.BAR;
69    assertEquals(SimpleMessageNano.BAR, msg.defaultNestedEnum);
70
71    byte [] result = MessageNano.toByteArray(msg);
72    int msgSerializedSize = msg.getSerializedSize();
73    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
74    assertTrue(msgSerializedSize == 9);
75    assertEquals(result.length, msgSerializedSize);
76
77    SimpleMessageNano newMsg = SimpleMessageNano.parseFrom(result);
78    assertEquals(456, newMsg.d);
79    assertEquals(2, msg.nestedMsg.bb);
80    assertEquals(SimpleMessageNano.BAR, msg.defaultNestedEnum);
81  }
82
83  public void testRecursiveMessageNano() throws Exception {
84    RecursiveMessageNano msg = new RecursiveMessageNano();
85    assertTrue(msg.repeatedRecursiveMessageNano.length == 0);
86
87    RecursiveMessageNano msg1 = new RecursiveMessageNano();
88    msg1.id = 1;
89    assertEquals(1, msg1.id);
90    RecursiveMessageNano msg2 = new RecursiveMessageNano();
91    msg2.id = 2;
92    RecursiveMessageNano msg3 = new RecursiveMessageNano();
93    msg3.id = 3;
94
95    RecursiveMessageNano.NestedMessage nestedMsg = new RecursiveMessageNano.NestedMessage();
96    nestedMsg.a = msg1;
97    assertEquals(1, nestedMsg.a.id);
98
99    msg.id = 0;
100    msg.nestedMessage = nestedMsg;
101    msg.optionalRecursiveMessageNano = msg2;
102    msg.repeatedRecursiveMessageNano = new RecursiveMessageNano[] { msg3 };
103
104    byte [] result = MessageNano.toByteArray(msg);
105    int msgSerializedSize = msg.getSerializedSize();
106    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
107    assertTrue(msgSerializedSize == 16);
108    assertEquals(result.length, msgSerializedSize);
109
110    RecursiveMessageNano newMsg = RecursiveMessageNano.parseFrom(result);
111    assertEquals(1, newMsg.repeatedRecursiveMessageNano.length);
112
113    assertEquals(0, newMsg.id);
114    assertEquals(1, newMsg.nestedMessage.a.id);
115    assertEquals(2, newMsg.optionalRecursiveMessageNano.id);
116    assertEquals(3, newMsg.repeatedRecursiveMessageNano[0].id);
117  }
118
119  public void testNanoRequiredInt32() throws Exception {
120    TestAllTypesNano msg = new TestAllTypesNano();
121    msg.id = 123;
122    assertEquals(123, msg.id);
123    msg.clear().id = 456;
124    assertEquals(456, msg.id);
125    msg.clear();
126
127    msg.id = 123;
128    byte [] result = MessageNano.toByteArray(msg);
129    int msgSerializedSize = msg.getSerializedSize();
130    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
131    assertTrue(msgSerializedSize == 3);
132    assertEquals(result.length, msgSerializedSize);
133
134    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
135    assertEquals(123, newMsg.id);
136  }
137
138  public void testNanoOptionalInt32() throws Exception {
139    TestAllTypesNano msg = new TestAllTypesNano();
140    msg.optionalInt32 = 123;
141    assertEquals(123, msg.optionalInt32);
142    msg.clear()
143       .optionalInt32 = 456;
144    assertEquals(456, msg.optionalInt32);
145    msg.clear();
146
147    msg.optionalInt32 = 123;
148    byte [] result = MessageNano.toByteArray(msg);
149    int msgSerializedSize = msg.getSerializedSize();
150    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
151    assertTrue(msgSerializedSize == 5);
152    assertEquals(result.length, msgSerializedSize);
153
154    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
155    assertEquals(123, newMsg.optionalInt32);
156  }
157
158  public void testNanoOptionalInt64() throws Exception {
159    TestAllTypesNano msg = new TestAllTypesNano();
160    msg.optionalInt64 = 123;
161    assertEquals(123, msg.optionalInt64);
162    msg.clear()
163       .optionalInt64 = 456;
164    assertEquals(456, msg.optionalInt64);
165    msg.clear();
166    assertEquals(0, msg.optionalInt64);
167
168    msg.optionalInt64 = 123;
169    byte [] result = MessageNano.toByteArray(msg);
170    int msgSerializedSize = msg.getSerializedSize();
171    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
172    assertTrue(msgSerializedSize == 5);
173    assertEquals(result.length, msgSerializedSize);
174
175    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
176    assertEquals(123, newMsg.optionalInt64);
177  }
178
179  public void testNanoOptionalUint32() throws Exception {
180    TestAllTypesNano msg = new TestAllTypesNano();
181    msg.optionalUint32 = 123;
182    assertEquals(123, msg.optionalUint32);
183    msg.clear()
184       .optionalUint32 = 456;
185    assertEquals(456, msg.optionalUint32);
186    msg.clear();
187    assertEquals(0, msg.optionalUint32);
188
189    msg.optionalUint32 = 123;
190    byte [] result = MessageNano.toByteArray(msg);
191    int msgSerializedSize = msg.getSerializedSize();
192    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
193    assertTrue(msgSerializedSize == 5);
194    assertEquals(result.length, msgSerializedSize);
195
196    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
197    assertEquals(123, newMsg.optionalUint32);
198  }
199
200  public void testNanoOptionalUint64() throws Exception {
201    TestAllTypesNano msg = new TestAllTypesNano();
202    msg.optionalUint64 = 123;
203    assertEquals(123, msg.optionalUint64);
204    msg.clear()
205       .optionalUint64 = 456;
206    assertEquals(456, msg.optionalUint64);
207    msg.clear();
208    assertEquals(0, msg.optionalUint64);
209
210    msg.optionalUint64 = 123;
211    byte [] result = MessageNano.toByteArray(msg);
212    int msgSerializedSize = msg.getSerializedSize();
213    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
214    assertTrue(msgSerializedSize == 5);
215    assertEquals(result.length, msgSerializedSize);
216
217    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
218    assertEquals(123, newMsg.optionalUint64);
219  }
220
221  public void testNanoOptionalSint32() throws Exception {
222    TestAllTypesNano msg = new TestAllTypesNano();
223    msg.optionalSint32 = 123;
224    assertEquals(123, msg.optionalSint32);
225    msg.clear()
226       .optionalSint32 = 456;
227    assertEquals(456, msg.optionalSint32);
228    msg.clear();
229    assertEquals(0, msg.optionalSint32);
230
231    msg.optionalSint32 = -123;
232    byte [] result = MessageNano.toByteArray(msg);
233    int msgSerializedSize = msg.getSerializedSize();
234    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
235    assertTrue(msgSerializedSize == 6);
236    assertEquals(result.length, msgSerializedSize);
237
238    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
239    assertEquals(-123, newMsg.optionalSint32);
240  }
241
242  public void testNanoOptionalSint64() throws Exception {
243    TestAllTypesNano msg = new TestAllTypesNano();
244    msg.optionalSint64 = 123;
245    assertEquals(123, msg.optionalSint64);
246    msg.clear()
247       .optionalSint64 = 456;
248    assertEquals(456, msg.optionalSint64);
249    msg.clear();
250    assertEquals(0, msg.optionalSint64);
251
252    msg.optionalSint64 = -123;
253    byte [] result = MessageNano.toByteArray(msg);
254    int msgSerializedSize = msg.getSerializedSize();
255    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
256    assertTrue(msgSerializedSize == 6);
257    assertEquals(result.length, msgSerializedSize);
258
259    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
260    assertEquals(-123, newMsg.optionalSint64);
261  }
262
263  public void testNanoOptionalFixed32() throws Exception {
264    TestAllTypesNano msg = new TestAllTypesNano();
265    msg.optionalFixed32 = 123;
266    assertEquals(123, msg.optionalFixed32);
267    msg.clear()
268       .optionalFixed32 = 456;
269    assertEquals(456, msg.optionalFixed32);
270    msg.clear();
271    assertEquals(0, msg.optionalFixed32);
272
273    msg.optionalFixed32 = 123;
274    byte [] result = MessageNano.toByteArray(msg);
275    int msgSerializedSize = msg.getSerializedSize();
276    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
277    assertTrue(msgSerializedSize == 8);
278    assertEquals(result.length, msgSerializedSize);
279
280    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
281    assertEquals(123, newMsg.optionalFixed32);
282  }
283
284  public void testNanoOptionalFixed64() throws Exception {
285    TestAllTypesNano msg = new TestAllTypesNano();
286    msg.optionalFixed64 = 123;
287    assertEquals(123, msg.optionalFixed64);
288    msg.clear()
289       .optionalFixed64 = 456;
290    assertEquals(456, msg.optionalFixed64);
291    msg.clear();
292    assertEquals(0, msg.optionalFixed64);
293
294    msg.optionalFixed64 = 123;
295    byte [] result = MessageNano.toByteArray(msg);
296    int msgSerializedSize = msg.getSerializedSize();
297    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
298    assertTrue(msgSerializedSize == 12);
299    assertEquals(result.length, msgSerializedSize);
300
301    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
302    assertEquals(123, newMsg.optionalFixed64);
303  }
304
305  public void testNanoOptionalSfixed32() throws Exception {
306    TestAllTypesNano msg = new TestAllTypesNano();
307    msg.optionalSfixed32 = 123;
308    assertEquals(123, msg.optionalSfixed32);
309    msg.clear()
310       .optionalSfixed32 = 456;
311    assertEquals(456, msg.optionalSfixed32);
312    msg.clear();
313    assertEquals(0, msg.optionalSfixed32);
314
315    msg.optionalSfixed32 = 123;
316    byte [] result = MessageNano.toByteArray(msg);
317    int msgSerializedSize = msg.getSerializedSize();
318    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
319    assertTrue(msgSerializedSize == 8);
320    assertEquals(result.length, msgSerializedSize);
321
322    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
323    assertEquals(123, newMsg.optionalSfixed32);
324  }
325
326  public void testNanoOptionalSfixed64() throws Exception {
327    TestAllTypesNano msg = new TestAllTypesNano();
328    msg.optionalSfixed64 = 123;
329    assertEquals(123, msg.optionalSfixed64);
330    msg.clear()
331       .optionalSfixed64 = 456;
332    assertEquals(456, msg.optionalSfixed64);
333    msg.clear();
334    assertEquals(0, msg.optionalSfixed64);
335
336    msg.optionalSfixed64 = -123;
337    byte [] result = MessageNano.toByteArray(msg);
338    int msgSerializedSize = msg.getSerializedSize();
339    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
340    assertTrue(msgSerializedSize == 12);
341    assertEquals(result.length, msgSerializedSize);
342
343    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
344    assertEquals(-123, newMsg.optionalSfixed64);
345  }
346
347  public void testNanoOptionalFloat() throws Exception {
348    TestAllTypesNano msg = new TestAllTypesNano();
349    msg.optionalFloat = 123f;
350    assertTrue(123.0f == msg.optionalFloat);
351    msg.clear()
352       .optionalFloat = 456.0f;
353    assertTrue(456.0f == msg.optionalFloat);
354    msg.clear();
355    assertTrue(0.0f == msg.optionalFloat);
356
357    msg.optionalFloat = -123.456f;
358    byte [] result = MessageNano.toByteArray(msg);
359    int msgSerializedSize = msg.getSerializedSize();
360    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
361    assertTrue(msgSerializedSize == 8);
362    assertEquals(result.length, msgSerializedSize);
363
364    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
365    assertTrue(-123.456f == newMsg.optionalFloat);
366  }
367
368  public void testNanoOptionalDouble() throws Exception {
369    TestAllTypesNano msg = new TestAllTypesNano();
370    msg.optionalDouble = 123;
371    assertTrue(123.0 == msg.optionalDouble);
372    msg.clear()
373       .optionalDouble = 456.0;
374    assertTrue(456.0 == msg.optionalDouble);
375    msg.clear();
376    assertTrue(0.0 == msg.optionalDouble);
377
378    msg.optionalDouble = -123.456;
379    byte [] result = MessageNano.toByteArray(msg);
380    int msgSerializedSize = msg.getSerializedSize();
381    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
382    assertTrue(msgSerializedSize == 12);
383    assertEquals(result.length, msgSerializedSize);
384
385    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
386    assertTrue(-123.456 == newMsg.optionalDouble);
387  }
388
389  public void testNanoOptionalBool() throws Exception {
390    TestAllTypesNano msg = new TestAllTypesNano();
391    msg.optionalBool = true;
392    assertTrue(msg.optionalBool);
393    msg.clear()
394       .optionalBool = true;
395    assertTrue(msg.optionalBool);
396    msg.clear();
397    assertFalse(msg.optionalBool);
398
399    msg.optionalBool = true;
400    byte [] result = MessageNano.toByteArray(msg);
401    int msgSerializedSize = msg.getSerializedSize();
402    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
403    assertTrue(msgSerializedSize == 5);
404    assertEquals(result.length, msgSerializedSize);
405
406    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
407    assertTrue(newMsg.optionalBool);
408  }
409
410  public void testNanoOptionalString() throws Exception {
411    TestAllTypesNano msg = new TestAllTypesNano();
412    msg.optionalString = "hello";
413    assertEquals("hello", msg.optionalString);
414    msg.clear();
415    assertTrue(msg.optionalString.isEmpty());
416    msg.clear()
417       .optionalString = "hello2";
418    assertEquals("hello2", msg.optionalString);
419    msg.clear();
420    assertTrue(msg.optionalString.isEmpty());
421
422    msg.optionalString = "bye";
423    byte [] result = MessageNano.toByteArray(msg);
424    int msgSerializedSize = msg.getSerializedSize();
425    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
426    assertTrue(msgSerializedSize == 8);
427    assertEquals(result.length, msgSerializedSize);
428
429    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
430    assertTrue(newMsg.optionalString != null);
431    assertEquals("bye", newMsg.optionalString);
432  }
433
434  public void testNanoOptionalBytes() throws Exception {
435    TestAllTypesNano msg = new TestAllTypesNano();
436    assertFalse(msg.optionalBytes.length > 0);
437    msg.optionalBytes = InternalNano.copyFromUtf8("hello");
438    assertTrue(msg.optionalBytes.length > 0);
439    assertEquals("hello", new String(msg.optionalBytes, "UTF-8"));
440    msg.clear();
441    assertFalse(msg.optionalBytes.length > 0);
442    msg.clear()
443       .optionalBytes = InternalNano.copyFromUtf8("hello");
444    assertTrue(msg.optionalBytes.length > 0);
445    msg.clear();
446    assertFalse(msg.optionalBytes.length > 0);
447
448    msg.optionalBytes = InternalNano.copyFromUtf8("bye");
449    byte [] result = MessageNano.toByteArray(msg);
450    int msgSerializedSize = msg.getSerializedSize();
451    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
452    assertTrue(msgSerializedSize == 8);
453    assertEquals(result.length, msgSerializedSize);
454
455    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
456    assertTrue(newMsg.optionalBytes.length > 0);
457    assertEquals("bye", new String(newMsg.optionalBytes, "UTF-8"));
458  }
459
460  public void testNanoOptionalGroup() throws Exception {
461    TestAllTypesNano msg = new TestAllTypesNano();
462    TestAllTypesNano.OptionalGroup grp = new TestAllTypesNano.OptionalGroup();
463    grp.a = 1;
464    assertFalse(msg.optionalGroup != null);
465    msg.optionalGroup = grp;
466    assertTrue(msg.optionalGroup != null);
467    assertEquals(1, msg.optionalGroup.a);
468    msg.clear();
469    assertFalse(msg.optionalGroup != null);
470    msg.clear()
471       .optionalGroup = new TestAllTypesNano.OptionalGroup();
472    msg.optionalGroup.a = 2;
473    assertTrue(msg.optionalGroup != null);
474    msg.clear();
475    assertFalse(msg.optionalGroup != null);
476
477    msg.optionalGroup = grp;
478    byte [] result = MessageNano.toByteArray(msg);
479    int msgSerializedSize = msg.getSerializedSize();
480    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
481    assertTrue(msgSerializedSize == 10);
482    assertEquals(result.length, msgSerializedSize);
483
484    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
485    assertTrue(newMsg.optionalGroup != null);
486    assertEquals(1, newMsg.optionalGroup.a);
487  }
488
489  public void testNanoOptionalNestedMessage() throws Exception {
490    TestAllTypesNano msg = new TestAllTypesNano();
491    TestAllTypesNano.NestedMessage nestedMsg = new TestAllTypesNano.NestedMessage();
492    nestedMsg.bb = 1;
493    assertFalse(msg.optionalNestedMessage != null);
494    msg.optionalNestedMessage = nestedMsg;
495    assertTrue(msg.optionalNestedMessage != null);
496    assertEquals(1, msg.optionalNestedMessage.bb);
497    msg.clear();
498    assertFalse(msg.optionalNestedMessage != null);
499    msg.clear()
500       .optionalNestedMessage = new TestAllTypesNano.NestedMessage();
501    msg.optionalNestedMessage.bb = 2;
502    assertTrue(msg.optionalNestedMessage != null);
503    msg.clear();
504    assertFalse(msg.optionalNestedMessage != null);
505
506    msg.optionalNestedMessage = nestedMsg;
507    byte [] result = MessageNano.toByteArray(msg);
508    int msgSerializedSize = msg.getSerializedSize();
509    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
510    assertTrue(msgSerializedSize == 8);
511    assertEquals(result.length, msgSerializedSize);
512
513    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
514    assertTrue(newMsg.optionalNestedMessage != null);
515    assertEquals(1, newMsg.optionalNestedMessage.bb);
516  }
517
518  public void testNanoOptionalForeignMessage() throws Exception {
519    TestAllTypesNano msg = new TestAllTypesNano();
520    NanoOuterClass.ForeignMessageNano nestedMsg = new NanoOuterClass.ForeignMessageNano();
521    nestedMsg.c = 1;
522    assertFalse(msg.optionalForeignMessage != null);
523    msg.optionalForeignMessage = nestedMsg;
524    assertTrue(msg.optionalForeignMessage != null);
525    assertEquals(1, msg.optionalForeignMessage.c);
526    msg.clear();
527    assertFalse(msg.optionalForeignMessage != null);
528    msg.clear()
529       .optionalForeignMessage = new NanoOuterClass.ForeignMessageNano();
530    msg.optionalForeignMessage.c = 2;
531    assertTrue(msg.optionalForeignMessage != null);
532    msg.clear();
533    assertFalse(msg.optionalForeignMessage != null);
534
535    msg.optionalForeignMessage = nestedMsg;
536    byte [] result = MessageNano.toByteArray(msg);
537    int msgSerializedSize = msg.getSerializedSize();
538    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
539    assertTrue(msgSerializedSize == 8);
540    assertEquals(result.length, msgSerializedSize);
541
542    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
543    assertTrue(newMsg.optionalForeignMessage != null);
544    assertEquals(1, newMsg.optionalForeignMessage.c);
545  }
546
547  public void testNanoOptionalImportMessage() throws Exception {
548    TestAllTypesNano msg = new TestAllTypesNano();
549    UnittestImportNano.ImportMessageNano nestedMsg = new UnittestImportNano.ImportMessageNano();
550    nestedMsg.d = 1;
551    assertFalse(msg.optionalImportMessage != null);
552    msg.optionalImportMessage = nestedMsg;
553    assertTrue(msg.optionalImportMessage != null);
554    assertEquals(1, msg.optionalImportMessage.d);
555    msg.clear();
556    assertFalse(msg.optionalImportMessage != null);
557    msg.clear()
558       .optionalImportMessage = new UnittestImportNano.ImportMessageNano();
559    msg.optionalImportMessage.d = 2;
560    assertTrue(msg.optionalImportMessage != null);
561    msg.clear();
562    assertFalse(msg.optionalImportMessage != null);
563
564    msg.optionalImportMessage = nestedMsg;
565    byte [] result = MessageNano.toByteArray(msg);
566    int msgSerializedSize = msg.getSerializedSize();
567    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
568    assertTrue(msgSerializedSize == 8);
569    assertEquals(result.length, msgSerializedSize);
570
571    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
572    assertTrue(newMsg.optionalImportMessage != null);
573    assertEquals(1, newMsg.optionalImportMessage.d);
574  }
575
576  public void testNanoOptionalNestedEnum() throws Exception {
577    TestAllTypesNano msg = new TestAllTypesNano();
578    msg.optionalNestedEnum = TestAllTypesNano.BAR;
579    assertEquals(TestAllTypesNano.BAR, msg.optionalNestedEnum);
580    msg.clear()
581       .optionalNestedEnum = TestAllTypesNano.BAZ;
582    assertEquals(TestAllTypesNano.BAZ, msg.optionalNestedEnum);
583    msg.clear();
584    assertEquals(TestAllTypesNano.FOO, msg.optionalNestedEnum);
585
586    msg.optionalNestedEnum = TestAllTypesNano.BAR;
587    byte [] result = MessageNano.toByteArray(msg);
588    int msgSerializedSize = msg.getSerializedSize();
589    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
590    assertTrue(msgSerializedSize == 6);
591    assertEquals(result.length, msgSerializedSize);
592
593    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
594    assertEquals(TestAllTypesNano.BAR, newMsg.optionalNestedEnum);
595  }
596
597  public void testNanoOptionalForeignEnum() throws Exception {
598    TestAllTypesNano msg = new TestAllTypesNano();
599    msg.optionalForeignEnum = NanoOuterClass.FOREIGN_NANO_BAR;
600    assertEquals(NanoOuterClass.FOREIGN_NANO_BAR, msg.optionalForeignEnum);
601    msg.clear()
602       .optionalForeignEnum = NanoOuterClass.FOREIGN_NANO_BAZ;
603    assertEquals(NanoOuterClass.FOREIGN_NANO_BAZ, msg.optionalForeignEnum);
604    msg.clear();
605    assertEquals(NanoOuterClass.FOREIGN_NANO_FOO, msg.optionalForeignEnum);
606
607    msg.optionalForeignEnum = NanoOuterClass.FOREIGN_NANO_BAR;
608    byte [] result = MessageNano.toByteArray(msg);
609    int msgSerializedSize = msg.getSerializedSize();
610    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
611    assertTrue(msgSerializedSize == 6);
612    assertEquals(result.length, msgSerializedSize);
613
614    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
615    assertEquals(NanoOuterClass.FOREIGN_NANO_BAR, newMsg.optionalForeignEnum);
616  }
617
618  public void testNanoOptionalImportEnum() throws Exception {
619    TestAllTypesNano msg = new TestAllTypesNano();
620    msg.optionalImportEnum = UnittestImportNano.IMPORT_NANO_BAR;
621    assertEquals(UnittestImportNano.IMPORT_NANO_BAR, msg.optionalImportEnum);
622    msg.clear()
623       .optionalImportEnum = UnittestImportNano.IMPORT_NANO_BAZ;
624    assertEquals(UnittestImportNano.IMPORT_NANO_BAZ, msg.optionalImportEnum);
625    msg.clear();
626    assertEquals(UnittestImportNano.IMPORT_NANO_FOO, msg.optionalImportEnum);
627
628    msg.optionalImportEnum = UnittestImportNano.IMPORT_NANO_BAR;
629    byte [] result = MessageNano.toByteArray(msg);
630    int msgSerializedSize = msg.getSerializedSize();
631    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
632    assertTrue(msgSerializedSize == 6);
633    assertEquals(result.length, msgSerializedSize);
634
635    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
636    assertEquals(UnittestImportNano.IMPORT_NANO_BAR, newMsg.optionalImportEnum);
637  }
638
639  public void testNanoOptionalStringPiece() throws Exception {
640    TestAllTypesNano msg = new TestAllTypesNano();
641    msg.optionalStringPiece = "hello";
642    assertEquals("hello", msg.optionalStringPiece);
643    msg.clear();
644    assertTrue(msg.optionalStringPiece.isEmpty());
645    msg.clear()
646       .optionalStringPiece = "hello2";
647    assertEquals("hello2", msg.optionalStringPiece);
648    msg.clear();
649    assertTrue(msg.optionalStringPiece.isEmpty());
650
651    msg.optionalStringPiece = "bye";
652    byte [] result = MessageNano.toByteArray(msg);
653    int msgSerializedSize = msg.getSerializedSize();
654    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
655    assertTrue(msgSerializedSize == 9);
656    assertEquals(result.length, msgSerializedSize);
657
658    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
659    assertTrue(newMsg.optionalStringPiece != null);
660    assertEquals("bye", newMsg.optionalStringPiece);
661  }
662
663  public void testNanoOptionalCord() throws Exception {
664    TestAllTypesNano msg = new TestAllTypesNano();
665    msg.optionalCord = "hello";
666    assertEquals("hello", msg.optionalCord);
667    msg.clear();
668    assertTrue(msg.optionalCord.isEmpty());
669    msg.clear()
670       .optionalCord = "hello2";
671    assertEquals("hello2", msg.optionalCord);
672    msg.clear();
673    assertTrue(msg.optionalCord.isEmpty());
674
675    msg.optionalCord = "bye";
676    byte [] result = MessageNano.toByteArray(msg);
677    int msgSerializedSize = msg.getSerializedSize();
678    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
679    assertTrue(msgSerializedSize == 9);
680    assertEquals(result.length, msgSerializedSize);
681
682    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
683    assertTrue(newMsg.optionalCord != null);
684    assertEquals("bye", newMsg.optionalCord);
685  }
686
687  public void testNanoRepeatedInt32() throws Exception {
688    TestAllTypesNano msg = new TestAllTypesNano();
689    assertEquals(0, msg.repeatedInt32.length);
690    msg.repeatedInt32 = new int[] { 123, 789, 456 };
691    assertEquals(789, msg.repeatedInt32[1]);
692    assertEquals(456, msg.repeatedInt32[2]);
693    msg.clear();
694    assertEquals(0, msg.repeatedInt32.length);
695    msg.clear()
696       .repeatedInt32 = new int[] { 456 };
697    assertEquals(1, msg.repeatedInt32.length);
698    assertEquals(456, msg.repeatedInt32[0]);
699    msg.clear();
700    assertEquals(0, msg.repeatedInt32.length);
701
702    // Test 1 entry
703    msg.clear()
704       .repeatedInt32 = new int[] { 123 };
705    assertEquals(1, msg.repeatedInt32.length);
706    byte [] result = MessageNano.toByteArray(msg);
707    int msgSerializedSize = msg.getSerializedSize();
708    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
709    assertTrue(msgSerializedSize == 6);
710    assertEquals(result.length, msgSerializedSize);
711    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
712    assertEquals(1, newMsg.repeatedInt32.length);
713    assertEquals(123, newMsg.repeatedInt32[0]);
714
715    // Test 2 entries
716    msg.clear()
717       .repeatedInt32 = new int[] { 123, 456 };
718    assertEquals(2, msg.repeatedInt32.length);
719    result = MessageNano.toByteArray(msg);
720    msgSerializedSize = msg.getSerializedSize();
721    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
722    assertTrue(msgSerializedSize == 10);
723    assertEquals(result.length, msgSerializedSize);
724
725    newMsg = TestAllTypesNano.parseFrom(result);
726    assertEquals(2, newMsg.repeatedInt32.length);
727    assertEquals(123, newMsg.repeatedInt32[0]);
728    assertEquals(456, newMsg.repeatedInt32[1]);
729  }
730
731  public void testNanoRepeatedInt64() throws Exception {
732    TestAllTypesNano msg = new TestAllTypesNano();
733    assertEquals(0, msg.repeatedInt64.length);
734    msg.repeatedInt64 = new long[] { 123, 789, 456 };
735    assertEquals(789, msg.repeatedInt64[1]);
736    assertEquals(456, msg.repeatedInt64[2]);
737    msg.clear();
738    assertEquals(0, msg.repeatedInt64.length);
739    msg.clear()
740       .repeatedInt64 = new long[] { 456 };
741    assertEquals(1, msg.repeatedInt64.length);
742    assertEquals(456, msg.repeatedInt64[0]);
743    msg.clear();
744    assertEquals(0, msg.repeatedInt64.length);
745
746    // Test 1 entry
747    msg.clear()
748       .repeatedInt64 = new long[] { 123 };
749    assertEquals(1, msg.repeatedInt64.length);
750    byte [] result = MessageNano.toByteArray(msg);
751    int msgSerializedSize = msg.getSerializedSize();
752    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
753    assertTrue(msgSerializedSize == 6);
754    assertEquals(result.length, msgSerializedSize);
755    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
756    assertEquals(1, newMsg.repeatedInt64.length);
757    assertEquals(123, newMsg.repeatedInt64[0]);
758
759    // Test 2 entries
760    msg.clear()
761       .repeatedInt64 = new long[] { 123, 456 };
762    assertEquals(2, msg.repeatedInt64.length);
763    result = MessageNano.toByteArray(msg);
764    msgSerializedSize = msg.getSerializedSize();
765    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
766    assertTrue(msgSerializedSize == 10);
767    assertEquals(result.length, msgSerializedSize);
768
769    newMsg = TestAllTypesNano.parseFrom(result);
770    assertEquals(2, newMsg.repeatedInt64.length);
771    assertEquals(123, newMsg.repeatedInt64[0]);
772    assertEquals(456, newMsg.repeatedInt64[1]);
773  }
774
775  public void testNanoRepeatedUint32() throws Exception {
776    TestAllTypesNano msg = new TestAllTypesNano();
777    assertEquals(0, msg.repeatedUint32.length);
778    msg.repeatedUint32 = new int[] { 123, 789, 456 };
779    assertEquals(789, msg.repeatedUint32[1]);
780    assertEquals(456, msg.repeatedUint32[2]);
781    msg.clear();
782    assertEquals(0, msg.repeatedUint32.length);
783    msg.clear()
784       .repeatedUint32 = new int[] { 456 };
785    assertEquals(1, msg.repeatedUint32.length);
786    assertEquals(456, msg.repeatedUint32[0]);
787    msg.clear();
788    assertEquals(0, msg.repeatedUint32.length);
789
790    // Test 1 entry
791    msg.clear()
792       .repeatedUint32 = new int[] { 123 };
793    assertEquals(1, msg.repeatedUint32.length);
794    byte [] result = MessageNano.toByteArray(msg);
795    int msgSerializedSize = msg.getSerializedSize();
796    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
797    assertTrue(msgSerializedSize == 6);
798    assertEquals(result.length, msgSerializedSize);
799    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
800    assertEquals(1, newMsg.repeatedUint32.length);
801    assertEquals(123, newMsg.repeatedUint32[0]);
802
803    // Test 2 entries
804    msg.clear()
805       .repeatedUint32 = new int[] { 123, 456 };
806    assertEquals(2, msg.repeatedUint32.length);
807    result = MessageNano.toByteArray(msg);
808    msgSerializedSize = msg.getSerializedSize();
809    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
810    assertTrue(msgSerializedSize == 10);
811    assertEquals(result.length, msgSerializedSize);
812
813    newMsg = TestAllTypesNano.parseFrom(result);
814    assertEquals(2, newMsg.repeatedUint32.length);
815    assertEquals(123, newMsg.repeatedUint32[0]);
816    assertEquals(456, newMsg.repeatedUint32[1]);
817  }
818
819  public void testNanoRepeatedUint64() throws Exception {
820    TestAllTypesNano msg = new TestAllTypesNano();
821    assertEquals(0, msg.repeatedUint64.length);
822    msg.repeatedUint64 = new long[] { 123, 789, 456 };
823    assertEquals(789, msg.repeatedUint64[1]);
824    assertEquals(456, msg.repeatedUint64[2]);
825    msg.clear();
826    assertEquals(0, msg.repeatedUint64.length);
827    msg.clear()
828       .repeatedUint64 = new long[] { 456 };
829    assertEquals(1, msg.repeatedUint64.length);
830    assertEquals(456, msg.repeatedUint64[0]);
831    msg.clear();
832    assertEquals(0, msg.repeatedUint64.length);
833
834    // Test 1 entry
835    msg.clear()
836       .repeatedUint64 = new long[] { 123 };
837    assertEquals(1, msg.repeatedUint64.length);
838    byte [] result = MessageNano.toByteArray(msg);
839    int msgSerializedSize = msg.getSerializedSize();
840    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
841    assertTrue(msgSerializedSize == 6);
842    assertEquals(result.length, msgSerializedSize);
843    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
844    assertEquals(1, newMsg.repeatedUint64.length);
845    assertEquals(123, newMsg.repeatedUint64[0]);
846
847    // Test 2 entries
848    msg.clear()
849       .repeatedUint64 = new long[] { 123, 456 };
850    assertEquals(2, msg.repeatedUint64.length);
851    result = MessageNano.toByteArray(msg);
852    msgSerializedSize = msg.getSerializedSize();
853    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
854    assertTrue(msgSerializedSize == 10);
855    assertEquals(result.length, msgSerializedSize);
856
857    newMsg = TestAllTypesNano.parseFrom(result);
858    assertEquals(2, newMsg.repeatedUint64.length);
859    assertEquals(123, newMsg.repeatedUint64[0]);
860    assertEquals(456, newMsg.repeatedUint64[1]);
861  }
862
863  public void testNanoRepeatedSint32() throws Exception {
864    TestAllTypesNano msg = new TestAllTypesNano();
865    assertEquals(0, msg.repeatedSint32.length);
866    msg.repeatedSint32 = new int[] { 123, 789, 456 };
867    assertEquals(789, msg.repeatedSint32[1]);
868    assertEquals(456, msg.repeatedSint32[2]);
869    msg.clear();
870    assertEquals(0, msg.repeatedSint32.length);
871    msg.clear()
872       .repeatedSint32 = new int[] { 456 };
873    assertEquals(1, msg.repeatedSint32.length);
874    assertEquals(456, msg.repeatedSint32[0]);
875    msg.clear();
876    assertEquals(0, msg.repeatedSint32.length);
877
878    // Test 1 entry
879    msg.clear()
880       .repeatedSint32 = new int[] { 123 };
881    assertEquals(1, msg.repeatedSint32.length);
882    byte [] result = MessageNano.toByteArray(msg);
883    int msgSerializedSize = msg.getSerializedSize();
884    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
885    assertTrue(msgSerializedSize == 7);
886    assertEquals(result.length, msgSerializedSize);
887    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
888    assertEquals(1, newMsg.repeatedSint32.length);
889    assertEquals(123, newMsg.repeatedSint32[0]);
890
891    // Test 2 entries
892    msg.clear()
893       .repeatedSint32 = new int[] { 123, 456 };
894    assertEquals(2, msg.repeatedSint32.length);
895    result = MessageNano.toByteArray(msg);
896    msgSerializedSize = msg.getSerializedSize();
897    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
898    assertTrue(msgSerializedSize == 11);
899    assertEquals(result.length, msgSerializedSize);
900
901    newMsg = TestAllTypesNano.parseFrom(result);
902    assertEquals(2, newMsg.repeatedSint32.length);
903    assertEquals(123, newMsg.repeatedSint32[0]);
904    assertEquals(456, newMsg.repeatedSint32[1]);
905  }
906
907  public void testNanoRepeatedSint64() throws Exception {
908    TestAllTypesNano msg = new TestAllTypesNano();
909    assertEquals(0, msg.repeatedSint64.length);
910    msg.repeatedSint64 = new long[] { 123, 789, 456 };
911    assertEquals(789, msg.repeatedSint64[1]);
912    assertEquals(456, msg.repeatedSint64[2]);
913    msg.clear();
914    assertEquals(0, msg.repeatedSint64.length);
915    msg.clear()
916       .repeatedSint64 = new long[] { 456 };
917    assertEquals(1, msg.repeatedSint64.length);
918    assertEquals(456, msg.repeatedSint64[0]);
919    msg.clear();
920    assertEquals(0, msg.repeatedSint64.length);
921
922    // Test 1 entry
923    msg.clear()
924       .repeatedSint64 = new long[] { 123 };
925    assertEquals(1, msg.repeatedSint64.length);
926    byte [] result = MessageNano.toByteArray(msg);
927    int msgSerializedSize = msg.getSerializedSize();
928    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
929    assertTrue(msgSerializedSize == 7);
930    assertEquals(result.length, msgSerializedSize);
931    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
932    assertEquals(1, newMsg.repeatedSint64.length);
933    assertEquals(123, newMsg.repeatedSint64[0]);
934
935    // Test 2 entries
936    msg.clear()
937       .repeatedSint64 = new long[] { 123, 456 };
938    assertEquals(2, msg.repeatedSint64.length);
939    result = MessageNano.toByteArray(msg);
940    msgSerializedSize = msg.getSerializedSize();
941    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
942    assertTrue(msgSerializedSize == 11);
943    assertEquals(result.length, msgSerializedSize);
944
945    newMsg = TestAllTypesNano.parseFrom(result);
946    assertEquals(2, newMsg.repeatedSint64.length);
947    assertEquals(123, newMsg.repeatedSint64[0]);
948    assertEquals(456, newMsg.repeatedSint64[1]);
949  }
950
951  public void testNanoRepeatedFixed32() throws Exception {
952    TestAllTypesNano msg = new TestAllTypesNano();
953    assertEquals(0, msg.repeatedFixed32.length);
954    msg.repeatedFixed32 = new int[] { 123, 789, 456 };
955    assertEquals(789, msg.repeatedFixed32[1]);
956    assertEquals(456, msg.repeatedFixed32[2]);
957    msg.clear();
958    assertEquals(0, msg.repeatedFixed32.length);
959    msg.clear()
960       .repeatedFixed32 = new int[] { 456 };
961    assertEquals(1, msg.repeatedFixed32.length);
962    assertEquals(456, msg.repeatedFixed32[0]);
963    msg.clear();
964    assertEquals(0, msg.repeatedFixed32.length);
965
966    // Test 1 entry
967    msg.clear()
968       .repeatedFixed32 = new int[] { 123 };
969    assertEquals(1, msg.repeatedFixed32.length);
970    byte [] result = MessageNano.toByteArray(msg);
971    int msgSerializedSize = msg.getSerializedSize();
972    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
973    assertTrue(msgSerializedSize == 9);
974    assertEquals(result.length, msgSerializedSize);
975    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
976    assertEquals(1, newMsg.repeatedFixed32.length);
977    assertEquals(123, newMsg.repeatedFixed32[0]);
978
979    // Test 2 entries
980    msg.clear()
981       .repeatedFixed32 = new int[] { 123, 456 };
982    assertEquals(2, msg.repeatedFixed32.length);
983    result = MessageNano.toByteArray(msg);
984    msgSerializedSize = msg.getSerializedSize();
985    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
986    assertTrue(msgSerializedSize == 15);
987    assertEquals(result.length, msgSerializedSize);
988
989    newMsg = TestAllTypesNano.parseFrom(result);
990    assertEquals(2, newMsg.repeatedFixed32.length);
991    assertEquals(123, newMsg.repeatedFixed32[0]);
992    assertEquals(456, newMsg.repeatedFixed32[1]);
993  }
994
995  public void testNanoRepeatedFixed64() throws Exception {
996    TestAllTypesNano msg = new TestAllTypesNano();
997    assertEquals(0, msg.repeatedFixed64.length);
998    msg.repeatedFixed64 = new long[] { 123, 789, 456 };
999    assertEquals(789, msg.repeatedFixed64[1]);
1000    assertEquals(456, msg.repeatedFixed64[2]);
1001    msg.clear();
1002    assertEquals(0, msg.repeatedFixed64.length);
1003    msg.clear()
1004       .repeatedFixed64 = new long[] { 456 };
1005    assertEquals(1, msg.repeatedFixed64.length);
1006    assertEquals(456, msg.repeatedFixed64[0]);
1007    msg.clear();
1008    assertEquals(0, msg.repeatedFixed64.length);
1009
1010    // Test 1 entry
1011    msg.clear()
1012       .repeatedFixed64 = new long[] { 123 };
1013    assertEquals(1, msg.repeatedFixed64.length);
1014    byte [] result = MessageNano.toByteArray(msg);
1015    int msgSerializedSize = msg.getSerializedSize();
1016    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1017    assertTrue(msgSerializedSize == 13);
1018    assertEquals(result.length, msgSerializedSize);
1019    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1020    assertEquals(1, newMsg.repeatedFixed64.length);
1021    assertEquals(123, newMsg.repeatedFixed64[0]);
1022
1023    // Test 2 entries
1024    msg.clear()
1025       .repeatedFixed64 = new long[] { 123, 456 };
1026    assertEquals(2, msg.repeatedFixed64.length);
1027    result = MessageNano.toByteArray(msg);
1028    msgSerializedSize = msg.getSerializedSize();
1029    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1030    assertTrue(msgSerializedSize == 23);
1031    assertEquals(result.length, msgSerializedSize);
1032
1033    newMsg = TestAllTypesNano.parseFrom(result);
1034    assertEquals(2, newMsg.repeatedFixed64.length);
1035    assertEquals(123, newMsg.repeatedFixed64[0]);
1036    assertEquals(456, newMsg.repeatedFixed64[1]);
1037  }
1038
1039  public void testNanoRepeatedSfixed32() throws Exception {
1040    TestAllTypesNano msg = new TestAllTypesNano();
1041    assertEquals(0, msg.repeatedSfixed32.length);
1042    msg.repeatedSfixed32 = new int[] { 123, 789, 456 };
1043    assertEquals(789, msg.repeatedSfixed32[1]);
1044    assertEquals(456, msg.repeatedSfixed32[2]);
1045    msg.clear();
1046    assertEquals(0, msg.repeatedSfixed32.length);
1047    msg.clear()
1048       .repeatedSfixed32 = new int[] { 456 };
1049    assertEquals(1, msg.repeatedSfixed32.length);
1050    assertEquals(456, msg.repeatedSfixed32[0]);
1051    msg.clear();
1052    assertEquals(0, msg.repeatedSfixed32.length);
1053
1054    // Test 1 entry
1055    msg.clear()
1056       .repeatedSfixed32 = new int[] { 123 };
1057    assertEquals(1, msg.repeatedSfixed32.length);
1058    byte [] result = MessageNano.toByteArray(msg);
1059    int msgSerializedSize = msg.getSerializedSize();
1060    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1061    assertTrue(msgSerializedSize == 9);
1062    assertEquals(result.length, msgSerializedSize);
1063    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1064    assertEquals(1, newMsg.repeatedSfixed32.length);
1065    assertEquals(123, newMsg.repeatedSfixed32[0]);
1066
1067    // Test 2 entries
1068    msg.clear()
1069       .repeatedSfixed32 = new int[] { 123, 456 };
1070    assertEquals(2, msg.repeatedSfixed32.length);
1071    result = MessageNano.toByteArray(msg);
1072    msgSerializedSize = msg.getSerializedSize();
1073    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1074    assertTrue(msgSerializedSize == 15);
1075    assertEquals(result.length, msgSerializedSize);
1076
1077    newMsg = TestAllTypesNano.parseFrom(result);
1078    assertEquals(2, newMsg.repeatedSfixed32.length);
1079    assertEquals(123, newMsg.repeatedSfixed32[0]);
1080    assertEquals(456, newMsg.repeatedSfixed32[1]);
1081  }
1082
1083  public void testNanoRepeatedSfixed64() throws Exception {
1084    TestAllTypesNano msg = new TestAllTypesNano();
1085    assertEquals(0, msg.repeatedSfixed64.length);
1086    msg.repeatedSfixed64 = new long[] { 123, 789, 456 };
1087    assertEquals(789, msg.repeatedSfixed64[1]);
1088    assertEquals(456, msg.repeatedSfixed64[2]);
1089    msg.clear();
1090    assertEquals(0, msg.repeatedSfixed64.length);
1091    msg.clear()
1092       .repeatedSfixed64 = new long[] { 456 };
1093    assertEquals(1, msg.repeatedSfixed64.length);
1094    assertEquals(456, msg.repeatedSfixed64[0]);
1095    msg.clear();
1096    assertEquals(0, msg.repeatedSfixed64.length);
1097
1098    // Test 1 entry
1099    msg.clear()
1100       .repeatedSfixed64 = new long[] { 123 };
1101    assertEquals(1, msg.repeatedSfixed64.length);
1102    byte [] result = MessageNano.toByteArray(msg);
1103    int msgSerializedSize = msg.getSerializedSize();
1104    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1105    assertTrue(msgSerializedSize == 13);
1106    assertEquals(result.length, msgSerializedSize);
1107    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1108    assertEquals(1, newMsg.repeatedSfixed64.length);
1109    assertEquals(123, newMsg.repeatedSfixed64[0]);
1110
1111    // Test 2 entries
1112    msg.clear()
1113       .repeatedSfixed64 = new long[] { 123, 456 };
1114    assertEquals(2, msg.repeatedSfixed64.length);
1115    result = MessageNano.toByteArray(msg);
1116    msgSerializedSize = msg.getSerializedSize();
1117    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1118    assertTrue(msgSerializedSize == 23);
1119    assertEquals(result.length, msgSerializedSize);
1120
1121    newMsg = TestAllTypesNano.parseFrom(result);
1122    assertEquals(2, newMsg.repeatedSfixed64.length);
1123    assertEquals(123, newMsg.repeatedSfixed64[0]);
1124    assertEquals(456, newMsg.repeatedSfixed64[1]);
1125  }
1126
1127  public void testNanoRepeatedFloat() throws Exception {
1128    TestAllTypesNano msg = new TestAllTypesNano();
1129    assertEquals(0, msg.repeatedFloat.length);
1130    msg.repeatedFloat = new float[] { 123f, 789f, 456f };
1131    assertEquals(789f, msg.repeatedFloat[1]);
1132    assertEquals(456f, msg.repeatedFloat[2]);
1133    msg.clear();
1134    assertEquals(0, msg.repeatedFloat.length);
1135    msg.clear()
1136       .repeatedFloat = new float[] { 456f };
1137    assertEquals(1, msg.repeatedFloat.length);
1138    assertEquals(456f, msg.repeatedFloat[0]);
1139    msg.clear();
1140    assertEquals(0, msg.repeatedFloat.length);
1141
1142    // Test 1 entry
1143    msg.clear()
1144       .repeatedFloat = new float[] { 123f };
1145    assertEquals(1, msg.repeatedFloat.length);
1146    byte [] result = MessageNano.toByteArray(msg);
1147    int msgSerializedSize = msg.getSerializedSize();
1148    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1149    assertTrue(msgSerializedSize == 9);
1150    assertEquals(result.length, msgSerializedSize);
1151    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1152    assertEquals(1, newMsg.repeatedFloat.length);
1153    assertEquals(123f, newMsg.repeatedFloat[0]);
1154
1155    // Test 2 entries
1156    msg.clear()
1157       .repeatedFloat = new float[] { 123f, 456f };
1158    assertEquals(2, msg.repeatedFloat.length);
1159    result = MessageNano.toByteArray(msg);
1160    msgSerializedSize = msg.getSerializedSize();
1161    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1162    assertTrue(msgSerializedSize == 15);
1163    assertEquals(result.length, msgSerializedSize);
1164
1165    newMsg = TestAllTypesNano.parseFrom(result);
1166    assertEquals(2, newMsg.repeatedFloat.length);
1167    assertEquals(123f, newMsg.repeatedFloat[0]);
1168    assertEquals(456f, newMsg.repeatedFloat[1]);
1169  }
1170
1171  public void testNanoRepeatedDouble() throws Exception {
1172    TestAllTypesNano msg = new TestAllTypesNano();
1173    assertEquals(0, msg.repeatedDouble.length);
1174    msg.repeatedDouble = new double[] { 123.0, 789.0, 456.0 };
1175    assertEquals(789.0, msg.repeatedDouble[1]);
1176    assertEquals(456.0, msg.repeatedDouble[2]);
1177    msg.clear();
1178    assertEquals(0, msg.repeatedDouble.length);
1179    msg.clear()
1180       .repeatedDouble = new double[] { 456.0 };
1181    assertEquals(1, msg.repeatedDouble.length);
1182    assertEquals(456.0, msg.repeatedDouble[0]);
1183    msg.clear();
1184    assertEquals(0, msg.repeatedDouble.length);
1185
1186    // Test 1 entry
1187    msg.clear()
1188       .repeatedDouble = new double[] { 123.0 };
1189    assertEquals(1, msg.repeatedDouble.length);
1190    byte [] result = MessageNano.toByteArray(msg);
1191    int msgSerializedSize = msg.getSerializedSize();
1192    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1193    assertTrue(msgSerializedSize == 13);
1194    assertEquals(result.length, msgSerializedSize);
1195    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1196    assertEquals(1, newMsg.repeatedDouble.length);
1197    assertEquals(123.0, newMsg.repeatedDouble[0]);
1198
1199    // Test 2 entries
1200    msg.clear()
1201       .repeatedDouble = new double[] { 123.0, 456.0 };
1202    assertEquals(2, msg.repeatedDouble.length);
1203    result = MessageNano.toByteArray(msg);
1204    msgSerializedSize = msg.getSerializedSize();
1205    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1206    assertTrue(msgSerializedSize == 23);
1207    assertEquals(result.length, msgSerializedSize);
1208
1209    newMsg = TestAllTypesNano.parseFrom(result);
1210    assertEquals(2, newMsg.repeatedDouble.length);
1211    assertEquals(123.0, newMsg.repeatedDouble[0]);
1212    assertEquals(456.0, newMsg.repeatedDouble[1]);
1213  }
1214
1215  public void testNanoRepeatedBool() throws Exception {
1216    TestAllTypesNano msg = new TestAllTypesNano();
1217    assertEquals(0, msg.repeatedBool.length);
1218    msg.repeatedBool = new boolean[] { false, true, false };
1219    assertTrue(msg.repeatedBool[1]);
1220    assertFalse(msg.repeatedBool[2]);
1221    msg.clear();
1222    assertEquals(0, msg.repeatedBool.length);
1223    msg.clear()
1224       .repeatedBool = new boolean[] { true };
1225    assertEquals(1, msg.repeatedBool.length);
1226    assertTrue(msg.repeatedBool[0]);
1227    msg.clear();
1228    assertEquals(0, msg.repeatedBool.length);
1229
1230    // Test 1 entry
1231    msg.clear()
1232       .repeatedBool = new boolean[] { false };
1233    assertEquals(1, msg.repeatedBool.length);
1234    byte [] result = MessageNano.toByteArray(msg);
1235    int msgSerializedSize = msg.getSerializedSize();
1236    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1237    assertTrue(msgSerializedSize == 6);
1238    assertEquals(result.length, msgSerializedSize);
1239    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1240    assertEquals(1, newMsg.repeatedBool.length);
1241    assertFalse(newMsg.repeatedBool[0]);
1242
1243    // Test 2 entries
1244    msg.clear()
1245       .repeatedBool = new boolean[] { true, false };
1246    assertEquals(2, msg.repeatedBool.length);
1247    result = MessageNano.toByteArray(msg);
1248    msgSerializedSize = msg.getSerializedSize();
1249    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1250    assertTrue(msgSerializedSize == 9);
1251    assertEquals(result.length, msgSerializedSize);
1252
1253    newMsg = TestAllTypesNano.parseFrom(result);
1254    assertEquals(2, newMsg.repeatedBool.length);
1255    assertTrue(newMsg.repeatedBool[0]);
1256    assertFalse(newMsg.repeatedBool[1]);
1257  }
1258
1259  public void testNanoRepeatedString() throws Exception {
1260    TestAllTypesNano msg = new TestAllTypesNano();
1261    assertEquals(0, msg.repeatedString.length);
1262    msg.repeatedString = new String[] { "hello", "bye", "boo" };
1263    assertEquals("bye", msg.repeatedString[1]);
1264    assertEquals("boo", msg.repeatedString[2]);
1265    msg.clear();
1266    assertEquals(0, msg.repeatedString.length);
1267    msg.clear()
1268       .repeatedString = new String[] { "boo" };
1269    assertEquals(1, msg.repeatedString.length);
1270    assertEquals("boo", msg.repeatedString[0]);
1271    msg.clear();
1272    assertEquals(0, msg.repeatedString.length);
1273
1274    // Test 1 entry
1275    msg.clear()
1276       .repeatedString = new String[] { "" };
1277    assertEquals(1, msg.repeatedString.length);
1278    byte [] result = MessageNano.toByteArray(msg);
1279    int msgSerializedSize = msg.getSerializedSize();
1280    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1281    assertTrue(msgSerializedSize == 6);
1282    assertEquals(result.length, msgSerializedSize);
1283    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1284    assertEquals(1, newMsg.repeatedString.length);
1285    assertTrue(newMsg.repeatedString[0].isEmpty());
1286
1287    // Test 2 entries
1288    msg.clear()
1289       .repeatedString = new String[] { "hello", "world" };
1290    assertEquals(2, msg.repeatedString.length);
1291    result = MessageNano.toByteArray(msg);
1292    msgSerializedSize = msg.getSerializedSize();
1293    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1294    assertTrue(msgSerializedSize == 19);
1295    assertEquals(result.length, msgSerializedSize);
1296
1297    newMsg = TestAllTypesNano.parseFrom(result);
1298    assertEquals(2, newMsg.repeatedString.length);
1299    assertEquals("hello", newMsg.repeatedString[0]);
1300    assertEquals("world", newMsg.repeatedString[1]);
1301  }
1302
1303  public void testNanoRepeatedBytes() throws Exception {
1304    TestAllTypesNano msg = new TestAllTypesNano();
1305    assertEquals(0, msg.repeatedBytes.length);
1306    msg.repeatedBytes = new byte[][] {
1307        InternalNano.copyFromUtf8("hello"),
1308        InternalNano.copyFromUtf8("bye"),
1309        InternalNano.copyFromUtf8("boo")
1310    };
1311    assertEquals("bye", new String(msg.repeatedBytes[1], "UTF-8"));
1312    assertEquals("boo", new String(msg.repeatedBytes[2], "UTF-8"));
1313    msg.clear();
1314    assertEquals(0, msg.repeatedBytes.length);
1315    msg.clear()
1316       .repeatedBytes = new byte[][] { InternalNano.copyFromUtf8("boo") };
1317    assertEquals(1, msg.repeatedBytes.length);
1318    assertEquals("boo", new String(msg.repeatedBytes[0], "UTF-8"));
1319    msg.clear();
1320    assertEquals(0, msg.repeatedBytes.length);
1321
1322    // Test 1 entry
1323    msg.clear()
1324       .repeatedBytes = new byte[][] { InternalNano.copyFromUtf8("") };
1325    assertEquals(1, msg.repeatedBytes.length);
1326    byte [] result = MessageNano.toByteArray(msg);
1327    int msgSerializedSize = msg.getSerializedSize();
1328    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1329    assertTrue(msgSerializedSize == 6);
1330    assertEquals(result.length, msgSerializedSize);
1331    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1332    assertEquals(1, newMsg.repeatedBytes.length);
1333    assertTrue(newMsg.repeatedBytes[0].length == 0);
1334
1335    // Test 2 entries
1336    msg.clear()
1337       .repeatedBytes = new byte[][] {
1338      InternalNano.copyFromUtf8("hello"),
1339      InternalNano.copyFromUtf8("world")
1340    };
1341    assertEquals(2, msg.repeatedBytes.length);
1342    result = MessageNano.toByteArray(msg);
1343    msgSerializedSize = msg.getSerializedSize();
1344    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1345    assertTrue(msgSerializedSize == 19);
1346    assertEquals(result.length, msgSerializedSize);
1347
1348    newMsg = TestAllTypesNano.parseFrom(result);
1349    assertEquals(2, newMsg.repeatedBytes.length);
1350    assertEquals("hello", new String(newMsg.repeatedBytes[0], "UTF-8"));
1351    assertEquals("world", new String(newMsg.repeatedBytes[1], "UTF-8"));
1352  }
1353
1354  public void testNanoRepeatedGroup() throws Exception {
1355    TestAllTypesNano msg = new TestAllTypesNano();
1356    TestAllTypesNano.RepeatedGroup group0 =
1357      new TestAllTypesNano.RepeatedGroup();
1358    group0.a = 0;
1359    TestAllTypesNano.RepeatedGroup group1 =
1360      new TestAllTypesNano.RepeatedGroup();
1361    group1.a = 1;
1362    TestAllTypesNano.RepeatedGroup group2 =
1363      new TestAllTypesNano.RepeatedGroup();
1364    group2.a = 2;
1365
1366    msg.repeatedGroup = new TestAllTypesNano.RepeatedGroup[] { group0, group1, group2 };
1367    assertEquals(3, msg.repeatedGroup.length);
1368    assertEquals(0, msg.repeatedGroup[0].a);
1369    assertEquals(1, msg.repeatedGroup[1].a);
1370    assertEquals(2, msg.repeatedGroup[2].a);
1371    msg.clear();
1372    assertEquals(0, msg.repeatedGroup.length);
1373    msg.clear()
1374       .repeatedGroup = new TestAllTypesNano.RepeatedGroup[] { group1 };
1375    assertEquals(1, msg.repeatedGroup.length);
1376    assertEquals(1, msg.repeatedGroup[0].a);
1377    msg.clear();
1378    assertEquals(0, msg.repeatedGroup.length);
1379
1380    // Test 1 entry
1381    msg.clear()
1382       .repeatedGroup = new TestAllTypesNano.RepeatedGroup[] { group0 };
1383    assertEquals(1, msg.repeatedGroup.length);
1384    byte [] result = MessageNano.toByteArray(msg);
1385    int msgSerializedSize = msg.getSerializedSize();
1386    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1387    assertTrue(msgSerializedSize == 7);
1388    assertEquals(result.length, msgSerializedSize);
1389    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1390    assertEquals(1, newMsg.repeatedGroup.length);
1391    assertEquals(0, newMsg.repeatedGroup[0].a);
1392
1393    // Test 2 entries
1394    msg.clear()
1395       .repeatedGroup = new TestAllTypesNano.RepeatedGroup[] { group0, group1 };
1396    assertEquals(2, msg.repeatedGroup.length);
1397    result = MessageNano.toByteArray(msg);
1398    msgSerializedSize = msg.getSerializedSize();
1399    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1400    assertTrue(msgSerializedSize == 14);
1401    assertEquals(result.length, msgSerializedSize);
1402
1403    newMsg = TestAllTypesNano.parseFrom(result);
1404    assertEquals(2, newMsg.repeatedGroup.length);
1405    assertEquals(0, newMsg.repeatedGroup[0].a);
1406    assertEquals(1, newMsg.repeatedGroup[1].a);
1407  }
1408
1409  public void testNanoRepeatedNestedMessage() throws Exception {
1410    TestAllTypesNano msg = new TestAllTypesNano();
1411    TestAllTypesNano.NestedMessage nestedMsg0 =
1412      new TestAllTypesNano.NestedMessage();
1413    nestedMsg0.bb = 0;
1414    TestAllTypesNano.NestedMessage nestedMsg1 =
1415      new TestAllTypesNano.NestedMessage();
1416    nestedMsg1.bb = 1;
1417    TestAllTypesNano.NestedMessage nestedMsg2 =
1418      new TestAllTypesNano.NestedMessage();
1419    nestedMsg2.bb = 2;
1420
1421    msg.repeatedNestedMessage =
1422        new TestAllTypesNano.NestedMessage[] { nestedMsg0, nestedMsg1, nestedMsg2 };
1423    assertEquals(3, msg.repeatedNestedMessage.length);
1424    assertEquals(0, msg.repeatedNestedMessage[0].bb);
1425    assertEquals(1, msg.repeatedNestedMessage[1].bb);
1426    assertEquals(2, msg.repeatedNestedMessage[2].bb);
1427    msg.clear();
1428    assertEquals(0, msg.repeatedNestedMessage.length);
1429    msg.clear()
1430       .repeatedNestedMessage = new TestAllTypesNano.NestedMessage[] { nestedMsg1 };
1431    assertEquals(1, msg.repeatedNestedMessage.length);
1432    assertEquals(1, msg.repeatedNestedMessage[0].bb);
1433    msg.clear();
1434    assertEquals(0, msg.repeatedNestedMessage.length);
1435
1436    // Test 1 entry
1437    msg.clear()
1438       .repeatedNestedMessage = new TestAllTypesNano.NestedMessage[] { nestedMsg0 };
1439    assertEquals(1, msg.repeatedNestedMessage.length);
1440    byte [] result = MessageNano.toByteArray(msg);
1441    int msgSerializedSize = msg.getSerializedSize();
1442    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1443    assertTrue(msgSerializedSize == 6);
1444    assertEquals(result.length, msgSerializedSize);
1445    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1446    assertEquals(1, newMsg.repeatedNestedMessage.length);
1447    assertEquals(0, newMsg.repeatedNestedMessage[0].bb);
1448
1449    // Test 2 entries
1450    msg.clear()
1451       .repeatedNestedMessage = new TestAllTypesNano.NestedMessage[] { nestedMsg0, nestedMsg1 };
1452    assertEquals(2, msg.repeatedNestedMessage.length);
1453    result = MessageNano.toByteArray(msg);
1454    msgSerializedSize = msg.getSerializedSize();
1455    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1456    assertTrue(msgSerializedSize == 11);
1457    assertEquals(result.length, msgSerializedSize);
1458
1459    newMsg = TestAllTypesNano.parseFrom(result);
1460    assertEquals(2, newMsg.repeatedNestedMessage.length);
1461    assertEquals(0, newMsg.repeatedNestedMessage[0].bb);
1462    assertEquals(1, newMsg.repeatedNestedMessage[1].bb);
1463  }
1464
1465  public void testNanoRepeatedForeignMessage() throws Exception {
1466    TestAllTypesNano msg = new TestAllTypesNano();
1467    NanoOuterClass.ForeignMessageNano foreignMsg0 =
1468      new NanoOuterClass.ForeignMessageNano();
1469    foreignMsg0.c = 0;
1470    NanoOuterClass.ForeignMessageNano foreignMsg1 =
1471      new NanoOuterClass.ForeignMessageNano();
1472    foreignMsg1.c = 1;
1473    NanoOuterClass.ForeignMessageNano foreignMsg2 =
1474      new NanoOuterClass.ForeignMessageNano();
1475    foreignMsg2.c = 2;
1476
1477    msg.repeatedForeignMessage =
1478        new NanoOuterClass.ForeignMessageNano[] { foreignMsg0, foreignMsg1, foreignMsg2 };
1479    assertEquals(3, msg.repeatedForeignMessage.length);
1480    assertEquals(0, msg.repeatedForeignMessage[0].c);
1481    assertEquals(1, msg.repeatedForeignMessage[1].c);
1482    assertEquals(2, msg.repeatedForeignMessage[2].c);
1483    msg.clear();
1484    assertEquals(0, msg.repeatedForeignMessage.length);
1485    msg.clear()
1486       .repeatedForeignMessage = new NanoOuterClass.ForeignMessageNano[] { foreignMsg1 };
1487    assertEquals(1, msg.repeatedForeignMessage.length);
1488    assertEquals(1, msg.repeatedForeignMessage[0].c);
1489    msg.clear();
1490    assertEquals(0, msg.repeatedForeignMessage.length);
1491
1492    // Test 1 entry
1493    msg.clear()
1494       .repeatedForeignMessage = new NanoOuterClass.ForeignMessageNano[] { foreignMsg0 };
1495    assertEquals(1, msg.repeatedForeignMessage.length);
1496    byte [] result = MessageNano.toByteArray(msg);
1497    int msgSerializedSize = msg.getSerializedSize();
1498    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1499    assertTrue(msgSerializedSize == 6);
1500    assertEquals(result.length, msgSerializedSize);
1501    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1502    assertEquals(1, newMsg.repeatedForeignMessage.length);
1503    assertEquals(0, newMsg.repeatedForeignMessage[0].c);
1504
1505    // Test 2 entries
1506    msg.clear()
1507       .repeatedForeignMessage = new NanoOuterClass.ForeignMessageNano[] { foreignMsg0, foreignMsg1 };
1508    assertEquals(2, msg.repeatedForeignMessage.length);
1509    result = MessageNano.toByteArray(msg);
1510    msgSerializedSize = msg.getSerializedSize();
1511    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1512    assertTrue(msgSerializedSize == 11);
1513    assertEquals(result.length, msgSerializedSize);
1514
1515    newMsg = TestAllTypesNano.parseFrom(result);
1516    assertEquals(2, newMsg.repeatedForeignMessage.length);
1517    assertEquals(0, newMsg.repeatedForeignMessage[0].c);
1518    assertEquals(1, newMsg.repeatedForeignMessage[1].c);
1519  }
1520
1521  public void testNanoRepeatedImportMessage() throws Exception {
1522    TestAllTypesNano msg = new TestAllTypesNano();
1523    UnittestImportNano.ImportMessageNano foreignMsg0 =
1524      new UnittestImportNano.ImportMessageNano();
1525    foreignMsg0.d = 0;
1526    UnittestImportNano.ImportMessageNano foreignMsg1 =
1527      new UnittestImportNano.ImportMessageNano();
1528    foreignMsg1.d = 1;
1529    UnittestImportNano.ImportMessageNano foreignMsg2 =
1530      new UnittestImportNano.ImportMessageNano();
1531    foreignMsg2.d = 2;
1532
1533    msg.repeatedImportMessage =
1534        new UnittestImportNano.ImportMessageNano[] { foreignMsg0, foreignMsg1, foreignMsg2 };
1535    assertEquals(3, msg.repeatedImportMessage.length);
1536    assertEquals(0, msg.repeatedImportMessage[0].d);
1537    assertEquals(1, msg.repeatedImportMessage[1].d);
1538    assertEquals(2, msg.repeatedImportMessage[2].d);
1539    msg.clear();
1540    assertEquals(0, msg.repeatedImportMessage.length);
1541    msg.clear()
1542       .repeatedImportMessage = new UnittestImportNano.ImportMessageNano[] { foreignMsg1 };
1543    assertEquals(1, msg.repeatedImportMessage.length);
1544    assertEquals(1, msg.repeatedImportMessage[0].d);
1545    msg.clear();
1546    assertEquals(0, msg.repeatedImportMessage.length);
1547
1548    // Test 1 entry
1549    msg.clear()
1550       .repeatedImportMessage = new UnittestImportNano.ImportMessageNano[] { foreignMsg0 };
1551    assertEquals(1, msg.repeatedImportMessage.length);
1552    byte [] result = MessageNano.toByteArray(msg);
1553    int msgSerializedSize = msg.getSerializedSize();
1554    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1555    assertTrue(msgSerializedSize == 6);
1556    assertEquals(result.length, msgSerializedSize);
1557    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1558    assertEquals(1, newMsg.repeatedImportMessage.length);
1559    assertEquals(0, newMsg.repeatedImportMessage[0].d);
1560
1561    // Test 2 entries
1562    msg.clear()
1563       .repeatedImportMessage = new UnittestImportNano.ImportMessageNano[] { foreignMsg0, foreignMsg1 };
1564    assertEquals(2, msg.repeatedImportMessage.length);
1565    result = MessageNano.toByteArray(msg);
1566    msgSerializedSize = msg.getSerializedSize();
1567    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1568    assertTrue(msgSerializedSize == 11);
1569    assertEquals(result.length, msgSerializedSize);
1570
1571    newMsg = TestAllTypesNano.parseFrom(result);
1572    assertEquals(2, newMsg.repeatedImportMessage.length);
1573    assertEquals(0, newMsg.repeatedImportMessage[0].d);
1574    assertEquals(1, newMsg.repeatedImportMessage[1].d);
1575  }
1576
1577  public void testNanoRepeatedNestedEnum() throws Exception {
1578    TestAllTypesNano msg = new TestAllTypesNano();
1579    msg.repeatedNestedEnum = new int[] {
1580        TestAllTypesNano.FOO,
1581        TestAllTypesNano.BAR,
1582        TestAllTypesNano.BAZ
1583    };
1584    assertEquals(3, msg.repeatedNestedEnum.length);
1585    assertEquals(TestAllTypesNano.FOO, msg.repeatedNestedEnum[0]);
1586    assertEquals(TestAllTypesNano.BAR, msg.repeatedNestedEnum[1]);
1587    assertEquals(TestAllTypesNano.BAZ, msg.repeatedNestedEnum[2]);
1588    msg.clear();
1589    assertEquals(0, msg.repeatedNestedEnum.length);
1590    msg.clear()
1591       .repeatedNestedEnum = new int[] { TestAllTypesNano.BAR };
1592    assertEquals(1, msg.repeatedNestedEnum.length);
1593    assertEquals(TestAllTypesNano.BAR, msg.repeatedNestedEnum[0]);
1594    msg.clear();
1595    assertEquals(0, msg.repeatedNestedEnum.length);
1596
1597    // Test 1 entry
1598    msg.clear()
1599       .repeatedNestedEnum = new int[] { TestAllTypesNano.FOO };
1600    byte [] result = MessageNano.toByteArray(msg);
1601    int msgSerializedSize = msg.getSerializedSize();
1602    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1603    assertTrue(msgSerializedSize == 6);
1604    assertEquals(result.length, msgSerializedSize);
1605    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1606    assertEquals(1, newMsg.repeatedNestedEnum.length);
1607    assertEquals(TestAllTypesNano.FOO, msg.repeatedNestedEnum[0]);
1608
1609    // Test 2 entries
1610    msg.clear()
1611       .repeatedNestedEnum = new int[] { TestAllTypesNano.FOO, TestAllTypesNano.BAR };
1612    assertEquals(2, msg.repeatedNestedEnum.length);
1613    result = MessageNano.toByteArray(msg);
1614    msgSerializedSize = msg.getSerializedSize();
1615    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1616    assertTrue(msgSerializedSize == 9);
1617    assertEquals(result.length, msgSerializedSize);
1618
1619    newMsg = TestAllTypesNano.parseFrom(result);
1620    assertEquals(2, newMsg.repeatedNestedEnum.length);
1621    assertEquals(TestAllTypesNano.FOO, msg.repeatedNestedEnum[0]);
1622    assertEquals(TestAllTypesNano.BAR, msg.repeatedNestedEnum[1]);
1623  }
1624
1625  public void testNanoRepeatedForeignEnum() throws Exception {
1626    TestAllTypesNano msg = new TestAllTypesNano();
1627    msg.repeatedForeignEnum = new int[] {
1628        NanoOuterClass.FOREIGN_NANO_FOO,
1629        NanoOuterClass.FOREIGN_NANO_BAR,
1630        NanoOuterClass.FOREIGN_NANO_BAZ
1631    };
1632    assertEquals(3, msg.repeatedForeignEnum.length);
1633    assertEquals(NanoOuterClass.FOREIGN_NANO_FOO, msg.repeatedForeignEnum[0]);
1634    assertEquals(NanoOuterClass.FOREIGN_NANO_BAR, msg.repeatedForeignEnum[1]);
1635    assertEquals(NanoOuterClass.FOREIGN_NANO_BAZ, msg.repeatedForeignEnum[2]);
1636    msg.clear();
1637    assertEquals(0, msg.repeatedForeignEnum.length);
1638    msg.clear()
1639       .repeatedForeignEnum = new int[] { NanoOuterClass.FOREIGN_NANO_BAR };
1640    assertEquals(1, msg.repeatedForeignEnum.length);
1641    assertEquals(NanoOuterClass.FOREIGN_NANO_BAR, msg.repeatedForeignEnum[0]);
1642    msg.clear();
1643    assertEquals(0, msg.repeatedForeignEnum.length);
1644
1645    // Test 1 entry
1646    msg.clear()
1647       .repeatedForeignEnum = new int[] { NanoOuterClass.FOREIGN_NANO_FOO };
1648    byte [] result = MessageNano.toByteArray(msg);
1649    int msgSerializedSize = msg.getSerializedSize();
1650    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1651    assertTrue(msgSerializedSize == 6);
1652    assertEquals(result.length, msgSerializedSize);
1653    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1654    assertEquals(1, newMsg.repeatedForeignEnum.length);
1655    assertEquals(NanoOuterClass.FOREIGN_NANO_FOO, msg.repeatedForeignEnum[0]);
1656
1657    // Test 2 entries
1658    msg.clear()
1659       .repeatedForeignEnum = new int[] {
1660      NanoOuterClass.FOREIGN_NANO_FOO,
1661      NanoOuterClass.FOREIGN_NANO_BAR
1662    };
1663    assertEquals(2, msg.repeatedForeignEnum.length);
1664    result = MessageNano.toByteArray(msg);
1665    msgSerializedSize = msg.getSerializedSize();
1666    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1667    assertTrue(msgSerializedSize == 9);
1668    assertEquals(result.length, msgSerializedSize);
1669
1670    newMsg = TestAllTypesNano.parseFrom(result);
1671    assertEquals(2, newMsg.repeatedForeignEnum.length);
1672    assertEquals(NanoOuterClass.FOREIGN_NANO_FOO, msg.repeatedForeignEnum[0]);
1673    assertEquals(NanoOuterClass.FOREIGN_NANO_BAR, msg.repeatedForeignEnum[1]);
1674  }
1675
1676  public void testNanoRepeatedImportEnum() throws Exception {
1677    TestAllTypesNano msg = new TestAllTypesNano();
1678    msg.repeatedImportEnum = new int[] {
1679        UnittestImportNano.IMPORT_NANO_FOO,
1680        UnittestImportNano.IMPORT_NANO_BAR,
1681        UnittestImportNano.IMPORT_NANO_BAZ
1682    };
1683    assertEquals(3, msg.repeatedImportEnum.length);
1684    assertEquals(UnittestImportNano.IMPORT_NANO_FOO, msg.repeatedImportEnum[0]);
1685    assertEquals(UnittestImportNano.IMPORT_NANO_BAR, msg.repeatedImportEnum[1]);
1686    assertEquals(UnittestImportNano.IMPORT_NANO_BAZ, msg.repeatedImportEnum[2]);
1687    msg.clear();
1688    assertEquals(0, msg.repeatedImportEnum.length);
1689    msg.clear()
1690       .repeatedImportEnum = new int[] { UnittestImportNano.IMPORT_NANO_BAR };
1691    assertEquals(1, msg.repeatedImportEnum.length);
1692    assertEquals(UnittestImportNano.IMPORT_NANO_BAR, msg.repeatedImportEnum[0]);
1693    msg.clear();
1694    assertEquals(0, msg.repeatedImportEnum.length);
1695
1696    // Test 1 entry
1697    msg.clear()
1698       .repeatedImportEnum = new int[] { UnittestImportNano.IMPORT_NANO_FOO };
1699    byte [] result = MessageNano.toByteArray(msg);
1700    int msgSerializedSize = msg.getSerializedSize();
1701    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1702    assertTrue(msgSerializedSize == 6);
1703    assertEquals(result.length, msgSerializedSize);
1704    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1705    assertEquals(1, newMsg.repeatedImportEnum.length);
1706    assertEquals(UnittestImportNano.IMPORT_NANO_FOO, msg.repeatedImportEnum[0]);
1707
1708    // Test 2 entries
1709    msg.clear()
1710       .repeatedImportEnum = new int[] {
1711      UnittestImportNano.IMPORT_NANO_FOO,
1712      UnittestImportNano.IMPORT_NANO_BAR
1713    };
1714    assertEquals(2, msg.repeatedImportEnum.length);
1715    result = MessageNano.toByteArray(msg);
1716    msgSerializedSize = msg.getSerializedSize();
1717    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1718    assertTrue(msgSerializedSize == 9);
1719    assertEquals(result.length, msgSerializedSize);
1720
1721    newMsg = TestAllTypesNano.parseFrom(result);
1722    assertEquals(2, newMsg.repeatedImportEnum.length);
1723    assertEquals(UnittestImportNano.IMPORT_NANO_FOO, msg.repeatedImportEnum[0]);
1724    assertEquals(UnittestImportNano.IMPORT_NANO_BAR, msg.repeatedImportEnum[1]);
1725  }
1726
1727  public void testNanoRepeatedStringPiece() throws Exception {
1728    TestAllTypesNano msg = new TestAllTypesNano();
1729    assertEquals(0, msg.repeatedStringPiece.length);
1730    msg.repeatedStringPiece = new String[] { "hello", "bye", "boo" };
1731    assertEquals("bye", msg.repeatedStringPiece[1]);
1732    assertEquals("boo", msg.repeatedStringPiece[2]);
1733    msg.clear();
1734    assertEquals(0, msg.repeatedStringPiece.length);
1735    msg.clear()
1736       .repeatedStringPiece = new String[] { "boo" };
1737    assertEquals(1, msg.repeatedStringPiece.length);
1738    assertEquals("boo", msg.repeatedStringPiece[0]);
1739    msg.clear();
1740    assertEquals(0, msg.repeatedStringPiece.length);
1741
1742    // Test 1 entry
1743    msg.clear()
1744       .repeatedStringPiece = new String[] { "" };
1745    assertEquals(1, msg.repeatedStringPiece.length);
1746    byte [] result = MessageNano.toByteArray(msg);
1747    int msgSerializedSize = msg.getSerializedSize();
1748    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1749    assertTrue(msgSerializedSize == 6);
1750    assertEquals(result.length, msgSerializedSize);
1751    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1752    assertEquals(1, newMsg.repeatedStringPiece.length);
1753    assertTrue(newMsg.repeatedStringPiece[0].isEmpty());
1754
1755    // Test 2 entries
1756    msg.clear()
1757       .repeatedStringPiece = new String[] { "hello", "world" };
1758    assertEquals(2, msg.repeatedStringPiece.length);
1759    result = MessageNano.toByteArray(msg);
1760    msgSerializedSize = msg.getSerializedSize();
1761    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1762    assertTrue(msgSerializedSize == 19);
1763    assertEquals(result.length, msgSerializedSize);
1764
1765    newMsg = TestAllTypesNano.parseFrom(result);
1766    assertEquals(2, newMsg.repeatedStringPiece.length);
1767    assertEquals("hello", newMsg.repeatedStringPiece[0]);
1768    assertEquals("world", newMsg.repeatedStringPiece[1]);
1769  }
1770
1771  public void testNanoRepeatedCord() throws Exception {
1772    TestAllTypesNano msg = new TestAllTypesNano();
1773    assertEquals(0, msg.repeatedCord.length);
1774    msg.repeatedCord = new String[] { "hello", "bye", "boo" };
1775    assertEquals("bye", msg.repeatedCord[1]);
1776    assertEquals("boo", msg.repeatedCord[2]);
1777    msg.clear();
1778    assertEquals(0, msg.repeatedCord.length);
1779    msg.clear()
1780       .repeatedCord = new String[] { "boo" };
1781    assertEquals(1, msg.repeatedCord.length);
1782    assertEquals("boo", msg.repeatedCord[0]);
1783    msg.clear();
1784    assertEquals(0, msg.repeatedCord.length);
1785
1786    // Test 1 entry
1787    msg.clear()
1788       .repeatedCord = new String[] { "" };
1789    assertEquals(1, msg.repeatedCord.length);
1790    byte [] result = MessageNano.toByteArray(msg);
1791    int msgSerializedSize = msg.getSerializedSize();
1792    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1793    assertTrue(msgSerializedSize == 6);
1794    assertEquals(result.length, msgSerializedSize);
1795    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1796    assertEquals(1, newMsg.repeatedCord.length);
1797    assertTrue(newMsg.repeatedCord[0].isEmpty());
1798
1799    // Test 2 entries
1800    msg.clear()
1801       .repeatedCord = new String[] { "hello", "world" };
1802    assertEquals(2, msg.repeatedCord.length);
1803    result = MessageNano.toByteArray(msg);
1804    msgSerializedSize = msg.getSerializedSize();
1805    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1806    assertTrue(msgSerializedSize == 19);
1807    assertEquals(result.length, msgSerializedSize);
1808
1809    newMsg = TestAllTypesNano.parseFrom(result);
1810    assertEquals(2, newMsg.repeatedCord.length);
1811    assertEquals("hello", newMsg.repeatedCord[0]);
1812    assertEquals("world", newMsg.repeatedCord[1]);
1813  }
1814
1815  public void testNanoRepeatedPackedInt32() throws Exception {
1816    TestAllTypesNano msg = new TestAllTypesNano();
1817    assertEquals(0, msg.repeatedPackedInt32.length);
1818    msg.repeatedPackedInt32 = new int[] { 123, 789, 456 };
1819    assertEquals(789, msg.repeatedPackedInt32[1]);
1820    assertEquals(456, msg.repeatedPackedInt32[2]);
1821    msg.clear();
1822    assertEquals(0, msg.repeatedPackedInt32.length);
1823    msg.clear()
1824       .repeatedPackedInt32 = new int[] { 456 };
1825    assertEquals(1, msg.repeatedPackedInt32.length);
1826    assertEquals(456, msg.repeatedPackedInt32[0]);
1827    msg.clear();
1828    assertEquals(0, msg.repeatedPackedInt32.length);
1829
1830    // Test 1 entry
1831    msg.clear()
1832       .repeatedPackedInt32 = new int[] { 123 };
1833    assertEquals(1, msg.repeatedPackedInt32.length);
1834    byte [] result = MessageNano.toByteArray(msg);
1835    int msgSerializedSize = msg.getSerializedSize();
1836    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1837    assertTrue(msgSerializedSize == 7);
1838    assertEquals(result.length, msgSerializedSize);
1839    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1840    assertEquals(1, newMsg.repeatedPackedInt32.length);
1841    assertEquals(123, newMsg.repeatedPackedInt32[0]);
1842
1843    // Test 2 entries
1844    msg.clear()
1845       .repeatedPackedInt32 = new int[] { 123, 456 };
1846    assertEquals(2, msg.repeatedPackedInt32.length);
1847    result = MessageNano.toByteArray(msg);
1848    msgSerializedSize = msg.getSerializedSize();
1849    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1850    assertTrue(msgSerializedSize == 9);
1851    assertEquals(result.length, msgSerializedSize);
1852
1853    newMsg = TestAllTypesNano.parseFrom(result);
1854    assertEquals(2, newMsg.repeatedPackedInt32.length);
1855    assertEquals(123, newMsg.repeatedPackedInt32[0]);
1856    assertEquals(456, newMsg.repeatedPackedInt32[1]);
1857  }
1858
1859  public void testNanoRepeatedPackedSfixed64() throws Exception {
1860    TestAllTypesNano msg = new TestAllTypesNano();
1861    assertEquals(0, msg.repeatedPackedSfixed64.length);
1862    msg.repeatedPackedSfixed64 = new long[] { 123, 789, 456 };
1863    assertEquals(789, msg.repeatedPackedSfixed64[1]);
1864    assertEquals(456, msg.repeatedPackedSfixed64[2]);
1865    msg.clear();
1866    assertEquals(0, msg.repeatedPackedSfixed64.length);
1867    msg.clear()
1868       .repeatedPackedSfixed64 = new long[] { 456 };
1869    assertEquals(1, msg.repeatedPackedSfixed64.length);
1870    assertEquals(456, msg.repeatedPackedSfixed64[0]);
1871    msg.clear();
1872    assertEquals(0, msg.repeatedPackedSfixed64.length);
1873
1874    // Test 1 entry
1875    msg.clear()
1876       .repeatedPackedSfixed64 = new long[] { 123 };
1877    assertEquals(1, msg.repeatedPackedSfixed64.length);
1878    byte [] result = MessageNano.toByteArray(msg);
1879    int msgSerializedSize = msg.getSerializedSize();
1880    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1881    assertTrue(msgSerializedSize == 14);
1882    assertEquals(result.length, msgSerializedSize);
1883    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1884    assertEquals(1, newMsg.repeatedPackedSfixed64.length);
1885    assertEquals(123, newMsg.repeatedPackedSfixed64[0]);
1886
1887    // Test 2 entries
1888    msg.clear()
1889       .repeatedPackedSfixed64 = new long[] { 123, 456 };
1890    assertEquals(2, msg.repeatedPackedSfixed64.length);
1891    result = MessageNano.toByteArray(msg);
1892    msgSerializedSize = msg.getSerializedSize();
1893    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1894    assertTrue(msgSerializedSize == 22);
1895    assertEquals(result.length, msgSerializedSize);
1896
1897    newMsg = TestAllTypesNano.parseFrom(result);
1898    assertEquals(2, newMsg.repeatedPackedSfixed64.length);
1899    assertEquals(123, newMsg.repeatedPackedSfixed64[0]);
1900    assertEquals(456, newMsg.repeatedPackedSfixed64[1]);
1901  }
1902
1903  public void testNanoRepeatedPackedNestedEnum() throws Exception {
1904    TestAllTypesNano msg = new TestAllTypesNano();
1905    msg.repeatedPackedNestedEnum = new int[] {
1906        TestAllTypesNano.FOO,
1907        TestAllTypesNano.BAR,
1908        TestAllTypesNano.BAZ
1909    };
1910    assertEquals(3, msg.repeatedPackedNestedEnum.length);
1911    assertEquals(TestAllTypesNano.FOO, msg.repeatedPackedNestedEnum[0]);
1912    assertEquals(TestAllTypesNano.BAR, msg.repeatedPackedNestedEnum[1]);
1913    assertEquals(TestAllTypesNano.BAZ, msg.repeatedPackedNestedEnum[2]);
1914    msg.clear();
1915    assertEquals(0, msg.repeatedPackedNestedEnum.length);
1916    msg.clear()
1917       .repeatedPackedNestedEnum = new int[] { TestAllTypesNano.BAR };
1918    assertEquals(1, msg.repeatedPackedNestedEnum.length);
1919    assertEquals(TestAllTypesNano.BAR, msg.repeatedPackedNestedEnum[0]);
1920    msg.clear();
1921    assertEquals(0, msg.repeatedPackedNestedEnum.length);
1922
1923    // Test 1 entry
1924    msg.clear()
1925       .repeatedPackedNestedEnum = new int[] { TestAllTypesNano.FOO };
1926    byte [] result = MessageNano.toByteArray(msg);
1927    int msgSerializedSize = msg.getSerializedSize();
1928    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1929    assertTrue(msgSerializedSize == 7);
1930    assertEquals(result.length, msgSerializedSize);
1931    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1932    assertEquals(1, newMsg.repeatedPackedNestedEnum.length);
1933    assertEquals(TestAllTypesNano.FOO, msg.repeatedPackedNestedEnum[0]);
1934
1935    // Test 2 entries
1936    msg.clear()
1937       .repeatedPackedNestedEnum = new int[] { TestAllTypesNano.FOO, TestAllTypesNano.BAR };
1938    assertEquals(2, msg.repeatedPackedNestedEnum.length);
1939    result = MessageNano.toByteArray(msg);
1940    msgSerializedSize = msg.getSerializedSize();
1941    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
1942    assertTrue(msgSerializedSize == 8);
1943    assertEquals(result.length, msgSerializedSize);
1944
1945    newMsg = TestAllTypesNano.parseFrom(result);
1946    assertEquals(2, newMsg.repeatedPackedNestedEnum.length);
1947    assertEquals(TestAllTypesNano.FOO, msg.repeatedPackedNestedEnum[0]);
1948    assertEquals(TestAllTypesNano.BAR, msg.repeatedPackedNestedEnum[1]);
1949  }
1950
1951  public void testNanoRepeatedInt32ReMerge() throws Exception {
1952    TestAllTypesNano msg = new TestAllTypesNano();
1953    msg.repeatedInt32 = new int[] { 234 };
1954    byte [] result1 = MessageNano.toByteArray(msg);
1955
1956    msg.clear().optionalInt32 = 789;
1957    byte [] result2 = MessageNano.toByteArray(msg);
1958
1959    msg.clear().repeatedInt32 = new int[] { 123, 456 };
1960    byte [] result3 = MessageNano.toByteArray(msg);
1961
1962    // Concatenate the three serializations and read as one message.
1963    byte [] result = new byte[result1.length + result2.length + result3.length];
1964    System.arraycopy(result1, 0, result, 0, result1.length);
1965    System.arraycopy(result2, 0, result, result1.length, result2.length);
1966    System.arraycopy(result3, 0, result, result1.length + result2.length, result3.length);
1967
1968    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1969    assertEquals(789, newMsg.optionalInt32);
1970    assertEquals(3, newMsg.repeatedInt32.length);
1971    assertEquals(234, newMsg.repeatedInt32[0]);
1972    assertEquals(123, newMsg.repeatedInt32[1]);
1973    assertEquals(456, newMsg.repeatedInt32[2]);
1974  }
1975
1976  public void testNanoRepeatedNestedEnumReMerge() throws Exception {
1977    TestAllTypesNano msg = new TestAllTypesNano();
1978    msg.repeatedNestedEnum = new int[] { TestAllTypesNano.FOO };
1979    byte [] result1 = MessageNano.toByteArray(msg);
1980
1981    msg.clear().optionalInt32 = 789;
1982    byte [] result2 = MessageNano.toByteArray(msg);
1983
1984    msg.clear().repeatedNestedEnum = new int[] { TestAllTypesNano.BAR, TestAllTypesNano.FOO };
1985    byte [] result3 = MessageNano.toByteArray(msg);
1986
1987    // Concatenate the three serializations and read as one message.
1988    byte [] result = new byte[result1.length + result2.length + result3.length];
1989    System.arraycopy(result1, 0, result, 0, result1.length);
1990    System.arraycopy(result2, 0, result, result1.length, result2.length);
1991    System.arraycopy(result3, 0, result, result1.length + result2.length, result3.length);
1992
1993    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
1994    assertEquals(789, newMsg.optionalInt32);
1995    assertEquals(3, newMsg.repeatedNestedEnum.length);
1996    assertEquals(TestAllTypesNano.FOO, newMsg.repeatedNestedEnum[0]);
1997    assertEquals(TestAllTypesNano.BAR, newMsg.repeatedNestedEnum[1]);
1998    assertEquals(TestAllTypesNano.FOO, newMsg.repeatedNestedEnum[2]);
1999  }
2000
2001  public void testNanoRepeatedNestedMessageReMerge() throws Exception {
2002    TestAllTypesNano msg = new TestAllTypesNano();
2003    TestAllTypesNano.NestedMessage nestedMsg0 =
2004      new TestAllTypesNano.NestedMessage();
2005    nestedMsg0.bb = 0;
2006    TestAllTypesNano.NestedMessage nestedMsg1 =
2007      new TestAllTypesNano.NestedMessage();
2008    nestedMsg1.bb = 1;
2009    TestAllTypesNano.NestedMessage nestedMsg2 =
2010      new TestAllTypesNano.NestedMessage();
2011    nestedMsg2.bb = 2;
2012
2013    msg.repeatedNestedMessage = new TestAllTypesNano.NestedMessage[] { nestedMsg0 };
2014    byte [] result1 = MessageNano.toByteArray(msg);
2015
2016    msg.clear().optionalInt32 = 789;
2017    byte [] result2 = MessageNano.toByteArray(msg);
2018
2019    msg.clear().repeatedNestedMessage =
2020        new TestAllTypesNano.NestedMessage[] { nestedMsg1, nestedMsg2 };
2021    byte [] result3 = MessageNano.toByteArray(msg);
2022
2023    // Concatenate the three serializations and read as one message.
2024    byte [] result = new byte[result1.length + result2.length + result3.length];
2025    System.arraycopy(result1, 0, result, 0, result1.length);
2026    System.arraycopy(result2, 0, result, result1.length, result2.length);
2027    System.arraycopy(result3, 0, result, result1.length + result2.length, result3.length);
2028
2029    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
2030    assertEquals(789, newMsg.optionalInt32);
2031    assertEquals(3, newMsg.repeatedNestedMessage.length);
2032    assertEquals(nestedMsg0.bb, newMsg.repeatedNestedMessage[0].bb);
2033    assertEquals(nestedMsg1.bb, newMsg.repeatedNestedMessage[1].bb);
2034    assertEquals(nestedMsg2.bb, newMsg.repeatedNestedMessage[2].bb);
2035  }
2036
2037  public void testNanoDefaults() throws Exception {
2038    TestAllTypesNano msg = new TestAllTypesNano();
2039    for (int i = 0; i < 2; i++) {
2040      assertEquals(41, msg.defaultInt32);
2041      assertEquals(42, msg.defaultInt64);
2042      assertEquals(43, msg.defaultUint32);
2043      assertEquals(44, msg.defaultUint64);
2044      assertEquals(-45, msg.defaultSint32);
2045      assertEquals(46, msg.defaultSint64);
2046      assertEquals(47, msg.defaultFixed32);
2047      assertEquals(48, msg.defaultFixed64);
2048      assertEquals(49, msg.defaultSfixed32);
2049      assertEquals(-50, msg.defaultSfixed64);
2050      assertTrue(51.5f == msg.defaultFloat);
2051      assertTrue(52.0e3 == msg.defaultDouble);
2052      assertEquals(true, msg.defaultBool);
2053      assertEquals("hello", msg.defaultString);
2054      assertEquals("world", new String(msg.defaultBytes, "UTF-8"));
2055      assertEquals("dünya", msg.defaultStringNonascii);
2056      assertEquals("dünyab", new String(msg.defaultBytesNonascii, "UTF-8"));
2057      assertEquals(TestAllTypesNano.BAR, msg.defaultNestedEnum);
2058      assertEquals(NanoOuterClass.FOREIGN_NANO_BAR, msg.defaultForeignEnum);
2059      assertEquals(UnittestImportNano.IMPORT_NANO_BAR, msg.defaultImportEnum);
2060
2061      // Default values are not output, except for required fields.
2062      byte [] result = MessageNano.toByteArray(msg);
2063      int msgSerializedSize = msg.getSerializedSize();
2064      //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
2065      assertTrue(msgSerializedSize == 3);
2066      assertEquals(result.length, msgSerializedSize);
2067      msg.clear();
2068    }
2069  }
2070
2071  /**
2072   * Test that a bug in skipRawBytes() has been fixed:  if the skip skips
2073   * exactly up to a limit, this should not break things.
2074   */
2075  public void testSkipRawBytesBug() throws Exception {
2076    byte[] rawBytes = new byte[] { 1, 2 };
2077    CodedInputByteBufferNano input = CodedInputByteBufferNano.newInstance(rawBytes);
2078
2079    int limit = input.pushLimit(1);
2080    input.skipRawBytes(1);
2081    input.popLimit(limit);
2082    assertEquals(2, input.readRawByte());
2083  }
2084
2085  /**
2086   * Test that a bug in skipRawBytes() has been fixed:  if the skip skips
2087   * past the end of a buffer with a limit that has been set past the end of
2088   * that buffer, this should not break things.
2089   */
2090  public void testSkipRawBytesPastEndOfBufferWithLimit() throws Exception {
2091    byte[] rawBytes = new byte[] { 1, 2, 3, 4, 5 };
2092    CodedInputByteBufferNano input = CodedInputByteBufferNano.newInstance(rawBytes);
2093
2094    int limit = input.pushLimit(4);
2095    // In order to expose the bug we need to read at least one byte to prime the
2096    // buffer inside the CodedInputStream.
2097    assertEquals(1, input.readRawByte());
2098    // Skip to the end of the limit.
2099    input.skipRawBytes(3);
2100    assertTrue(input.isAtEnd());
2101    input.popLimit(limit);
2102    assertEquals(5, input.readRawByte());
2103  }
2104}
2105