164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// Protocol Buffers - Google's data interchange format
264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// Copyright 2013 Google Inc.  All rights reserved.
364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// http://code.google.com/p/protobuf/
464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//
564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// Redistribution and use in source and binary forms, with or without
664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// modification, are permitted provided that the following conditions are
764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// met:
864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//
964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//     * Redistributions of source code must retain the above copyright
1064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// notice, this list of conditions and the following disclaimer.
1164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//     * Redistributions in binary form must reproduce the above
1264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// copyright notice, this list of conditions and the following disclaimer
1364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// in the documentation and/or other materials provided with the
1464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// distribution.
1564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//     * Neither the name of Google Inc. nor the names of its
1664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// contributors may be used to endorse or promote products derived from
1764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// this software without specific prior written permission.
1864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//
1964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
3164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcipackage com.google.protobuf;
3264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
330e055f079f53b07de3705838a7b4742ce56839f8Brian Duffimport com.google.protobuf.nano.CodedInputByteBufferNano;
34ebfc42610b47af51de7ce9eacc65960a80c6d490Charles Mungerimport com.google.protobuf.nano.CodedOutputByteBufferNano;
3526266cd4660ffe1f3d6015b715713ee654c5b936Max Caiimport com.google.protobuf.nano.EnumClassNanoMultiple;
3626266cd4660ffe1f3d6015b715713ee654c5b936Max Caiimport com.google.protobuf.nano.EnumClassNanos;
37d888895a3b5cf764856d3a94ed526bf9994c1800Max Caiimport com.google.protobuf.nano.EnumValidity;
38d888895a3b5cf764856d3a94ed526bf9994c1800Max Caiimport com.google.protobuf.nano.EnumValidityAccessors;
3926266cd4660ffe1f3d6015b715713ee654c5b936Max Caiimport com.google.protobuf.nano.FileScopeEnumMultiple;
40624c448fbef20a1a2fad2289f622b468c25763d1Max Caiimport com.google.protobuf.nano.FileScopeEnumRefNano;
4164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazciimport com.google.protobuf.nano.InternalNano;
42cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveiraimport com.google.protobuf.nano.InvalidProtocolBufferNanoException;
4364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazciimport com.google.protobuf.nano.MessageNano;
44624c448fbef20a1a2fad2289f622b468c25763d1Max Caiimport com.google.protobuf.nano.MessageScopeEnumRefNano;
458170787391efcb6cc6a8babc1cce35d5b1aff420Max Caiimport com.google.protobuf.nano.MultipleImportingNonMultipleNano1;
468170787391efcb6cc6a8babc1cce35d5b1aff420Max Caiimport com.google.protobuf.nano.MultipleImportingNonMultipleNano2;
47624c448fbef20a1a2fad2289f622b468c25763d1Max Caiimport com.google.protobuf.nano.MultipleNameClashNano;
48e74fe623e115237968a3de1143d7cdb4df710858Max Caiimport com.google.protobuf.nano.NanoAccessorsOuterClass.TestNanoAccessors;
4935d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazciimport com.google.protobuf.nano.NanoHasOuterClass.TestAllTypesNanoHas;
5064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazciimport com.google.protobuf.nano.NanoOuterClass;
5164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazciimport com.google.protobuf.nano.NanoOuterClass.TestAllTypesNano;
520b8579237336f221711a0aac42400eb31a58fed3Brian Duffimport com.google.protobuf.nano.NanoReferenceTypes;
535537d6fe4af105eb769bacc530e8d5d9e0b027cbBrian Duffimport com.google.protobuf.nano.NanoReferenceTypesCompat;
54fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Caiimport com.google.protobuf.nano.NanoRepeatedPackables;
55382ddccb550e1c822ef26a0e65988998f7446624Max Caiimport com.google.protobuf.nano.PackedExtensions;
56382ddccb550e1c822ef26a0e65988998f7446624Max Caiimport com.google.protobuf.nano.RepeatedExtensions;
57382ddccb550e1c822ef26a0e65988998f7446624Max Caiimport com.google.protobuf.nano.SingularExtensions;
58334a7d1117a576bc6010c14677fb6444639c1ddaMax Caiimport com.google.protobuf.nano.TestRepeatedMergeNano;
59624c448fbef20a1a2fad2289f622b468c25763d1Max Caiimport com.google.protobuf.nano.UnittestMultipleNano;
60624c448fbef20a1a2fad2289f622b468c25763d1Max Caiimport com.google.protobuf.nano.UnittestRecursiveNano.RecursiveMessageNano;
61624c448fbef20a1a2fad2289f622b468c25763d1Max Caiimport com.google.protobuf.nano.UnittestSimpleNano.SimpleMessageNano;
62624c448fbef20a1a2fad2289f622b468c25763d1Max Caiimport com.google.protobuf.nano.UnittestSingleNano.SingleMessageNano;
6311f883e185a2ea6fd6d0b19520e9f0f004e90e5cMax Caiimport com.google.protobuf.nano.testext.Extensions;
6411f883e185a2ea6fd6d0b19520e9f0f004e90e5cMax Caiimport com.google.protobuf.nano.testext.Extensions.AnotherMessage;
6511f883e185a2ea6fd6d0b19520e9f0f004e90e5cMax Caiimport com.google.protobuf.nano.testext.Extensions.MessageWithGroup;
6611f883e185a2ea6fd6d0b19520e9f0f004e90e5cMax Caiimport com.google.protobuf.nano.testimport.UnittestImportNano;
6764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
6864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazciimport junit.framework.TestCase;
6964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
7014dd1f02ac95f61087e311bf61c85047fb218a29Ulas Kirazciimport java.util.Arrays;
71ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duffimport java.util.HashMap;
720e055f079f53b07de3705838a7b4742ce56839f8Brian Duff
7364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci/**
7464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * Test nano runtime.
7564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci *
7664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * @author ulas@google.com Ulas Kirazci
7764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci */
7864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcipublic class NanoTest extends TestCase {
79e74fe623e115237968a3de1143d7cdb4df710858Max Cai  @Override
8064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void setUp() throws Exception {
8164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
8264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
8364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testSimpleMessageNano() throws Exception {
8464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    SimpleMessageNano msg = new SimpleMessageNano();
8564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, msg.d);
8664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(null, msg.nestedMsg);
8764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(SimpleMessageNano.BAZ, msg.defaultNestedEnum);
8864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
8964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.d = 456;
9064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.d);
9164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
9264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    SimpleMessageNano.NestedMessage nestedMsg = new SimpleMessageNano.NestedMessage();
9364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    nestedMsg.bb = 2;
9464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, nestedMsg.bb);
9564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.nestedMsg = nestedMsg;
9664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.nestedMsg.bb);
9764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
9864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.defaultNestedEnum = SimpleMessageNano.BAR;
9964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(SimpleMessageNano.BAR, msg.defaultNestedEnum);
10064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
10164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
10264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
10364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
10464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 9);
10564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
10664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
10764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    SimpleMessageNano newMsg = SimpleMessageNano.parseFrom(result);
10864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, newMsg.d);
10964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.nestedMsg.bb);
11064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(SimpleMessageNano.BAR, msg.defaultNestedEnum);
111c82101204dcde798f870d95e91f5483c3e57eb29Dave Hawkey
112c82101204dcde798f870d95e91f5483c3e57eb29Dave Hawkey    msg.nestedMsg = null;
113c82101204dcde798f870d95e91f5483c3e57eb29Dave Hawkey    assertTrue(msgSerializedSize != msg.getSerializedSize());
114c82101204dcde798f870d95e91f5483c3e57eb29Dave Hawkey
115c82101204dcde798f870d95e91f5483c3e57eb29Dave Hawkey    msg.clear();
116c82101204dcde798f870d95e91f5483c3e57eb29Dave Hawkey    assertEquals(0, msg.getSerializedSize());
11764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
11864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
11964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testRecursiveMessageNano() throws Exception {
12064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    RecursiveMessageNano msg = new RecursiveMessageNano();
12164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.repeatedRecursiveMessageNano.length == 0);
12264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
12364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    RecursiveMessageNano msg1 = new RecursiveMessageNano();
12464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg1.id = 1;
12564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg1.id);
12664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    RecursiveMessageNano msg2 = new RecursiveMessageNano();
12764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg2.id = 2;
12864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    RecursiveMessageNano msg3 = new RecursiveMessageNano();
12964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg3.id = 3;
13064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
13164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    RecursiveMessageNano.NestedMessage nestedMsg = new RecursiveMessageNano.NestedMessage();
13264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    nestedMsg.a = msg1;
13364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, nestedMsg.a.id);
13464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
13564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.id = 0;
13664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.nestedMessage = nestedMsg;
13764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalRecursiveMessageNano = msg2;
13864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedRecursiveMessageNano = new RecursiveMessageNano[] { msg3 };
13964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
14064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
14164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
14264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
14364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 16);
14464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
14564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
14664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    RecursiveMessageNano newMsg = RecursiveMessageNano.parseFrom(result);
14764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedRecursiveMessageNano.length);
14864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
14964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, newMsg.id);
15064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.nestedMessage.a.id);
15164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.optionalRecursiveMessageNano.id);
15264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(3, newMsg.repeatedRecursiveMessageNano[0].id);
15364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
15464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
155c82101204dcde798f870d95e91f5483c3e57eb29Dave Hawkey  public void testMessageNoFields() {
156c82101204dcde798f870d95e91f5483c3e57eb29Dave Hawkey    SingleMessageNano msg = new SingleMessageNano();
157c82101204dcde798f870d95e91f5483c3e57eb29Dave Hawkey    assertEquals(0, msg.getSerializedSize());
158c82101204dcde798f870d95e91f5483c3e57eb29Dave Hawkey    assertEquals(0, MessageNano.toByteArray(msg).length);
159c82101204dcde798f870d95e91f5483c3e57eb29Dave Hawkey  }
160c82101204dcde798f870d95e91f5483c3e57eb29Dave Hawkey
16164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRequiredInt32() throws Exception {
16264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
16364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.id = 123;
16464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, msg.id);
16564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear().id = 456;
16664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.id);
16764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
16864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
16964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.id = 123;
17064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
17164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
17264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
17364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 3);
17464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
17564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
17664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
17764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.id);
17864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
17964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
18064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalInt32() throws Exception {
18164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
18264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalInt32 = 123;
18364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, msg.optionalInt32);
18464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
18564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalInt32 = 456;
18664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.optionalInt32);
18764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
18864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
18964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalInt32 = 123;
19064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
19164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
19264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
19364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 5);
19464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
19564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
19664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
19764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.optionalInt32);
19864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
19964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
20064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalInt64() throws Exception {
20164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
20264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalInt64 = 123;
20364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, msg.optionalInt64);
20464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
20564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalInt64 = 456;
20664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.optionalInt64);
20764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
20864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.optionalInt64);
20964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
21064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalInt64 = 123;
21164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
21264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
21364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
21464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 5);
21564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
21664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
21764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
21864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.optionalInt64);
21964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
22064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
22164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalUint32() throws Exception {
22264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
22364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalUint32 = 123;
22464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, msg.optionalUint32);
22564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
22664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalUint32 = 456;
22764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.optionalUint32);
22864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
22964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.optionalUint32);
23064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
23164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalUint32 = 123;
23264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
23364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
23464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
23564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 5);
23664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
23764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
23864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
23964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.optionalUint32);
24064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
24164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
24264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalUint64() throws Exception {
24364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
24464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalUint64 = 123;
24564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, msg.optionalUint64);
24664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
24764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalUint64 = 456;
24864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.optionalUint64);
24964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
25064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.optionalUint64);
25164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
25264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalUint64 = 123;
25364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
25464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
25564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
25664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 5);
25764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
25864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
25964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
26064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.optionalUint64);
26164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
26264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
26364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalSint32() throws Exception {
26464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
26564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalSint32 = 123;
26664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, msg.optionalSint32);
26764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
26864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalSint32 = 456;
26964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.optionalSint32);
27064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
27164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.optionalSint32);
27264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
27364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalSint32 = -123;
27464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
27564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
27664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
27764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
27864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
27964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
28064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
28164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(-123, newMsg.optionalSint32);
28264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
28364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
28464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalSint64() throws Exception {
28564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
28664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalSint64 = 123;
28764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, msg.optionalSint64);
28864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
28964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalSint64 = 456;
29064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.optionalSint64);
29164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
29264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.optionalSint64);
29364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
29464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalSint64 = -123;
29564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
29664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
29764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
29864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
29964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
30064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
30164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
30264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(-123, newMsg.optionalSint64);
30364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
30464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
30564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalFixed32() throws Exception {
30664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
30764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalFixed32 = 123;
30864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, msg.optionalFixed32);
30964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
31064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalFixed32 = 456;
31164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.optionalFixed32);
31264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
31364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.optionalFixed32);
31464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
31564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalFixed32 = 123;
31664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
31764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
31864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
31964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 8);
32064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
32164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
32264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
32364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.optionalFixed32);
32464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
32564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
32664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalFixed64() throws Exception {
32764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
32864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalFixed64 = 123;
32964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, msg.optionalFixed64);
33064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
33164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalFixed64 = 456;
33264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.optionalFixed64);
33364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
33464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.optionalFixed64);
33564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
33664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalFixed64 = 123;
33764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
33864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
33964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
34064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 12);
34164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
34264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
34364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
34464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.optionalFixed64);
34564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
34664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
34764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalSfixed32() throws Exception {
34864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
34964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalSfixed32 = 123;
35064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, msg.optionalSfixed32);
35164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
35264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalSfixed32 = 456;
35364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.optionalSfixed32);
35464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
35564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.optionalSfixed32);
35664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
35764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalSfixed32 = 123;
35864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
35964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
36064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
36164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 8);
36264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
36364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
36464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
36564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.optionalSfixed32);
36664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
36764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
36864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalSfixed64() throws Exception {
36964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
37064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalSfixed64 = 123;
37164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, msg.optionalSfixed64);
37264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
37364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalSfixed64 = 456;
37464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.optionalSfixed64);
37564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
37664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.optionalSfixed64);
37764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
37864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalSfixed64 = -123;
37964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
38064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
38164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
38264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 12);
38364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
38464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
38564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
38664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(-123, newMsg.optionalSfixed64);
38764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
38864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
38964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalFloat() throws Exception {
39064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
39164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalFloat = 123f;
39264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(123.0f == msg.optionalFloat);
39364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
39464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalFloat = 456.0f;
39564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(456.0f == msg.optionalFloat);
39664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
39764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(0.0f == msg.optionalFloat);
39864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
39964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalFloat = -123.456f;
40064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
40164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
40264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
40364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 8);
40464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
40564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
40664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
40764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(-123.456f == newMsg.optionalFloat);
40864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
40964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
41064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalDouble() throws Exception {
41164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
41264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalDouble = 123;
41364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(123.0 == msg.optionalDouble);
41464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
41564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalDouble = 456.0;
41664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(456.0 == msg.optionalDouble);
41764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
41864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(0.0 == msg.optionalDouble);
41964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
42064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalDouble = -123.456;
42164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
42264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
42364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
42464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 12);
42564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
42664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
42764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
42864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(-123.456 == newMsg.optionalDouble);
42964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
43064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
43164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalBool() throws Exception {
43264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
43364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalBool = true;
43464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.optionalBool);
43564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
43664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalBool = true;
43764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.optionalBool);
43864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
43964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertFalse(msg.optionalBool);
44064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
44164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalBool = true;
44264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
44364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
44464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
44564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 5);
44664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
44764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
44864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
44964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(newMsg.optionalBool);
45064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
45164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
45264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalString() throws Exception {
45364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
45464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalString = "hello";
45564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("hello", msg.optionalString);
45664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
45764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.optionalString.isEmpty());
45864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
45964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalString = "hello2";
46064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("hello2", msg.optionalString);
46164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
46264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.optionalString.isEmpty());
46364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
46464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalString = "bye";
46564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
46664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
46764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
46864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 8);
46964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
47064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
47164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
47264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(newMsg.optionalString != null);
47364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("bye", newMsg.optionalString);
47464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
47564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
47664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalBytes() throws Exception {
47764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
47864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertFalse(msg.optionalBytes.length > 0);
47964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalBytes = InternalNano.copyFromUtf8("hello");
48064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.optionalBytes.length > 0);
48164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("hello", new String(msg.optionalBytes, "UTF-8"));
48264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
48364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertFalse(msg.optionalBytes.length > 0);
48464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
48564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalBytes = InternalNano.copyFromUtf8("hello");
48664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.optionalBytes.length > 0);
48764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
48864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertFalse(msg.optionalBytes.length > 0);
48964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
49064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalBytes = InternalNano.copyFromUtf8("bye");
49164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
49264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
49364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
49464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 8);
49564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
49664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
49764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
49864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(newMsg.optionalBytes.length > 0);
49964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("bye", new String(newMsg.optionalBytes, "UTF-8"));
50064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
50164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
50264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalGroup() throws Exception {
50364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
50464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano.OptionalGroup grp = new TestAllTypesNano.OptionalGroup();
50564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    grp.a = 1;
50664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertFalse(msg.optionalGroup != null);
50764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalGroup = grp;
50864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.optionalGroup != null);
50964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.optionalGroup.a);
51064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
51164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertFalse(msg.optionalGroup != null);
51264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
51364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalGroup = new TestAllTypesNano.OptionalGroup();
51464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalGroup.a = 2;
51564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.optionalGroup != null);
51664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
51764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertFalse(msg.optionalGroup != null);
51864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
51964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalGroup = grp;
52064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
52164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
52264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
52364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 10);
52464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
52564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
52664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
52764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(newMsg.optionalGroup != null);
52864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.optionalGroup.a);
52964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
53064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
53137ac79028de3d1cd8c215ba54fdf31e4eeca4b2cNicholas Seckar  public void testNanoOptionalGroupWithUnknownFieldsEnabled() throws Exception {
53237ac79028de3d1cd8c215ba54fdf31e4eeca4b2cNicholas Seckar    MessageWithGroup msg = new MessageWithGroup();
53337ac79028de3d1cd8c215ba54fdf31e4eeca4b2cNicholas Seckar    MessageWithGroup.Group grp = new MessageWithGroup.Group();
53437ac79028de3d1cd8c215ba54fdf31e4eeca4b2cNicholas Seckar    grp.a = 1;
53537ac79028de3d1cd8c215ba54fdf31e4eeca4b2cNicholas Seckar    msg.group = grp;
53637ac79028de3d1cd8c215ba54fdf31e4eeca4b2cNicholas Seckar    byte [] serialized = MessageNano.toByteArray(msg);
53737ac79028de3d1cd8c215ba54fdf31e4eeca4b2cNicholas Seckar
53837ac79028de3d1cd8c215ba54fdf31e4eeca4b2cNicholas Seckar    MessageWithGroup parsed = MessageWithGroup.parseFrom(serialized);
539382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(1, parsed.group.a);
54037ac79028de3d1cd8c215ba54fdf31e4eeca4b2cNicholas Seckar
54137ac79028de3d1cd8c215ba54fdf31e4eeca4b2cNicholas Seckar    byte [] serialized2 = MessageNano.toByteArray(parsed);
542382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(serialized.length, serialized2.length);
54337ac79028de3d1cd8c215ba54fdf31e4eeca4b2cNicholas Seckar    MessageWithGroup parsed2 = MessageWithGroup.parseFrom(serialized2);
544382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(1, parsed2.group.a);
54537ac79028de3d1cd8c215ba54fdf31e4eeca4b2cNicholas Seckar  }
54637ac79028de3d1cd8c215ba54fdf31e4eeca4b2cNicholas Seckar
54764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalNestedMessage() throws Exception {
54864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
54964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano.NestedMessage nestedMsg = new TestAllTypesNano.NestedMessage();
55064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    nestedMsg.bb = 1;
55164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertFalse(msg.optionalNestedMessage != null);
55264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalNestedMessage = nestedMsg;
55364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.optionalNestedMessage != null);
55464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.optionalNestedMessage.bb);
55564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
55664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertFalse(msg.optionalNestedMessage != null);
55764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
55864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalNestedMessage = new TestAllTypesNano.NestedMessage();
55964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalNestedMessage.bb = 2;
56064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.optionalNestedMessage != null);
56164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
56264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertFalse(msg.optionalNestedMessage != null);
56364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
56464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalNestedMessage = nestedMsg;
56564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
56664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
56764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
56864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 8);
56964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
57064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
57164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
57264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(newMsg.optionalNestedMessage != null);
57364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.optionalNestedMessage.bb);
57464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
57564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
57664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalForeignMessage() throws Exception {
57764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
57864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    NanoOuterClass.ForeignMessageNano nestedMsg = new NanoOuterClass.ForeignMessageNano();
57964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    nestedMsg.c = 1;
58064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertFalse(msg.optionalForeignMessage != null);
58164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalForeignMessage = nestedMsg;
58264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.optionalForeignMessage != null);
58364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.optionalForeignMessage.c);
58464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
58564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertFalse(msg.optionalForeignMessage != null);
58664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
58764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalForeignMessage = new NanoOuterClass.ForeignMessageNano();
58864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalForeignMessage.c = 2;
58964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.optionalForeignMessage != null);
59064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
59164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertFalse(msg.optionalForeignMessage != null);
59264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
59364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalForeignMessage = nestedMsg;
59464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
59564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
59664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
59764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 8);
59864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
59964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
60064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
60164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(newMsg.optionalForeignMessage != null);
60264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.optionalForeignMessage.c);
60364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
60464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
60564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalImportMessage() throws Exception {
60664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
60764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    UnittestImportNano.ImportMessageNano nestedMsg = new UnittestImportNano.ImportMessageNano();
60864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    nestedMsg.d = 1;
60964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertFalse(msg.optionalImportMessage != null);
61064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalImportMessage = nestedMsg;
61164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.optionalImportMessage != null);
61264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.optionalImportMessage.d);
61364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
61464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertFalse(msg.optionalImportMessage != null);
61564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
61664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalImportMessage = new UnittestImportNano.ImportMessageNano();
61764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalImportMessage.d = 2;
61864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.optionalImportMessage != null);
61964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
62064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertFalse(msg.optionalImportMessage != null);
62164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
62264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalImportMessage = nestedMsg;
62364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
62464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
62564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
62664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 8);
62764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
62864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
62964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
63064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(newMsg.optionalImportMessage != null);
63164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.optionalImportMessage.d);
63264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
63364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
63464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalNestedEnum() throws Exception {
63564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
63664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalNestedEnum = TestAllTypesNano.BAR;
63764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.BAR, msg.optionalNestedEnum);
63864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
63964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalNestedEnum = TestAllTypesNano.BAZ;
64064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.BAZ, msg.optionalNestedEnum);
64164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
64264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.FOO, msg.optionalNestedEnum);
64364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
64464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalNestedEnum = TestAllTypesNano.BAR;
64564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
64664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
64764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
64864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
64964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
65064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
65164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
65264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.BAR, newMsg.optionalNestedEnum);
65364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
65464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
65564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalForeignEnum() throws Exception {
65664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
65764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalForeignEnum = NanoOuterClass.FOREIGN_NANO_BAR;
65864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(NanoOuterClass.FOREIGN_NANO_BAR, msg.optionalForeignEnum);
65964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
66064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalForeignEnum = NanoOuterClass.FOREIGN_NANO_BAZ;
66164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(NanoOuterClass.FOREIGN_NANO_BAZ, msg.optionalForeignEnum);
66264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
66364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(NanoOuterClass.FOREIGN_NANO_FOO, msg.optionalForeignEnum);
66464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
66564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalForeignEnum = NanoOuterClass.FOREIGN_NANO_BAR;
66664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
66764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
66864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
66964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
67064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
67164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
67264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
67364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(NanoOuterClass.FOREIGN_NANO_BAR, newMsg.optionalForeignEnum);
67464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
67564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
67664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalImportEnum() throws Exception {
67764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
67864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalImportEnum = UnittestImportNano.IMPORT_NANO_BAR;
67964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(UnittestImportNano.IMPORT_NANO_BAR, msg.optionalImportEnum);
68064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
68164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalImportEnum = UnittestImportNano.IMPORT_NANO_BAZ;
68264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(UnittestImportNano.IMPORT_NANO_BAZ, msg.optionalImportEnum);
68364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
68464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(UnittestImportNano.IMPORT_NANO_FOO, msg.optionalImportEnum);
68564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
68664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalImportEnum = UnittestImportNano.IMPORT_NANO_BAR;
68764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
68864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
68964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
69064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
69164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
69264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
69364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
69464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(UnittestImportNano.IMPORT_NANO_BAR, newMsg.optionalImportEnum);
69564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
69664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
69764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalStringPiece() throws Exception {
69864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
69964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalStringPiece = "hello";
70064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("hello", msg.optionalStringPiece);
70164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
70264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.optionalStringPiece.isEmpty());
70364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
70464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalStringPiece = "hello2";
70564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("hello2", msg.optionalStringPiece);
70664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
70764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.optionalStringPiece.isEmpty());
70864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
70964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalStringPiece = "bye";
71064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
71164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
71264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
71364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 9);
71464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
71564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
71664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
71764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(newMsg.optionalStringPiece != null);
71864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("bye", newMsg.optionalStringPiece);
71964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
72064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
72164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoOptionalCord() throws Exception {
72264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
72364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalCord = "hello";
72464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("hello", msg.optionalCord);
72564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
72664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.optionalCord.isEmpty());
72764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
72864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .optionalCord = "hello2";
72964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("hello2", msg.optionalCord);
73064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
73164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.optionalCord.isEmpty());
73264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
73364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.optionalCord = "bye";
73464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
73564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
73664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
73764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 9);
73864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
73964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
74064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
74164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(newMsg.optionalCord != null);
74264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("bye", newMsg.optionalCord);
74364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
74464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
74564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedInt32() throws Exception {
74664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
74764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedInt32.length);
74864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedInt32 = new int[] { 123, 789, 456 };
74964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(789, msg.repeatedInt32[1]);
75064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedInt32[2]);
75164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
75264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedInt32.length);
75364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
75464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedInt32 = new int[] { 456 };
75564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedInt32.length);
75664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedInt32[0]);
75764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
75864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedInt32.length);
75964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
76064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
76164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
76264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedInt32 = new int[] { 123 };
76364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedInt32.length);
76464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
76564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
76664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
76764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
76864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
76964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
77064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedInt32.length);
77164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedInt32[0]);
77264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
77364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
77464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
77564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedInt32 = new int[] { 123, 456 };
77664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedInt32.length);
77764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
77864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
77964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
78064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 10);
78164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
78264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
78364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
78464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedInt32.length);
78564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedInt32[0]);
78664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, newMsg.repeatedInt32[1]);
78764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
78864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
78964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedInt64() throws Exception {
79064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
79164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedInt64.length);
79264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedInt64 = new long[] { 123, 789, 456 };
79364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(789, msg.repeatedInt64[1]);
79464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedInt64[2]);
79564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
79664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedInt64.length);
79764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
79864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedInt64 = new long[] { 456 };
79964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedInt64.length);
80064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedInt64[0]);
80164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
80264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedInt64.length);
80364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
80464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
80564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
80664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedInt64 = new long[] { 123 };
80764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedInt64.length);
80864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
80964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
81064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
81164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
81264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
81364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
81464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedInt64.length);
81564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedInt64[0]);
81664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
81764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
81864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
81964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedInt64 = new long[] { 123, 456 };
82064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedInt64.length);
82164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
82264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
82364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
82464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 10);
82564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
82664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
82764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
82864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedInt64.length);
82964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedInt64[0]);
83064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, newMsg.repeatedInt64[1]);
83164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
83264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
83364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedUint32() throws Exception {
83464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
83564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedUint32.length);
83664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedUint32 = new int[] { 123, 789, 456 };
83764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(789, msg.repeatedUint32[1]);
83864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedUint32[2]);
83964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
84064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedUint32.length);
84164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
84264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedUint32 = new int[] { 456 };
84364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedUint32.length);
84464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedUint32[0]);
84564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
84664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedUint32.length);
84764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
84864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
84964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
85064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedUint32 = new int[] { 123 };
85164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedUint32.length);
85264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
85364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
85464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
85564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
85664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
85764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
85864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedUint32.length);
85964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedUint32[0]);
86064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
86164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
86264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
86364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedUint32 = new int[] { 123, 456 };
86464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedUint32.length);
86564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
86664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
86764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
86864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 10);
86964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
87064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
87164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
87264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedUint32.length);
87364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedUint32[0]);
87464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, newMsg.repeatedUint32[1]);
87564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
87664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
87764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedUint64() throws Exception {
87864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
87964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedUint64.length);
88064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedUint64 = new long[] { 123, 789, 456 };
88164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(789, msg.repeatedUint64[1]);
88264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedUint64[2]);
88364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
88464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedUint64.length);
88564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
88664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedUint64 = new long[] { 456 };
88764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedUint64.length);
88864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedUint64[0]);
88964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
89064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedUint64.length);
89164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
89264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
89364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
89464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedUint64 = new long[] { 123 };
89564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedUint64.length);
89664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
89764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
89864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
89964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
90064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
90164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
90264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedUint64.length);
90364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedUint64[0]);
90464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
90564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
90664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
90764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedUint64 = new long[] { 123, 456 };
90864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedUint64.length);
90964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
91064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
91164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
91264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 10);
91364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
91464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
91564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
91664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedUint64.length);
91764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedUint64[0]);
91864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, newMsg.repeatedUint64[1]);
91964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
92064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
92164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedSint32() throws Exception {
92264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
92364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedSint32.length);
92464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedSint32 = new int[] { 123, 789, 456 };
92564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(789, msg.repeatedSint32[1]);
92664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedSint32[2]);
92764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
92864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedSint32.length);
92964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
93064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedSint32 = new int[] { 456 };
93164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedSint32.length);
93264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedSint32[0]);
93364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
93464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedSint32.length);
93564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
93664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
93764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
93864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedSint32 = new int[] { 123 };
93964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedSint32.length);
94064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
94164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
94264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
94364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 7);
94464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
94564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
94664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedSint32.length);
94764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedSint32[0]);
94864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
94964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
95064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
95164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedSint32 = new int[] { 123, 456 };
95264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedSint32.length);
95364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
95464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
95564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
95664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 11);
95764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
95864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
95964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
96064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedSint32.length);
96164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedSint32[0]);
96264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, newMsg.repeatedSint32[1]);
96364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
96464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
96564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedSint64() throws Exception {
96664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
96764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedSint64.length);
96864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedSint64 = new long[] { 123, 789, 456 };
96964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(789, msg.repeatedSint64[1]);
97064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedSint64[2]);
97164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
97264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedSint64.length);
97364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
97464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedSint64 = new long[] { 456 };
97564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedSint64.length);
97664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedSint64[0]);
97764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
97864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedSint64.length);
97964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
98064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
98164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
98264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedSint64 = new long[] { 123 };
98364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedSint64.length);
98464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
98564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
98664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
98764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 7);
98864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
98964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
99064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedSint64.length);
99164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedSint64[0]);
99264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
99364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
99464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
99564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedSint64 = new long[] { 123, 456 };
99664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedSint64.length);
99764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
99864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
99964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
100064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 11);
100164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
100264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
100364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
100464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedSint64.length);
100564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedSint64[0]);
100664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, newMsg.repeatedSint64[1]);
100764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
100864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
100964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedFixed32() throws Exception {
101064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
101164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedFixed32.length);
101264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedFixed32 = new int[] { 123, 789, 456 };
101364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(789, msg.repeatedFixed32[1]);
101464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedFixed32[2]);
101564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
101664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedFixed32.length);
101764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
101864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedFixed32 = new int[] { 456 };
101964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedFixed32.length);
102064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedFixed32[0]);
102164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
102264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedFixed32.length);
102364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
102464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
102564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
102664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedFixed32 = new int[] { 123 };
102764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedFixed32.length);
102864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
102964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
103064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
103164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 9);
103264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
103364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
103464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedFixed32.length);
103564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedFixed32[0]);
103664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
103764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
103864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
103964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedFixed32 = new int[] { 123, 456 };
104064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedFixed32.length);
104164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
104264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
104364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
104464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 15);
104564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
104664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
104764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
104864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedFixed32.length);
104964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedFixed32[0]);
105064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, newMsg.repeatedFixed32[1]);
105164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
105264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
105364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedFixed64() throws Exception {
105464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
105564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedFixed64.length);
105664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedFixed64 = new long[] { 123, 789, 456 };
105764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(789, msg.repeatedFixed64[1]);
105864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedFixed64[2]);
105964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
106064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedFixed64.length);
106164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
106264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedFixed64 = new long[] { 456 };
106364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedFixed64.length);
106464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedFixed64[0]);
106564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
106664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedFixed64.length);
106764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
106864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
106964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
107064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedFixed64 = new long[] { 123 };
107164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedFixed64.length);
107264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
107364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
107464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
107564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 13);
107664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
107764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
107864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedFixed64.length);
107964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedFixed64[0]);
108064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
108164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
108264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
108364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedFixed64 = new long[] { 123, 456 };
108464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedFixed64.length);
108564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
108664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
108764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
108864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 23);
108964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
109064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
109164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
109264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedFixed64.length);
109364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedFixed64[0]);
109464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, newMsg.repeatedFixed64[1]);
109564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
109664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
109764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedSfixed32() throws Exception {
109864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
109964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedSfixed32.length);
110064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedSfixed32 = new int[] { 123, 789, 456 };
110164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(789, msg.repeatedSfixed32[1]);
110264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedSfixed32[2]);
110364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
110464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedSfixed32.length);
110564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
110664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedSfixed32 = new int[] { 456 };
110764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedSfixed32.length);
110864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedSfixed32[0]);
110964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
111064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedSfixed32.length);
111164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
111264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
111364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
111464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedSfixed32 = new int[] { 123 };
111564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedSfixed32.length);
111664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
111764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
111864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
111964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 9);
112064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
112164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
112264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedSfixed32.length);
112364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedSfixed32[0]);
112464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
112564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
112664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
112764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedSfixed32 = new int[] { 123, 456 };
112864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedSfixed32.length);
112964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
113064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
113164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
113264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 15);
113364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
113464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
113564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
113664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedSfixed32.length);
113764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedSfixed32[0]);
113864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, newMsg.repeatedSfixed32[1]);
113964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
114064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
114164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedSfixed64() throws Exception {
114264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
114364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedSfixed64.length);
114464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedSfixed64 = new long[] { 123, 789, 456 };
114564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(789, msg.repeatedSfixed64[1]);
114664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedSfixed64[2]);
114764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
114864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedSfixed64.length);
114964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
115064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedSfixed64 = new long[] { 456 };
115164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedSfixed64.length);
115264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedSfixed64[0]);
115364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
115464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedSfixed64.length);
115564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
115664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
115764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
115864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedSfixed64 = new long[] { 123 };
115964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedSfixed64.length);
116064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
116164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
116264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
116364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 13);
116464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
116564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
116664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedSfixed64.length);
116764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedSfixed64[0]);
116864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
116964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
117064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
117164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedSfixed64 = new long[] { 123, 456 };
117264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedSfixed64.length);
117364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
117464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
117564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
117664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 23);
117764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
117864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
117964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
118064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedSfixed64.length);
118164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedSfixed64[0]);
118264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, newMsg.repeatedSfixed64[1]);
118364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
118464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
118564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedFloat() throws Exception {
118664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
118764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedFloat.length);
118864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedFloat = new float[] { 123f, 789f, 456f };
118964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(789f, msg.repeatedFloat[1]);
119064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456f, msg.repeatedFloat[2]);
119164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
119264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedFloat.length);
119364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
119464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedFloat = new float[] { 456f };
119564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedFloat.length);
119664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456f, msg.repeatedFloat[0]);
119764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
119864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedFloat.length);
119964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
120064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
120164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
120264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedFloat = new float[] { 123f };
120364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedFloat.length);
120464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
120564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
120664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
120764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 9);
120864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
120964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
121064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedFloat.length);
121164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123f, newMsg.repeatedFloat[0]);
121264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
121364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
121464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
121564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedFloat = new float[] { 123f, 456f };
121664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedFloat.length);
121764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
121864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
121964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
122064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 15);
122164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
122264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
122364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
122464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedFloat.length);
122564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123f, newMsg.repeatedFloat[0]);
122664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456f, newMsg.repeatedFloat[1]);
122764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
122864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
122964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedDouble() throws Exception {
123064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
123164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedDouble.length);
123264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedDouble = new double[] { 123.0, 789.0, 456.0 };
123364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(789.0, msg.repeatedDouble[1]);
123464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456.0, msg.repeatedDouble[2]);
123564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
123664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedDouble.length);
123764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
123864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedDouble = new double[] { 456.0 };
123964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedDouble.length);
124064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456.0, msg.repeatedDouble[0]);
124164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
124264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedDouble.length);
124364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
124464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
124564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
124664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedDouble = new double[] { 123.0 };
124764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedDouble.length);
124864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
124964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
125064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
125164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 13);
125264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
125364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
125464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedDouble.length);
125564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123.0, newMsg.repeatedDouble[0]);
125664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
125764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
125864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
125964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedDouble = new double[] { 123.0, 456.0 };
126064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedDouble.length);
126164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
126264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
126364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
126464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 23);
126564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
126664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
126764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
126864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedDouble.length);
126964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123.0, newMsg.repeatedDouble[0]);
127064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456.0, newMsg.repeatedDouble[1]);
127164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
127264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
127364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedBool() throws Exception {
127464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
127564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedBool.length);
127664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedBool = new boolean[] { false, true, false };
127764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.repeatedBool[1]);
127864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertFalse(msg.repeatedBool[2]);
127964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
128064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedBool.length);
128164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
128264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedBool = new boolean[] { true };
128364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedBool.length);
128464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msg.repeatedBool[0]);
128564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
128664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedBool.length);
128764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
128864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
128964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
129064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedBool = new boolean[] { false };
129164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedBool.length);
129264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
129364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
129464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
129564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
129664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
129764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
129864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedBool.length);
129964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertFalse(newMsg.repeatedBool[0]);
130064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
130164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
130264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
130364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedBool = new boolean[] { true, false };
130464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedBool.length);
130564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
130664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
130764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
130864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 9);
130964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
131064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
131164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
131264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedBool.length);
131364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(newMsg.repeatedBool[0]);
131464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertFalse(newMsg.repeatedBool[1]);
131564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
131664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
131764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedString() throws Exception {
131864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
131964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedString.length);
132064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedString = new String[] { "hello", "bye", "boo" };
132164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("bye", msg.repeatedString[1]);
132264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("boo", msg.repeatedString[2]);
132364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
132464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedString.length);
132564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
132664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedString = new String[] { "boo" };
132764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedString.length);
132864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("boo", msg.repeatedString[0]);
132964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
133064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedString.length);
133164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
133264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
133364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
133464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedString = new String[] { "" };
133564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedString.length);
133664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
133764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
133864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
133964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
134064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
134164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
134264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedString.length);
134364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(newMsg.repeatedString[0].isEmpty());
134464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
134564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
134664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
134764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedString = new String[] { "hello", "world" };
134864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedString.length);
134964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
135064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
135164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
135264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 19);
135364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
135464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
135564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
135664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedString.length);
135764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("hello", newMsg.repeatedString[0]);
135864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("world", newMsg.repeatedString[1]);
135964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
136064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
136164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedBytes() throws Exception {
136264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
136364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedBytes.length);
136464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedBytes = new byte[][] {
136564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        InternalNano.copyFromUtf8("hello"),
136664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        InternalNano.copyFromUtf8("bye"),
136764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        InternalNano.copyFromUtf8("boo")
136864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    };
136964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("bye", new String(msg.repeatedBytes[1], "UTF-8"));
137064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("boo", new String(msg.repeatedBytes[2], "UTF-8"));
137164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
137264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedBytes.length);
137364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
137464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedBytes = new byte[][] { InternalNano.copyFromUtf8("boo") };
137564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedBytes.length);
137664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("boo", new String(msg.repeatedBytes[0], "UTF-8"));
137764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
137864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedBytes.length);
137964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
138064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
138164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
138264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedBytes = new byte[][] { InternalNano.copyFromUtf8("") };
138364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedBytes.length);
138464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
138564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
138664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
138764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
138864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
138964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
139064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedBytes.length);
139164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(newMsg.repeatedBytes[0].length == 0);
139264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
139364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
139464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
139564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedBytes = new byte[][] {
139664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      InternalNano.copyFromUtf8("hello"),
139764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      InternalNano.copyFromUtf8("world")
139864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    };
139964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedBytes.length);
140064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
140164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
140264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
140364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 19);
140464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
140564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
140664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
140764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedBytes.length);
140864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("hello", new String(newMsg.repeatedBytes[0], "UTF-8"));
140964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("world", new String(newMsg.repeatedBytes[1], "UTF-8"));
141064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
141164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
141264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedGroup() throws Exception {
141364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
141464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano.RepeatedGroup group0 =
141564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      new TestAllTypesNano.RepeatedGroup();
141664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    group0.a = 0;
141764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano.RepeatedGroup group1 =
141864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      new TestAllTypesNano.RepeatedGroup();
141964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    group1.a = 1;
142064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano.RepeatedGroup group2 =
142164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      new TestAllTypesNano.RepeatedGroup();
142264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    group2.a = 2;
142364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
142464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedGroup = new TestAllTypesNano.RepeatedGroup[] { group0, group1, group2 };
142564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(3, msg.repeatedGroup.length);
142664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedGroup[0].a);
142764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedGroup[1].a);
142864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedGroup[2].a);
142964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
143064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedGroup.length);
143164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
143264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedGroup = new TestAllTypesNano.RepeatedGroup[] { group1 };
143364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedGroup.length);
143464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedGroup[0].a);
143564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
143664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedGroup.length);
143764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
143864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
143964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
144064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedGroup = new TestAllTypesNano.RepeatedGroup[] { group0 };
144164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedGroup.length);
144264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
144364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
144464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
144564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 7);
144664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
144764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
144864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedGroup.length);
144964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, newMsg.repeatedGroup[0].a);
145064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
145164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
145264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
145364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedGroup = new TestAllTypesNano.RepeatedGroup[] { group0, group1 };
145464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedGroup.length);
145564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
145664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
145764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
145864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 14);
145964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
146064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
146164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
146264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedGroup.length);
146364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, newMsg.repeatedGroup[0].a);
146464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedGroup[1].a);
146564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
146664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
146764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedNestedMessage() throws Exception {
146864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
146964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano.NestedMessage nestedMsg0 =
147064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      new TestAllTypesNano.NestedMessage();
147164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    nestedMsg0.bb = 0;
147264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano.NestedMessage nestedMsg1 =
147364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      new TestAllTypesNano.NestedMessage();
147464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    nestedMsg1.bb = 1;
147564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano.NestedMessage nestedMsg2 =
147664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      new TestAllTypesNano.NestedMessage();
147764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    nestedMsg2.bb = 2;
147864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
147964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedNestedMessage =
148064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        new TestAllTypesNano.NestedMessage[] { nestedMsg0, nestedMsg1, nestedMsg2 };
148164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(3, msg.repeatedNestedMessage.length);
148264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedNestedMessage[0].bb);
148364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedNestedMessage[1].bb);
148464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedNestedMessage[2].bb);
148564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
148664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedNestedMessage.length);
148764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
148864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedNestedMessage = new TestAllTypesNano.NestedMessage[] { nestedMsg1 };
148964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedNestedMessage.length);
149064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedNestedMessage[0].bb);
149164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
149264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedNestedMessage.length);
149364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
149464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
149564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
149664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedNestedMessage = new TestAllTypesNano.NestedMessage[] { nestedMsg0 };
149764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedNestedMessage.length);
149864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
149964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
150064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
150164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
150264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
150364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
150464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedNestedMessage.length);
150564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, newMsg.repeatedNestedMessage[0].bb);
150664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
150764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
150864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
150964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedNestedMessage = new TestAllTypesNano.NestedMessage[] { nestedMsg0, nestedMsg1 };
151064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedNestedMessage.length);
151164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
151264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
151364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
151464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 11);
151564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
151664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
151764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
151864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedNestedMessage.length);
151964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, newMsg.repeatedNestedMessage[0].bb);
152064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedNestedMessage[1].bb);
152164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
152264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
152364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedForeignMessage() throws Exception {
152464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
152564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    NanoOuterClass.ForeignMessageNano foreignMsg0 =
152664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      new NanoOuterClass.ForeignMessageNano();
152764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    foreignMsg0.c = 0;
152864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    NanoOuterClass.ForeignMessageNano foreignMsg1 =
152964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      new NanoOuterClass.ForeignMessageNano();
153064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    foreignMsg1.c = 1;
153164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    NanoOuterClass.ForeignMessageNano foreignMsg2 =
153264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      new NanoOuterClass.ForeignMessageNano();
153364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    foreignMsg2.c = 2;
153464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
153564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedForeignMessage =
153664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        new NanoOuterClass.ForeignMessageNano[] { foreignMsg0, foreignMsg1, foreignMsg2 };
153764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(3, msg.repeatedForeignMessage.length);
153864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedForeignMessage[0].c);
153964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedForeignMessage[1].c);
154064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedForeignMessage[2].c);
154164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
154264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedForeignMessage.length);
154364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
154464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedForeignMessage = new NanoOuterClass.ForeignMessageNano[] { foreignMsg1 };
154564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedForeignMessage.length);
154664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedForeignMessage[0].c);
154764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
154864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedForeignMessage.length);
154964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
155064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
155164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
155264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedForeignMessage = new NanoOuterClass.ForeignMessageNano[] { foreignMsg0 };
155364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedForeignMessage.length);
155464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
155564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
155664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
155764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
155864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
155964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
156064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedForeignMessage.length);
156164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, newMsg.repeatedForeignMessage[0].c);
156264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
156364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
156464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
156564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedForeignMessage = new NanoOuterClass.ForeignMessageNano[] { foreignMsg0, foreignMsg1 };
156664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedForeignMessage.length);
156764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
156864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
156964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
157064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 11);
157164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
157264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
157364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
157464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedForeignMessage.length);
157564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, newMsg.repeatedForeignMessage[0].c);
157664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedForeignMessage[1].c);
157764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
157864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
157964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedImportMessage() throws Exception {
158064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
158164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    UnittestImportNano.ImportMessageNano foreignMsg0 =
158264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      new UnittestImportNano.ImportMessageNano();
158364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    foreignMsg0.d = 0;
158464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    UnittestImportNano.ImportMessageNano foreignMsg1 =
158564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      new UnittestImportNano.ImportMessageNano();
158664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    foreignMsg1.d = 1;
158764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    UnittestImportNano.ImportMessageNano foreignMsg2 =
158864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      new UnittestImportNano.ImportMessageNano();
158964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    foreignMsg2.d = 2;
159064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
159164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedImportMessage =
159264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        new UnittestImportNano.ImportMessageNano[] { foreignMsg0, foreignMsg1, foreignMsg2 };
159364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(3, msg.repeatedImportMessage.length);
159464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedImportMessage[0].d);
159564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedImportMessage[1].d);
159664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedImportMessage[2].d);
159764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
159864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedImportMessage.length);
159964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
160064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedImportMessage = new UnittestImportNano.ImportMessageNano[] { foreignMsg1 };
160164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedImportMessage.length);
160264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedImportMessage[0].d);
160364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
160464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedImportMessage.length);
160564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
160664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
160764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
160864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedImportMessage = new UnittestImportNano.ImportMessageNano[] { foreignMsg0 };
160964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedImportMessage.length);
161064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
161164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
161264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
161364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
161464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
161564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
161664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedImportMessage.length);
161764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, newMsg.repeatedImportMessage[0].d);
161864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
161964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
162064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
162164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedImportMessage = new UnittestImportNano.ImportMessageNano[] { foreignMsg0, foreignMsg1 };
162264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedImportMessage.length);
162364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
162464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
162564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
162664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 11);
162764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
162864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
162964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
163064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedImportMessage.length);
163164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, newMsg.repeatedImportMessage[0].d);
163264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedImportMessage[1].d);
163364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
163464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
163564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedNestedEnum() throws Exception {
163664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
163764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedNestedEnum = new int[] {
163864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        TestAllTypesNano.FOO,
163964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        TestAllTypesNano.BAR,
164064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        TestAllTypesNano.BAZ
164164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    };
164264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(3, msg.repeatedNestedEnum.length);
164364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.FOO, msg.repeatedNestedEnum[0]);
164464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.BAR, msg.repeatedNestedEnum[1]);
164564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.BAZ, msg.repeatedNestedEnum[2]);
164664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
164764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedNestedEnum.length);
164864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
164964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedNestedEnum = new int[] { TestAllTypesNano.BAR };
165064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedNestedEnum.length);
165164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.BAR, msg.repeatedNestedEnum[0]);
165264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
165364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedNestedEnum.length);
165464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
165564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
165664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
165764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedNestedEnum = new int[] { TestAllTypesNano.FOO };
165864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
165964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
166064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
166164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
166264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
166364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
166464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedNestedEnum.length);
166564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.FOO, msg.repeatedNestedEnum[0]);
166664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
166764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
166864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
166964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedNestedEnum = new int[] { TestAllTypesNano.FOO, TestAllTypesNano.BAR };
167064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedNestedEnum.length);
167164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
167264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
167364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
167464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 9);
167564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
167664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
167764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
167864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedNestedEnum.length);
167964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.FOO, msg.repeatedNestedEnum[0]);
168064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.BAR, msg.repeatedNestedEnum[1]);
168164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
168264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
168364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedForeignEnum() throws Exception {
168464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
168564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedForeignEnum = new int[] {
168664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        NanoOuterClass.FOREIGN_NANO_FOO,
168764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        NanoOuterClass.FOREIGN_NANO_BAR,
168864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        NanoOuterClass.FOREIGN_NANO_BAZ
168964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    };
169064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(3, msg.repeatedForeignEnum.length);
169164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(NanoOuterClass.FOREIGN_NANO_FOO, msg.repeatedForeignEnum[0]);
169264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(NanoOuterClass.FOREIGN_NANO_BAR, msg.repeatedForeignEnum[1]);
169364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(NanoOuterClass.FOREIGN_NANO_BAZ, msg.repeatedForeignEnum[2]);
169464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
169564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedForeignEnum.length);
169664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
169764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedForeignEnum = new int[] { NanoOuterClass.FOREIGN_NANO_BAR };
169864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedForeignEnum.length);
169964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(NanoOuterClass.FOREIGN_NANO_BAR, msg.repeatedForeignEnum[0]);
170064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
170164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedForeignEnum.length);
170264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
170364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
170464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
170564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedForeignEnum = new int[] { NanoOuterClass.FOREIGN_NANO_FOO };
170664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
170764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
170864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
170964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
171064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
171164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
171264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedForeignEnum.length);
171364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(NanoOuterClass.FOREIGN_NANO_FOO, msg.repeatedForeignEnum[0]);
171464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
171564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
171664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
171764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedForeignEnum = new int[] {
171864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      NanoOuterClass.FOREIGN_NANO_FOO,
171964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      NanoOuterClass.FOREIGN_NANO_BAR
172064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    };
172164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedForeignEnum.length);
172264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
172364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
172464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
172564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 9);
172664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
172764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
172864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
172964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedForeignEnum.length);
173064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(NanoOuterClass.FOREIGN_NANO_FOO, msg.repeatedForeignEnum[0]);
173164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(NanoOuterClass.FOREIGN_NANO_BAR, msg.repeatedForeignEnum[1]);
173264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
173364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
173464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedImportEnum() throws Exception {
173564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
173664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedImportEnum = new int[] {
173764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        UnittestImportNano.IMPORT_NANO_FOO,
173864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        UnittestImportNano.IMPORT_NANO_BAR,
173964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        UnittestImportNano.IMPORT_NANO_BAZ
174064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    };
174164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(3, msg.repeatedImportEnum.length);
174264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(UnittestImportNano.IMPORT_NANO_FOO, msg.repeatedImportEnum[0]);
174364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(UnittestImportNano.IMPORT_NANO_BAR, msg.repeatedImportEnum[1]);
174464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(UnittestImportNano.IMPORT_NANO_BAZ, msg.repeatedImportEnum[2]);
174564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
174664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedImportEnum.length);
174764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
174864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedImportEnum = new int[] { UnittestImportNano.IMPORT_NANO_BAR };
174964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedImportEnum.length);
175064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(UnittestImportNano.IMPORT_NANO_BAR, msg.repeatedImportEnum[0]);
175164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
175264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedImportEnum.length);
175364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
175464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
175564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
175664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedImportEnum = new int[] { UnittestImportNano.IMPORT_NANO_FOO };
175764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
175864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
175964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
176064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
176164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
176264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
176364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedImportEnum.length);
176464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(UnittestImportNano.IMPORT_NANO_FOO, msg.repeatedImportEnum[0]);
176564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
176664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
176764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
176864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedImportEnum = new int[] {
176964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      UnittestImportNano.IMPORT_NANO_FOO,
177064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      UnittestImportNano.IMPORT_NANO_BAR
177164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    };
177264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedImportEnum.length);
177364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
177464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
177564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
177664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 9);
177764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
177864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
177964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
178064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedImportEnum.length);
178164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(UnittestImportNano.IMPORT_NANO_FOO, msg.repeatedImportEnum[0]);
178264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(UnittestImportNano.IMPORT_NANO_BAR, msg.repeatedImportEnum[1]);
178364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
178464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
178564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedStringPiece() throws Exception {
178664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
178764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedStringPiece.length);
178864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedStringPiece = new String[] { "hello", "bye", "boo" };
178964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("bye", msg.repeatedStringPiece[1]);
179064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("boo", msg.repeatedStringPiece[2]);
179164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
179264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedStringPiece.length);
179364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
179464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedStringPiece = new String[] { "boo" };
179564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedStringPiece.length);
179664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("boo", msg.repeatedStringPiece[0]);
179764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
179864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedStringPiece.length);
179964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
180064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
180164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
180264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedStringPiece = new String[] { "" };
180364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedStringPiece.length);
180464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
180564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
180664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
180764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
180864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
180964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
181064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedStringPiece.length);
181164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(newMsg.repeatedStringPiece[0].isEmpty());
181264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
181364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
181464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
181564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedStringPiece = new String[] { "hello", "world" };
181664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedStringPiece.length);
181764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
181864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
181964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
182064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 19);
182164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
182264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
182364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
182464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedStringPiece.length);
182564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("hello", newMsg.repeatedStringPiece[0]);
182664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("world", newMsg.repeatedStringPiece[1]);
182764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
182864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
182964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedCord() throws Exception {
183064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
183164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedCord.length);
183264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedCord = new String[] { "hello", "bye", "boo" };
183364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("bye", msg.repeatedCord[1]);
183464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("boo", msg.repeatedCord[2]);
183564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
183664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedCord.length);
183764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
183864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedCord = new String[] { "boo" };
183964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedCord.length);
184064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("boo", msg.repeatedCord[0]);
184164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
184264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedCord.length);
184364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
184464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
184564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
184664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedCord = new String[] { "" };
184764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedCord.length);
184864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
184964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
185064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
185164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 6);
185264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
185364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
185464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedCord.length);
185564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(newMsg.repeatedCord[0].isEmpty());
185664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
185764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
185864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
185964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedCord = new String[] { "hello", "world" };
186064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedCord.length);
186164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
186264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
186364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
186464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 19);
186564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
186664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
186764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
186864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedCord.length);
186964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("hello", newMsg.repeatedCord[0]);
187064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals("world", newMsg.repeatedCord[1]);
187164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
187264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
187364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedPackedInt32() throws Exception {
187464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
187564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedPackedInt32.length);
187664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedPackedInt32 = new int[] { 123, 789, 456 };
187764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(789, msg.repeatedPackedInt32[1]);
187864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedPackedInt32[2]);
187964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
188064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedPackedInt32.length);
188164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
188264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedPackedInt32 = new int[] { 456 };
188364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedPackedInt32.length);
188464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedPackedInt32[0]);
188564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
188664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedPackedInt32.length);
188764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
188864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
188964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
189064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedPackedInt32 = new int[] { 123 };
189164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedPackedInt32.length);
189264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
189364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
189464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
189564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 7);
189664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
189764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
189864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedPackedInt32.length);
189964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedPackedInt32[0]);
190064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
190164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
190264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
190364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedPackedInt32 = new int[] { 123, 456 };
190464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedPackedInt32.length);
190564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
190664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
190764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
190864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 9);
190964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
191064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
191164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
191264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedPackedInt32.length);
191364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedPackedInt32[0]);
191464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, newMsg.repeatedPackedInt32[1]);
191564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
191664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
191764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedPackedSfixed64() throws Exception {
191864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
191964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedPackedSfixed64.length);
192064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedPackedSfixed64 = new long[] { 123, 789, 456 };
192164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(789, msg.repeatedPackedSfixed64[1]);
192264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedPackedSfixed64[2]);
192364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
192464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedPackedSfixed64.length);
192564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
192664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedPackedSfixed64 = new long[] { 456 };
192764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedPackedSfixed64.length);
192864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, msg.repeatedPackedSfixed64[0]);
192964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
193064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedPackedSfixed64.length);
193164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
193264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
193364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
193464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedPackedSfixed64 = new long[] { 123 };
193564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedPackedSfixed64.length);
193664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
193764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
193864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
193964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 14);
194064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
194164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
194264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedPackedSfixed64.length);
194364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedPackedSfixed64[0]);
194464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
194564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
194664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
194764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedPackedSfixed64 = new long[] { 123, 456 };
194864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedPackedSfixed64.length);
194964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
195064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
195164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
195264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 22);
195364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
195464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
195564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
195664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedPackedSfixed64.length);
195764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedPackedSfixed64[0]);
195864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, newMsg.repeatedPackedSfixed64[1]);
195964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
196064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
196164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedPackedNestedEnum() throws Exception {
196264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
196364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedPackedNestedEnum = new int[] {
196464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        TestAllTypesNano.FOO,
196564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        TestAllTypesNano.BAR,
196664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        TestAllTypesNano.BAZ
196764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    };
196864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(3, msg.repeatedPackedNestedEnum.length);
196964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.FOO, msg.repeatedPackedNestedEnum[0]);
197064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.BAR, msg.repeatedPackedNestedEnum[1]);
197164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.BAZ, msg.repeatedPackedNestedEnum[2]);
197264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
197364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedPackedNestedEnum.length);
197464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
197564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedPackedNestedEnum = new int[] { TestAllTypesNano.BAR };
197664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, msg.repeatedPackedNestedEnum.length);
197764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.BAR, msg.repeatedPackedNestedEnum[0]);
197864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear();
197964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(0, msg.repeatedPackedNestedEnum.length);
198064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
198164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 1 entry
198264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
198364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedPackedNestedEnum = new int[] { TestAllTypesNano.FOO };
198464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = MessageNano.toByteArray(msg);
198564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int msgSerializedSize = msg.getSerializedSize();
198664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
198764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 7);
198864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
198964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
199064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, newMsg.repeatedPackedNestedEnum.length);
199164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.FOO, msg.repeatedPackedNestedEnum[0]);
199264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
199364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Test 2 entries
199464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear()
199564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci       .repeatedPackedNestedEnum = new int[] { TestAllTypesNano.FOO, TestAllTypesNano.BAR };
199664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, msg.repeatedPackedNestedEnum.length);
199764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    result = MessageNano.toByteArray(msg);
199864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msgSerializedSize = msg.getSerializedSize();
199964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
200064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(msgSerializedSize == 8);
200164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(result.length, msgSerializedSize);
200264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
200364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    newMsg = TestAllTypesNano.parseFrom(result);
200464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, newMsg.repeatedPackedNestedEnum.length);
200564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.FOO, msg.repeatedPackedNestedEnum[0]);
200664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.BAR, msg.repeatedPackedNestedEnum[1]);
200764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
200864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
200914dd1f02ac95f61087e311bf61c85047fb218a29Ulas Kirazci  public void testNanoRepeatedPackedSerializedSize() throws Exception {
201014dd1f02ac95f61087e311bf61c85047fb218a29Ulas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
201114dd1f02ac95f61087e311bf61c85047fb218a29Ulas Kirazci    msg.repeatedPackedInt32 = new int[] { 123, 789, 456 };
201214dd1f02ac95f61087e311bf61c85047fb218a29Ulas Kirazci    int msgSerializedSize = msg.getSerializedSize();
201314dd1f02ac95f61087e311bf61c85047fb218a29Ulas Kirazci    byte [] result = MessageNano.toByteArray(msg);
201414dd1f02ac95f61087e311bf61c85047fb218a29Ulas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
201514dd1f02ac95f61087e311bf61c85047fb218a29Ulas Kirazci    assertTrue(msgSerializedSize == 11);
201614dd1f02ac95f61087e311bf61c85047fb218a29Ulas Kirazci    assertEquals(result.length, msgSerializedSize);
201714dd1f02ac95f61087e311bf61c85047fb218a29Ulas Kirazci    TestAllTypesNano msg2 = new TestAllTypesNano();
201814dd1f02ac95f61087e311bf61c85047fb218a29Ulas Kirazci    msg2.repeatedPackedInt32 = new int[] { 123, 789, 456 };
201914dd1f02ac95f61087e311bf61c85047fb218a29Ulas Kirazci    byte [] result2 = new byte[msgSerializedSize];
202014dd1f02ac95f61087e311bf61c85047fb218a29Ulas Kirazci    MessageNano.toByteArray(msg2, result2, 0, msgSerializedSize);
202114dd1f02ac95f61087e311bf61c85047fb218a29Ulas Kirazci
202214dd1f02ac95f61087e311bf61c85047fb218a29Ulas Kirazci    // Check equal size and content.
202314dd1f02ac95f61087e311bf61c85047fb218a29Ulas Kirazci    assertEquals(msgSerializedSize, msg2.getSerializedSize());
202414dd1f02ac95f61087e311bf61c85047fb218a29Ulas Kirazci    assertTrue(Arrays.equals(result, result2));
202514dd1f02ac95f61087e311bf61c85047fb218a29Ulas Kirazci  }
202614dd1f02ac95f61087e311bf61c85047fb218a29Ulas Kirazci
202764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedInt32ReMerge() throws Exception {
202864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
202964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedInt32 = new int[] { 234 };
203064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result1 = MessageNano.toByteArray(msg);
203164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
203264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear().optionalInt32 = 789;
203364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result2 = MessageNano.toByteArray(msg);
203464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
203564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear().repeatedInt32 = new int[] { 123, 456 };
203664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result3 = MessageNano.toByteArray(msg);
203764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
203864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Concatenate the three serializations and read as one message.
203964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = new byte[result1.length + result2.length + result3.length];
204064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    System.arraycopy(result1, 0, result, 0, result1.length);
204164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    System.arraycopy(result2, 0, result, result1.length, result2.length);
204264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    System.arraycopy(result3, 0, result, result1.length + result2.length, result3.length);
204364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
204464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
204564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(789, newMsg.optionalInt32);
204664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(3, newMsg.repeatedInt32.length);
204764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(234, newMsg.repeatedInt32[0]);
204864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(123, newMsg.repeatedInt32[1]);
204964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(456, newMsg.repeatedInt32[2]);
205064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
205164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
205264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedNestedEnumReMerge() throws Exception {
205364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
205464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedNestedEnum = new int[] { TestAllTypesNano.FOO };
205564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result1 = MessageNano.toByteArray(msg);
205664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
205764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear().optionalInt32 = 789;
205864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result2 = MessageNano.toByteArray(msg);
205964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
206064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear().repeatedNestedEnum = new int[] { TestAllTypesNano.BAR, TestAllTypesNano.FOO };
206164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result3 = MessageNano.toByteArray(msg);
206264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
206364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Concatenate the three serializations and read as one message.
206464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = new byte[result1.length + result2.length + result3.length];
206564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    System.arraycopy(result1, 0, result, 0, result1.length);
206664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    System.arraycopy(result2, 0, result, result1.length, result2.length);
206764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    System.arraycopy(result3, 0, result, result1.length + result2.length, result3.length);
206864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
206964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
207064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(789, newMsg.optionalInt32);
207164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(3, newMsg.repeatedNestedEnum.length);
207264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.FOO, newMsg.repeatedNestedEnum[0]);
207364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.BAR, newMsg.repeatedNestedEnum[1]);
207464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(TestAllTypesNano.FOO, newMsg.repeatedNestedEnum[2]);
207564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
207664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
207764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoRepeatedNestedMessageReMerge() throws Exception {
207864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
207964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano.NestedMessage nestedMsg0 =
208064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      new TestAllTypesNano.NestedMessage();
208164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    nestedMsg0.bb = 0;
208264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano.NestedMessage nestedMsg1 =
208364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      new TestAllTypesNano.NestedMessage();
208464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    nestedMsg1.bb = 1;
208564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano.NestedMessage nestedMsg2 =
208664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      new TestAllTypesNano.NestedMessage();
208764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    nestedMsg2.bb = 2;
208864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
208964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.repeatedNestedMessage = new TestAllTypesNano.NestedMessage[] { nestedMsg0 };
209064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result1 = MessageNano.toByteArray(msg);
209164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
209264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear().optionalInt32 = 789;
209364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result2 = MessageNano.toByteArray(msg);
209464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
209564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    msg.clear().repeatedNestedMessage =
209664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        new TestAllTypesNano.NestedMessage[] { nestedMsg1, nestedMsg2 };
209764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result3 = MessageNano.toByteArray(msg);
209864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
209964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Concatenate the three serializations and read as one message.
210064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte [] result = new byte[result1.length + result2.length + result3.length];
210164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    System.arraycopy(result1, 0, result, 0, result1.length);
210264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    System.arraycopy(result2, 0, result, result1.length, result2.length);
210364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    System.arraycopy(result3, 0, result, result1.length + result2.length, result3.length);
210464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
210564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano newMsg = TestAllTypesNano.parseFrom(result);
210664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(789, newMsg.optionalInt32);
210764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(3, newMsg.repeatedNestedMessage.length);
210864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(nestedMsg0.bb, newMsg.repeatedNestedMessage[0].bb);
210964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(nestedMsg1.bb, newMsg.repeatedNestedMessage[1].bb);
211064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(nestedMsg2.bb, newMsg.repeatedNestedMessage[2].bb);
211164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
211264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
21138170787391efcb6cc6a8babc1cce35d5b1aff420Max Cai  /**
2114d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai   * Tests that invalid enum values from the wire are not accepted.
2115d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai   */
2116d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai  public void testNanoEnumValidity() throws Exception {
2117d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    final int invalid = 120;
2118d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    final int alsoInvalid = 121;
2119d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai
2120d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    EnumValidity.M m = new EnumValidity.M();
2121d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    // Sanity check & baseline of the assertions for the first case below.
2122d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(EnumValidity.E.default_, m.optionalE);
2123d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(EnumValidity.E.BAZ, m.defaultE);
2124d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai
2125d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    m.optionalE = invalid;
2126d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    m.defaultE = invalid;
2127d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    // E contains all valid values
2128d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    m.repeatedE = new int[] {EnumValidity.E.FOO, EnumValidity.E.BAR};
2129d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    m.packedE = new int[] {EnumValidity.E.FOO, EnumValidity.E.BAZ};
2130d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    // E2 contains some invalid values
2131d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    m.repeatedE2 = new int[] {invalid, EnumValidity.E.BAR, alsoInvalid};
2132d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    m.packedE2 = new int[] {EnumValidity.E.FOO, invalid, alsoInvalid};
2133d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    // E3 contains all invalid values
2134d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    m.repeatedE3 = new int[] {invalid, invalid};
2135d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    m.packedE3 = new int[] {alsoInvalid, alsoInvalid};
2136d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    byte[] serialized = MessageNano.toByteArray(m);
2137d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    // Sanity check that we do have all data in the byte array.
2138d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(31, serialized.length);
2139d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai
2140d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    // Test 1: tests that invalid values aren't included in the deserialized message.
2141d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    EnumValidity.M deserialized = MessageNano.mergeFrom(new EnumValidity.M(), serialized);
2142d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(EnumValidity.E.default_, deserialized.optionalE);
2143d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(EnumValidity.E.BAZ, deserialized.defaultE);
2144d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertTrue(Arrays.equals(
2145d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai        new int[] {EnumValidity.E.FOO, EnumValidity.E.BAR}, deserialized.repeatedE));
2146d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertTrue(Arrays.equals(
2147d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai        new int[] {EnumValidity.E.FOO, EnumValidity.E.BAZ}, deserialized.packedE));
2148d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertTrue(Arrays.equals(
2149d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai        new int[] {EnumValidity.E.BAR}, deserialized.repeatedE2));
2150d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertTrue(Arrays.equals(
2151d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai        new int[] {EnumValidity.E.FOO}, deserialized.packedE2));
2152d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(0, deserialized.repeatedE3.length);
2153d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(0, deserialized.packedE3.length);
2154d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai
2155d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    // Test 2: tests that invalid values do not override previous values in the field, including
2156d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    // arrays, including pre-existing invalid values.
2157d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    deserialized.optionalE = EnumValidity.E.BAR;
2158d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    deserialized.defaultE = alsoInvalid;
2159d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    deserialized.repeatedE = new int[] {EnumValidity.E.BAZ};
2160d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    deserialized.packedE = new int[] {EnumValidity.E.BAZ, alsoInvalid};
2161d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    deserialized.repeatedE2 = new int[] {invalid, alsoInvalid};
2162d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    deserialized.packedE2 = null;
2163d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    deserialized.repeatedE3 = null;
2164d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    deserialized.packedE3 = new int[0];
2165d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    MessageNano.mergeFrom(deserialized, serialized);
2166d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(EnumValidity.E.BAR, deserialized.optionalE);
2167d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(alsoInvalid, deserialized.defaultE);
2168d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertTrue(Arrays.equals(
2169d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai        new int[] {EnumValidity.E.BAZ, /* + */ EnumValidity.E.FOO, EnumValidity.E.BAR},
2170d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai        deserialized.repeatedE));
2171d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertTrue(Arrays.equals(
2172d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai        new int[] {EnumValidity.E.BAZ, alsoInvalid, /* + */ EnumValidity.E.FOO, EnumValidity.E.BAZ},
2173d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai        deserialized.packedE));
2174d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertTrue(Arrays.equals(
2175d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai        new int[] {invalid, alsoInvalid, /* + */ EnumValidity.E.BAR},
2176d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai        deserialized.repeatedE2));
2177d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertTrue(Arrays.equals(
2178d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai        new int[] {/* <null> + */ EnumValidity.E.FOO},
2179d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai        deserialized.packedE2));
2180d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertNull(deserialized.repeatedE3); // null + all invalid == null
2181d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(0, deserialized.packedE3.length); // empty + all invalid == empty
2182d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai
2183d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    // Test 3: reading by alternative forms
2184d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    EnumValidity.Alt alt = MessageNano.mergeFrom(new EnumValidity.Alt(), serialized);
2185d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(EnumValidity.E.BAR, // last valid value in m.repeatedE2
2186d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai        alt.repeatedE2AsOptional);
2187d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertTrue(Arrays.equals(new int[] {EnumValidity.E.FOO}, alt.packedE2AsNonPacked));
2188d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(0, alt.nonPackedE3AsPacked.length);
2189d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai  }
2190d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai
2191d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai  /**
2192d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai   * Tests the same as {@link #testNanoEnumValidity()} with accessor style. Repeated fields are
2193d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai   * not re-tested here because they are not affected by the accessor style.
2194d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai   */
2195d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai  public void testNanoEnumValidityAccessors() throws Exception {
2196d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    final int invalid = 120;
2197d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    final int alsoInvalid = 121;
2198d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai
2199d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    EnumValidityAccessors.M m = new EnumValidityAccessors.M();
2200d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    // Sanity check & baseline of the assertions for the first case below.
2201d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(EnumValidityAccessors.default_, m.getOptionalE());
2202d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(EnumValidityAccessors.BAZ, m.getDefaultE());
2203d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai
2204d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    m.setOptionalE(invalid);
2205d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    m.setDefaultE(invalid);
2206d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    // Set repeatedE2 for Alt.repeatedE2AsOptional
2207d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    m.repeatedE2 = new int[] {invalid, EnumValidityAccessors.BAR, alsoInvalid};
2208d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    byte[] serialized = MessageNano.toByteArray(m);
2209d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    // Sanity check that we do have all data in the byte array.
2210d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(10, serialized.length);
2211d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai
2212d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    // Test 1: tests that invalid values aren't included in the deserialized message.
2213d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    EnumValidityAccessors.M deserialized =
2214d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai        MessageNano.mergeFrom(new EnumValidityAccessors.M(), serialized);
2215d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(EnumValidityAccessors.default_, deserialized.getOptionalE());
2216d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(EnumValidityAccessors.BAZ, deserialized.getDefaultE());
2217d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai
2218d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    // Test 2: tests that invalid values do not override previous values in the field, including
2219d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    // pre-existing invalid values.
2220d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    deserialized.setOptionalE(EnumValidityAccessors.BAR);
2221d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    deserialized.setDefaultE(alsoInvalid);
2222d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    MessageNano.mergeFrom(deserialized, serialized);
2223d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(EnumValidityAccessors.BAR, deserialized.getOptionalE());
2224d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(alsoInvalid, deserialized.getDefaultE());
2225d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai
2226d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    // Test 3: reading by alternative forms
2227d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    EnumValidityAccessors.Alt alt =
2228d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai        MessageNano.mergeFrom(new EnumValidityAccessors.Alt(), serialized);
2229d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai    assertEquals(EnumValidityAccessors.BAR, // last valid value in m.repeatedE2
2230d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai        alt.getRepeatedE2AsOptional());
2231d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai  }
2232d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai
2233d888895a3b5cf764856d3a94ed526bf9994c1800Max Cai  /**
2234624c448fbef20a1a2fad2289f622b468c25763d1Max Cai   * Tests that code generation correctly wraps a single message into its outer
2235624c448fbef20a1a2fad2289f622b468c25763d1Max Cai   * class. The class {@code SingleMessageNano} is imported from the outer
2236624c448fbef20a1a2fad2289f622b468c25763d1Max Cai   * class {@code UnittestSingleNano}, whose name is implicit. Any error would
2237624c448fbef20a1a2fad2289f622b468c25763d1Max Cai   * cause this method to fail compilation.
2238624c448fbef20a1a2fad2289f622b468c25763d1Max Cai   */
2239624c448fbef20a1a2fad2289f622b468c25763d1Max Cai  public void testNanoSingle() throws Exception {
2240624c448fbef20a1a2fad2289f622b468c25763d1Max Cai    SingleMessageNano msg = new SingleMessageNano();
2241382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertNotNull(msg);
2242624c448fbef20a1a2fad2289f622b468c25763d1Max Cai  }
2243624c448fbef20a1a2fad2289f622b468c25763d1Max Cai
2244624c448fbef20a1a2fad2289f622b468c25763d1Max Cai  /**
2245624c448fbef20a1a2fad2289f622b468c25763d1Max Cai   * Tests that code generation correctly skips generating the outer class if
2246624c448fbef20a1a2fad2289f622b468c25763d1Max Cai   * unnecessary, letting a file-scope entity have the same name. The class
2247624c448fbef20a1a2fad2289f622b468c25763d1Max Cai   * {@code MultipleNameClashNano} shares the same name with the file's outer
2248624c448fbef20a1a2fad2289f622b468c25763d1Max Cai   * class defined explicitly, but the file contains no other entities and has
2249624c448fbef20a1a2fad2289f622b468c25763d1Max Cai   * java_multiple_files set. Any error would cause this method to fail
2250624c448fbef20a1a2fad2289f622b468c25763d1Max Cai   * compilation.
2251624c448fbef20a1a2fad2289f622b468c25763d1Max Cai   */
2252624c448fbef20a1a2fad2289f622b468c25763d1Max Cai  public void testNanoMultipleNameClash() throws Exception {
2253624c448fbef20a1a2fad2289f622b468c25763d1Max Cai    MultipleNameClashNano msg = new MultipleNameClashNano();
2254624c448fbef20a1a2fad2289f622b468c25763d1Max Cai    msg.field = 0;
2255624c448fbef20a1a2fad2289f622b468c25763d1Max Cai  }
2256624c448fbef20a1a2fad2289f622b468c25763d1Max Cai
2257624c448fbef20a1a2fad2289f622b468c25763d1Max Cai  /**
2258624c448fbef20a1a2fad2289f622b468c25763d1Max Cai   * Tests that code generation correctly handles enums in different scopes in
2259624c448fbef20a1a2fad2289f622b468c25763d1Max Cai   * a source file with the option java_multiple_files set to true. Any error
2260624c448fbef20a1a2fad2289f622b468c25763d1Max Cai   * would cause this method to fail compilation.
2261624c448fbef20a1a2fad2289f622b468c25763d1Max Cai   */
2262624c448fbef20a1a2fad2289f622b468c25763d1Max Cai  public void testNanoMultipleEnumScoping() throws Exception {
2263624c448fbef20a1a2fad2289f622b468c25763d1Max Cai    FileScopeEnumRefNano msg1 = new FileScopeEnumRefNano();
2264624c448fbef20a1a2fad2289f622b468c25763d1Max Cai    msg1.enumField = UnittestMultipleNano.ONE;
2265624c448fbef20a1a2fad2289f622b468c25763d1Max Cai    MessageScopeEnumRefNano msg2 = new MessageScopeEnumRefNano();
2266624c448fbef20a1a2fad2289f622b468c25763d1Max Cai    msg2.enumField = MessageScopeEnumRefNano.TWO;
2267624c448fbef20a1a2fad2289f622b468c25763d1Max Cai  }
2268624c448fbef20a1a2fad2289f622b468c25763d1Max Cai
2269624c448fbef20a1a2fad2289f622b468c25763d1Max Cai  /**
22708170787391efcb6cc6a8babc1cce35d5b1aff420Max Cai   * Tests that code generation with mixed values of the java_multiple_files
22718170787391efcb6cc6a8babc1cce35d5b1aff420Max Cai   * options between the main source file and the imported source files would
22728170787391efcb6cc6a8babc1cce35d5b1aff420Max Cai   * generate correct references. Any error would cause this method to fail
22738170787391efcb6cc6a8babc1cce35d5b1aff420Max Cai   * compilation.
22748170787391efcb6cc6a8babc1cce35d5b1aff420Max Cai   */
22758170787391efcb6cc6a8babc1cce35d5b1aff420Max Cai  public void testNanoMultipleImportingNonMultiple() throws Exception {
22768170787391efcb6cc6a8babc1cce35d5b1aff420Max Cai    UnittestImportNano.ImportMessageNano importMsg = new UnittestImportNano.ImportMessageNano();
22778170787391efcb6cc6a8babc1cce35d5b1aff420Max Cai    MultipleImportingNonMultipleNano1 nano1 = new MultipleImportingNonMultipleNano1();
22788170787391efcb6cc6a8babc1cce35d5b1aff420Max Cai    nano1.field = importMsg;
22798170787391efcb6cc6a8babc1cce35d5b1aff420Max Cai    MultipleImportingNonMultipleNano2 nano2 = new MultipleImportingNonMultipleNano2();
22808170787391efcb6cc6a8babc1cce35d5b1aff420Max Cai    nano2.nano1 = nano1;
22818170787391efcb6cc6a8babc1cce35d5b1aff420Max Cai  }
22828170787391efcb6cc6a8babc1cce35d5b1aff420Max Cai
228364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testNanoDefaults() throws Exception {
228464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    TestAllTypesNano msg = new TestAllTypesNano();
228564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    for (int i = 0; i < 2; i++) {
228664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertEquals(41, msg.defaultInt32);
228764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertEquals(42, msg.defaultInt64);
228864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertEquals(43, msg.defaultUint32);
228964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertEquals(44, msg.defaultUint64);
229064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertEquals(-45, msg.defaultSint32);
229164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertEquals(46, msg.defaultSint64);
229264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertEquals(47, msg.defaultFixed32);
229364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertEquals(48, msg.defaultFixed64);
229464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertEquals(49, msg.defaultSfixed32);
229564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertEquals(-50, msg.defaultSfixed64);
229664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertTrue(51.5f == msg.defaultFloat);
229764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertTrue(52.0e3 == msg.defaultDouble);
229864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertEquals(true, msg.defaultBool);
229964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertEquals("hello", msg.defaultString);
230064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertEquals("world", new String(msg.defaultBytes, "UTF-8"));
230164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertEquals("dünya", msg.defaultStringNonascii);
230264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertEquals("dünyab", new String(msg.defaultBytesNonascii, "UTF-8"));
230364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertEquals(TestAllTypesNano.BAR, msg.defaultNestedEnum);
230464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertEquals(NanoOuterClass.FOREIGN_NANO_BAR, msg.defaultForeignEnum);
230564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertEquals(UnittestImportNano.IMPORT_NANO_BAR, msg.defaultImportEnum);
23060f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith      assertEquals(Float.POSITIVE_INFINITY, msg.defaultFloatInf);
23070f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith      assertEquals(Float.NEGATIVE_INFINITY, msg.defaultFloatNegInf);
23080f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith      assertEquals(Float.NaN, msg.defaultFloatNan);
23090f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith      assertEquals(Double.POSITIVE_INFINITY, msg.defaultDoubleInf);
23100f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith      assertEquals(Double.NEGATIVE_INFINITY, msg.defaultDoubleNegInf);
23110f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith      assertEquals(Double.NaN, msg.defaultDoubleNan);
231264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
231364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      // Default values are not output, except for required fields.
231464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      byte [] result = MessageNano.toByteArray(msg);
231564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      int msgSerializedSize = msg.getSerializedSize();
231664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
231764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertTrue(msgSerializedSize == 3);
231864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      assertEquals(result.length, msgSerializedSize);
231964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      msg.clear();
232064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    }
232164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
232264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
2323bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger  public void testDifferentStringLengthsNano() throws Exception {
2324bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger    // Test string serialization roundtrip using strings of the following lengths,
2325bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger    // with ASCII and Unicode characters requiring different UTF-8 byte counts per
2326bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger    // char, hence causing the length delimiter varint to sometimes require more
2327bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger    // bytes for the Unicode strings than the ASCII string of the same length.
2328bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger    int[] lengths = new int[] {
2329bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger            0,
2330bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger            1,
2331bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger            (1 << 4) - 1,  // 1 byte for ASCII and Unicode
2332bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger            (1 << 7) - 1,  // 1 byte for ASCII, 2 bytes for Unicode
2333bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger            (1 << 11) - 1, // 2 bytes for ASCII and Unicode
2334bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger            (1 << 14) - 1, // 2 bytes for ASCII, 3 bytes for Unicode
2335bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger            (1 << 17) - 1, // 3 bytes for ASCII and Unicode
2336bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger    };
2337bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger    for (int i : lengths) {
2338bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger      testEncodingOfString('q', i);      // 1 byte per char
2339bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger      testEncodingOfString('\u07FF', i); // 2 bytes per char
2340bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger      testEncodingOfString('\u0981', i); // 3 bytes per char
2341bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger    }
2342bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger  }
2343bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger
2344ebfc42610b47af51de7ce9eacc65960a80c6d490Charles Munger  /** Regression test for https://github.com/google/protobuf/issues/292 */
2345ebfc42610b47af51de7ce9eacc65960a80c6d490Charles Munger  public void testCorrectExceptionThrowWhenEncodingStringsWithoutEnoughSpace() throws Exception {
2346ebfc42610b47af51de7ce9eacc65960a80c6d490Charles Munger    String testCase = "Foooooooo";
2347ebfc42610b47af51de7ce9eacc65960a80c6d490Charles Munger    assertEquals(CodedOutputByteBufferNano.computeRawVarint32Size(testCase.length()),
2348ebfc42610b47af51de7ce9eacc65960a80c6d490Charles Munger            CodedOutputByteBufferNano.computeRawVarint32Size(testCase.length() * 3));
2349ebfc42610b47af51de7ce9eacc65960a80c6d490Charles Munger    assertEquals(11, CodedOutputByteBufferNano.computeStringSize(1, testCase));
2350ebfc42610b47af51de7ce9eacc65960a80c6d490Charles Munger    // Tag is one byte, varint describing string length is 1 byte, string length is 9 bytes.
2351ebfc42610b47af51de7ce9eacc65960a80c6d490Charles Munger    // An array of size 1 will cause a failure when trying to write the varint.
2352ebfc42610b47af51de7ce9eacc65960a80c6d490Charles Munger    for (int i = 0; i < 11; i++) {
2353ebfc42610b47af51de7ce9eacc65960a80c6d490Charles Munger      CodedOutputByteBufferNano bufferNano = CodedOutputByteBufferNano.newInstance(new byte[i]);
2354ebfc42610b47af51de7ce9eacc65960a80c6d490Charles Munger      try {
2355ebfc42610b47af51de7ce9eacc65960a80c6d490Charles Munger        bufferNano.writeString(1, testCase);
2356ebfc42610b47af51de7ce9eacc65960a80c6d490Charles Munger        fail("Should have thrown an out of space exception");
2357ebfc42610b47af51de7ce9eacc65960a80c6d490Charles Munger      } catch (CodedOutputByteBufferNano.OutOfSpaceException expected) {}
2358ebfc42610b47af51de7ce9eacc65960a80c6d490Charles Munger    }
2359ebfc42610b47af51de7ce9eacc65960a80c6d490Charles Munger  }
2360ebfc42610b47af51de7ce9eacc65960a80c6d490Charles Munger
2361bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger  private void testEncodingOfString(char c, int length) throws InvalidProtocolBufferNanoException {
2362bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger    TestAllTypesNano testAllTypesNano = new TestAllTypesNano();
2363bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger    final String fullString = fullString(c, length);
2364bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger    testAllTypesNano.optionalString = fullString;
2365bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger    final TestAllTypesNano resultNano = new TestAllTypesNano();
2366bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger    MessageNano.mergeFrom(resultNano, MessageNano.toByteArray(testAllTypesNano));
2367bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger    assertEquals(fullString, resultNano.optionalString);
2368bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger  }
2369bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger
2370bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger  private String fullString(char c, int length) {
2371bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger    char[] result = new char[length];
2372bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger    Arrays.fill(result, c);
2373bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger    return new String(result);
2374bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger  }
2375bcf7a816ad9d435cd4562bdc722fd01100a918d7Charles Munger
237635d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci  public void testNanoWithHasParseFrom() throws Exception {
237735d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    TestAllTypesNanoHas msg = null;
237835d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    // Test false on creation, after clear and upon empty parse.
237935d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    for (int i = 0; i < 3; i++) {
238035d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci      if (i == 0) {
238135d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci        msg = new TestAllTypesNanoHas();
238235d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci      } else if (i == 1) {
238335d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci        msg.clear();
238435d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci      } else if (i == 2) {
238535d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci        msg = TestAllTypesNanoHas.parseFrom(new byte[0]);
238635d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci      }
238735d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci      assertFalse(msg.hasOptionalInt32);
238835d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci      assertFalse(msg.hasOptionalString);
238935d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci      assertFalse(msg.hasOptionalBytes);
239035d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci      assertFalse(msg.hasOptionalNestedEnum);
239135d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci      assertFalse(msg.hasDefaultInt32);
239235d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci      assertFalse(msg.hasDefaultString);
239335d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci      assertFalse(msg.hasDefaultBytes);
239435d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci      assertFalse(msg.hasDefaultFloatNan);
239535d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci      assertFalse(msg.hasDefaultNestedEnum);
239635d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci      assertFalse(msg.hasId);
2397f84177299a76759be1eb925093b059aef246fc0eMax Cai      assertFalse(msg.hasRequiredEnum);
239835d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci      msg.optionalInt32 = 123;
239935d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci      msg.optionalNestedMessage = new TestAllTypesNanoHas.NestedMessage();
240035d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci      msg.optionalNestedMessage.bb = 2;
240135d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci      msg.optionalNestedEnum = TestAllTypesNano.BAZ;
240235d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    }
240335d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci
240435d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    byte [] result = MessageNano.toByteArray(msg);
240535d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    int msgSerializedSize = msg.getSerializedSize();
240635d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
2407f84177299a76759be1eb925093b059aef246fc0eMax Cai    assertTrue(msgSerializedSize == 10);
240835d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertEquals(result.length, msgSerializedSize);
240935d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci
241035d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    // Has fields true upon parse.
241135d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    TestAllTypesNanoHas newMsg = TestAllTypesNanoHas.parseFrom(result);
241235d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertEquals(123, newMsg.optionalInt32);
241335d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertTrue(newMsg.hasOptionalInt32);
241435d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertEquals(2, newMsg.optionalNestedMessage.bb);
241535d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertTrue(newMsg.optionalNestedMessage.hasBb);
241635d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertEquals(TestAllTypesNanoHas.BAZ, newMsg.optionalNestedEnum);
241735d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertTrue(newMsg.hasOptionalNestedEnum);
241835d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci  }
241935d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci
242035d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci  public void testNanoWithHasSerialize() throws Exception {
242135d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    TestAllTypesNanoHas msg = new TestAllTypesNanoHas();
242235d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    msg.hasOptionalInt32 = true;
242335d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    msg.hasOptionalString = true;
242435d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    msg.hasOptionalBytes = true;
242535d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    msg.optionalNestedMessage = new TestAllTypesNanoHas.NestedMessage();
242635d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    msg.optionalNestedMessage.hasBb = true;
242735d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    msg.hasOptionalNestedEnum = true;
242835d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    msg.hasDefaultInt32 = true;
242935d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    msg.hasDefaultString = true;
243035d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    msg.hasDefaultBytes = true;
243135d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    msg.hasDefaultFloatNan = true;
243235d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    msg.hasDefaultNestedEnum = true;
2433f84177299a76759be1eb925093b059aef246fc0eMax Cai    msg.hasId = true;
2434f84177299a76759be1eb925093b059aef246fc0eMax Cai    msg.hasRequiredEnum = true;
243535d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci
243635d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    byte [] result = MessageNano.toByteArray(msg);
243735d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    int msgSerializedSize = msg.getSerializedSize();
243835d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertEquals(result.length, msgSerializedSize);
243935d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci
244035d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    // Now deserialize and find that all fields are set and equal to their defaults.
244135d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    TestAllTypesNanoHas newMsg = TestAllTypesNanoHas.parseFrom(result);
244235d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertTrue(newMsg.hasOptionalInt32);
244335d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertTrue(newMsg.hasOptionalString);
244435d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertTrue(newMsg.hasOptionalBytes);
244535d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertTrue(newMsg.optionalNestedMessage.hasBb);
244635d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertTrue(newMsg.hasOptionalNestedEnum);
244735d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertTrue(newMsg.hasDefaultInt32);
244835d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertTrue(newMsg.hasDefaultString);
244935d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertTrue(newMsg.hasDefaultBytes);
245035d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertTrue(newMsg.hasDefaultFloatNan);
245135d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertTrue(newMsg.hasDefaultNestedEnum);
245235d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertTrue(newMsg.hasId);
2453f84177299a76759be1eb925093b059aef246fc0eMax Cai    assertTrue(newMsg.hasRequiredEnum);
245435d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertEquals(0, newMsg.optionalInt32);
245535d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertEquals(0, newMsg.optionalString.length());
245635d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertEquals(0, newMsg.optionalBytes.length);
245735d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertEquals(0, newMsg.optionalNestedMessage.bb);
245835d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertEquals(TestAllTypesNanoHas.FOO, newMsg.optionalNestedEnum);
245935d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertEquals(41, newMsg.defaultInt32);
246035d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertEquals("hello", newMsg.defaultString);
246135d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertEquals("world", new String(newMsg.defaultBytes, "UTF-8"));
246235d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertEquals(TestAllTypesNanoHas.BAR, newMsg.defaultNestedEnum);
246335d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertEquals(Float.NaN, newMsg.defaultFloatNan);
246435d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci    assertEquals(0, newMsg.id);
2465f84177299a76759be1eb925093b059aef246fc0eMax Cai    assertEquals(TestAllTypesNanoHas.FOO, newMsg.requiredEnum);
246635d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci  }
246735d9fd84ff1d9ecdb91156b757cc9fdcc3f25249Ulas Kirazci
2468e74fe623e115237968a3de1143d7cdb4df710858Max Cai  public void testNanoWithAccessorsBasic() throws Exception {
2469e74fe623e115237968a3de1143d7cdb4df710858Max Cai    TestNanoAccessors msg = new TestNanoAccessors();
2470e74fe623e115237968a3de1143d7cdb4df710858Max Cai
2471102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    // Makes sure required, repeated, and message fields are still public
2472e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.id = 3;
2473e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.repeatedBytes = new byte[2][3];
2474102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    msg.optionalNestedMessage = null;
2475e74fe623e115237968a3de1143d7cdb4df710858Max Cai
2476e74fe623e115237968a3de1143d7cdb4df710858Max Cai    // Test accessors
2477e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertEquals(0, msg.getOptionalInt32());
2478e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertFalse(msg.hasOptionalInt32());
2479e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.setOptionalInt32(135);
2480e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertEquals(135, msg.getOptionalInt32());
2481e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertTrue(msg.hasOptionalInt32());
2482e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.clearOptionalInt32();
2483e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertFalse(msg.hasOptionalInt32());
2484e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.setOptionalInt32(0); // default value
2485e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertTrue(msg.hasOptionalInt32());
2486e74fe623e115237968a3de1143d7cdb4df710858Max Cai
2487e74fe623e115237968a3de1143d7cdb4df710858Max Cai    // Test NPE
2488e74fe623e115237968a3de1143d7cdb4df710858Max Cai    try {
2489e74fe623e115237968a3de1143d7cdb4df710858Max Cai      msg.setOptionalBytes(null);
2490e74fe623e115237968a3de1143d7cdb4df710858Max Cai      fail();
2491e74fe623e115237968a3de1143d7cdb4df710858Max Cai    } catch (NullPointerException expected) {}
2492e74fe623e115237968a3de1143d7cdb4df710858Max Cai    try {
2493e74fe623e115237968a3de1143d7cdb4df710858Max Cai      msg.setOptionalString(null);
2494e74fe623e115237968a3de1143d7cdb4df710858Max Cai      fail();
2495e74fe623e115237968a3de1143d7cdb4df710858Max Cai    } catch (NullPointerException expected) {}
2496e74fe623e115237968a3de1143d7cdb4df710858Max Cai
2497e74fe623e115237968a3de1143d7cdb4df710858Max Cai    // Test has bit on bytes field with defaults and clear() re-clones the default array
2498e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertFalse(msg.hasDefaultBytes());
2499e74fe623e115237968a3de1143d7cdb4df710858Max Cai    byte[] defaultBytes = msg.getDefaultBytes();
2500e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.setDefaultBytes(defaultBytes);
2501e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertTrue(msg.hasDefaultBytes());
2502e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.clearDefaultBytes();
2503e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertFalse(msg.hasDefaultBytes());
2504e74fe623e115237968a3de1143d7cdb4df710858Max Cai    defaultBytes[0]++; // modify original array
2505e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertFalse(Arrays.equals(defaultBytes, msg.getDefaultBytes()));
2506e74fe623e115237968a3de1143d7cdb4df710858Max Cai
2507e74fe623e115237968a3de1143d7cdb4df710858Max Cai    // Test has bits that require additional bit fields
2508e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertFalse(msg.hasBitFieldCheck());
2509e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.setBitFieldCheck(0);
2510e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertTrue(msg.hasBitFieldCheck());
2511e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertFalse(msg.hasBeforeBitFieldCheck()); // checks bit field does not leak
2512e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertFalse(msg.hasAfterBitFieldCheck());
2513e74fe623e115237968a3de1143d7cdb4df710858Max Cai
2514e74fe623e115237968a3de1143d7cdb4df710858Max Cai    // Test clear() clears has bits
2515e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.setOptionalString("hi");
2516e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.setDefaultString("there");
2517e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.clear();
2518e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertFalse(msg.hasOptionalString());
2519e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertFalse(msg.hasDefaultString());
2520e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertFalse(msg.hasBitFieldCheck());
2521b15a1b379f896e371ca3375bdf51dd4a9a0268afMax Cai
2522b15a1b379f896e371ca3375bdf51dd4a9a0268afMax Cai    // Test set() and clear() returns itself (compiles = success)
2523b15a1b379f896e371ca3375bdf51dd4a9a0268afMax Cai    msg.clear()
2524b15a1b379f896e371ca3375bdf51dd4a9a0268afMax Cai        .setOptionalInt32(3)
2525b15a1b379f896e371ca3375bdf51dd4a9a0268afMax Cai        .clearDefaultBytes()
2526b15a1b379f896e371ca3375bdf51dd4a9a0268afMax Cai        .setOptionalString("4");
2527e74fe623e115237968a3de1143d7cdb4df710858Max Cai  }
2528e74fe623e115237968a3de1143d7cdb4df710858Max Cai
2529e74fe623e115237968a3de1143d7cdb4df710858Max Cai  public void testNanoWithAccessorsParseFrom() throws Exception {
2530e74fe623e115237968a3de1143d7cdb4df710858Max Cai    TestNanoAccessors msg = null;
2531e74fe623e115237968a3de1143d7cdb4df710858Max Cai    // Test false on creation, after clear and upon empty parse.
2532e74fe623e115237968a3de1143d7cdb4df710858Max Cai    for (int i = 0; i < 3; i++) {
2533e74fe623e115237968a3de1143d7cdb4df710858Max Cai      if (i == 0) {
2534e74fe623e115237968a3de1143d7cdb4df710858Max Cai        msg = new TestNanoAccessors();
2535e74fe623e115237968a3de1143d7cdb4df710858Max Cai      } else if (i == 1) {
2536e74fe623e115237968a3de1143d7cdb4df710858Max Cai        msg.clear();
2537e74fe623e115237968a3de1143d7cdb4df710858Max Cai      } else if (i == 2) {
2538e74fe623e115237968a3de1143d7cdb4df710858Max Cai        msg = TestNanoAccessors.parseFrom(new byte[0]);
2539e74fe623e115237968a3de1143d7cdb4df710858Max Cai      }
2540e74fe623e115237968a3de1143d7cdb4df710858Max Cai      assertFalse(msg.hasOptionalInt32());
2541e74fe623e115237968a3de1143d7cdb4df710858Max Cai      assertFalse(msg.hasOptionalString());
2542e74fe623e115237968a3de1143d7cdb4df710858Max Cai      assertFalse(msg.hasOptionalBytes());
2543e74fe623e115237968a3de1143d7cdb4df710858Max Cai      assertFalse(msg.hasOptionalNestedEnum());
2544e74fe623e115237968a3de1143d7cdb4df710858Max Cai      assertFalse(msg.hasDefaultInt32());
2545e74fe623e115237968a3de1143d7cdb4df710858Max Cai      assertFalse(msg.hasDefaultString());
2546e74fe623e115237968a3de1143d7cdb4df710858Max Cai      assertFalse(msg.hasDefaultBytes());
2547e74fe623e115237968a3de1143d7cdb4df710858Max Cai      assertFalse(msg.hasDefaultFloatNan());
2548e74fe623e115237968a3de1143d7cdb4df710858Max Cai      assertFalse(msg.hasDefaultNestedEnum());
2549102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn      msg.optionalNestedMessage = new TestNanoAccessors.NestedMessage();
2550102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn      msg.optionalNestedMessage.setBb(2);
2551e74fe623e115237968a3de1143d7cdb4df710858Max Cai      msg.setOptionalNestedEnum(TestNanoAccessors.BAZ);
2552e74fe623e115237968a3de1143d7cdb4df710858Max Cai      msg.setDefaultInt32(msg.getDefaultInt32());
2553e74fe623e115237968a3de1143d7cdb4df710858Max Cai    }
2554e74fe623e115237968a3de1143d7cdb4df710858Max Cai
2555e74fe623e115237968a3de1143d7cdb4df710858Max Cai    byte [] result = MessageNano.toByteArray(msg);
2556e74fe623e115237968a3de1143d7cdb4df710858Max Cai    int msgSerializedSize = msg.getSerializedSize();
2557e74fe623e115237968a3de1143d7cdb4df710858Max Cai    //System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
2558e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertTrue(msgSerializedSize == 14);
2559e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertEquals(result.length, msgSerializedSize);
2560e74fe623e115237968a3de1143d7cdb4df710858Max Cai
2561e74fe623e115237968a3de1143d7cdb4df710858Max Cai    // Has fields true upon parse.
2562e74fe623e115237968a3de1143d7cdb4df710858Max Cai    TestNanoAccessors newMsg = TestNanoAccessors.parseFrom(result);
2563102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    assertEquals(2, newMsg.optionalNestedMessage.getBb());
2564102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    assertTrue(newMsg.optionalNestedMessage.hasBb());
2565e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertEquals(TestNanoAccessors.BAZ, newMsg.getOptionalNestedEnum());
2566e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertTrue(newMsg.hasOptionalNestedEnum());
2567e74fe623e115237968a3de1143d7cdb4df710858Max Cai
2568e74fe623e115237968a3de1143d7cdb4df710858Max Cai    // Has field true on fields with explicit default values from wire.
2569e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertTrue(newMsg.hasDefaultInt32());
2570e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertEquals(41, newMsg.getDefaultInt32());
2571e74fe623e115237968a3de1143d7cdb4df710858Max Cai  }
2572e74fe623e115237968a3de1143d7cdb4df710858Max Cai
2573102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn  public void testNanoWithAccessorsPublicFieldTypes() throws Exception {
2574102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    TestNanoAccessors msg = new TestNanoAccessors();
2575102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    assertNull(msg.optionalNestedMessage);
2576102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    assertEquals(0, msg.id);
2577102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    assertEquals(0, msg.repeatedNestedEnum.length);
2578102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn
2579102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    TestNanoAccessors newMsg = TestNanoAccessors.parseFrom(MessageNano.toByteArray(msg));
2580102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    assertNull(newMsg.optionalNestedMessage);
2581102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    assertEquals(0, newMsg.id);
2582102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    assertEquals(0, newMsg.repeatedNestedEnum.length);
2583102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn
2584102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    TestNanoAccessors.NestedMessage nestedMessage = new TestNanoAccessors.NestedMessage();
2585102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    nestedMessage.setBb(5);
2586102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    newMsg.optionalNestedMessage = nestedMessage;
2587102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    newMsg.id = -1;
2588102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    newMsg.repeatedNestedEnum = new int[] { TestAllTypesNano.FOO };
2589102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn
2590102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    TestNanoAccessors newMsg2 = TestNanoAccessors.parseFrom(MessageNano.toByteArray(newMsg));
2591102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    assertEquals(nestedMessage.getBb(), newMsg2.optionalNestedMessage.getBb());
2592102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    assertEquals(-1, newMsg2.id);
2593102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    assertEquals(TestAllTypesNano.FOO, newMsg2.repeatedNestedEnum[0]);
2594102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn
2595102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    newMsg2.optionalNestedMessage = null;
2596102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    newMsg2.id = 0;
2597102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    newMsg2.repeatedNestedEnum = null;
2598102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn
2599102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    TestNanoAccessors newMsg3 = TestNanoAccessors.parseFrom(MessageNano.toByteArray(newMsg2));
2600102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    assertNull(newMsg3.optionalNestedMessage);
2601102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    assertEquals(0, newMsg3.id);
2602102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    assertEquals(0, newMsg3.repeatedNestedEnum.length);
2603102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn  }
2604102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn
2605e74fe623e115237968a3de1143d7cdb4df710858Max Cai  public void testNanoWithAccessorsSerialize() throws Exception {
2606e74fe623e115237968a3de1143d7cdb4df710858Max Cai    TestNanoAccessors msg = new TestNanoAccessors();
2607e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.setOptionalInt32(msg.getOptionalInt32());
2608e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.setOptionalString(msg.getOptionalString());
2609e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.setOptionalBytes(msg.getOptionalBytes());
2610e74fe623e115237968a3de1143d7cdb4df710858Max Cai    TestNanoAccessors.NestedMessage nestedMessage = new TestNanoAccessors.NestedMessage();
2611e74fe623e115237968a3de1143d7cdb4df710858Max Cai    nestedMessage.setBb(nestedMessage.getBb());
2612102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    msg.optionalNestedMessage = nestedMessage;
2613e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.setOptionalNestedEnum(msg.getOptionalNestedEnum());
2614e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.setDefaultInt32(msg.getDefaultInt32());
2615e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.setDefaultString(msg.getDefaultString());
2616e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.setDefaultBytes(msg.getDefaultBytes());
2617e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.setDefaultFloatNan(msg.getDefaultFloatNan());
2618e74fe623e115237968a3de1143d7cdb4df710858Max Cai    msg.setDefaultNestedEnum(msg.getDefaultNestedEnum());
2619e74fe623e115237968a3de1143d7cdb4df710858Max Cai
2620e74fe623e115237968a3de1143d7cdb4df710858Max Cai    byte [] result = MessageNano.toByteArray(msg);
2621e74fe623e115237968a3de1143d7cdb4df710858Max Cai    int msgSerializedSize = msg.getSerializedSize();
2622e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertEquals(result.length, msgSerializedSize);
2623e74fe623e115237968a3de1143d7cdb4df710858Max Cai
2624e74fe623e115237968a3de1143d7cdb4df710858Max Cai    // Now deserialize and find that all fields are set and equal to their defaults.
2625e74fe623e115237968a3de1143d7cdb4df710858Max Cai    TestNanoAccessors newMsg = TestNanoAccessors.parseFrom(result);
2626e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertTrue(newMsg.hasOptionalInt32());
2627e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertTrue(newMsg.hasOptionalString());
2628e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertTrue(newMsg.hasOptionalBytes());
2629102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    assertTrue(newMsg.optionalNestedMessage.hasBb());
2630e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertTrue(newMsg.hasOptionalNestedEnum());
2631e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertTrue(newMsg.hasDefaultInt32());
2632e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertTrue(newMsg.hasDefaultString());
2633e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertTrue(newMsg.hasDefaultBytes());
2634e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertTrue(newMsg.hasDefaultFloatNan());
2635e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertTrue(newMsg.hasDefaultNestedEnum());
2636e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertEquals(0, newMsg.getOptionalInt32());
2637e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertEquals(0, newMsg.getOptionalString().length());
2638e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertEquals(0, newMsg.getOptionalBytes().length);
2639102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    assertEquals(0, newMsg.optionalNestedMessage.getBb());
2640e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertEquals(TestNanoAccessors.FOO, newMsg.getOptionalNestedEnum());
2641e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertEquals(41, newMsg.getDefaultInt32());
2642e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertEquals("hello", newMsg.getDefaultString());
2643e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertEquals("world", new String(newMsg.getDefaultBytes(), "UTF-8"));
2644e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertEquals(TestNanoAccessors.BAR, newMsg.getDefaultNestedEnum());
2645e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertEquals(Float.NaN, newMsg.getDefaultFloatNan());
2646e74fe623e115237968a3de1143d7cdb4df710858Max Cai    assertEquals(0, newMsg.id);
2647e74fe623e115237968a3de1143d7cdb4df710858Max Cai  }
2648e74fe623e115237968a3de1143d7cdb4df710858Max Cai
264926266cd4660ffe1f3d6015b715713ee654c5b936Max Cai  public void testNanoJavaEnumStyle() throws Exception {
265026266cd4660ffe1f3d6015b715713ee654c5b936Max Cai    EnumClassNanos.EnumClassNano msg = new EnumClassNanos.EnumClassNano();
265126266cd4660ffe1f3d6015b715713ee654c5b936Max Cai    assertEquals(EnumClassNanos.FileScopeEnum.ONE, msg.one);
265226266cd4660ffe1f3d6015b715713ee654c5b936Max Cai    assertEquals(EnumClassNanos.EnumClassNano.MessageScopeEnum.TWO, msg.two);
265326266cd4660ffe1f3d6015b715713ee654c5b936Max Cai
265426266cd4660ffe1f3d6015b715713ee654c5b936Max Cai    EnumClassNanoMultiple msg2 = new EnumClassNanoMultiple();
265526266cd4660ffe1f3d6015b715713ee654c5b936Max Cai    assertEquals(FileScopeEnumMultiple.THREE, msg2.three);
265626266cd4660ffe1f3d6015b715713ee654c5b936Max Cai    assertEquals(EnumClassNanoMultiple.MessageScopeEnumMultiple.FOUR, msg2.four);
265726266cd4660ffe1f3d6015b715713ee654c5b936Max Cai  }
265826266cd4660ffe1f3d6015b715713ee654c5b936Max Cai
265964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  /**
26600f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith   * Tests that fields with a default value of NaN are not serialized when
26610f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith   * set to NaN. This is a special case as NaN != NaN, so normal equality
26620f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith   * checks don't work.
26630f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith   */
26640f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith  public void testNanoNotANumberDefaults() throws Exception {
26650f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith    TestAllTypesNano msg = new TestAllTypesNano();
26660f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith    msg.defaultDoubleNan = 0;
26670f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith    msg.defaultFloatNan = 0;
26680f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith    byte[] result = MessageNano.toByteArray(msg);
26690f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith    int msgSerializedSize = msg.getSerializedSize();
2670382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(result.length == msgSerializedSize);
26710f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith    assertTrue(msgSerializedSize > 3);
26720f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith
26730f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith    msg.defaultDoubleNan = Double.NaN;
26740f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith    msg.defaultFloatNan = Float.NaN;
26750f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith    result = MessageNano.toByteArray(msg);
26760f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith    msgSerializedSize = msg.getSerializedSize();
2677382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(3, result.length);
26780f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith    assertEquals(3, msgSerializedSize);
26790f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith  }
26800f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith
26810f2ca89132ab81441f7eb351c7a053a8c8d9d1c3Chris Smith  /**
268264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci   * Test that a bug in skipRawBytes() has been fixed:  if the skip skips
268364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci   * exactly up to a limit, this should not break things.
268464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci   */
268564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testSkipRawBytesBug() throws Exception {
268664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte[] rawBytes = new byte[] { 1, 2 };
268764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    CodedInputByteBufferNano input = CodedInputByteBufferNano.newInstance(rawBytes);
268864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
268964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int limit = input.pushLimit(1);
269064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    input.skipRawBytes(1);
269164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    input.popLimit(limit);
269264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(2, input.readRawByte());
269364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
269464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
269564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  /**
269664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci   * Test that a bug in skipRawBytes() has been fixed:  if the skip skips
269764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci   * past the end of a buffer with a limit that has been set past the end of
269864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci   * that buffer, this should not break things.
269964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci   */
270064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public void testSkipRawBytesPastEndOfBufferWithLimit() throws Exception {
270164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    byte[] rawBytes = new byte[] { 1, 2, 3, 4, 5 };
270264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    CodedInputByteBufferNano input = CodedInputByteBufferNano.newInstance(rawBytes);
270364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
270464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int limit = input.pushLimit(4);
270564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // In order to expose the bug we need to read at least one byte to prime the
270664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // buffer inside the CodedInputStream.
270764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(1, input.readRawByte());
270864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    // Skip to the end of the limit.
270964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    input.skipRawBytes(3);
271064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertTrue(input.isAtEnd());
271164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    input.popLimit(limit);
271264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    assertEquals(5, input.readRawByte());
271364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
271447107914acbad70ff4db1664d3664ccc994315afAndrew Flynn
271547107914acbad70ff4db1664d3664ccc994315afAndrew Flynn  // Test a smattering of various proto types for printing
271647107914acbad70ff4db1664d3664ccc994315afAndrew Flynn  public void testMessageNanoPrinter() {
271747107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    TestAllTypesNano msg = new TestAllTypesNano();
271847107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.optionalInt32 = 14;
271947107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.optionalFloat = 42.3f;
272047107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.optionalString = "String \"with' both quotes";
272162a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    msg.optionalBytes = new byte[] {'"', '\0', 1, 8};
272247107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.optionalGroup = new TestAllTypesNano.OptionalGroup();
272347107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.optionalGroup.a = 15;
272447107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.repeatedInt64 = new long[2];
272547107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.repeatedInt64[0] = 1L;
272647107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.repeatedInt64[1] = -1L;
272747107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.repeatedBytes = new byte[2][];
272862a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    msg.repeatedBytes[1] = new byte[] {'h', 'e', 'l', 'l', 'o'};
272947107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.repeatedGroup = new TestAllTypesNano.RepeatedGroup[2];
273047107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.repeatedGroup[0] = new TestAllTypesNano.RepeatedGroup();
273147107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.repeatedGroup[0].a = -27;
273247107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.repeatedGroup[1] = new TestAllTypesNano.RepeatedGroup();
273347107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.repeatedGroup[1].a = -72;
273447107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.optionalNestedMessage = new TestAllTypesNano.NestedMessage();
273547107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.optionalNestedMessage.bb = 7;
273647107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.repeatedNestedMessage = new TestAllTypesNano.NestedMessage[2];
273747107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.repeatedNestedMessage[0] = new TestAllTypesNano.NestedMessage();
273847107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.repeatedNestedMessage[0].bb = 77;
273947107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.repeatedNestedMessage[1] = new TestAllTypesNano.NestedMessage();
274047107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.repeatedNestedMessage[1].bb = 88;
274147107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.optionalNestedEnum = TestAllTypesNano.BAZ;
274247107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.repeatedNestedEnum = new int[2];
274347107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.repeatedNestedEnum[0] = TestAllTypesNano.BAR;
274447107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    msg.repeatedNestedEnum[1] = TestAllTypesNano.FOO;
274562a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    msg.repeatedStringPiece = new String[] {null, "world"};
274647107914acbad70ff4db1664d3664ccc994315afAndrew Flynn
274747107914acbad70ff4db1664d3664ccc994315afAndrew Flynn    String protoPrint = msg.toString();
274862a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    assertTrue(protoPrint.contains("optional_int32: 14"));
274962a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    assertTrue(protoPrint.contains("optional_float: 42.3"));
275062a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    assertTrue(protoPrint.contains("optional_double: 0.0"));
275162a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    assertTrue(protoPrint.contains("optional_string: \"String \\u0022with\\u0027 both quotes\""));
275262a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    assertTrue(protoPrint.contains("optional_bytes: \"\\\"\\000\\001\\010\""));
275362a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    assertTrue(protoPrint.contains("optional_group <\n  a: 15\n>"));
275462a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar
27556b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    assertTrue(protoPrint.contains("repeated_int64: 1\nrepeated_int64: -1"));
275662a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    assertFalse(protoPrint.contains("repeated_bytes: \"\"")); // null should be dropped
275762a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    assertTrue(protoPrint.contains("repeated_bytes: \"hello\""));
275862a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    assertTrue(protoPrint.contains("repeated_group <\n  a: -27\n>\n"
275962a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar            + "repeated_group <\n  a: -72\n>"));
276062a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    assertTrue(protoPrint.contains("optional_nested_message <\n  bb: 7\n>"));
276162a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    assertTrue(protoPrint.contains("repeated_nested_message <\n  bb: 77\n>\n"
276262a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar            + "repeated_nested_message <\n  bb: 88\n>"));
276362a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    assertTrue(protoPrint.contains("optional_nested_enum: 3"));
276462a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    assertTrue(protoPrint.contains("repeated_nested_enum: 2\nrepeated_nested_enum: 1"));
276562a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    assertTrue(protoPrint.contains("default_int32: 41"));
276662a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    assertTrue(protoPrint.contains("default_string: \"hello\""));
276762a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    assertFalse(protoPrint.contains("repeated_string_piece: \"\""));  // null should be dropped
276862a22a732fb134e5f34dd3e01920933ca5b16346Nicholas Seckar    assertTrue(protoPrint.contains("repeated_string_piece: \"world\""));
276947107914acbad70ff4db1664d3664ccc994315afAndrew Flynn  }
27700e055f079f53b07de3705838a7b4742ce56839f8Brian Duff
27716b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn  public void testMessageNanoPrinterAccessors() throws Exception {
27726b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    TestNanoAccessors msg = new TestNanoAccessors();
27736b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    msg.setOptionalInt32(13);
27746b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    msg.setOptionalString("foo");
27756b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    msg.setOptionalBytes(new byte[] {'"', '\0', 1, 8});
27766b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    msg.optionalNestedMessage = new TestNanoAccessors.NestedMessage();
27776b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    msg.optionalNestedMessage.setBb(7);
27786b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    msg.setOptionalNestedEnum(TestNanoAccessors.BAZ);
27796b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    msg.repeatedInt32 = new int[] { 1, -1 };
27806b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    msg.repeatedString = new String[] { "Hello", "world" };
27816b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    msg.repeatedBytes = new byte[2][];
27826b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    msg.repeatedBytes[1] = new byte[] {'h', 'e', 'l', 'l', 'o'};
27836b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    msg.repeatedNestedMessage = new TestNanoAccessors.NestedMessage[2];
27846b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    msg.repeatedNestedMessage[0] = new TestNanoAccessors.NestedMessage();
27856b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    msg.repeatedNestedMessage[0].setBb(5);
27866b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    msg.repeatedNestedMessage[1] = new TestNanoAccessors.NestedMessage();
27876b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    msg.repeatedNestedMessage[1].setBb(6);
27886b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    msg.repeatedNestedEnum = new int[] { TestNanoAccessors.FOO, TestNanoAccessors.BAR };
27896b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    msg.id = 33;
27906b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn
27916b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    String protoPrint = msg.toString();
27926b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    assertTrue(protoPrint.contains("optional_int32: 13"));
27936b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    assertTrue(protoPrint.contains("optional_string: \"foo\""));
27946b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    assertTrue(protoPrint.contains("optional_bytes: \"\\\"\\000\\001\\010\""));
27956b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    assertTrue(protoPrint.contains("optional_nested_message <\n  bb: 7\n>"));
27966b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    assertTrue(protoPrint.contains("optional_nested_enum: 3"));
27976b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    assertTrue(protoPrint.contains("repeated_int32: 1\nrepeated_int32: -1"));
27986b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    assertTrue(protoPrint.contains("repeated_string: \"Hello\"\nrepeated_string: \"world\""));
27996b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    assertFalse(protoPrint.contains("repeated_bytes: \"\"")); // null should be dropped
28006b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    assertTrue(protoPrint.contains("repeated_bytes: \"hello\""));
28016b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    assertTrue(protoPrint.contains("repeated_nested_message <\n  bb: 5\n>\n"
28026b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn            + "repeated_nested_message <\n  bb: 6\n>"));
28036b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    assertTrue(protoPrint.contains("repeated_nested_enum: 1\nrepeated_nested_enum: 2"));
28046b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn    assertTrue(protoPrint.contains("id: 33"));
28056b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn  }
28066b594c228e7954eb98353ad8e242b83fb255a277Andrew Flynn
28070e055f079f53b07de3705838a7b4742ce56839f8Brian Duff  public void testExtensions() throws Exception {
28080e055f079f53b07de3705838a7b4742ce56839f8Brian Duff    Extensions.ExtendableMessage message = new Extensions.ExtendableMessage();
28090e055f079f53b07de3705838a7b4742ce56839f8Brian Duff    message.field = 5;
2810382ddccb550e1c822ef26a0e65988998f7446624Max Cai    int[] int32s = {1, 2};
2811382ddccb550e1c822ef26a0e65988998f7446624Max Cai    int[] uint32s = {3, 4};
2812382ddccb550e1c822ef26a0e65988998f7446624Max Cai    int[] sint32s = {-5, -6};
2813382ddccb550e1c822ef26a0e65988998f7446624Max Cai    long[] int64s = {7, 8};
2814382ddccb550e1c822ef26a0e65988998f7446624Max Cai    long[] uint64s = {9, 10};
2815382ddccb550e1c822ef26a0e65988998f7446624Max Cai    long[] sint64s = {-11, -12};
2816382ddccb550e1c822ef26a0e65988998f7446624Max Cai    int[] fixed32s = {13, 14};
2817382ddccb550e1c822ef26a0e65988998f7446624Max Cai    int[] sfixed32s = {-15, -16};
2818382ddccb550e1c822ef26a0e65988998f7446624Max Cai    long[] fixed64s = {17, 18};
2819382ddccb550e1c822ef26a0e65988998f7446624Max Cai    long[] sfixed64s = {-19, -20};
2820382ddccb550e1c822ef26a0e65988998f7446624Max Cai    boolean[] bools = {true, false};
2821382ddccb550e1c822ef26a0e65988998f7446624Max Cai    float[] floats = {2.1f, 2.2f};
2822382ddccb550e1c822ef26a0e65988998f7446624Max Cai    double[] doubles = {2.3, 2.4};
2823382ddccb550e1c822ef26a0e65988998f7446624Max Cai    int[] enums = {Extensions.SECOND_VALUE, Extensions.FIRST_VALUE};
2824382ddccb550e1c822ef26a0e65988998f7446624Max Cai    String[] strings = {"vijfentwintig", "twenty-six"};
2825382ddccb550e1c822ef26a0e65988998f7446624Max Cai    byte[][] bytess = {{2, 7}, {2, 8}};
2826382ddccb550e1c822ef26a0e65988998f7446624Max Cai    AnotherMessage another1 = new AnotherMessage();
2827382ddccb550e1c822ef26a0e65988998f7446624Max Cai    another1.string = "er shi jiu";
2828382ddccb550e1c822ef26a0e65988998f7446624Max Cai    another1.value = false;
2829382ddccb550e1c822ef26a0e65988998f7446624Max Cai    AnotherMessage another2 = new AnotherMessage();
2830382ddccb550e1c822ef26a0e65988998f7446624Max Cai    another2.string = "trente";
2831382ddccb550e1c822ef26a0e65988998f7446624Max Cai    another2.value = true;
2832382ddccb550e1c822ef26a0e65988998f7446624Max Cai    AnotherMessage[] messages = {another1, another2};
2833382ddccb550e1c822ef26a0e65988998f7446624Max Cai    RepeatedExtensions.RepeatedGroup group1 = new RepeatedExtensions.RepeatedGroup();
2834382ddccb550e1c822ef26a0e65988998f7446624Max Cai    group1.a = 31;
2835382ddccb550e1c822ef26a0e65988998f7446624Max Cai    RepeatedExtensions.RepeatedGroup group2 = new RepeatedExtensions.RepeatedGroup();
2836382ddccb550e1c822ef26a0e65988998f7446624Max Cai    group2.a = 32;
2837382ddccb550e1c822ef26a0e65988998f7446624Max Cai    RepeatedExtensions.RepeatedGroup[] groups = {group1, group2};
28380f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(RepeatedExtensions.repeatedInt32));
2839382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(RepeatedExtensions.repeatedInt32, int32s);
28400f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(RepeatedExtensions.repeatedInt32));
28410f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(RepeatedExtensions.repeatedUint32));
2842382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(RepeatedExtensions.repeatedUint32, uint32s);
28430f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(RepeatedExtensions.repeatedUint32));
2844382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(RepeatedExtensions.repeatedSint32, sint32s);
28450f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(RepeatedExtensions.repeatedInt64));
2846382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(RepeatedExtensions.repeatedInt64, int64s);
28470f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(RepeatedExtensions.repeatedInt64));
28480f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(RepeatedExtensions.repeatedUint64));
2849382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(RepeatedExtensions.repeatedUint64, uint64s);
28500f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(RepeatedExtensions.repeatedUint64));
28510f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(RepeatedExtensions.repeatedSint64));
2852382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(RepeatedExtensions.repeatedSint64, sint64s);
28530f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(RepeatedExtensions.repeatedSint64));
28540f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(RepeatedExtensions.repeatedFixed32));
2855382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(RepeatedExtensions.repeatedFixed32, fixed32s);
28560f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(RepeatedExtensions.repeatedFixed32));
28570f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(RepeatedExtensions.repeatedSfixed32));
2858382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(RepeatedExtensions.repeatedSfixed32, sfixed32s);
28590f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(RepeatedExtensions.repeatedSfixed32));
28600f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(RepeatedExtensions.repeatedFixed64));
2861382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(RepeatedExtensions.repeatedFixed64, fixed64s);
28620f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(RepeatedExtensions.repeatedFixed64));
28630f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(RepeatedExtensions.repeatedSfixed64));
2864382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(RepeatedExtensions.repeatedSfixed64, sfixed64s);
28650f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(RepeatedExtensions.repeatedSfixed64));
28660f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(RepeatedExtensions.repeatedBool));
2867382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(RepeatedExtensions.repeatedBool, bools);
28680f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(RepeatedExtensions.repeatedBool));
28690f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(RepeatedExtensions.repeatedFloat));
2870382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(RepeatedExtensions.repeatedFloat, floats);
28710f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(RepeatedExtensions.repeatedFloat));
28720f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(RepeatedExtensions.repeatedDouble));
2873382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(RepeatedExtensions.repeatedDouble, doubles);
28740f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(RepeatedExtensions.repeatedDouble));
28750f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(RepeatedExtensions.repeatedEnum));
2876382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(RepeatedExtensions.repeatedEnum, enums);
28770f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(RepeatedExtensions.repeatedEnum));
28780f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(RepeatedExtensions.repeatedString));
2879382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(RepeatedExtensions.repeatedString, strings);
28800f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(RepeatedExtensions.repeatedString));
28810f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(RepeatedExtensions.repeatedBytes));
2882382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(RepeatedExtensions.repeatedBytes, bytess);
28830f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(RepeatedExtensions.repeatedBytes));
28840f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(RepeatedExtensions.repeatedMessage));
2885382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(RepeatedExtensions.repeatedMessage, messages);
28860f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(RepeatedExtensions.repeatedMessage));
28870f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(RepeatedExtensions.repeatedGroup));
2888382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(RepeatedExtensions.repeatedGroup, groups);
28890f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(RepeatedExtensions.repeatedGroup));
28900e055f079f53b07de3705838a7b4742ce56839f8Brian Duff
28910e055f079f53b07de3705838a7b4742ce56839f8Brian Duff    byte[] data = MessageNano.toByteArray(message);
2892382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message = Extensions.ExtendableMessage.parseFrom(data);
2893382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(5, message.field);
2894382ddccb550e1c822ef26a0e65988998f7446624Max Cai
2895382ddccb550e1c822ef26a0e65988998f7446624Max Cai    // Test reading back using SingularExtensions: the retrieved value should equal the last
2896382ddccb550e1c822ef26a0e65988998f7446624Max Cai    // in each array.
2897382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(int32s[1], (int) message.getExtension(SingularExtensions.someInt32));
2898382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(uint32s[1], (int) message.getExtension(SingularExtensions.someUint32));
2899382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(sint32s[1], (int) message.getExtension(SingularExtensions.someSint32));
2900382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(int64s[1], (long) message.getExtension(SingularExtensions.someInt64));
2901382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(uint64s[1], (long) message.getExtension(SingularExtensions.someUint64));
2902382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(sint64s[1], (long) message.getExtension(SingularExtensions.someSint64));
2903382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(fixed32s[1], (int) message.getExtension(SingularExtensions.someFixed32));
2904382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(sfixed32s[1], (int) message.getExtension(SingularExtensions.someSfixed32));
2905382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(fixed64s[1], (long) message.getExtension(SingularExtensions.someFixed64));
2906382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(sfixed64s[1], (long) message.getExtension(SingularExtensions.someSfixed64));
2907382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(bools[1], (boolean) message.getExtension(SingularExtensions.someBool));
2908382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(floats[1], (float) message.getExtension(SingularExtensions.someFloat));
2909382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(doubles[1], (double) message.getExtension(SingularExtensions.someDouble));
2910382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(enums[1], (int) message.getExtension(SingularExtensions.someEnum));
2911382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(strings[1], message.getExtension(SingularExtensions.someString));
2912382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(bytess[1], message.getExtension(SingularExtensions.someBytes)));
2913382ddccb550e1c822ef26a0e65988998f7446624Max Cai    AnotherMessage deserializedMessage = message.getExtension(SingularExtensions.someMessage);
2914382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(another2.string, deserializedMessage.string);
2915382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(another2.value, deserializedMessage.value);
2916382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(group2.a, message.getExtension(SingularExtensions.someGroup).a);
2917382ddccb550e1c822ef26a0e65988998f7446624Max Cai
2918382ddccb550e1c822ef26a0e65988998f7446624Max Cai    // Test reading back using RepeatedExtensions: the arrays should be equal.
2919cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    message = Extensions.ExtendableMessage.parseFrom(data);
2920cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    assertEquals(5, message.field);
2921382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(int32s, message.getExtension(RepeatedExtensions.repeatedInt32)));
2922382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(uint32s, message.getExtension(RepeatedExtensions.repeatedUint32)));
2923382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(sint32s, message.getExtension(RepeatedExtensions.repeatedSint32)));
2924382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(int64s, message.getExtension(RepeatedExtensions.repeatedInt64)));
2925382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(uint64s, message.getExtension(RepeatedExtensions.repeatedUint64)));
2926382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(sint64s, message.getExtension(RepeatedExtensions.repeatedSint64)));
2927382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(fixed32s, message.getExtension(RepeatedExtensions.repeatedFixed32)));
2928382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(sfixed32s, message.getExtension(RepeatedExtensions.repeatedSfixed32)));
2929382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(fixed64s, message.getExtension(RepeatedExtensions.repeatedFixed64)));
2930382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(sfixed64s, message.getExtension(RepeatedExtensions.repeatedSfixed64)));
2931382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(bools, message.getExtension(RepeatedExtensions.repeatedBool)));
2932382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(floats, message.getExtension(RepeatedExtensions.repeatedFloat)));
2933382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(doubles, message.getExtension(RepeatedExtensions.repeatedDouble)));
2934382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(enums, message.getExtension(RepeatedExtensions.repeatedEnum)));
2935382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(strings, message.getExtension(RepeatedExtensions.repeatedString)));
2936382ddccb550e1c822ef26a0e65988998f7446624Max Cai    byte[][] deserializedRepeatedBytes = message.getExtension(RepeatedExtensions.repeatedBytes);
2937382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(2, deserializedRepeatedBytes.length);
2938382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(bytess[0], deserializedRepeatedBytes[0]));
2939382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(bytess[1], deserializedRepeatedBytes[1]));
2940382ddccb550e1c822ef26a0e65988998f7446624Max Cai    AnotherMessage[] deserializedRepeatedMessage =
2941382ddccb550e1c822ef26a0e65988998f7446624Max Cai        message.getExtension(RepeatedExtensions.repeatedMessage);
2942382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(2, deserializedRepeatedMessage.length);
2943382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(another1.string, deserializedRepeatedMessage[0].string);
2944382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(another1.value, deserializedRepeatedMessage[0].value);
2945382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(another2.string, deserializedRepeatedMessage[1].string);
2946382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(another2.value, deserializedRepeatedMessage[1].value);
2947382ddccb550e1c822ef26a0e65988998f7446624Max Cai    RepeatedExtensions.RepeatedGroup[] deserializedRepeatedGroup =
2948382ddccb550e1c822ef26a0e65988998f7446624Max Cai        message.getExtension(RepeatedExtensions.repeatedGroup);
2949382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(2, deserializedRepeatedGroup.length);
2950382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(group1.a, deserializedRepeatedGroup[0].a);
2951382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertEquals(group2.a, deserializedRepeatedGroup[1].a);
2952382ddccb550e1c822ef26a0e65988998f7446624Max Cai
2953cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    message = Extensions.ExtendableMessage.parseFrom(data);
2954cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    assertEquals(5, message.field);
29550f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    // Test hasExtension using PackedExtensions.
29560f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(PackedExtensions.packedInt32));
29570f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(PackedExtensions.packedUint32));
29580f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(PackedExtensions.packedSint32));
29590f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(PackedExtensions.packedInt64));
29600f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(PackedExtensions.packedUint64));
29610f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(PackedExtensions.packedSint64));
29620f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(PackedExtensions.packedFixed32));
29630f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(PackedExtensions.packedSfixed32));
29640f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(PackedExtensions.packedFixed64));
29650f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(PackedExtensions.packedSfixed64));
29660f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(PackedExtensions.packedBool));
29670f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(PackedExtensions.packedFloat));
29680f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(PackedExtensions.packedDouble));
29690f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(PackedExtensions.packedEnum));
29700f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira
29710f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    // Test reading back using PackedExtensions: the arrays should be equal, even the fields
29720f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    // are non-packed.
2973382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(int32s, message.getExtension(PackedExtensions.packedInt32)));
2974382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(uint32s, message.getExtension(PackedExtensions.packedUint32)));
2975382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(sint32s, message.getExtension(PackedExtensions.packedSint32)));
2976382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(int64s, message.getExtension(PackedExtensions.packedInt64)));
2977382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(uint64s, message.getExtension(PackedExtensions.packedUint64)));
2978382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(sint64s, message.getExtension(PackedExtensions.packedSint64)));
2979382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(fixed32s, message.getExtension(PackedExtensions.packedFixed32)));
2980382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(sfixed32s, message.getExtension(PackedExtensions.packedSfixed32)));
2981382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(fixed64s, message.getExtension(PackedExtensions.packedFixed64)));
2982382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(sfixed64s, message.getExtension(PackedExtensions.packedSfixed64)));
2983382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(bools, message.getExtension(PackedExtensions.packedBool)));
2984382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(floats, message.getExtension(PackedExtensions.packedFloat)));
2985382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(doubles, message.getExtension(PackedExtensions.packedDouble)));
2986382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(enums, message.getExtension(PackedExtensions.packedEnum)));
2987382ddccb550e1c822ef26a0e65988998f7446624Max Cai
2988382ddccb550e1c822ef26a0e65988998f7446624Max Cai    // Now set the packable extension values using PackedExtensions so they're serialized packed.
2989382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(PackedExtensions.packedInt32, int32s);
2990382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(PackedExtensions.packedUint32, uint32s);
2991382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(PackedExtensions.packedSint32, sint32s);
2992382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(PackedExtensions.packedInt64, int64s);
2993382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(PackedExtensions.packedUint64, uint64s);
2994382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(PackedExtensions.packedSint64, sint64s);
2995382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(PackedExtensions.packedFixed32, fixed32s);
2996382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(PackedExtensions.packedSfixed32, sfixed32s);
2997382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(PackedExtensions.packedFixed64, fixed64s);
2998382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(PackedExtensions.packedSfixed64, sfixed64s);
2999382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(PackedExtensions.packedBool, bools);
3000382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(PackedExtensions.packedFloat, floats);
3001382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(PackedExtensions.packedDouble, doubles);
3002382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message.setExtension(PackedExtensions.packedEnum, enums);
3003382ddccb550e1c822ef26a0e65988998f7446624Max Cai
3004382ddccb550e1c822ef26a0e65988998f7446624Max Cai    // And read back using non-packed RepeatedExtensions.
3005382ddccb550e1c822ef26a0e65988998f7446624Max Cai    byte[] data2 = MessageNano.toByteArray(message);
3006382ddccb550e1c822ef26a0e65988998f7446624Max Cai    message = MessageNano.mergeFrom(new Extensions.ExtendableMessage(), data2);
3007382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(int32s, message.getExtension(RepeatedExtensions.repeatedInt32)));
3008382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(uint32s, message.getExtension(RepeatedExtensions.repeatedUint32)));
3009382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(sint32s, message.getExtension(RepeatedExtensions.repeatedSint32)));
3010382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(int64s, message.getExtension(RepeatedExtensions.repeatedInt64)));
3011382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(uint64s, message.getExtension(RepeatedExtensions.repeatedUint64)));
3012382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(sint64s, message.getExtension(RepeatedExtensions.repeatedSint64)));
3013382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(fixed32s, message.getExtension(RepeatedExtensions.repeatedFixed32)));
3014382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(sfixed32s, message.getExtension(RepeatedExtensions.repeatedSfixed32)));
3015382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(fixed64s, message.getExtension(RepeatedExtensions.repeatedFixed64)));
3016382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(sfixed64s, message.getExtension(RepeatedExtensions.repeatedSfixed64)));
3017382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(bools, message.getExtension(RepeatedExtensions.repeatedBool)));
3018382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(floats, message.getExtension(RepeatedExtensions.repeatedFloat)));
3019382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(doubles, message.getExtension(RepeatedExtensions.repeatedDouble)));
3020382ddccb550e1c822ef26a0e65988998f7446624Max Cai    assertTrue(Arrays.equals(enums, message.getExtension(RepeatedExtensions.repeatedEnum)));
3021bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff
3022bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    // Clone the message and ensure it's still equal.
3023bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    Extensions.ExtendableMessage clone = message.clone();
3024bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    assertEquals(clone, message);
30250e055f079f53b07de3705838a7b4742ce56839f8Brian Duff  }
30260e055f079f53b07de3705838a7b4742ce56839f8Brian Duff
30271ee2760aed05bf072a05fd7b6aeb158691a5dfbcJan-Willem Maarse  public void testNullExtensions() throws Exception {
30281ee2760aed05bf072a05fd7b6aeb158691a5dfbcJan-Willem Maarse    // Check that clearing the extension on an empty message is a no-op.
30291ee2760aed05bf072a05fd7b6aeb158691a5dfbcJan-Willem Maarse    Extensions.ExtendableMessage message = new Extensions.ExtendableMessage();
30300f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(SingularExtensions.someMessage));
30311ee2760aed05bf072a05fd7b6aeb158691a5dfbcJan-Willem Maarse    message.setExtension(SingularExtensions.someMessage, null);
30320f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(SingularExtensions.someMessage));
30331ee2760aed05bf072a05fd7b6aeb158691a5dfbcJan-Willem Maarse    assertEquals(0, MessageNano.toByteArray(message).length);
30341ee2760aed05bf072a05fd7b6aeb158691a5dfbcJan-Willem Maarse
30351ee2760aed05bf072a05fd7b6aeb158691a5dfbcJan-Willem Maarse    // Check that the message is empty after setting and clearing an extension.
30361ee2760aed05bf072a05fd7b6aeb158691a5dfbcJan-Willem Maarse    AnotherMessage another = new AnotherMessage();
30370f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(SingularExtensions.someMessage));
30381ee2760aed05bf072a05fd7b6aeb158691a5dfbcJan-Willem Maarse    message.setExtension(SingularExtensions.someMessage, another);
30390f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertTrue(message.hasExtension(SingularExtensions.someMessage));
30401ee2760aed05bf072a05fd7b6aeb158691a5dfbcJan-Willem Maarse    assertTrue(MessageNano.toByteArray(message).length > 0);
30411ee2760aed05bf072a05fd7b6aeb158691a5dfbcJan-Willem Maarse    message.setExtension(SingularExtensions.someMessage, null);
30420f67b212cd169ccf83221273ed88504d7e3f8165Juan Silveira    assertFalse(message.hasExtension(SingularExtensions.someMessage));
30431ee2760aed05bf072a05fd7b6aeb158691a5dfbcJan-Willem Maarse    assertEquals(0, MessageNano.toByteArray(message).length);
30441ee2760aed05bf072a05fd7b6aeb158691a5dfbcJan-Willem Maarse  }
30451ee2760aed05bf072a05fd7b6aeb158691a5dfbcJan-Willem Maarse
3046cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira  public void testExtensionsMutation() {
3047cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    Extensions.ExtendableMessage extendableMessage = new Extensions.ExtendableMessage();
3048cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(SingularExtensions.someMessage,
3049cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira        new Extensions.AnotherMessage());
3050cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira
3051cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.getExtension(SingularExtensions.someMessage).string = "not empty";
3052cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira
3053cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    assertEquals("not empty",
3054cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira        extendableMessage.getExtension(SingularExtensions.someMessage).string);
3055cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira  }
3056cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira
3057cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira  public void testExtensionsMutation_Equals() throws InvalidProtocolBufferNanoException {
3058cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    Extensions.ExtendableMessage extendableMessage = new Extensions.ExtendableMessage();
3059cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.field = 5;
3060cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    int int32 = 42;
3061cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    int[] uint32s = {3, 4};
3062cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    int[] sint32s = {-5, -6};
3063cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    long[] int64s = {7, 8};
3064cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    long[] uint64s = {9, 10};
3065cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    long[] sint64s = {-11, -12};
3066cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    int[] fixed32s = {13, 14};
3067cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    int[] sfixed32s = {-15, -16};
3068cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    long[] fixed64s = {17, 18};
3069cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    long[] sfixed64s = {-19, -20};
3070cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    boolean[] bools = {true, false};
3071cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    float[] floats = {2.1f, 2.2f};
3072cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    double[] doubles = {2.3, 2.4};
3073cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    int[] enums = {Extensions.SECOND_VALUE, Extensions.FIRST_VALUE};
3074cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    String[] strings = {"vijfentwintig", "twenty-six"};
3075cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    byte[][] bytess = {{2, 7}, {2, 8}};
3076cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    AnotherMessage another1 = new AnotherMessage();
3077cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    another1.string = "er shi jiu";
3078cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    another1.value = false;
3079cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    AnotherMessage another2 = new AnotherMessage();
3080cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    another2.string = "trente";
3081cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    another2.value = true;
3082cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    AnotherMessage[] messages = {another1, another2};
3083cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    RepeatedExtensions.RepeatedGroup group1 = new RepeatedExtensions.RepeatedGroup();
3084cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    group1.a = 31;
3085cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    RepeatedExtensions.RepeatedGroup group2 = new RepeatedExtensions.RepeatedGroup();
3086cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    group2.a = 32;
3087cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    RepeatedExtensions.RepeatedGroup[] groups = {group1, group2};
3088cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(SingularExtensions.someInt32, int32);
3089cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(RepeatedExtensions.repeatedUint32, uint32s);
3090cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(RepeatedExtensions.repeatedSint32, sint32s);
3091cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(RepeatedExtensions.repeatedInt64, int64s);
3092cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(RepeatedExtensions.repeatedUint64, uint64s);
3093cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(RepeatedExtensions.repeatedSint64, sint64s);
3094cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(RepeatedExtensions.repeatedFixed32, fixed32s);
3095cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(RepeatedExtensions.repeatedSfixed32, sfixed32s);
3096cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(RepeatedExtensions.repeatedFixed64, fixed64s);
3097cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(RepeatedExtensions.repeatedSfixed64, sfixed64s);
3098cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(RepeatedExtensions.repeatedBool, bools);
3099cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(RepeatedExtensions.repeatedFloat, floats);
3100cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(RepeatedExtensions.repeatedDouble, doubles);
3101cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(RepeatedExtensions.repeatedEnum, enums);
3102cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(RepeatedExtensions.repeatedString, strings);
3103cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(RepeatedExtensions.repeatedBytes, bytess);
3104cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(RepeatedExtensions.repeatedMessage, messages);
3105cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(RepeatedExtensions.repeatedGroup, groups);
3106cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira
3107cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    byte[] data = MessageNano.toByteArray(extendableMessage);
3108cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira
3109cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage = Extensions.ExtendableMessage.parseFrom(data);
3110cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    Extensions.ExtendableMessage messageCopy = Extensions.ExtendableMessage.parseFrom(data);
3111cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira
3112cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    // Without deserialising.
3113cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    assertEquals(extendableMessage, messageCopy);
3114cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    assertEquals(extendableMessage.hashCode(), messageCopy.hashCode());
3115cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira
3116cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    // Only one deserialized.
3117cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.getExtension(SingularExtensions.someInt32);
3118cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.getExtension(RepeatedExtensions.repeatedUint32);
3119cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.getExtension(RepeatedExtensions.repeatedSint32);
3120cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.getExtension(RepeatedExtensions.repeatedInt64);
3121cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.getExtension(RepeatedExtensions.repeatedUint64);
3122cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.getExtension(RepeatedExtensions.repeatedSint64);
3123cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.getExtension(RepeatedExtensions.repeatedFixed32);
3124cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.getExtension(RepeatedExtensions.repeatedSfixed32);
3125cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.getExtension(RepeatedExtensions.repeatedFixed64);
3126cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.getExtension(RepeatedExtensions.repeatedSfixed64);
3127cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.getExtension(RepeatedExtensions.repeatedBool);
3128cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.getExtension(RepeatedExtensions.repeatedFloat);
3129cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.getExtension(RepeatedExtensions.repeatedDouble);
3130cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.getExtension(RepeatedExtensions.repeatedEnum);
3131cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.getExtension(RepeatedExtensions.repeatedString);
3132cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.getExtension(RepeatedExtensions.repeatedBytes);
3133cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.getExtension(RepeatedExtensions.repeatedMessage);
3134cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.getExtension(RepeatedExtensions.repeatedGroup);
3135cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    assertEquals(extendableMessage, messageCopy);
3136cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    assertEquals(extendableMessage.hashCode(), messageCopy.hashCode());
3137cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira
3138cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    // Both deserialized.
3139cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    messageCopy.getExtension(SingularExtensions.someInt32);
3140cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    messageCopy.getExtension(RepeatedExtensions.repeatedUint32);
3141cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    messageCopy.getExtension(RepeatedExtensions.repeatedSint32);
3142cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    messageCopy.getExtension(RepeatedExtensions.repeatedInt64);
3143cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    messageCopy.getExtension(RepeatedExtensions.repeatedUint64);
3144cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    messageCopy.getExtension(RepeatedExtensions.repeatedSint64);
3145cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    messageCopy.getExtension(RepeatedExtensions.repeatedFixed32);
3146cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    messageCopy.getExtension(RepeatedExtensions.repeatedSfixed32);
3147cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    messageCopy.getExtension(RepeatedExtensions.repeatedFixed64);
3148cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    messageCopy.getExtension(RepeatedExtensions.repeatedSfixed64);
3149cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    messageCopy.getExtension(RepeatedExtensions.repeatedBool);
3150cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    messageCopy.getExtension(RepeatedExtensions.repeatedFloat);
3151cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    messageCopy.getExtension(RepeatedExtensions.repeatedDouble);
3152cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    messageCopy.getExtension(RepeatedExtensions.repeatedEnum);
3153cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    messageCopy.getExtension(RepeatedExtensions.repeatedString);
3154cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    messageCopy.getExtension(RepeatedExtensions.repeatedBytes);
3155cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    messageCopy.getExtension(RepeatedExtensions.repeatedMessage);
3156cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    messageCopy.getExtension(RepeatedExtensions.repeatedGroup);
3157cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    assertEquals(extendableMessage, messageCopy);
3158cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    assertEquals(extendableMessage.hashCode(), messageCopy.hashCode());
3159cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira
3160cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    // Change one, make sure they are still different.
3161cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    messageCopy.getExtension(RepeatedExtensions.repeatedMessage)[0].string = "not empty";
3162cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    assertFalse(extendableMessage.equals(messageCopy));
3163cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira
3164cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    // Even if the extension hasn't been deserialized.
3165cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage = Extensions.ExtendableMessage.parseFrom(data);
3166cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    assertFalse(extendableMessage.equals(messageCopy));
3167cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira  }
3168cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira
3169cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira  public void testExtensionsCaching() {
3170cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    Extensions.ExtendableMessage extendableMessage = new Extensions.ExtendableMessage();
3171cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    extendableMessage.setExtension(SingularExtensions.someMessage,
3172cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira        new Extensions.AnotherMessage());
3173cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira    assertSame("Consecutive calls to getExtensions should return the same object",
3174cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira        extendableMessage.getExtension(SingularExtensions.someMessage),
3175cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira        extendableMessage.getExtension(SingularExtensions.someMessage));
3176cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira  }
3177cf1b416ae1327a26dd53a691fc1b3e30eec8e6a6Juan Silveira
31780e055f079f53b07de3705838a7b4742ce56839f8Brian Duff  public void testUnknownFields() throws Exception {
31790e055f079f53b07de3705838a7b4742ce56839f8Brian Duff    // Check that we roundtrip (serialize and deserialize) unrecognized fields.
31800e055f079f53b07de3705838a7b4742ce56839f8Brian Duff    AnotherMessage message = new AnotherMessage();
31810e055f079f53b07de3705838a7b4742ce56839f8Brian Duff    message.string = "Hello World";
31820e055f079f53b07de3705838a7b4742ce56839f8Brian Duff    message.value = false;
31830e055f079f53b07de3705838a7b4742ce56839f8Brian Duff
31840e055f079f53b07de3705838a7b4742ce56839f8Brian Duff    byte[] bytes = MessageNano.toByteArray(message);
31850e055f079f53b07de3705838a7b4742ce56839f8Brian Duff    int extraFieldSize = CodedOutputStream.computeStringSize(1001, "This is an unknown field");
31860e055f079f53b07de3705838a7b4742ce56839f8Brian Duff    byte[] newBytes = new byte[bytes.length + extraFieldSize];
31870e055f079f53b07de3705838a7b4742ce56839f8Brian Duff    System.arraycopy(bytes, 0, newBytes, 0, bytes.length);
31880e055f079f53b07de3705838a7b4742ce56839f8Brian Duff    CodedOutputStream.newInstance(newBytes, bytes.length, extraFieldSize).writeString(1001,
31890e055f079f53b07de3705838a7b4742ce56839f8Brian Duff        "This is an unknown field");
31900e055f079f53b07de3705838a7b4742ce56839f8Brian Duff
31910e055f079f53b07de3705838a7b4742ce56839f8Brian Duff    // Deserialize with an unknown field.
31920e055f079f53b07de3705838a7b4742ce56839f8Brian Duff    AnotherMessage deserialized = AnotherMessage.parseFrom(newBytes);
31930e055f079f53b07de3705838a7b4742ce56839f8Brian Duff    byte[] serialized = MessageNano.toByteArray(deserialized);
31940e055f079f53b07de3705838a7b4742ce56839f8Brian Duff
31950e055f079f53b07de3705838a7b4742ce56839f8Brian Duff    assertEquals(newBytes.length, serialized.length);
31960e055f079f53b07de3705838a7b4742ce56839f8Brian Duff
31970e055f079f53b07de3705838a7b4742ce56839f8Brian Duff    // Clear, and make sure it clears everything.
31980e055f079f53b07de3705838a7b4742ce56839f8Brian Duff    deserialized.clear();
31990e055f079f53b07de3705838a7b4742ce56839f8Brian Duff    assertEquals(0, MessageNano.toByteArray(deserialized).length);
32000e055f079f53b07de3705838a7b4742ce56839f8Brian Duff  }
32010e055f079f53b07de3705838a7b4742ce56839f8Brian Duff
320219641419a381509bddfc2d0b5d60a411b67b105bBrian Duff  public void testMergeFrom() throws Exception {
320319641419a381509bddfc2d0b5d60a411b67b105bBrian Duff    SimpleMessageNano message = new SimpleMessageNano();
320419641419a381509bddfc2d0b5d60a411b67b105bBrian Duff    message.d = 123;
320519641419a381509bddfc2d0b5d60a411b67b105bBrian Duff    byte[] bytes = MessageNano.toByteArray(message);
320619641419a381509bddfc2d0b5d60a411b67b105bBrian Duff
320719641419a381509bddfc2d0b5d60a411b67b105bBrian Duff    SimpleMessageNano newMessage = MessageNano.mergeFrom(new SimpleMessageNano(), bytes);
320819641419a381509bddfc2d0b5d60a411b67b105bBrian Duff    assertEquals(message.d, newMessage.d);
320919641419a381509bddfc2d0b5d60a411b67b105bBrian Duff  }
321019641419a381509bddfc2d0b5d60a411b67b105bBrian Duff
3211f4e01452f159ae6b53f5edd25fa647ca2919ae10Tom Chao  public void testJavaKeyword() throws Exception {
3212f4e01452f159ae6b53f5edd25fa647ca2919ae10Tom Chao    TestAllTypesNano msg = new TestAllTypesNano();
3213f4e01452f159ae6b53f5edd25fa647ca2919ae10Tom Chao    msg.synchronized_ = 123;
3214f4e01452f159ae6b53f5edd25fa647ca2919ae10Tom Chao    assertEquals(123, msg.synchronized_);
3215f4e01452f159ae6b53f5edd25fa647ca2919ae10Tom Chao  }
3216f4e01452f159ae6b53f5edd25fa647ca2919ae10Tom Chao
32170b8579237336f221711a0aac42400eb31a58fed3Brian Duff  public void testReferenceTypesForPrimitives() throws Exception {
32180b8579237336f221711a0aac42400eb31a58fed3Brian Duff    NanoReferenceTypes.TestAllTypesNano message = new NanoReferenceTypes.TestAllTypesNano();
32190b8579237336f221711a0aac42400eb31a58fed3Brian Duff
32200b8579237336f221711a0aac42400eb31a58fed3Brian Duff    // Base check - when nothing is set, we serialize nothing.
32210b8579237336f221711a0aac42400eb31a58fed3Brian Duff    assertHasWireData(message, false);
32220b8579237336f221711a0aac42400eb31a58fed3Brian Duff
32230b8579237336f221711a0aac42400eb31a58fed3Brian Duff    message.defaultBool = true;
32240b8579237336f221711a0aac42400eb31a58fed3Brian Duff    assertHasWireData(message, true);
32250b8579237336f221711a0aac42400eb31a58fed3Brian Duff
32260b8579237336f221711a0aac42400eb31a58fed3Brian Duff    message.defaultBool = false;
32270b8579237336f221711a0aac42400eb31a58fed3Brian Duff    assertHasWireData(message, true);
32280b8579237336f221711a0aac42400eb31a58fed3Brian Duff
32290b8579237336f221711a0aac42400eb31a58fed3Brian Duff    message.defaultBool = null;
32300b8579237336f221711a0aac42400eb31a58fed3Brian Duff    assertHasWireData(message, false);
32310b8579237336f221711a0aac42400eb31a58fed3Brian Duff
32320b8579237336f221711a0aac42400eb31a58fed3Brian Duff    message.defaultInt32 = 5;
32330b8579237336f221711a0aac42400eb31a58fed3Brian Duff    assertHasWireData(message, true);
32340b8579237336f221711a0aac42400eb31a58fed3Brian Duff
32350b8579237336f221711a0aac42400eb31a58fed3Brian Duff    message.defaultInt32 = null;
32360b8579237336f221711a0aac42400eb31a58fed3Brian Duff    assertHasWireData(message, false);
32370b8579237336f221711a0aac42400eb31a58fed3Brian Duff
32380b8579237336f221711a0aac42400eb31a58fed3Brian Duff    message.defaultInt64 = 123456L;
32390b8579237336f221711a0aac42400eb31a58fed3Brian Duff    assertHasWireData(message, true);
32400b8579237336f221711a0aac42400eb31a58fed3Brian Duff
32410b8579237336f221711a0aac42400eb31a58fed3Brian Duff    message.defaultInt64 = null;
32420b8579237336f221711a0aac42400eb31a58fed3Brian Duff    assertHasWireData(message, false);
32430b8579237336f221711a0aac42400eb31a58fed3Brian Duff
32440b8579237336f221711a0aac42400eb31a58fed3Brian Duff    message.defaultFloat = 1f;
32450b8579237336f221711a0aac42400eb31a58fed3Brian Duff    assertHasWireData(message, true);
32460b8579237336f221711a0aac42400eb31a58fed3Brian Duff
32470b8579237336f221711a0aac42400eb31a58fed3Brian Duff    message.defaultFloat = null;
32480b8579237336f221711a0aac42400eb31a58fed3Brian Duff    assertHasWireData(message, false);
32490b8579237336f221711a0aac42400eb31a58fed3Brian Duff
32500b8579237336f221711a0aac42400eb31a58fed3Brian Duff    message.defaultDouble = 2.1;
32510b8579237336f221711a0aac42400eb31a58fed3Brian Duff    assertHasWireData(message, true);
32520b8579237336f221711a0aac42400eb31a58fed3Brian Duff
32530b8579237336f221711a0aac42400eb31a58fed3Brian Duff    message.defaultDouble = null;
32540b8579237336f221711a0aac42400eb31a58fed3Brian Duff    assertHasWireData(message, false);
32550b8579237336f221711a0aac42400eb31a58fed3Brian Duff
32560b8579237336f221711a0aac42400eb31a58fed3Brian Duff    message.defaultString = "hello";
32570b8579237336f221711a0aac42400eb31a58fed3Brian Duff    assertHasWireData(message, true);
32580b8579237336f221711a0aac42400eb31a58fed3Brian Duff
32590b8579237336f221711a0aac42400eb31a58fed3Brian Duff    message.defaultString = null;
32600b8579237336f221711a0aac42400eb31a58fed3Brian Duff    assertHasWireData(message, false);
32610b8579237336f221711a0aac42400eb31a58fed3Brian Duff
32620b8579237336f221711a0aac42400eb31a58fed3Brian Duff    message.defaultBytes = new byte[] { 1, 2, 3 };
32630b8579237336f221711a0aac42400eb31a58fed3Brian Duff    assertHasWireData(message, true);
32640b8579237336f221711a0aac42400eb31a58fed3Brian Duff
32650b8579237336f221711a0aac42400eb31a58fed3Brian Duff    message.defaultBytes = null;
32660b8579237336f221711a0aac42400eb31a58fed3Brian Duff    assertHasWireData(message, false);
32670b8579237336f221711a0aac42400eb31a58fed3Brian Duff  }
32680b8579237336f221711a0aac42400eb31a58fed3Brian Duff
3269ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff  public void testHashCodeEquals() throws Exception {
3270ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    // Complete equality:
3271ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    TestAllTypesNano a = createMessageForHashCodeEqualsTest();
3272ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    TestAllTypesNano aEquivalent = createMessageForHashCodeEqualsTest();
3273ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3274a882d4b4b6801edb1e67fb17632d2da50ba22266Brian Duff    assertTrue(MessageNano.messageNanoEquals(a, aEquivalent));
3275a882d4b4b6801edb1e67fb17632d2da50ba22266Brian Duff    assertFalse(MessageNano.messageNanoEquals(a, new TestAllTypesNano()));
3276a882d4b4b6801edb1e67fb17632d2da50ba22266Brian Duff
3277ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    // Null and empty array for repeated fields equality:
3278ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    TestAllTypesNano b = createMessageForHashCodeEqualsTest();
3279ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    b.repeatedBool = null;
3280ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    b.repeatedFloat = new float[0];
3281ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    TestAllTypesNano bEquivalent = createMessageForHashCodeEqualsTest();
3282ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    bEquivalent.repeatedBool = new boolean[0];
3283ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    bEquivalent.repeatedFloat = null;
3284ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3285ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    // Ref-element-type repeated fields use non-null subsequence equality:
3286ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    TestAllTypesNano c = createMessageForHashCodeEqualsTest();
3287ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    c.repeatedString = null;
3288ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    c.repeatedStringPiece = new String[] {null, "one", null, "two"};
3289ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    c.repeatedBytes = new byte[][] {{3, 4}, null};
3290ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    TestAllTypesNano cEquivalent = createMessageForHashCodeEqualsTest();
3291ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    cEquivalent.repeatedString = new String[3];
3292ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    cEquivalent.repeatedStringPiece = new String[] {"one", "two", null};
3293ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    cEquivalent.repeatedBytes = new byte[][] {{3, 4}};
3294ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3295ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    // Complete equality for messages with has fields:
3296ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    TestAllTypesNanoHas d = createMessageWithHasForHashCodeEqualsTest();
3297ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    TestAllTypesNanoHas dEquivalent = createMessageWithHasForHashCodeEqualsTest();
3298ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3299ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    // If has-fields exist, fields with the same default values but
3300ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    // different has-field values are different.
3301ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    TestAllTypesNanoHas e = createMessageWithHasForHashCodeEqualsTest();
3302ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    e.optionalInt32++; // make different from d
3303ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    e.hasDefaultString = false;
3304ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    TestAllTypesNanoHas eDifferent = createMessageWithHasForHashCodeEqualsTest();
3305ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    eDifferent.optionalInt32 = e.optionalInt32;
3306ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    eDifferent.hasDefaultString = true;
3307ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3308ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    // Complete equality for messages with accessors:
3309ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    TestNanoAccessors f = createMessageWithAccessorsForHashCodeEqualsTest();
3310ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    TestNanoAccessors fEquivalent = createMessageWithAccessorsForHashCodeEqualsTest();
3311ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3312ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    // If using accessors, explicitly setting a field to its default value
3313ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    // should make the message different.
3314ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    TestNanoAccessors g = createMessageWithAccessorsForHashCodeEqualsTest();
3315ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    g.setOptionalInt32(g.getOptionalInt32() + 1); // make different from f
3316ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    g.clearDefaultString();
3317ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    TestNanoAccessors gDifferent = createMessageWithAccessorsForHashCodeEqualsTest();
3318ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    gDifferent.setOptionalInt32(g.getOptionalInt32());
3319ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    gDifferent.setDefaultString(g.getDefaultString());
3320ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3321ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    // Complete equality for reference typed messages:
3322ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    NanoReferenceTypes.TestAllTypesNano h = createRefTypedMessageForHashCodeEqualsTest();
3323ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    NanoReferenceTypes.TestAllTypesNano hEquivalent = createRefTypedMessageForHashCodeEqualsTest();
3324ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3325ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    // Inequality of null and default value for reference typed messages:
3326ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    NanoReferenceTypes.TestAllTypesNano i = createRefTypedMessageForHashCodeEqualsTest();
3327ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    i.optionalInt32 = 1; // make different from h
3328ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    i.optionalFloat = null;
3329ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    NanoReferenceTypes.TestAllTypesNano iDifferent = createRefTypedMessageForHashCodeEqualsTest();
3330ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    iDifferent.optionalInt32 = i.optionalInt32;
3331ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    iDifferent.optionalFloat = 0.0f;
3332ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3333ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    HashMap<MessageNano, String> hashMap = new HashMap<MessageNano, String>();
3334ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    hashMap.put(a, "a");
3335ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    hashMap.put(b, "b");
3336ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    hashMap.put(c, "c");
3337ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    hashMap.put(d, "d");
3338ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    hashMap.put(e, "e");
3339ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    hashMap.put(f, "f");
3340ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    hashMap.put(g, "g");
3341ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    hashMap.put(h, "h");
3342ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    hashMap.put(i, "i");
3343ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3344ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    assertEquals(9, hashMap.size()); // a-i should be different from each other.
3345ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3346ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    assertEquals("a", hashMap.get(a));
3347ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    assertEquals("a", hashMap.get(aEquivalent));
3348ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3349ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    assertEquals("b", hashMap.get(b));
3350ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    assertEquals("b", hashMap.get(bEquivalent));
3351ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3352ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    assertEquals("c", hashMap.get(c));
3353ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    assertEquals("c", hashMap.get(cEquivalent));
3354ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3355ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    assertEquals("d", hashMap.get(d));
3356ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    assertEquals("d", hashMap.get(dEquivalent));
3357ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3358ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    assertEquals("e", hashMap.get(e));
3359ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    assertNull(hashMap.get(eDifferent));
3360ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3361ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    assertEquals("f", hashMap.get(f));
3362ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    assertEquals("f", hashMap.get(fEquivalent));
3363ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3364ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    assertEquals("g", hashMap.get(g));
3365ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    assertNull(hashMap.get(gDifferent));
3366ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3367ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    assertEquals("h", hashMap.get(h));
3368ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    assertEquals("h", hashMap.get(hEquivalent));
3369ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3370ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    assertEquals("i", hashMap.get(i));
3371ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    assertNull(hashMap.get(iDifferent));
3372ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff  }
3373ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3374ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff  private TestAllTypesNano createMessageForHashCodeEqualsTest() {
3375ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    TestAllTypesNano message = new TestAllTypesNano();
3376ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalInt32 = 5;
3377ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalInt64 = 777;
3378ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalFloat = 1.0f;
3379ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalDouble = 2.0;
3380ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalBool = true;
3381ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalString = "Hello";
3382ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalBytes = new byte[] { 1, 2, 3 };
3383ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalNestedMessage = new TestAllTypesNano.NestedMessage();
3384ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalNestedMessage.bb = 27;
3385ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalNestedEnum = TestAllTypesNano.BAR;
3386ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedInt32 = new int[] { 5, 6, 7, 8 };
3387ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedInt64 = new long[] { 27L, 28L, 29L };
3388ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedFloat = new float[] { 5.0f, 6.0f };
3389ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedDouble = new double[] { 99.1, 22.5 };
3390ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedBool = new boolean[] { true, false, true };
3391ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedString = new String[] { "One", "Two" };
3392ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedBytes = new byte[][] { { 2, 7 }, { 2, 7 } };
3393ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedNestedMessage = new TestAllTypesNano.NestedMessage[] {
3394ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff      message.optionalNestedMessage,
3395ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff      message.optionalNestedMessage
3396ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    };
3397ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedNestedEnum = new int[] {
3398ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff      TestAllTypesNano.BAR,
3399ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff      TestAllTypesNano.BAZ
3400ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    };
3401ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    return message;
3402ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff  }
3403ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3404ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff  private TestAllTypesNanoHas createMessageWithHasForHashCodeEqualsTest() {
3405ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    TestAllTypesNanoHas message = new TestAllTypesNanoHas();
3406ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalInt32 = 5;
3407ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalString = "Hello";
3408ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalBytes = new byte[] { 1, 2, 3 };
3409ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalNestedMessage = new TestAllTypesNanoHas.NestedMessage();
3410ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalNestedMessage.bb = 27;
3411ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalNestedEnum = TestAllTypesNano.BAR;
3412ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedInt32 = new int[] { 5, 6, 7, 8 };
3413ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedString = new String[] { "One", "Two" };
3414ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedBytes = new byte[][] { { 2, 7 }, { 2, 7 } };
3415ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedNestedMessage = new TestAllTypesNanoHas.NestedMessage[] {
3416ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff      message.optionalNestedMessage,
3417ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff      message.optionalNestedMessage
3418ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    };
3419ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedNestedEnum = new int[] {
3420ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff      TestAllTypesNano.BAR,
3421ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff      TestAllTypesNano.BAZ
3422ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    };
3423ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    return message;
3424ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff  }
3425ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3426ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff  private TestNanoAccessors createMessageWithAccessorsForHashCodeEqualsTest() {
3427ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    TestNanoAccessors message = new TestNanoAccessors()
3428ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff        .setOptionalInt32(5)
3429ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff        .setOptionalString("Hello")
3430ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff        .setOptionalBytes(new byte[] {1, 2, 3})
343104e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai        .setOptionalNestedEnum(TestNanoAccessors.BAR);
3432102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn    message.optionalNestedMessage = new TestNanoAccessors.NestedMessage().setBb(27);
3433ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedInt32 = new int[] { 5, 6, 7, 8 };
3434ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedString = new String[] { "One", "Two" };
3435ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedBytes = new byte[][] { { 2, 7 }, { 2, 7 } };
3436ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedNestedMessage = new TestNanoAccessors.NestedMessage[] {
3437102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn      message.optionalNestedMessage,
3438102cfe65b9b9e2b458c3d0ec69d47e8fc40dc726Andrew Flynn      message.optionalNestedMessage
3439ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    };
3440ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedNestedEnum = new int[] {
3441ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff      TestAllTypesNano.BAR,
3442ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff      TestAllTypesNano.BAZ
3443ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    };
3444ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    return message;
3445ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff  }
3446ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
3447ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff  private NanoReferenceTypes.TestAllTypesNano createRefTypedMessageForHashCodeEqualsTest() {
3448ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    NanoReferenceTypes.TestAllTypesNano message = new NanoReferenceTypes.TestAllTypesNano();
3449ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalInt32 = 5;
3450ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalInt64 = 777L;
3451ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalFloat = 1.0f;
3452ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalDouble = 2.0;
3453ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalBool = true;
3454ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalString = "Hello";
3455ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalBytes = new byte[] { 1, 2, 3 };
3456ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalNestedMessage =
3457ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff        new NanoReferenceTypes.TestAllTypesNano.NestedMessage();
3458ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalNestedMessage.foo = 27;
3459ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.optionalNestedEnum = NanoReferenceTypes.TestAllTypesNano.BAR;
3460ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedInt32 = new int[] { 5, 6, 7, 8 };
3461ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedInt64 = new long[] { 27L, 28L, 29L };
3462ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedFloat = new float[] { 5.0f, 6.0f };
3463ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedDouble = new double[] { 99.1, 22.5 };
3464ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedBool = new boolean[] { true, false, true };
3465ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedString = new String[] { "One", "Two" };
3466ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedBytes = new byte[][] { { 2, 7 }, { 2, 7 } };
3467ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedNestedMessage =
3468ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff        new NanoReferenceTypes.TestAllTypesNano.NestedMessage[] {
3469ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff          message.optionalNestedMessage,
3470ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff          message.optionalNestedMessage
3471ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff        };
3472ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    message.repeatedNestedEnum = new int[] {
3473ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff      NanoReferenceTypes.TestAllTypesNano.BAR,
3474ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff      NanoReferenceTypes.TestAllTypesNano.BAZ
3475ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    };
3476ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    return message;
3477ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff  }
3478ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
347904e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai  public void testEqualsWithSpecialFloatingPointValues() throws Exception {
348004e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    // Checks that the nano implementation complies with Object.equals() when treating
348104e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    // floating point numbers, i.e. NaN == NaN and +0.0 != -0.0.
348204e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    // This test assumes that the generated equals() implementations are symmetric, so
348304e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    // there will only be one direction for each equality check.
348404e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
348504e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    TestAllTypesNano m1 = new TestAllTypesNano();
348604e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m1.optionalFloat = Float.NaN;
348704e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m1.optionalDouble = Double.NaN;
348804e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    TestAllTypesNano m2 = new TestAllTypesNano();
348904e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m2.optionalFloat = Float.NaN;
349004e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m2.optionalDouble = Double.NaN;
349104e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertTrue(m1.equals(m2));
349204e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertTrue(m1.equals(
349304e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai        MessageNano.mergeFrom(new TestAllTypesNano(), MessageNano.toByteArray(m1))));
349404e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
349504e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m1.optionalFloat = +0f;
349604e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m2.optionalFloat = -0f;
349704e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertFalse(m1.equals(m2));
349804e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
349904e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m1.optionalFloat = -0f;
350004e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m1.optionalDouble = +0d;
350104e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m2.optionalDouble = -0d;
350204e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertFalse(m1.equals(m2));
350304e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
350404e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m1.optionalDouble = -0d;
350504e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertTrue(m1.equals(m2));
350604e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertFalse(m1.equals(new TestAllTypesNano())); // -0 does not equals() the default +0
350704e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertTrue(m1.equals(
350804e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai        MessageNano.mergeFrom(new TestAllTypesNano(), MessageNano.toByteArray(m1))));
350904e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
351004e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    // -------
351104e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
351204e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    TestAllTypesNanoHas m3 = new TestAllTypesNanoHas();
351304e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m3.optionalFloat = Float.NaN;
351404e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m3.hasOptionalFloat = true;
351504e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m3.optionalDouble = Double.NaN;
351604e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m3.hasOptionalDouble = true;
351704e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    TestAllTypesNanoHas m4 = new TestAllTypesNanoHas();
351804e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m4.optionalFloat = Float.NaN;
351904e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m4.hasOptionalFloat = true;
352004e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m4.optionalDouble = Double.NaN;
352104e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m4.hasOptionalDouble = true;
352204e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertTrue(m3.equals(m4));
352304e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertTrue(m3.equals(
352404e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai        MessageNano.mergeFrom(new TestAllTypesNanoHas(), MessageNano.toByteArray(m3))));
352504e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
352604e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m3.optionalFloat = +0f;
352704e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m4.optionalFloat = -0f;
352804e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertFalse(m3.equals(m4));
352904e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
353004e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m3.optionalFloat = -0f;
353104e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m3.optionalDouble = +0d;
353204e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m4.optionalDouble = -0d;
353304e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertFalse(m3.equals(m4));
353404e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
353504e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m3.optionalDouble = -0d;
353604e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m3.hasOptionalFloat = false;  // -0 does not equals() the default +0,
353704e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m3.hasOptionalDouble = false; // so these incorrect 'has' flags should be disregarded.
353804e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertTrue(m3.equals(m4));    // note: m4 has the 'has' flags set.
353904e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertFalse(m3.equals(new TestAllTypesNanoHas())); // note: the new message has +0 defaults
354004e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertTrue(m3.equals(
354104e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai        MessageNano.mergeFrom(new TestAllTypesNanoHas(), MessageNano.toByteArray(m3))));
354204e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai                                  // note: the deserialized message has the 'has' flags set.
354304e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
354404e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    // -------
354504e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
354604e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    TestNanoAccessors m5 = new TestNanoAccessors();
354704e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m5.setOptionalFloat(Float.NaN);
354804e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m5.setOptionalDouble(Double.NaN);
354904e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    TestNanoAccessors m6 = new TestNanoAccessors();
355004e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m6.setOptionalFloat(Float.NaN);
355104e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m6.setOptionalDouble(Double.NaN);
355204e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertTrue(m5.equals(m6));
355304e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertTrue(m5.equals(
355404e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai        MessageNano.mergeFrom(new TestNanoAccessors(), MessageNano.toByteArray(m6))));
355504e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
355604e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m5.setOptionalFloat(+0f);
355704e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m6.setOptionalFloat(-0f);
355804e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertFalse(m5.equals(m6));
355904e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
356004e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m5.setOptionalFloat(-0f);
356104e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m5.setOptionalDouble(+0d);
356204e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m6.setOptionalDouble(-0d);
356304e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertFalse(m5.equals(m6));
356404e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
356504e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m5.setOptionalDouble(-0d);
356604e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertTrue(m5.equals(m6));
356704e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertFalse(m5.equals(new TestNanoAccessors()));
356804e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertTrue(m5.equals(
356904e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai        MessageNano.mergeFrom(new TestNanoAccessors(), MessageNano.toByteArray(m6))));
357004e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
357104e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    // -------
357204e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
357304e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    NanoReferenceTypes.TestAllTypesNano m7 = new NanoReferenceTypes.TestAllTypesNano();
357404e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m7.optionalFloat = Float.NaN;
357504e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m7.optionalDouble = Double.NaN;
357604e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    NanoReferenceTypes.TestAllTypesNano m8 = new NanoReferenceTypes.TestAllTypesNano();
357704e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m8.optionalFloat = Float.NaN;
357804e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m8.optionalDouble = Double.NaN;
357904e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertTrue(m7.equals(m8));
358004e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertTrue(m7.equals(MessageNano.mergeFrom(
358104e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai        new NanoReferenceTypes.TestAllTypesNano(), MessageNano.toByteArray(m7))));
358204e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
358304e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m7.optionalFloat = +0f;
358404e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m8.optionalFloat = -0f;
358504e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertFalse(m7.equals(m8));
358604e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
358704e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m7.optionalFloat = -0f;
358804e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m7.optionalDouble = +0d;
358904e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m8.optionalDouble = -0d;
359004e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertFalse(m7.equals(m8));
359104e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
359204e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    m7.optionalDouble = -0d;
359304e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertTrue(m7.equals(m8));
359404e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertFalse(m7.equals(new NanoReferenceTypes.TestAllTypesNano()));
359504e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai    assertTrue(m7.equals(MessageNano.mergeFrom(
359604e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai        new NanoReferenceTypes.TestAllTypesNano(), MessageNano.toByteArray(m7))));
359704e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai  }
359804e0fa44e105bc644bf07ba5154fc4a1ca4baec2Max Cai
3599e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff  public void testNullRepeatedFields() throws Exception {
3600e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    // Check that serialization after explicitly setting a repeated field
3601e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    // to null doesn't NPE.
3602e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    TestAllTypesNano message = new TestAllTypesNano();
3603e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    message.repeatedInt32 = null;
3604e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    MessageNano.toByteArray(message);  // should not NPE
3605e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    message.toString(); // should not NPE
3606e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff
3607e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    message.repeatedNestedEnum = null;
3608e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    MessageNano.toByteArray(message);  // should not NPE
3609e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    message.toString(); // should not NPE
3610e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff
3611e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    message.repeatedBytes = null;
3612e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    MessageNano.toByteArray(message); // should not NPE
3613e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    message.toString(); // should not NPE
3614e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff
3615e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    message.repeatedNestedMessage = null;
3616e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    MessageNano.toByteArray(message); // should not NPE
3617e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    message.toString(); // should not NPE
3618e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff
3619334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    message.repeatedPackedInt32 = null;
3620334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    MessageNano.toByteArray(message); // should not NPE
3621334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    message.toString(); // should not NPE
3622334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai
3623334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    message.repeatedPackedNestedEnum = null;
3624334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    MessageNano.toByteArray(message); // should not NPE
3625334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    message.toString(); // should not NPE
3626334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai
3627e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    // Create a second message to merge into message.
3628e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    TestAllTypesNano secondMessage = new TestAllTypesNano();
3629334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    secondMessage.repeatedInt32 = new int[] {1, 2, 3};
3630334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    secondMessage.repeatedNestedEnum = new int[] {
3631334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai      TestAllTypesNano.FOO, TestAllTypesNano.BAR
3632334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    };
3633334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    secondMessage.repeatedBytes = new byte[][] {{1, 2}, {3, 4}};
3634e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    TestAllTypesNano.NestedMessage nested =
3635e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff        new TestAllTypesNano.NestedMessage();
3636e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    nested.bb = 55;
3637e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    secondMessage.repeatedNestedMessage =
3638334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai        new TestAllTypesNano.NestedMessage[] {nested};
3639334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    secondMessage.repeatedPackedInt32 = new int[] {1, 2, 3};
3640334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    secondMessage.repeatedPackedNestedEnum = new int[] {
3641334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai        TestAllTypesNano.FOO, TestAllTypesNano.BAR
3642334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai      };
3643e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff
3644e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    // Should not NPE
3645e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    message.mergeFrom(CodedInputByteBufferNano.newInstance(
3646e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff        MessageNano.toByteArray(secondMessage)));
3647334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(3, message.repeatedInt32.length);
3648334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(3, message.repeatedInt32[2]);
3649334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(2, message.repeatedNestedEnum.length);
3650334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(TestAllTypesNano.FOO, message.repeatedNestedEnum[0]);
3651334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(2, message.repeatedBytes.length);
3652334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(4, message.repeatedBytes[1][1]);
3653334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(1, message.repeatedNestedMessage.length);
3654e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    assertEquals(55, message.repeatedNestedMessage[0].bb);
3655334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(3, message.repeatedPackedInt32.length);
3656334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(2, message.repeatedPackedInt32[1]);
3657334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(2, message.repeatedPackedNestedEnum.length);
3658334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(TestAllTypesNano.BAR, message.repeatedPackedNestedEnum[1]);
3659334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai  }
3660334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai
3661beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod  public void testNullRepeatedFieldElements() throws Exception {
3662beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    // Check that serialization with null array elements doesn't NPE.
3663beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    String string1 = "1";
3664beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    String string2 = "2";
3665beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    byte[] bytes1 = {3, 4};
3666beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    byte[] bytes2 = {5, 6};
3667beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    TestAllTypesNano.NestedMessage msg1 = new TestAllTypesNano.NestedMessage();
3668beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    msg1.bb = 7;
3669beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    TestAllTypesNano.NestedMessage msg2 = new TestAllTypesNano.NestedMessage();
3670beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    msg2.bb = 8;
3671beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod
3672beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    TestAllTypesNano message = new TestAllTypesNano();
3673beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    message.repeatedString = new String[] {null, string1, string2};
3674beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    message.repeatedBytes = new byte[][] {bytes1, null, bytes2};
3675beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    message.repeatedNestedMessage = new TestAllTypesNano.NestedMessage[] {msg1, msg2, null};
3676beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    message.repeatedGroup = new TestAllTypesNano.RepeatedGroup[] {null, null, null};
3677beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod
3678beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    byte[] serialized = MessageNano.toByteArray(message); // should not NPE
3679beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    TestAllTypesNano deserialized = MessageNano.mergeFrom(new TestAllTypesNano(), serialized);
3680beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    assertEquals(2, deserialized.repeatedString.length);
3681beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    assertEquals(string1, deserialized.repeatedString[0]);
3682beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    assertEquals(string2, deserialized.repeatedString[1]);
3683beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    assertEquals(2, deserialized.repeatedBytes.length);
3684beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    assertTrue(Arrays.equals(bytes1, deserialized.repeatedBytes[0]));
3685beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    assertTrue(Arrays.equals(bytes2, deserialized.repeatedBytes[1]));
3686beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    assertEquals(2, deserialized.repeatedNestedMessage.length);
3687beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    assertEquals(msg1.bb, deserialized.repeatedNestedMessage[0].bb);
3688beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    assertEquals(msg2.bb, deserialized.repeatedNestedMessage[1].bb);
3689beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    assertEquals(0, deserialized.repeatedGroup.length);
3690beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod  }
3691beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod
3692334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai  public void testRepeatedMerge() throws Exception {
3693334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    // Check that merging repeated fields cause the arrays to expand with
3694334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    // new data.
3695334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    TestAllTypesNano first = new TestAllTypesNano();
3696334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    first.repeatedInt32 = new int[] {1, 2, 3};
3697334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    TestAllTypesNano second = new TestAllTypesNano();
3698334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    second.repeatedInt32 = new int[] {4, 5};
3699334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    MessageNano.mergeFrom(first, MessageNano.toByteArray(second));
3700334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(5, first.repeatedInt32.length);
3701334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(1, first.repeatedInt32[0]);
3702334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(4, first.repeatedInt32[3]);
3703334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai
3704334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    first = new TestAllTypesNano();
3705334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    first.repeatedNestedEnum = new int[] {TestAllTypesNano.BAR};
3706334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    second = new TestAllTypesNano();
3707334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    second.repeatedNestedEnum = new int[] {TestAllTypesNano.FOO};
3708334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    MessageNano.mergeFrom(first, MessageNano.toByteArray(second));
3709334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(2, first.repeatedNestedEnum.length);
3710334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(TestAllTypesNano.BAR, first.repeatedNestedEnum[0]);
3711334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(TestAllTypesNano.FOO, first.repeatedNestedEnum[1]);
3712334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai
3713334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    first = new TestAllTypesNano();
3714334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    first.repeatedNestedMessage = new TestAllTypesNano.NestedMessage[] {
3715334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai      new TestAllTypesNano.NestedMessage()
3716334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    };
3717334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    first.repeatedNestedMessage[0].bb = 3;
3718334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    second = new TestAllTypesNano();
3719334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    second.repeatedNestedMessage = new TestAllTypesNano.NestedMessage[] {
3720334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai      new TestAllTypesNano.NestedMessage()
3721334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    };
3722334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    second.repeatedNestedMessage[0].bb = 5;
3723334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    MessageNano.mergeFrom(first, MessageNano.toByteArray(second));
3724334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(2, first.repeatedNestedMessage.length);
3725334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(3, first.repeatedNestedMessage[0].bb);
3726334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(5, first.repeatedNestedMessage[1].bb);
3727334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai
3728334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    first = new TestAllTypesNano();
3729334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    first.repeatedPackedSfixed64 = new long[] {-1, -2, -3};
3730334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    second = new TestAllTypesNano();
3731334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    second.repeatedPackedSfixed64 = new long[] {-4, -5};
3732334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    MessageNano.mergeFrom(first, MessageNano.toByteArray(second));
3733334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(5, first.repeatedPackedSfixed64.length);
3734334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(-1, first.repeatedPackedSfixed64[0]);
3735334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(-4, first.repeatedPackedSfixed64[3]);
3736334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai
3737334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    first = new TestAllTypesNano();
3738334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    first.repeatedPackedNestedEnum = new int[] {TestAllTypesNano.BAR};
3739334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    second = new TestAllTypesNano();
3740334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    second.repeatedPackedNestedEnum = new int[] {TestAllTypesNano.FOO};
3741334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    MessageNano.mergeFrom(first, MessageNano.toByteArray(second));
3742334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(2, first.repeatedPackedNestedEnum.length);
3743334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(TestAllTypesNano.BAR, first.repeatedPackedNestedEnum[0]);
3744334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(TestAllTypesNano.FOO, first.repeatedPackedNestedEnum[1]);
3745334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai
3746334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    // Now test repeated merging in a nested scope
3747334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    TestRepeatedMergeNano firstContainer = new TestRepeatedMergeNano();
3748334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    firstContainer.contained = new TestAllTypesNano();
3749334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    firstContainer.contained.repeatedInt32 = new int[] {10, 20};
3750334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    TestRepeatedMergeNano secondContainer = new TestRepeatedMergeNano();
3751334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    secondContainer.contained = new TestAllTypesNano();
3752334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    secondContainer.contained.repeatedInt32 = new int[] {30};
3753334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    MessageNano.mergeFrom(firstContainer, MessageNano.toByteArray(secondContainer));
3754334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(3, firstContainer.contained.repeatedInt32.length);
3755334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(20, firstContainer.contained.repeatedInt32[1]);
3756334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    assertEquals(30, firstContainer.contained.repeatedInt32[2]);
3757e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff  }
3758e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff
3759fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai  public void testRepeatedPackables() throws Exception {
3760fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    // Check that repeated fields with packable types can accept both packed and unpacked
3761fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    // serialized forms.
3762fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    NanoRepeatedPackables.NonPacked nonPacked = new NanoRepeatedPackables.NonPacked();
3763f4523ddb8a4e6f1008bfec2ee9e39629be792639Max Cai    // Exaggerates the first values of varint-typed arrays. This is to test that the parsing code
3764f4523ddb8a4e6f1008bfec2ee9e39629be792639Max Cai    // of packed fields handles non-packed data correctly. If the code incorrectly thinks it is
3765f4523ddb8a4e6f1008bfec2ee9e39629be792639Max Cai    // reading from a packed tag, it will read the first value as the byte length of the field,
3766f4523ddb8a4e6f1008bfec2ee9e39629be792639Max Cai    // and the large number will cause the input to go out of bounds, thus capturing the error.
3767f4523ddb8a4e6f1008bfec2ee9e39629be792639Max Cai    nonPacked.int32S = new int[] {1000, 2, 3};
3768f4523ddb8a4e6f1008bfec2ee9e39629be792639Max Cai    nonPacked.int64S = new long[] {4000, 5, 6};
3769f4523ddb8a4e6f1008bfec2ee9e39629be792639Max Cai    nonPacked.uint32S = new int[] {7000, 8, 9};
3770f4523ddb8a4e6f1008bfec2ee9e39629be792639Max Cai    nonPacked.uint64S = new long[] {10000, 11, 12};
3771f4523ddb8a4e6f1008bfec2ee9e39629be792639Max Cai    nonPacked.sint32S = new int[] {13000, 14, 15};
3772f4523ddb8a4e6f1008bfec2ee9e39629be792639Max Cai    nonPacked.sint64S = new long[] {16000, 17, 18};
3773fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    nonPacked.fixed32S = new int[] {19, 20, 21};
3774fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    nonPacked.fixed64S = new long[] {22, 23, 24};
3775fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    nonPacked.sfixed32S = new int[] {25, 26, 27};
3776fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    nonPacked.sfixed64S = new long[] {28, 29, 30};
3777fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    nonPacked.floats = new float[] {31, 32, 33};
3778fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    nonPacked.doubles = new double[] {34, 35, 36};
3779fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    nonPacked.bools = new boolean[] {false, true};
3780fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    nonPacked.enums = new int[] {
3781fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai      NanoRepeatedPackables.Enum.OPTION_ONE,
3782fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai      NanoRepeatedPackables.Enum.OPTION_TWO,
3783fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    };
3784fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    nonPacked.noise = 13579;
3785fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai
3786fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    byte[] nonPackedSerialized = MessageNano.toByteArray(nonPacked);
3787fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai
3788fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    NanoRepeatedPackables.Packed packed =
3789fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai        MessageNano.mergeFrom(new NanoRepeatedPackables.Packed(), nonPackedSerialized);
3790fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertRepeatedPackablesEqual(nonPacked, packed);
3791fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai
3792fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    byte[] packedSerialized = MessageNano.toByteArray(packed);
3793fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    // Just a cautious check that the two serialized forms are different,
3794fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    // to make sure the remaining of this test is useful:
3795fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertFalse(Arrays.equals(nonPackedSerialized, packedSerialized));
3796fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai
3797fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    nonPacked = MessageNano.mergeFrom(new NanoRepeatedPackables.NonPacked(), packedSerialized);
3798fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertRepeatedPackablesEqual(nonPacked, packed);
3799fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai
3800fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    // Test mixed serialized form.
3801fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    byte[] mixedSerialized = new byte[nonPackedSerialized.length + packedSerialized.length];
3802fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    System.arraycopy(nonPackedSerialized, 0, mixedSerialized, 0, nonPackedSerialized.length);
3803fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    System.arraycopy(packedSerialized, 0,
3804fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai        mixedSerialized, nonPackedSerialized.length, packedSerialized.length);
3805fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai
3806fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    nonPacked = MessageNano.mergeFrom(new NanoRepeatedPackables.NonPacked(), mixedSerialized);
3807fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    packed = MessageNano.mergeFrom(new NanoRepeatedPackables.Packed(), mixedSerialized);
3808fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertRepeatedPackablesEqual(nonPacked, packed);
3809f4523ddb8a4e6f1008bfec2ee9e39629be792639Max Cai    assertTrue(Arrays.equals(new int[] {1000, 2, 3, 1000, 2, 3}, nonPacked.int32S));
3810f4523ddb8a4e6f1008bfec2ee9e39629be792639Max Cai    assertTrue(Arrays.equals(new int[] {13000, 14, 15, 13000, 14, 15}, nonPacked.sint32S));
3811fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertTrue(Arrays.equals(new int[] {25, 26, 27, 25, 26, 27}, nonPacked.sfixed32S));
3812fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertTrue(Arrays.equals(new boolean[] {false, true, false, true}, nonPacked.bools));
3813fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai  }
3814fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai
38155537d6fe4af105eb769bacc530e8d5d9e0b027cbBrian Duff  public void testRepeatedFieldInitializedInReftypesCompatMode() {
38165537d6fe4af105eb769bacc530e8d5d9e0b027cbBrian Duff    NanoReferenceTypesCompat.TestAllTypesNano proto = new NanoReferenceTypesCompat.TestAllTypesNano();
38175537d6fe4af105eb769bacc530e8d5d9e0b027cbBrian Duff    assertNotNull(proto.repeatedString);
38185537d6fe4af105eb769bacc530e8d5d9e0b027cbBrian Duff  }
38195537d6fe4af105eb769bacc530e8d5d9e0b027cbBrian Duff
3820fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai  private void assertRepeatedPackablesEqual(
3821fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai      NanoRepeatedPackables.NonPacked nonPacked, NanoRepeatedPackables.Packed packed) {
3822fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    // Not using MessageNano.equals() -- that belongs to a separate test.
3823fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertTrue(Arrays.equals(nonPacked.int32S, packed.int32S));
3824fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertTrue(Arrays.equals(nonPacked.int64S, packed.int64S));
3825fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertTrue(Arrays.equals(nonPacked.uint32S, packed.uint32S));
3826fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertTrue(Arrays.equals(nonPacked.uint64S, packed.uint64S));
3827fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertTrue(Arrays.equals(nonPacked.sint32S, packed.sint32S));
3828fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertTrue(Arrays.equals(nonPacked.sint64S, packed.sint64S));
3829fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertTrue(Arrays.equals(nonPacked.fixed32S, packed.fixed32S));
3830fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertTrue(Arrays.equals(nonPacked.fixed64S, packed.fixed64S));
3831fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertTrue(Arrays.equals(nonPacked.sfixed32S, packed.sfixed32S));
3832fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertTrue(Arrays.equals(nonPacked.sfixed64S, packed.sfixed64S));
3833fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertTrue(Arrays.equals(nonPacked.floats, packed.floats));
3834fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertTrue(Arrays.equals(nonPacked.doubles, packed.doubles));
3835fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertTrue(Arrays.equals(nonPacked.bools, packed.bools));
3836fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai    assertTrue(Arrays.equals(nonPacked.enums, packed.enums));
3837fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai  }
3838fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai
3839bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff  public void testClone() throws Exception {
3840bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    // A simple message.
3841bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    AnotherMessage anotherMessage = new AnotherMessage();
3842bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    anotherMessage.string = "Hello";
3843bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    anotherMessage.value = true;
3844bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    anotherMessage.integers = new int[] { 1, 2, 3 };
3845bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff
3846bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    AnotherMessage clone = anotherMessage.clone();
3847bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    assertEquals(clone, anotherMessage);
3848bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff
3849bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    // Verify it was a deep clone - changes to the clone shouldn't affect the
3850bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    // original.
3851bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    clone.integers[1] = 100;
3852bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    assertFalse(clone.equals(anotherMessage));
3853bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff  }
3854bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff
38550b8579237336f221711a0aac42400eb31a58fed3Brian Duff  private void assertHasWireData(MessageNano message, boolean expected) {
3856e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    byte[] bytes = MessageNano.toByteArray(message);
3857e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    int wireLength = bytes.length;
38580b8579237336f221711a0aac42400eb31a58fed3Brian Duff    if (expected) {
38590b8579237336f221711a0aac42400eb31a58fed3Brian Duff      assertFalse(wireLength == 0);
38600b8579237336f221711a0aac42400eb31a58fed3Brian Duff    } else {
3861e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff      if (wireLength != 0) {
3862e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff        fail("Expected no wire data for message \n" + message
3863e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff            + "\nBut got:\n"
3864e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff            + hexDump(bytes));
3865e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff      }
3866e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    }
3867e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff  }
3868e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff
3869e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff  private static String hexDump(byte[] bytes) {
3870e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    StringBuilder sb = new StringBuilder();
3871e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    for (byte b : bytes) {
3872e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff      sb.append(String.format("%02x ", b));
38730b8579237336f221711a0aac42400eb31a58fed3Brian Duff    }
3874e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    return sb.toString();
38750b8579237336f221711a0aac42400eb31a58fed3Brian Duff  }
387664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}
3877