xref: /aosp_15_r20/external/flatbuffers/tests/JavaTest.java (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Worker 
2*890232f2SAndroid Build Coastguard Worker import static com.google.flatbuffers.Constants.*;
3*890232f2SAndroid Build Coastguard Worker 
4*890232f2SAndroid Build Coastguard Worker import DictionaryLookup.*;
5*890232f2SAndroid Build Coastguard Worker import MyGame.Example.*;
6*890232f2SAndroid Build Coastguard Worker import optional_scalars.ScalarStuff;
7*890232f2SAndroid Build Coastguard Worker import optional_scalars.OptionalByte;
8*890232f2SAndroid Build Coastguard Worker import MyGame.MonsterExtra;
9*890232f2SAndroid Build Coastguard Worker import NamespaceA.*;
10*890232f2SAndroid Build Coastguard Worker import NamespaceA.NamespaceB.*;
11*890232f2SAndroid Build Coastguard Worker import com.google.flatbuffers.ByteBufferUtil;
12*890232f2SAndroid Build Coastguard Worker import com.google.flatbuffers.ByteVector;
13*890232f2SAndroid Build Coastguard Worker import com.google.flatbuffers.FlatBufferBuilder;
14*890232f2SAndroid Build Coastguard Worker import com.google.flatbuffers.FlexBuffers;
15*890232f2SAndroid Build Coastguard Worker import com.google.flatbuffers.FlexBuffersBuilder;
16*890232f2SAndroid Build Coastguard Worker import com.google.flatbuffers.StringVector;
17*890232f2SAndroid Build Coastguard Worker import com.google.flatbuffers.UnionVector;
18*890232f2SAndroid Build Coastguard Worker 
19*890232f2SAndroid Build Coastguard Worker import com.google.flatbuffers.FlexBuffers.FlexBufferException;
20*890232f2SAndroid Build Coastguard Worker import com.google.flatbuffers.FlexBuffers.Reference;
21*890232f2SAndroid Build Coastguard Worker import com.google.flatbuffers.FlexBuffers.Vector;
22*890232f2SAndroid Build Coastguard Worker import com.google.flatbuffers.ArrayReadWriteBuf;
23*890232f2SAndroid Build Coastguard Worker import com.google.flatbuffers.FlexBuffers.KeyVector;
24*890232f2SAndroid Build Coastguard Worker 
25*890232f2SAndroid Build Coastguard Worker import java.io.*;
26*890232f2SAndroid Build Coastguard Worker import java.math.BigInteger;
27*890232f2SAndroid Build Coastguard Worker import java.nio.ByteBuffer;
28*890232f2SAndroid Build Coastguard Worker import java.nio.ByteOrder;
29*890232f2SAndroid Build Coastguard Worker import java.nio.CharBuffer;
30*890232f2SAndroid Build Coastguard Worker import java.nio.channels.FileChannel;
31*890232f2SAndroid Build Coastguard Worker import java.nio.charset.StandardCharsets;
32*890232f2SAndroid Build Coastguard Worker import java.util.Arrays;
33*890232f2SAndroid Build Coastguard Worker import java.util.HashMap;
34*890232f2SAndroid Build Coastguard Worker import java.util.Map;
35*890232f2SAndroid Build Coastguard Worker 
36*890232f2SAndroid Build Coastguard Worker /*
37*890232f2SAndroid Build Coastguard Worker  * Copyright 2014 Google Inc. All rights reserved.
38*890232f2SAndroid Build Coastguard Worker  *
39*890232f2SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
40*890232f2SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
41*890232f2SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
42*890232f2SAndroid Build Coastguard Worker  *
43*890232f2SAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
44*890232f2SAndroid Build Coastguard Worker  *
45*890232f2SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
46*890232f2SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
47*890232f2SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
48*890232f2SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
49*890232f2SAndroid Build Coastguard Worker  * limitations under the License.
50*890232f2SAndroid Build Coastguard Worker  */
51*890232f2SAndroid Build Coastguard Worker 
52*890232f2SAndroid Build Coastguard Worker 
53*890232f2SAndroid Build Coastguard Worker 
54*890232f2SAndroid Build Coastguard Worker class JavaTest {
main(String[] args)55*890232f2SAndroid Build Coastguard Worker     public static void main(String[] args) {
56*890232f2SAndroid Build Coastguard Worker 
57*890232f2SAndroid Build Coastguard Worker         // First, let's test reading a FlatBuffer generated by C++ code:
58*890232f2SAndroid Build Coastguard Worker         // This file was generated from monsterdata_test.json
59*890232f2SAndroid Build Coastguard Worker 
60*890232f2SAndroid Build Coastguard Worker         byte[] data = null;
61*890232f2SAndroid Build Coastguard Worker         File file = new File("monsterdata_test.mon");
62*890232f2SAndroid Build Coastguard Worker         RandomAccessFile f = null;
63*890232f2SAndroid Build Coastguard Worker         try {
64*890232f2SAndroid Build Coastguard Worker             f = new RandomAccessFile(file, "r");
65*890232f2SAndroid Build Coastguard Worker             data = new byte[(int)f.length()];
66*890232f2SAndroid Build Coastguard Worker             f.readFully(data);
67*890232f2SAndroid Build Coastguard Worker             f.close();
68*890232f2SAndroid Build Coastguard Worker         } catch(java.io.IOException e) {
69*890232f2SAndroid Build Coastguard Worker             System.out.println("FlatBuffers test: couldn't read file");
70*890232f2SAndroid Build Coastguard Worker             return;
71*890232f2SAndroid Build Coastguard Worker         }
72*890232f2SAndroid Build Coastguard Worker 
73*890232f2SAndroid Build Coastguard Worker         // Now test it:
74*890232f2SAndroid Build Coastguard Worker 
75*890232f2SAndroid Build Coastguard Worker         ByteBuffer bb = ByteBuffer.wrap(data);
76*890232f2SAndroid Build Coastguard Worker         TestBuffer(bb);
77*890232f2SAndroid Build Coastguard Worker 
78*890232f2SAndroid Build Coastguard Worker         // Second, let's create a FlatBuffer from scratch in Java, and test it also.
79*890232f2SAndroid Build Coastguard Worker         // We use an initial size of 1 to exercise the reallocation algorithm,
80*890232f2SAndroid Build Coastguard Worker         // normally a size larger than the typical FlatBuffer you generate would be
81*890232f2SAndroid Build Coastguard Worker         // better for performance.
82*890232f2SAndroid Build Coastguard Worker         FlatBufferBuilder fbb = new FlatBufferBuilder(1);
83*890232f2SAndroid Build Coastguard Worker 
84*890232f2SAndroid Build Coastguard Worker         TestBuilderBasics(fbb, true);
85*890232f2SAndroid Build Coastguard Worker         TestBuilderBasics(fbb, false);
86*890232f2SAndroid Build Coastguard Worker 
87*890232f2SAndroid Build Coastguard Worker         TestExtendedBuffer(fbb.dataBuffer().asReadOnlyBuffer());
88*890232f2SAndroid Build Coastguard Worker 
89*890232f2SAndroid Build Coastguard Worker         TestNamespaceNesting();
90*890232f2SAndroid Build Coastguard Worker 
91*890232f2SAndroid Build Coastguard Worker         TestNestedFlatBuffer();
92*890232f2SAndroid Build Coastguard Worker 
93*890232f2SAndroid Build Coastguard Worker         TestCreateByteVector();
94*890232f2SAndroid Build Coastguard Worker 
95*890232f2SAndroid Build Coastguard Worker         TestCreateUninitializedVector();
96*890232f2SAndroid Build Coastguard Worker 
97*890232f2SAndroid Build Coastguard Worker         TestByteBufferFactory();
98*890232f2SAndroid Build Coastguard Worker 
99*890232f2SAndroid Build Coastguard Worker         TestSizedInputStream();
100*890232f2SAndroid Build Coastguard Worker 
101*890232f2SAndroid Build Coastguard Worker         TestVectorOfUnions();
102*890232f2SAndroid Build Coastguard Worker 
103*890232f2SAndroid Build Coastguard Worker         TestFixedLengthArrays();
104*890232f2SAndroid Build Coastguard Worker 
105*890232f2SAndroid Build Coastguard Worker         TestFlexBuffers();
106*890232f2SAndroid Build Coastguard Worker 
107*890232f2SAndroid Build Coastguard Worker         TestVectorOfBytes();
108*890232f2SAndroid Build Coastguard Worker 
109*890232f2SAndroid Build Coastguard Worker         TestSharedStringPool();
110*890232f2SAndroid Build Coastguard Worker 
111*890232f2SAndroid Build Coastguard Worker         TestScalarOptional();
112*890232f2SAndroid Build Coastguard Worker 
113*890232f2SAndroid Build Coastguard Worker         TestPackUnpack(bb);
114*890232f2SAndroid Build Coastguard Worker 
115*890232f2SAndroid Build Coastguard Worker         TestDictionaryLookup();
116*890232f2SAndroid Build Coastguard Worker 
117*890232f2SAndroid Build Coastguard Worker         System.out.println("FlatBuffers test: completed successfully");
118*890232f2SAndroid Build Coastguard Worker     }
119*890232f2SAndroid Build Coastguard Worker 
TestEnums()120*890232f2SAndroid Build Coastguard Worker     static void TestEnums() {
121*890232f2SAndroid Build Coastguard Worker       TestEq(Color.name(Color.Red), "Red");
122*890232f2SAndroid Build Coastguard Worker       TestEq(Color.name(Color.Blue), "Blue");
123*890232f2SAndroid Build Coastguard Worker       TestEq(Any.name(Any.NONE), "NONE");
124*890232f2SAndroid Build Coastguard Worker       TestEq(Any.name(Any.Monster), "Monster");
125*890232f2SAndroid Build Coastguard Worker     }
126*890232f2SAndroid Build Coastguard Worker 
TestBuffer(ByteBuffer bb)127*890232f2SAndroid Build Coastguard Worker     static void TestBuffer(ByteBuffer bb) {
128*890232f2SAndroid Build Coastguard Worker         TestEq(Monster.MonsterBufferHasIdentifier(bb), true);
129*890232f2SAndroid Build Coastguard Worker 
130*890232f2SAndroid Build Coastguard Worker         Monster monster = Monster.getRootAsMonster(bb);
131*890232f2SAndroid Build Coastguard Worker 
132*890232f2SAndroid Build Coastguard Worker         TestEq(monster.hp(), (short)80);
133*890232f2SAndroid Build Coastguard Worker         TestEq(monster.mana(), (short)150);  // default
134*890232f2SAndroid Build Coastguard Worker 
135*890232f2SAndroid Build Coastguard Worker         TestEq(monster.name(), "MyMonster");
136*890232f2SAndroid Build Coastguard Worker         // monster.friendly() // can't access, deprecated
137*890232f2SAndroid Build Coastguard Worker 
138*890232f2SAndroid Build Coastguard Worker         Vec3 pos = monster.pos();
139*890232f2SAndroid Build Coastguard Worker         TestEq(pos.x(), 1.0f);
140*890232f2SAndroid Build Coastguard Worker         TestEq(pos.y(), 2.0f);
141*890232f2SAndroid Build Coastguard Worker         TestEq(pos.z(), 3.0f);
142*890232f2SAndroid Build Coastguard Worker         TestEq(pos.test1(), 3.0);
143*890232f2SAndroid Build Coastguard Worker         // issue: int != byte
144*890232f2SAndroid Build Coastguard Worker         TestEq(pos.test2(), (int) Color.Green);
145*890232f2SAndroid Build Coastguard Worker         Test t = pos.test3();
146*890232f2SAndroid Build Coastguard Worker         TestEq(t.a(), (short)5);
147*890232f2SAndroid Build Coastguard Worker         TestEq(t.b(), (byte)6);
148*890232f2SAndroid Build Coastguard Worker 
149*890232f2SAndroid Build Coastguard Worker         TestEq(monster.testType(), (byte)Any.Monster);
150*890232f2SAndroid Build Coastguard Worker         Monster monster2 = new Monster();
151*890232f2SAndroid Build Coastguard Worker         TestEq(monster.test(monster2) != null, true);
152*890232f2SAndroid Build Coastguard Worker         TestEq(monster2.name(), "Fred");
153*890232f2SAndroid Build Coastguard Worker 
154*890232f2SAndroid Build Coastguard Worker         TestEq(monster.inventoryLength(), 5);
155*890232f2SAndroid Build Coastguard Worker         int invsum = 0;
156*890232f2SAndroid Build Coastguard Worker         for (int i = 0; i < monster.inventoryLength(); i++)
157*890232f2SAndroid Build Coastguard Worker             invsum += monster.inventory(i);
158*890232f2SAndroid Build Coastguard Worker         TestEq(invsum, 10);
159*890232f2SAndroid Build Coastguard Worker 
160*890232f2SAndroid Build Coastguard Worker         // Method using a vector access object:
161*890232f2SAndroid Build Coastguard Worker         ByteVector inventoryVector = monster.inventoryVector();
162*890232f2SAndroid Build Coastguard Worker         TestEq(inventoryVector.length(), 5);
163*890232f2SAndroid Build Coastguard Worker         invsum = 0;
164*890232f2SAndroid Build Coastguard Worker         for (int i = 0; i < inventoryVector.length(); i++)
165*890232f2SAndroid Build Coastguard Worker             invsum += inventoryVector.getAsUnsigned(i);
166*890232f2SAndroid Build Coastguard Worker         TestEq(invsum, 10);
167*890232f2SAndroid Build Coastguard Worker 
168*890232f2SAndroid Build Coastguard Worker         // Alternative way of accessing a vector:
169*890232f2SAndroid Build Coastguard Worker         ByteBuffer ibb = monster.inventoryAsByteBuffer();
170*890232f2SAndroid Build Coastguard Worker         invsum = 0;
171*890232f2SAndroid Build Coastguard Worker         while (ibb.position() < ibb.limit())
172*890232f2SAndroid Build Coastguard Worker             invsum += ibb.get();
173*890232f2SAndroid Build Coastguard Worker         TestEq(invsum, 10);
174*890232f2SAndroid Build Coastguard Worker 
175*890232f2SAndroid Build Coastguard Worker         Test test_0 = monster.test4(0);
176*890232f2SAndroid Build Coastguard Worker         Test test_1 = monster.test4(1);
177*890232f2SAndroid Build Coastguard Worker         TestEq(monster.test4Length(), 2);
178*890232f2SAndroid Build Coastguard Worker         TestEq(test_0.a() + test_0.b() + test_1.a() + test_1.b(), 100);
179*890232f2SAndroid Build Coastguard Worker 
180*890232f2SAndroid Build Coastguard Worker         Test.Vector test4Vector = monster.test4Vector();
181*890232f2SAndroid Build Coastguard Worker         test_0 = test4Vector.get(0);
182*890232f2SAndroid Build Coastguard Worker         test_1 = test4Vector.get(1);
183*890232f2SAndroid Build Coastguard Worker         TestEq(test4Vector.length(), 2);
184*890232f2SAndroid Build Coastguard Worker         TestEq(test_0.a() + test_0.b() + test_1.a() + test_1.b(), 100);
185*890232f2SAndroid Build Coastguard Worker 
186*890232f2SAndroid Build Coastguard Worker         TestEq(monster.testarrayofstringLength(), 2);
187*890232f2SAndroid Build Coastguard Worker         TestEq(monster.testarrayofstring(0),"test1");
188*890232f2SAndroid Build Coastguard Worker         TestEq(monster.testarrayofstring(1),"test2");
189*890232f2SAndroid Build Coastguard Worker 
190*890232f2SAndroid Build Coastguard Worker         // Method using a vector access object:
191*890232f2SAndroid Build Coastguard Worker         StringVector testarrayofstringVector = monster.testarrayofstringVector();
192*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayofstringVector.length(), 2);
193*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayofstringVector.get(0),"test1");
194*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayofstringVector.get(1),"test2");
195*890232f2SAndroid Build Coastguard Worker 
196*890232f2SAndroid Build Coastguard Worker         TestEq(monster.testbool(), true);
197*890232f2SAndroid Build Coastguard Worker     }
198*890232f2SAndroid Build Coastguard Worker 
199*890232f2SAndroid Build Coastguard Worker     // this method checks additional fields not present in the binary buffer read from file
200*890232f2SAndroid Build Coastguard Worker     // these new tests are performed on top of the regular tests
TestExtendedBuffer(ByteBuffer bb)201*890232f2SAndroid Build Coastguard Worker     static void TestExtendedBuffer(ByteBuffer bb) {
202*890232f2SAndroid Build Coastguard Worker         TestBuffer(bb);
203*890232f2SAndroid Build Coastguard Worker 
204*890232f2SAndroid Build Coastguard Worker         Monster monster = Monster.getRootAsMonster(bb);
205*890232f2SAndroid Build Coastguard Worker 
206*890232f2SAndroid Build Coastguard Worker         TestEq(monster.testhashu32Fnv1(), Integer.MAX_VALUE + 1L);
207*890232f2SAndroid Build Coastguard Worker     }
208*890232f2SAndroid Build Coastguard Worker 
TestNamespaceNesting()209*890232f2SAndroid Build Coastguard Worker     static void TestNamespaceNesting() {
210*890232f2SAndroid Build Coastguard Worker         // reference / manipulate these to verify compilation
211*890232f2SAndroid Build Coastguard Worker         FlatBufferBuilder fbb = new FlatBufferBuilder(1);
212*890232f2SAndroid Build Coastguard Worker 
213*890232f2SAndroid Build Coastguard Worker         TableInNestedNS.startTableInNestedNS(fbb);
214*890232f2SAndroid Build Coastguard Worker         TableInNestedNS.addFoo(fbb, 1234);
215*890232f2SAndroid Build Coastguard Worker         int nestedTableOff = TableInNestedNS.endTableInNestedNS(fbb);
216*890232f2SAndroid Build Coastguard Worker 
217*890232f2SAndroid Build Coastguard Worker         TableInFirstNS.startTableInFirstNS(fbb);
218*890232f2SAndroid Build Coastguard Worker         TableInFirstNS.addFooTable(fbb, nestedTableOff);
219*890232f2SAndroid Build Coastguard Worker         int off = TableInFirstNS.endTableInFirstNS(fbb);
220*890232f2SAndroid Build Coastguard Worker     }
221*890232f2SAndroid Build Coastguard Worker 
TestNestedFlatBuffer()222*890232f2SAndroid Build Coastguard Worker     static void TestNestedFlatBuffer() {
223*890232f2SAndroid Build Coastguard Worker         final String nestedMonsterName = "NestedMonsterName";
224*890232f2SAndroid Build Coastguard Worker         final short nestedMonsterHp = 600;
225*890232f2SAndroid Build Coastguard Worker         final short nestedMonsterMana = 1024;
226*890232f2SAndroid Build Coastguard Worker 
227*890232f2SAndroid Build Coastguard Worker         FlatBufferBuilder fbb1 = new FlatBufferBuilder(16);
228*890232f2SAndroid Build Coastguard Worker         int str1 = fbb1.createString(nestedMonsterName);
229*890232f2SAndroid Build Coastguard Worker         Monster.startMonster(fbb1);
230*890232f2SAndroid Build Coastguard Worker         Monster.addName(fbb1, str1);
231*890232f2SAndroid Build Coastguard Worker         Monster.addHp(fbb1, nestedMonsterHp);
232*890232f2SAndroid Build Coastguard Worker         Monster.addMana(fbb1, nestedMonsterMana);
233*890232f2SAndroid Build Coastguard Worker         int monster1 = Monster.endMonster(fbb1);
234*890232f2SAndroid Build Coastguard Worker         Monster.finishMonsterBuffer(fbb1, monster1);
235*890232f2SAndroid Build Coastguard Worker         byte[] fbb1Bytes = fbb1.sizedByteArray();
236*890232f2SAndroid Build Coastguard Worker         fbb1 = null;
237*890232f2SAndroid Build Coastguard Worker 
238*890232f2SAndroid Build Coastguard Worker         FlatBufferBuilder fbb2 = new FlatBufferBuilder(16);
239*890232f2SAndroid Build Coastguard Worker         int str2 = fbb2.createString("My Monster");
240*890232f2SAndroid Build Coastguard Worker         int nestedBuffer = Monster.createTestnestedflatbufferVector(fbb2, fbb1Bytes);
241*890232f2SAndroid Build Coastguard Worker         Monster.startMonster(fbb2);
242*890232f2SAndroid Build Coastguard Worker         Monster.addName(fbb2, str2);
243*890232f2SAndroid Build Coastguard Worker         Monster.addHp(fbb2, (short)50);
244*890232f2SAndroid Build Coastguard Worker         Monster.addMana(fbb2, (short)32);
245*890232f2SAndroid Build Coastguard Worker         Monster.addTestnestedflatbuffer(fbb2, nestedBuffer);
246*890232f2SAndroid Build Coastguard Worker         int monster = Monster.endMonster(fbb2);
247*890232f2SAndroid Build Coastguard Worker         Monster.finishMonsterBuffer(fbb2, monster);
248*890232f2SAndroid Build Coastguard Worker 
249*890232f2SAndroid Build Coastguard Worker         // Now test the data extracted from the nested buffer
250*890232f2SAndroid Build Coastguard Worker         Monster mons = Monster.getRootAsMonster(fbb2.dataBuffer());
251*890232f2SAndroid Build Coastguard Worker         Monster nestedMonster = mons.testnestedflatbufferAsMonster();
252*890232f2SAndroid Build Coastguard Worker 
253*890232f2SAndroid Build Coastguard Worker         TestEq(nestedMonsterMana, nestedMonster.mana());
254*890232f2SAndroid Build Coastguard Worker         TestEq(nestedMonsterHp, nestedMonster.hp());
255*890232f2SAndroid Build Coastguard Worker         TestEq(nestedMonsterName, nestedMonster.name());
256*890232f2SAndroid Build Coastguard Worker     }
257*890232f2SAndroid Build Coastguard Worker 
TestCreateByteVector()258*890232f2SAndroid Build Coastguard Worker     static void TestCreateByteVector() {
259*890232f2SAndroid Build Coastguard Worker         FlatBufferBuilder fbb = new FlatBufferBuilder(16);
260*890232f2SAndroid Build Coastguard Worker         int str = fbb.createString("MyMonster");
261*890232f2SAndroid Build Coastguard Worker         byte[] inventory = new byte[] { 0, 1, 2, 3, 4 };
262*890232f2SAndroid Build Coastguard Worker         int vec = fbb.createByteVector(inventory);
263*890232f2SAndroid Build Coastguard Worker         Monster.startMonster(fbb);
264*890232f2SAndroid Build Coastguard Worker         Monster.addInventory(fbb, vec);
265*890232f2SAndroid Build Coastguard Worker         Monster.addName(fbb, str);
266*890232f2SAndroid Build Coastguard Worker         int monster1 = Monster.endMonster(fbb);
267*890232f2SAndroid Build Coastguard Worker         Monster.finishMonsterBuffer(fbb, monster1);
268*890232f2SAndroid Build Coastguard Worker         Monster monsterObject = Monster.getRootAsMonster(fbb.dataBuffer());
269*890232f2SAndroid Build Coastguard Worker 
270*890232f2SAndroid Build Coastguard Worker         TestEq(monsterObject.inventory(1), (int)inventory[1]);
271*890232f2SAndroid Build Coastguard Worker         TestEq(monsterObject.inventoryLength(), inventory.length);
272*890232f2SAndroid Build Coastguard Worker         ByteVector inventoryVector = monsterObject.inventoryVector();
273*890232f2SAndroid Build Coastguard Worker         TestEq(inventoryVector.getAsUnsigned(1), (int)inventory[1]);
274*890232f2SAndroid Build Coastguard Worker         TestEq(inventoryVector.length(), inventory.length);
275*890232f2SAndroid Build Coastguard Worker 
276*890232f2SAndroid Build Coastguard Worker         TestEq(ByteBuffer.wrap(inventory), monsterObject.inventoryAsByteBuffer());
277*890232f2SAndroid Build Coastguard Worker     }
278*890232f2SAndroid Build Coastguard Worker 
TestCreateUninitializedVector()279*890232f2SAndroid Build Coastguard Worker     static void TestCreateUninitializedVector() {
280*890232f2SAndroid Build Coastguard Worker         FlatBufferBuilder fbb = new FlatBufferBuilder(16);
281*890232f2SAndroid Build Coastguard Worker         int str = fbb.createString("MyMonster");
282*890232f2SAndroid Build Coastguard Worker         byte[] inventory = new byte[] { 0, 1, 2, 3, 4 };
283*890232f2SAndroid Build Coastguard Worker         ByteBuffer bb = fbb.createUnintializedVector(1, inventory.length, 1);
284*890232f2SAndroid Build Coastguard Worker         for (byte i:inventory) {
285*890232f2SAndroid Build Coastguard Worker             bb.put(i);
286*890232f2SAndroid Build Coastguard Worker         }
287*890232f2SAndroid Build Coastguard Worker         int vec = fbb.endVector();
288*890232f2SAndroid Build Coastguard Worker         Monster.startMonster(fbb);
289*890232f2SAndroid Build Coastguard Worker         Monster.addInventory(fbb, vec);
290*890232f2SAndroid Build Coastguard Worker         Monster.addName(fbb, str);
291*890232f2SAndroid Build Coastguard Worker         int monster1 = Monster.endMonster(fbb);
292*890232f2SAndroid Build Coastguard Worker         Monster.finishMonsterBuffer(fbb, monster1);
293*890232f2SAndroid Build Coastguard Worker         Monster monsterObject = Monster.getRootAsMonster(fbb.dataBuffer());
294*890232f2SAndroid Build Coastguard Worker 
295*890232f2SAndroid Build Coastguard Worker         TestEq(monsterObject.inventory(1), (int)inventory[1]);
296*890232f2SAndroid Build Coastguard Worker         TestEq(monsterObject.inventoryLength(), inventory.length);
297*890232f2SAndroid Build Coastguard Worker         ByteVector inventoryVector = monsterObject.inventoryVector();
298*890232f2SAndroid Build Coastguard Worker         TestEq(inventoryVector.getAsUnsigned(1), (int)inventory[1]);
299*890232f2SAndroid Build Coastguard Worker         TestEq(inventoryVector.length(), inventory.length);
300*890232f2SAndroid Build Coastguard Worker         TestEq(ByteBuffer.wrap(inventory), monsterObject.inventoryAsByteBuffer());
301*890232f2SAndroid Build Coastguard Worker     }
302*890232f2SAndroid Build Coastguard Worker 
TestByteBufferFactory()303*890232f2SAndroid Build Coastguard Worker     static void TestByteBufferFactory() {
304*890232f2SAndroid Build Coastguard Worker         final class MappedByteBufferFactory extends FlatBufferBuilder.ByteBufferFactory {
305*890232f2SAndroid Build Coastguard Worker             @Override
306*890232f2SAndroid Build Coastguard Worker             public ByteBuffer newByteBuffer(int capacity) {
307*890232f2SAndroid Build Coastguard Worker                 ByteBuffer bb;
308*890232f2SAndroid Build Coastguard Worker                 try {
309*890232f2SAndroid Build Coastguard Worker                     RandomAccessFile f = new RandomAccessFile("javatest.bin", "rw");
310*890232f2SAndroid Build Coastguard Worker                     bb =  f.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, capacity).order(ByteOrder.LITTLE_ENDIAN);
311*890232f2SAndroid Build Coastguard Worker                     f.close();
312*890232f2SAndroid Build Coastguard Worker                 } catch(Throwable e) {
313*890232f2SAndroid Build Coastguard Worker                     System.out.println("FlatBuffers test: couldn't map ByteBuffer to a file");
314*890232f2SAndroid Build Coastguard Worker                     bb = null;
315*890232f2SAndroid Build Coastguard Worker                 }
316*890232f2SAndroid Build Coastguard Worker                 return bb;
317*890232f2SAndroid Build Coastguard Worker             }
318*890232f2SAndroid Build Coastguard Worker         }
319*890232f2SAndroid Build Coastguard Worker 
320*890232f2SAndroid Build Coastguard Worker         FlatBufferBuilder fbb = new FlatBufferBuilder(1, new MappedByteBufferFactory());
321*890232f2SAndroid Build Coastguard Worker 
322*890232f2SAndroid Build Coastguard Worker         TestBuilderBasics(fbb, false);
323*890232f2SAndroid Build Coastguard Worker     }
324*890232f2SAndroid Build Coastguard Worker 
TestSizedInputStream()325*890232f2SAndroid Build Coastguard Worker     static void TestSizedInputStream() {
326*890232f2SAndroid Build Coastguard Worker         // Test on default FlatBufferBuilder that uses HeapByteBuffer
327*890232f2SAndroid Build Coastguard Worker         FlatBufferBuilder fbb = new FlatBufferBuilder(1);
328*890232f2SAndroid Build Coastguard Worker 
329*890232f2SAndroid Build Coastguard Worker         TestBuilderBasics(fbb, false);
330*890232f2SAndroid Build Coastguard Worker 
331*890232f2SAndroid Build Coastguard Worker         InputStream in = fbb.sizedInputStream();
332*890232f2SAndroid Build Coastguard Worker         byte[] array = fbb.sizedByteArray();
333*890232f2SAndroid Build Coastguard Worker         int count = 0;
334*890232f2SAndroid Build Coastguard Worker         int currentVal = 0;
335*890232f2SAndroid Build Coastguard Worker 
336*890232f2SAndroid Build Coastguard Worker         while (currentVal != -1 && count < array.length) {
337*890232f2SAndroid Build Coastguard Worker             try {
338*890232f2SAndroid Build Coastguard Worker                 currentVal = in.read();
339*890232f2SAndroid Build Coastguard Worker             } catch(java.io.IOException e) {
340*890232f2SAndroid Build Coastguard Worker                 System.out.println("FlatBuffers test: couldn't read from InputStream");
341*890232f2SAndroid Build Coastguard Worker                 return;
342*890232f2SAndroid Build Coastguard Worker             }
343*890232f2SAndroid Build Coastguard Worker             TestEq((byte)currentVal, array[count]);
344*890232f2SAndroid Build Coastguard Worker             count++;
345*890232f2SAndroid Build Coastguard Worker         }
346*890232f2SAndroid Build Coastguard Worker         TestEq(count, array.length);
347*890232f2SAndroid Build Coastguard Worker     }
348*890232f2SAndroid Build Coastguard Worker 
TestBuilderBasics(FlatBufferBuilder fbb, boolean sizePrefix)349*890232f2SAndroid Build Coastguard Worker     static void TestBuilderBasics(FlatBufferBuilder fbb, boolean sizePrefix) {
350*890232f2SAndroid Build Coastguard Worker         int[] names = {fbb.createString("Frodo"), fbb.createString("Barney"), fbb.createString("Wilma")};
351*890232f2SAndroid Build Coastguard Worker         int[] off = new int[3];
352*890232f2SAndroid Build Coastguard Worker         Monster.startMonster(fbb);
353*890232f2SAndroid Build Coastguard Worker         Monster.addName(fbb, names[0]);
354*890232f2SAndroid Build Coastguard Worker         off[0] = Monster.endMonster(fbb);
355*890232f2SAndroid Build Coastguard Worker         Monster.startMonster(fbb);
356*890232f2SAndroid Build Coastguard Worker         Monster.addName(fbb, names[1]);
357*890232f2SAndroid Build Coastguard Worker         off[1] = Monster.endMonster(fbb);
358*890232f2SAndroid Build Coastguard Worker         Monster.startMonster(fbb);
359*890232f2SAndroid Build Coastguard Worker         Monster.addName(fbb, names[2]);
360*890232f2SAndroid Build Coastguard Worker         off[2] = Monster.endMonster(fbb);
361*890232f2SAndroid Build Coastguard Worker         int sortMons = fbb.createSortedVectorOfTables(new Monster(), off);
362*890232f2SAndroid Build Coastguard Worker 
363*890232f2SAndroid Build Coastguard Worker         // We set up the same values as monsterdata.json:
364*890232f2SAndroid Build Coastguard Worker 
365*890232f2SAndroid Build Coastguard Worker         int str = fbb.createString("MyMonster");
366*890232f2SAndroid Build Coastguard Worker 
367*890232f2SAndroid Build Coastguard Worker         int inv = Monster.createInventoryVector(fbb, new byte[] { 0, 1, 2, 3, 4 });
368*890232f2SAndroid Build Coastguard Worker 
369*890232f2SAndroid Build Coastguard Worker         int fred = fbb.createString("Fred");
370*890232f2SAndroid Build Coastguard Worker         Monster.startMonster(fbb);
371*890232f2SAndroid Build Coastguard Worker         Monster.addName(fbb, fred);
372*890232f2SAndroid Build Coastguard Worker         int mon2 = Monster.endMonster(fbb);
373*890232f2SAndroid Build Coastguard Worker 
374*890232f2SAndroid Build Coastguard Worker         Monster.startTest4Vector(fbb, 2);
375*890232f2SAndroid Build Coastguard Worker         Test.createTest(fbb, (short)10, (byte)20);
376*890232f2SAndroid Build Coastguard Worker         Test.createTest(fbb, (short)30, (byte)40);
377*890232f2SAndroid Build Coastguard Worker         int test4 = fbb.endVector();
378*890232f2SAndroid Build Coastguard Worker 
379*890232f2SAndroid Build Coastguard Worker         int testArrayOfString = Monster.createTestarrayofstringVector(fbb, new int[] {
380*890232f2SAndroid Build Coastguard Worker                 fbb.createString("test1"),
381*890232f2SAndroid Build Coastguard Worker                 fbb.createString("test2")
382*890232f2SAndroid Build Coastguard Worker         });
383*890232f2SAndroid Build Coastguard Worker 
384*890232f2SAndroid Build Coastguard Worker         Monster.startMonster(fbb);
385*890232f2SAndroid Build Coastguard Worker         Monster.addPos(fbb, Vec3.createVec3(fbb, 1.0f, 2.0f, 3.0f, 3.0,
386*890232f2SAndroid Build Coastguard Worker                 Color.Green, (short)5, (byte)6));
387*890232f2SAndroid Build Coastguard Worker         Monster.addHp(fbb, (short)80);
388*890232f2SAndroid Build Coastguard Worker         Monster.addName(fbb, str);
389*890232f2SAndroid Build Coastguard Worker         Monster.addInventory(fbb, inv);
390*890232f2SAndroid Build Coastguard Worker         Monster.addTestType(fbb, (byte)Any.Monster);
391*890232f2SAndroid Build Coastguard Worker         Monster.addTest(fbb, mon2);
392*890232f2SAndroid Build Coastguard Worker         Monster.addTest4(fbb, test4);
393*890232f2SAndroid Build Coastguard Worker         Monster.addTestarrayofstring(fbb, testArrayOfString);
394*890232f2SAndroid Build Coastguard Worker         Monster.addTestbool(fbb, true);
395*890232f2SAndroid Build Coastguard Worker         Monster.addTesthashu32Fnv1(fbb, Integer.MAX_VALUE + 1L);
396*890232f2SAndroid Build Coastguard Worker         Monster.addTestarrayoftables(fbb, sortMons);
397*890232f2SAndroid Build Coastguard Worker         int mon = Monster.endMonster(fbb);
398*890232f2SAndroid Build Coastguard Worker 
399*890232f2SAndroid Build Coastguard Worker         if (sizePrefix) {
400*890232f2SAndroid Build Coastguard Worker             Monster.finishSizePrefixedMonsterBuffer(fbb, mon);
401*890232f2SAndroid Build Coastguard Worker         } else {
402*890232f2SAndroid Build Coastguard Worker             Monster.finishMonsterBuffer(fbb, mon);
403*890232f2SAndroid Build Coastguard Worker         }
404*890232f2SAndroid Build Coastguard Worker 
405*890232f2SAndroid Build Coastguard Worker         // Write the result to a file for debugging purposes:
406*890232f2SAndroid Build Coastguard Worker         // Note that the binaries are not necessarily identical, since the JSON
407*890232f2SAndroid Build Coastguard Worker         // parser may serialize in a slightly different order than the above
408*890232f2SAndroid Build Coastguard Worker         // Java code. They are functionally equivalent though.
409*890232f2SAndroid Build Coastguard Worker 
410*890232f2SAndroid Build Coastguard Worker         try {
411*890232f2SAndroid Build Coastguard Worker             String filename = "monsterdata_java_wire" + (sizePrefix ? "_sp" : "") + ".mon";
412*890232f2SAndroid Build Coastguard Worker             FileChannel fc = new FileOutputStream(filename).getChannel();
413*890232f2SAndroid Build Coastguard Worker             fc.write(fbb.dataBuffer().duplicate());
414*890232f2SAndroid Build Coastguard Worker             fc.close();
415*890232f2SAndroid Build Coastguard Worker         } catch(java.io.IOException e) {
416*890232f2SAndroid Build Coastguard Worker             System.out.println("FlatBuffers test: couldn't write file");
417*890232f2SAndroid Build Coastguard Worker             return;
418*890232f2SAndroid Build Coastguard Worker         }
419*890232f2SAndroid Build Coastguard Worker 
420*890232f2SAndroid Build Coastguard Worker         // Test it:
421*890232f2SAndroid Build Coastguard Worker         ByteBuffer dataBuffer = fbb.dataBuffer();
422*890232f2SAndroid Build Coastguard Worker         if (sizePrefix) {
423*890232f2SAndroid Build Coastguard Worker             TestEq(ByteBufferUtil.getSizePrefix(dataBuffer) + SIZE_PREFIX_LENGTH,
424*890232f2SAndroid Build Coastguard Worker                    dataBuffer.remaining());
425*890232f2SAndroid Build Coastguard Worker             dataBuffer = ByteBufferUtil.removeSizePrefix(dataBuffer);
426*890232f2SAndroid Build Coastguard Worker         }
427*890232f2SAndroid Build Coastguard Worker         TestExtendedBuffer(dataBuffer);
428*890232f2SAndroid Build Coastguard Worker 
429*890232f2SAndroid Build Coastguard Worker         // Make sure it also works with read only ByteBuffers. This is slower,
430*890232f2SAndroid Build Coastguard Worker         // since creating strings incurs an additional copy
431*890232f2SAndroid Build Coastguard Worker         // (see Table.__string).
432*890232f2SAndroid Build Coastguard Worker         TestExtendedBuffer(dataBuffer.asReadOnlyBuffer());
433*890232f2SAndroid Build Coastguard Worker 
434*890232f2SAndroid Build Coastguard Worker         TestEnums();
435*890232f2SAndroid Build Coastguard Worker 
436*890232f2SAndroid Build Coastguard Worker         //Attempt to mutate Monster fields and check whether the buffer has been mutated properly
437*890232f2SAndroid Build Coastguard Worker         // revert to original values after testing
438*890232f2SAndroid Build Coastguard Worker         Monster monster = Monster.getRootAsMonster(dataBuffer);
439*890232f2SAndroid Build Coastguard Worker 
440*890232f2SAndroid Build Coastguard Worker         // mana is optional and does not exist in the buffer so the mutation should fail
441*890232f2SAndroid Build Coastguard Worker         // the mana field should retain its default value
442*890232f2SAndroid Build Coastguard Worker         TestEq(monster.mutateMana((short)10), false);
443*890232f2SAndroid Build Coastguard Worker         TestEq(monster.mana(), (short)150);
444*890232f2SAndroid Build Coastguard Worker 
445*890232f2SAndroid Build Coastguard Worker         // Accessing a vector of sorted by the key tables
446*890232f2SAndroid Build Coastguard Worker         TestEq(monster.testarrayoftables(0).name(), "Barney");
447*890232f2SAndroid Build Coastguard Worker         TestEq(monster.testarrayoftables(1).name(), "Frodo");
448*890232f2SAndroid Build Coastguard Worker         TestEq(monster.testarrayoftables(2).name(), "Wilma");
449*890232f2SAndroid Build Coastguard Worker         Monster.Vector testarrayoftablesVector = monster.testarrayoftablesVector();
450*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayoftablesVector.get(0).name(), "Barney");
451*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayoftablesVector.get(1).name(), "Frodo");
452*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayoftablesVector.get(2).name(), "Wilma");
453*890232f2SAndroid Build Coastguard Worker 
454*890232f2SAndroid Build Coastguard Worker         // Example of searching for a table by the key
455*890232f2SAndroid Build Coastguard Worker         TestEq(monster.testarrayoftablesByKey("Frodo").name(), "Frodo");
456*890232f2SAndroid Build Coastguard Worker         TestEq(monster.testarrayoftablesByKey("Barney").name(), "Barney");
457*890232f2SAndroid Build Coastguard Worker         TestEq(monster.testarrayoftablesByKey("Wilma").name(), "Wilma");
458*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayoftablesVector.getByKey("Frodo").name(), "Frodo");
459*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayoftablesVector.getByKey("Barney").name(), "Barney");
460*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayoftablesVector.getByKey("Wilma").name(), "Wilma");
461*890232f2SAndroid Build Coastguard Worker 
462*890232f2SAndroid Build Coastguard Worker         // testType is an existing field and mutating it should succeed
463*890232f2SAndroid Build Coastguard Worker         TestEq(monster.testType(), (byte)Any.Monster);
464*890232f2SAndroid Build Coastguard Worker 
465*890232f2SAndroid Build Coastguard Worker         //mutate the inventory vector
466*890232f2SAndroid Build Coastguard Worker         TestEq(monster.mutateInventory(0, 1), true);
467*890232f2SAndroid Build Coastguard Worker         TestEq(monster.mutateInventory(1, 2), true);
468*890232f2SAndroid Build Coastguard Worker         TestEq(monster.mutateInventory(2, 3), true);
469*890232f2SAndroid Build Coastguard Worker         TestEq(monster.mutateInventory(3, 4), true);
470*890232f2SAndroid Build Coastguard Worker         TestEq(monster.mutateInventory(4, 5), true);
471*890232f2SAndroid Build Coastguard Worker 
472*890232f2SAndroid Build Coastguard Worker         for (int i = 0; i < monster.inventoryLength(); i++) {
473*890232f2SAndroid Build Coastguard Worker             TestEq(monster.inventory(i), i + 1);
474*890232f2SAndroid Build Coastguard Worker         }
475*890232f2SAndroid Build Coastguard Worker         ByteVector inventoryVector =  monster.inventoryVector();
476*890232f2SAndroid Build Coastguard Worker         for (int i = 0; i < inventoryVector.length(); i++) {
477*890232f2SAndroid Build Coastguard Worker             TestEq((int)inventoryVector.get(i), i + 1);
478*890232f2SAndroid Build Coastguard Worker         }
479*890232f2SAndroid Build Coastguard Worker 
480*890232f2SAndroid Build Coastguard Worker         //reverse mutation
481*890232f2SAndroid Build Coastguard Worker         TestEq(monster.mutateInventory(0, 0), true);
482*890232f2SAndroid Build Coastguard Worker         TestEq(monster.mutateInventory(1, 1), true);
483*890232f2SAndroid Build Coastguard Worker         TestEq(monster.mutateInventory(2, 2), true);
484*890232f2SAndroid Build Coastguard Worker         TestEq(monster.mutateInventory(3, 3), true);
485*890232f2SAndroid Build Coastguard Worker         TestEq(monster.mutateInventory(4, 4), true);
486*890232f2SAndroid Build Coastguard Worker 
487*890232f2SAndroid Build Coastguard Worker         // get a struct field and edit one of its fields
488*890232f2SAndroid Build Coastguard Worker         Vec3 pos = monster.pos();
489*890232f2SAndroid Build Coastguard Worker         TestEq(pos.x(), 1.0f);
490*890232f2SAndroid Build Coastguard Worker         pos.mutateX(55.0f);
491*890232f2SAndroid Build Coastguard Worker         TestEq(pos.x(), 55.0f);
492*890232f2SAndroid Build Coastguard Worker         pos.mutateX(1.0f);
493*890232f2SAndroid Build Coastguard Worker         TestEq(pos.x(), 1.0f);
494*890232f2SAndroid Build Coastguard Worker     }
495*890232f2SAndroid Build Coastguard Worker 
TestVectorOfUnions()496*890232f2SAndroid Build Coastguard Worker     static void TestVectorOfUnions() {
497*890232f2SAndroid Build Coastguard Worker         final FlatBufferBuilder fbb = new FlatBufferBuilder();
498*890232f2SAndroid Build Coastguard Worker 
499*890232f2SAndroid Build Coastguard Worker         final int swordAttackDamage = 1;
500*890232f2SAndroid Build Coastguard Worker 
501*890232f2SAndroid Build Coastguard Worker         final int[] characterVector = new int[] {
502*890232f2SAndroid Build Coastguard Worker             Attacker.createAttacker(fbb, swordAttackDamage),
503*890232f2SAndroid Build Coastguard Worker         };
504*890232f2SAndroid Build Coastguard Worker 
505*890232f2SAndroid Build Coastguard Worker         final byte[] characterTypeVector = new byte[]{
506*890232f2SAndroid Build Coastguard Worker             Character.MuLan,
507*890232f2SAndroid Build Coastguard Worker         };
508*890232f2SAndroid Build Coastguard Worker 
509*890232f2SAndroid Build Coastguard Worker         Movie.finishMovieBuffer(
510*890232f2SAndroid Build Coastguard Worker             fbb,
511*890232f2SAndroid Build Coastguard Worker             Movie.createMovie(
512*890232f2SAndroid Build Coastguard Worker                 fbb,
513*890232f2SAndroid Build Coastguard Worker                 (byte)0,
514*890232f2SAndroid Build Coastguard Worker                 (byte)0,
515*890232f2SAndroid Build Coastguard Worker                 Movie.createCharactersTypeVector(fbb, characterTypeVector),
516*890232f2SAndroid Build Coastguard Worker                 Movie.createCharactersVector(fbb, characterVector)
517*890232f2SAndroid Build Coastguard Worker             )
518*890232f2SAndroid Build Coastguard Worker         );
519*890232f2SAndroid Build Coastguard Worker 
520*890232f2SAndroid Build Coastguard Worker         final Movie movie = Movie.getRootAsMovie(fbb.dataBuffer());
521*890232f2SAndroid Build Coastguard Worker         ByteVector charactersTypeByteVector = movie.charactersTypeVector();
522*890232f2SAndroid Build Coastguard Worker         UnionVector charactersVector = movie.charactersVector();
523*890232f2SAndroid Build Coastguard Worker 
524*890232f2SAndroid Build Coastguard Worker         TestEq(movie.charactersTypeLength(), characterTypeVector.length);
525*890232f2SAndroid Build Coastguard Worker         TestEq(charactersTypeByteVector.length(), characterTypeVector.length);
526*890232f2SAndroid Build Coastguard Worker         TestEq(movie.charactersLength(), characterVector.length);
527*890232f2SAndroid Build Coastguard Worker         TestEq(charactersVector.length(), characterVector.length);
528*890232f2SAndroid Build Coastguard Worker 
529*890232f2SAndroid Build Coastguard Worker         TestEq(movie.charactersType(0), characterTypeVector[0]);
530*890232f2SAndroid Build Coastguard Worker         TestEq(charactersTypeByteVector.get(0), characterTypeVector[0]);
531*890232f2SAndroid Build Coastguard Worker 
532*890232f2SAndroid Build Coastguard Worker         TestEq(((Attacker)movie.characters(new Attacker(), 0)).swordAttackDamage(), swordAttackDamage);
533*890232f2SAndroid Build Coastguard Worker     }
534*890232f2SAndroid Build Coastguard Worker 
TestFixedLengthArrays()535*890232f2SAndroid Build Coastguard Worker     static void TestFixedLengthArrays() {
536*890232f2SAndroid Build Coastguard Worker         FlatBufferBuilder builder = new FlatBufferBuilder(0);
537*890232f2SAndroid Build Coastguard Worker 
538*890232f2SAndroid Build Coastguard Worker         float       a;
539*890232f2SAndroid Build Coastguard Worker         int[]       b = new int[15];
540*890232f2SAndroid Build Coastguard Worker         byte        c;
541*890232f2SAndroid Build Coastguard Worker         int[][]     d_a = new int[2][2];
542*890232f2SAndroid Build Coastguard Worker         byte[]      d_b = new byte[2];
543*890232f2SAndroid Build Coastguard Worker         byte[][]    d_c = new byte[2][2];
544*890232f2SAndroid Build Coastguard Worker         long[][]    d_d = new long[2][2];
545*890232f2SAndroid Build Coastguard Worker         int         e;
546*890232f2SAndroid Build Coastguard Worker         long[]      f = new long[2];
547*890232f2SAndroid Build Coastguard Worker 
548*890232f2SAndroid Build Coastguard Worker         a = 0.5f;
549*890232f2SAndroid Build Coastguard Worker         for (int i = 0; i < 15; i++) b[i] = i;
550*890232f2SAndroid Build Coastguard Worker         c = 1;
551*890232f2SAndroid Build Coastguard Worker         d_a[0][0] = 1;
552*890232f2SAndroid Build Coastguard Worker         d_a[0][1] = 2;
553*890232f2SAndroid Build Coastguard Worker         d_a[1][0] = 3;
554*890232f2SAndroid Build Coastguard Worker         d_a[1][1] = 4;
555*890232f2SAndroid Build Coastguard Worker         d_b[0] = TestEnum.B;
556*890232f2SAndroid Build Coastguard Worker         d_b[1] = TestEnum.C;
557*890232f2SAndroid Build Coastguard Worker         d_c[0][0] = TestEnum.A;
558*890232f2SAndroid Build Coastguard Worker         d_c[0][1] = TestEnum.B;
559*890232f2SAndroid Build Coastguard Worker         d_c[1][0] = TestEnum.C;
560*890232f2SAndroid Build Coastguard Worker         d_c[1][1] = TestEnum.B;
561*890232f2SAndroid Build Coastguard Worker         d_d[0][0] = -1;
562*890232f2SAndroid Build Coastguard Worker         d_d[0][1] = 1;
563*890232f2SAndroid Build Coastguard Worker         d_d[1][0] = -2;
564*890232f2SAndroid Build Coastguard Worker         d_d[1][1] = 2;
565*890232f2SAndroid Build Coastguard Worker         e = 2;
566*890232f2SAndroid Build Coastguard Worker         f[0] = -1;
567*890232f2SAndroid Build Coastguard Worker         f[1] = 1;
568*890232f2SAndroid Build Coastguard Worker 
569*890232f2SAndroid Build Coastguard Worker         int arrayOffset = ArrayStruct.createArrayStruct(builder,
570*890232f2SAndroid Build Coastguard Worker             a, b, c, d_a, d_b, d_c, d_d, e, f);
571*890232f2SAndroid Build Coastguard Worker 
572*890232f2SAndroid Build Coastguard Worker         // Create a table with the ArrayStruct.
573*890232f2SAndroid Build Coastguard Worker         ArrayTable.startArrayTable(builder);
574*890232f2SAndroid Build Coastguard Worker         ArrayTable.addA(builder, arrayOffset);
575*890232f2SAndroid Build Coastguard Worker         int tableOffset = ArrayTable.endArrayTable(builder);
576*890232f2SAndroid Build Coastguard Worker 
577*890232f2SAndroid Build Coastguard Worker         ArrayTable.finishArrayTableBuffer(builder, tableOffset);
578*890232f2SAndroid Build Coastguard Worker 
579*890232f2SAndroid Build Coastguard Worker         ArrayTable table = ArrayTable.getRootAsArrayTable(builder.dataBuffer());
580*890232f2SAndroid Build Coastguard Worker         NestedStruct nested = new NestedStruct();
581*890232f2SAndroid Build Coastguard Worker 
582*890232f2SAndroid Build Coastguard Worker         TestEq(table.a().a(), 0.5f);
583*890232f2SAndroid Build Coastguard Worker         for (int i = 0; i < 15; i++) TestEq(table.a().b(i), i);
584*890232f2SAndroid Build Coastguard Worker         TestEq(table.a().c(), (byte)1);
585*890232f2SAndroid Build Coastguard Worker         TestEq(table.a().d(nested, 0).a(0), 1);
586*890232f2SAndroid Build Coastguard Worker         TestEq(table.a().d(nested, 0).a(1), 2);
587*890232f2SAndroid Build Coastguard Worker         TestEq(table.a().d(nested, 1).a(0), 3);
588*890232f2SAndroid Build Coastguard Worker         TestEq(table.a().d(nested, 1).a(1), 4);
589*890232f2SAndroid Build Coastguard Worker         TestEq(table.a().d(nested, 0).b(), TestEnum.B);
590*890232f2SAndroid Build Coastguard Worker         TestEq(table.a().d(nested, 1).b(), TestEnum.C);
591*890232f2SAndroid Build Coastguard Worker         TestEq(table.a().d(nested, 0).c(0), TestEnum.A);
592*890232f2SAndroid Build Coastguard Worker         TestEq(table.a().d(nested, 0).c(1), TestEnum.B);
593*890232f2SAndroid Build Coastguard Worker         TestEq(table.a().d(nested, 1).c(0), TestEnum.C);
594*890232f2SAndroid Build Coastguard Worker         TestEq(table.a().d(nested, 1).c(1), TestEnum.B);
595*890232f2SAndroid Build Coastguard Worker         TestEq(table.a().d(nested, 0).d(0), (long)-1);
596*890232f2SAndroid Build Coastguard Worker         TestEq(table.a().d(nested, 0).d(1), (long)1);
597*890232f2SAndroid Build Coastguard Worker         TestEq(table.a().d(nested, 1).d(0), (long)-2);
598*890232f2SAndroid Build Coastguard Worker         TestEq(table.a().d(nested, 1).d(1), (long)2);
599*890232f2SAndroid Build Coastguard Worker         TestEq(table.a().e(), 2);
600*890232f2SAndroid Build Coastguard Worker         TestEq(table.a().f(0), (long)-1);
601*890232f2SAndroid Build Coastguard Worker         TestEq(table.a().f(1), (long)1);
602*890232f2SAndroid Build Coastguard Worker     }
603*890232f2SAndroid Build Coastguard Worker 
testFlexBuffersTest()604*890232f2SAndroid Build Coastguard Worker     public static void testFlexBuffersTest() {
605*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(512),
606*890232f2SAndroid Build Coastguard Worker                 FlexBuffersBuilder.BUILDER_FLAG_SHARE_KEYS_AND_STRINGS);
607*890232f2SAndroid Build Coastguard Worker         testFlexBuffersTest(builder);
608*890232f2SAndroid Build Coastguard Worker         int bufferLimit1 = ((ArrayReadWriteBuf) builder.getBuffer()).limit();
609*890232f2SAndroid Build Coastguard Worker 
610*890232f2SAndroid Build Coastguard Worker         // Repeat after clearing the builder to ensure the builder is reusable
611*890232f2SAndroid Build Coastguard Worker         builder.clear();
612*890232f2SAndroid Build Coastguard Worker         testFlexBuffersTest(builder);
613*890232f2SAndroid Build Coastguard Worker         int bufferLimit2 = ((ArrayReadWriteBuf) builder.getBuffer()).limit();
614*890232f2SAndroid Build Coastguard Worker         TestEq(bufferLimit1, bufferLimit2);
615*890232f2SAndroid Build Coastguard Worker     }
616*890232f2SAndroid Build Coastguard Worker 
testFlexBuffersTest(FlexBuffersBuilder builder)617*890232f2SAndroid Build Coastguard Worker     public static void testFlexBuffersTest(FlexBuffersBuilder builder) {
618*890232f2SAndroid Build Coastguard Worker         // Write the equivalent of:
619*890232f2SAndroid Build Coastguard Worker         // { vec: [ -100, "Fred", 4.0, false ], bar: [ 1, 2, 3 ], bar3: [ 1, 2, 3 ],
620*890232f2SAndroid Build Coastguard Worker         // foo: 100, bool: true, mymap: { foo: "Fred" } }
621*890232f2SAndroid Build Coastguard Worker         // It's possible to do this without std::function support as well.
622*890232f2SAndroid Build Coastguard Worker         int map1 = builder.startMap();
623*890232f2SAndroid Build Coastguard Worker 
624*890232f2SAndroid Build Coastguard Worker         int vec1 = builder.startVector();
625*890232f2SAndroid Build Coastguard Worker         builder.putInt(-100);
626*890232f2SAndroid Build Coastguard Worker         builder.putString("Fred");
627*890232f2SAndroid Build Coastguard Worker         builder.putBlob(new byte[]{(byte) 77});
628*890232f2SAndroid Build Coastguard Worker         builder.putBoolean(false);
629*890232f2SAndroid Build Coastguard Worker         builder.putInt(Long.MAX_VALUE);
630*890232f2SAndroid Build Coastguard Worker 
631*890232f2SAndroid Build Coastguard Worker         int map2 = builder.startMap();
632*890232f2SAndroid Build Coastguard Worker         builder.putInt("test", 200);
633*890232f2SAndroid Build Coastguard Worker         builder.endMap(null, map2);
634*890232f2SAndroid Build Coastguard Worker 
635*890232f2SAndroid Build Coastguard Worker         builder.putFloat(150.9);
636*890232f2SAndroid Build Coastguard Worker         builder.putFloat(150.9999998);
637*890232f2SAndroid Build Coastguard Worker         builder.endVector("vec", vec1, false, false);
638*890232f2SAndroid Build Coastguard Worker 
639*890232f2SAndroid Build Coastguard Worker         vec1 = builder.startVector();
640*890232f2SAndroid Build Coastguard Worker         builder.putInt(1);
641*890232f2SAndroid Build Coastguard Worker         builder.putInt(2);
642*890232f2SAndroid Build Coastguard Worker         builder.putInt(3);
643*890232f2SAndroid Build Coastguard Worker         builder.endVector("bar", vec1, true, false);
644*890232f2SAndroid Build Coastguard Worker 
645*890232f2SAndroid Build Coastguard Worker         vec1 = builder.startVector();
646*890232f2SAndroid Build Coastguard Worker         builder.putBoolean(true);
647*890232f2SAndroid Build Coastguard Worker         builder.putBoolean(false);
648*890232f2SAndroid Build Coastguard Worker         builder.putBoolean(true);
649*890232f2SAndroid Build Coastguard Worker         builder.putBoolean(false);
650*890232f2SAndroid Build Coastguard Worker         builder.endVector("bools", vec1, true, false);
651*890232f2SAndroid Build Coastguard Worker 
652*890232f2SAndroid Build Coastguard Worker         builder.putBoolean("bool", true);
653*890232f2SAndroid Build Coastguard Worker         builder.putFloat("foo", 100);
654*890232f2SAndroid Build Coastguard Worker 
655*890232f2SAndroid Build Coastguard Worker         map2 = builder.startMap();
656*890232f2SAndroid Build Coastguard Worker         builder.putString("bar", "Fred");  // Testing key and string reuse.
657*890232f2SAndroid Build Coastguard Worker         builder.putInt("int", -120);
658*890232f2SAndroid Build Coastguard Worker         builder.putFloat("float", -123.0f);
659*890232f2SAndroid Build Coastguard Worker         builder.putBlob("blob", new byte[]{ 65, 67 });
660*890232f2SAndroid Build Coastguard Worker         builder.endMap("mymap", map2);
661*890232f2SAndroid Build Coastguard Worker 
662*890232f2SAndroid Build Coastguard Worker         builder.endMap(null, map1);
663*890232f2SAndroid Build Coastguard Worker         builder.finish();
664*890232f2SAndroid Build Coastguard Worker 
665*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Map m = FlexBuffers.getRoot(builder.getBuffer()).asMap();
666*890232f2SAndroid Build Coastguard Worker 
667*890232f2SAndroid Build Coastguard Worker         TestEq(m.size(), 6);
668*890232f2SAndroid Build Coastguard Worker 
669*890232f2SAndroid Build Coastguard Worker         // test empty (an null)
670*890232f2SAndroid Build Coastguard Worker         TestEq(m.get("no_key").asString(), ""); // empty if fail
671*890232f2SAndroid Build Coastguard Worker         TestEq(m.get("no_key").asMap(), FlexBuffers.Map.empty()); // empty if fail
672*890232f2SAndroid Build Coastguard Worker         TestEq(m.get("no_key").asKey(), FlexBuffers.Key.empty()); // empty if fail
673*890232f2SAndroid Build Coastguard Worker         TestEq(m.get("no_key").asVector(), FlexBuffers.Vector.empty()); // empty if fail
674*890232f2SAndroid Build Coastguard Worker         TestEq(m.get("no_key").asBlob(), FlexBuffers.Blob.empty()); // empty if fail
675*890232f2SAndroid Build Coastguard Worker         assert(m.get("no_key").asVector().isEmpty()); // empty if fail
676*890232f2SAndroid Build Coastguard Worker 
677*890232f2SAndroid Build Coastguard Worker         // testing "vec" field
678*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Vector vec = m.get("vec").asVector();
679*890232f2SAndroid Build Coastguard Worker         TestEq(vec.size(), 8);
680*890232f2SAndroid Build Coastguard Worker         TestEq(vec.get(0).asLong(), (long) -100);
681*890232f2SAndroid Build Coastguard Worker         TestEq(vec.get(1).asString(), "Fred");
682*890232f2SAndroid Build Coastguard Worker         TestEq(vec.get(2).isBlob(), true);
683*890232f2SAndroid Build Coastguard Worker         TestEq(vec.get(2).asBlob().size(), 1);
684*890232f2SAndroid Build Coastguard Worker         TestEq(vec.get(2).asBlob().data().get(0), (byte) 77);
685*890232f2SAndroid Build Coastguard Worker         TestEq(vec.get(3).isBoolean(), true);   // Check if type is a bool
686*890232f2SAndroid Build Coastguard Worker         TestEq(vec.get(3).asBoolean(), false);  // Check if value is false
687*890232f2SAndroid Build Coastguard Worker         TestEq(vec.get(4).asLong(), Long.MAX_VALUE);
688*890232f2SAndroid Build Coastguard Worker         TestEq(vec.get(5).isMap(), true);
689*890232f2SAndroid Build Coastguard Worker         TestEq(vec.get(5).asMap().get("test").asInt(), 200);
690*890232f2SAndroid Build Coastguard Worker         TestEq(Float.compare((float)vec.get(6).asFloat(), 150.9f), 0);
691*890232f2SAndroid Build Coastguard Worker         TestEq(Double.compare(vec.get(7).asFloat(), 150.9999998), 0);
692*890232f2SAndroid Build Coastguard Worker         TestEq((long)0, (long)vec.get(1).asLong()); //conversion fail returns 0 as C++
693*890232f2SAndroid Build Coastguard Worker 
694*890232f2SAndroid Build Coastguard Worker         // bar vector
695*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Vector tvec = m.get("bar").asVector();
696*890232f2SAndroid Build Coastguard Worker         TestEq(tvec.size(), 3);
697*890232f2SAndroid Build Coastguard Worker         TestEq(tvec.get(0).asInt(), 1);
698*890232f2SAndroid Build Coastguard Worker         TestEq(tvec.get(1).asInt(), 2);
699*890232f2SAndroid Build Coastguard Worker         TestEq(tvec.get(2).asInt(), 3);
700*890232f2SAndroid Build Coastguard Worker         TestEq(((FlexBuffers.TypedVector) tvec).getElemType(), FlexBuffers.FBT_INT);
701*890232f2SAndroid Build Coastguard Worker 
702*890232f2SAndroid Build Coastguard Worker         // bools vector
703*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Vector bvec = m.get("bools").asVector();
704*890232f2SAndroid Build Coastguard Worker         TestEq(bvec.size(), 4);
705*890232f2SAndroid Build Coastguard Worker         TestEq(bvec.get(0).asBoolean(), true);
706*890232f2SAndroid Build Coastguard Worker         TestEq(bvec.get(1).asBoolean(), false);
707*890232f2SAndroid Build Coastguard Worker         TestEq(bvec.get(2).asBoolean(), true);
708*890232f2SAndroid Build Coastguard Worker         TestEq(bvec.get(3).asBoolean(), false);
709*890232f2SAndroid Build Coastguard Worker         TestEq(((FlexBuffers.TypedVector) bvec).getElemType(), FlexBuffers.FBT_BOOL);
710*890232f2SAndroid Build Coastguard Worker 
711*890232f2SAndroid Build Coastguard Worker 
712*890232f2SAndroid Build Coastguard Worker         TestEq((float)m.get("foo").asFloat(), (float) 100);
713*890232f2SAndroid Build Coastguard Worker         TestEq(m.get("unknown").isNull(), true);
714*890232f2SAndroid Build Coastguard Worker 
715*890232f2SAndroid Build Coastguard Worker         // mymap vector
716*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Map mymap = m.get("mymap").asMap();
717*890232f2SAndroid Build Coastguard Worker         TestEq(mymap.keys().get(0), m.keys().get(0)); // These should be equal by pointer equality, since key and value are shared.
718*890232f2SAndroid Build Coastguard Worker         TestEq(mymap.keys().get(0).toString(), "bar");
719*890232f2SAndroid Build Coastguard Worker         TestEq(mymap.values().get(0).asString(), vec.get(1).asString());
720*890232f2SAndroid Build Coastguard Worker         TestEq(mymap.get("int").asInt(), -120);
721*890232f2SAndroid Build Coastguard Worker         TestEq((float)mymap.get("float").asFloat(), -123.0f);
722*890232f2SAndroid Build Coastguard Worker         TestEq(Arrays.equals(mymap.get("blob").asBlob().getBytes(), new byte[]{ 65, 67 }), true);
723*890232f2SAndroid Build Coastguard Worker         TestEq(mymap.get("blob").asBlob().toString(), "AC");
724*890232f2SAndroid Build Coastguard Worker         TestEq(mymap.get("blob").toString(), "\"AC\"");
725*890232f2SAndroid Build Coastguard Worker     }
726*890232f2SAndroid Build Coastguard Worker 
testFlexBufferVectorStrings()727*890232f2SAndroid Build Coastguard Worker     public static void testFlexBufferVectorStrings() {
728*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(10000000));
729*890232f2SAndroid Build Coastguard Worker 
730*890232f2SAndroid Build Coastguard Worker         int size = 3000;
731*890232f2SAndroid Build Coastguard Worker         StringBuilder sb = new StringBuilder();
732*890232f2SAndroid Build Coastguard Worker         for (int i=0; i< size; i++) {
733*890232f2SAndroid Build Coastguard Worker             sb.append("a");
734*890232f2SAndroid Build Coastguard Worker         }
735*890232f2SAndroid Build Coastguard Worker 
736*890232f2SAndroid Build Coastguard Worker         String text = sb.toString();
737*890232f2SAndroid Build Coastguard Worker         TestEq(text.length(), size);
738*890232f2SAndroid Build Coastguard Worker 
739*890232f2SAndroid Build Coastguard Worker         int pos = builder.startVector();
740*890232f2SAndroid Build Coastguard Worker 
741*890232f2SAndroid Build Coastguard Worker         for (int i=0; i<size; i++) {
742*890232f2SAndroid Build Coastguard Worker             builder.putString(text);
743*890232f2SAndroid Build Coastguard Worker         }
744*890232f2SAndroid Build Coastguard Worker 
745*890232f2SAndroid Build Coastguard Worker         try {
746*890232f2SAndroid Build Coastguard Worker             builder.endVector(null, pos, true, false);
747*890232f2SAndroid Build Coastguard Worker             // this should raise an exception as
748*890232f2SAndroid Build Coastguard Worker             // typed vector of string was deprecated
749*890232f2SAndroid Build Coastguard Worker             assert false;
750*890232f2SAndroid Build Coastguard Worker         } catch(FlexBufferException fb) {
751*890232f2SAndroid Build Coastguard Worker             // no op
752*890232f2SAndroid Build Coastguard Worker         }
753*890232f2SAndroid Build Coastguard Worker         // we finish the vector again as non-typed
754*890232f2SAndroid Build Coastguard Worker         builder.endVector(null, pos, false, false);
755*890232f2SAndroid Build Coastguard Worker 
756*890232f2SAndroid Build Coastguard Worker         ByteBuffer b = builder.finish();
757*890232f2SAndroid Build Coastguard Worker         Vector v = FlexBuffers.getRoot(b).asVector();
758*890232f2SAndroid Build Coastguard Worker 
759*890232f2SAndroid Build Coastguard Worker         TestEq(v.size(), size);
760*890232f2SAndroid Build Coastguard Worker         for (int i=0; i<size; i++) {
761*890232f2SAndroid Build Coastguard Worker             TestEq(v.get(i).asString().length(), size);
762*890232f2SAndroid Build Coastguard Worker             TestEq(v.get(i).asString(), text);
763*890232f2SAndroid Build Coastguard Worker         }
764*890232f2SAndroid Build Coastguard Worker     }
765*890232f2SAndroid Build Coastguard Worker 
testDeprecatedTypedVectorString()766*890232f2SAndroid Build Coastguard Worker     public static void testDeprecatedTypedVectorString() {
767*890232f2SAndroid Build Coastguard Worker         // tests whether we are able to support reading deprecated typed vector string
768*890232f2SAndroid Build Coastguard Worker         // data is equivalent to [ "abc", "abc", "abc", "abc"]
769*890232f2SAndroid Build Coastguard Worker         byte[] data = new byte[] {0x03, 0x61, 0x62, 0x63, 0x00, 0x03, 0x61, 0x62, 0x63, 0x00,
770*890232f2SAndroid Build Coastguard Worker             0x03, 0x61, 0x62, 0x63, 0x00, 0x03, 0x61, 0x62, 0x63, 0x00, 0x04, 0x14, 0x10,
771*890232f2SAndroid Build Coastguard Worker              0x0c, 0x08, 0x04, 0x3c, 0x01};
772*890232f2SAndroid Build Coastguard Worker         Reference ref = FlexBuffers.getRoot(ByteBuffer.wrap(data));
773*890232f2SAndroid Build Coastguard Worker         TestEq(ref.getType(), FlexBuffers.FBT_VECTOR_STRING_DEPRECATED);
774*890232f2SAndroid Build Coastguard Worker         TestEq(ref.isTypedVector(), true);
775*890232f2SAndroid Build Coastguard Worker         Vector vec = ref.asVector();
776*890232f2SAndroid Build Coastguard Worker         for (int i=0; i< vec.size(); i++) {
777*890232f2SAndroid Build Coastguard Worker             TestEq("abc", vec.get(i).asString());
778*890232f2SAndroid Build Coastguard Worker         }
779*890232f2SAndroid Build Coastguard Worker     }
780*890232f2SAndroid Build Coastguard Worker 
testSingleElementBoolean()781*890232f2SAndroid Build Coastguard Worker     public static void testSingleElementBoolean() {
782*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(100));
783*890232f2SAndroid Build Coastguard Worker         builder.putBoolean(true);
784*890232f2SAndroid Build Coastguard Worker         ByteBuffer b = builder.finish();
785*890232f2SAndroid Build Coastguard Worker         assert(FlexBuffers.getRoot(b).asBoolean());
786*890232f2SAndroid Build Coastguard Worker     }
787*890232f2SAndroid Build Coastguard Worker 
testSingleElementByte()788*890232f2SAndroid Build Coastguard Worker     public static void testSingleElementByte() {
789*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder();
790*890232f2SAndroid Build Coastguard Worker         builder.putInt(10);
791*890232f2SAndroid Build Coastguard Worker         ByteBuffer b = builder.finish();
792*890232f2SAndroid Build Coastguard Worker         TestEq(10, FlexBuffers.getRoot(b).asInt());
793*890232f2SAndroid Build Coastguard Worker     }
794*890232f2SAndroid Build Coastguard Worker 
testSingleElementShort()795*890232f2SAndroid Build Coastguard Worker     public static void testSingleElementShort() {
796*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder();
797*890232f2SAndroid Build Coastguard Worker         builder.putInt(Short.MAX_VALUE);
798*890232f2SAndroid Build Coastguard Worker         ByteBuffer b = builder.finish();
799*890232f2SAndroid Build Coastguard Worker         TestEq(Short.MAX_VALUE, (short)FlexBuffers.getRoot(b).asInt());
800*890232f2SAndroid Build Coastguard Worker     }
801*890232f2SAndroid Build Coastguard Worker 
testSingleElementInt()802*890232f2SAndroid Build Coastguard Worker     public static void testSingleElementInt() {
803*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder();
804*890232f2SAndroid Build Coastguard Worker         builder.putInt(Integer.MIN_VALUE);
805*890232f2SAndroid Build Coastguard Worker         ByteBuffer b = builder.finish();
806*890232f2SAndroid Build Coastguard Worker         TestEq(Integer.MIN_VALUE, FlexBuffers.getRoot(b).asInt());
807*890232f2SAndroid Build Coastguard Worker     }
808*890232f2SAndroid Build Coastguard Worker 
testSingleElementLong()809*890232f2SAndroid Build Coastguard Worker     public static void testSingleElementLong() {
810*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder();
811*890232f2SAndroid Build Coastguard Worker         builder.putInt(Long.MAX_VALUE);
812*890232f2SAndroid Build Coastguard Worker         ByteBuffer b = builder.finish();
813*890232f2SAndroid Build Coastguard Worker         TestEq(Long.MAX_VALUE, FlexBuffers.getRoot(b).asLong());
814*890232f2SAndroid Build Coastguard Worker     }
815*890232f2SAndroid Build Coastguard Worker 
testSingleElementFloat()816*890232f2SAndroid Build Coastguard Worker     public static void testSingleElementFloat() {
817*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder();
818*890232f2SAndroid Build Coastguard Worker         builder.putFloat(Float.MAX_VALUE);
819*890232f2SAndroid Build Coastguard Worker         ByteBuffer b = builder.finish();
820*890232f2SAndroid Build Coastguard Worker         TestEq(Float.compare(Float.MAX_VALUE, (float) FlexBuffers.getRoot(b).asFloat()), 0);
821*890232f2SAndroid Build Coastguard Worker     }
822*890232f2SAndroid Build Coastguard Worker 
testSingleElementDouble()823*890232f2SAndroid Build Coastguard Worker     public static void testSingleElementDouble() {
824*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder();
825*890232f2SAndroid Build Coastguard Worker         builder.putFloat(Double.MAX_VALUE);
826*890232f2SAndroid Build Coastguard Worker         ByteBuffer b = builder.finish();
827*890232f2SAndroid Build Coastguard Worker         TestEq(Double.compare(Double.MAX_VALUE, FlexBuffers.getRoot(b).asFloat()), 0);
828*890232f2SAndroid Build Coastguard Worker     }
829*890232f2SAndroid Build Coastguard Worker 
testSingleElementBigString()830*890232f2SAndroid Build Coastguard Worker     public static void testSingleElementBigString() {
831*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(10000));
832*890232f2SAndroid Build Coastguard Worker         StringBuilder sb = new StringBuilder();
833*890232f2SAndroid Build Coastguard Worker 
834*890232f2SAndroid Build Coastguard Worker         for (int i=0; i< 3000; i++) {
835*890232f2SAndroid Build Coastguard Worker             sb.append("a");
836*890232f2SAndroid Build Coastguard Worker         }
837*890232f2SAndroid Build Coastguard Worker 
838*890232f2SAndroid Build Coastguard Worker         builder.putString(sb.toString());
839*890232f2SAndroid Build Coastguard Worker         ByteBuffer b = builder.finish();
840*890232f2SAndroid Build Coastguard Worker 
841*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Reference r = FlexBuffers.getRoot(b);
842*890232f2SAndroid Build Coastguard Worker 
843*890232f2SAndroid Build Coastguard Worker         TestEq(FlexBuffers.FBT_STRING, r.getType());
844*890232f2SAndroid Build Coastguard Worker         TestEq(sb.toString(), r.asString());
845*890232f2SAndroid Build Coastguard Worker     }
846*890232f2SAndroid Build Coastguard Worker 
testSingleElementSmallString()847*890232f2SAndroid Build Coastguard Worker     public static void testSingleElementSmallString() {
848*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(10000));
849*890232f2SAndroid Build Coastguard Worker 
850*890232f2SAndroid Build Coastguard Worker         builder.putString("aa");
851*890232f2SAndroid Build Coastguard Worker         ByteBuffer b = builder.finish();
852*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Reference r = FlexBuffers.getRoot(b);
853*890232f2SAndroid Build Coastguard Worker 
854*890232f2SAndroid Build Coastguard Worker         TestEq(FlexBuffers.FBT_STRING, r.getType());
855*890232f2SAndroid Build Coastguard Worker         TestEq("aa", r.asString());
856*890232f2SAndroid Build Coastguard Worker     }
857*890232f2SAndroid Build Coastguard Worker 
testSingleElementBlob()858*890232f2SAndroid Build Coastguard Worker     public static void testSingleElementBlob() {
859*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder();
860*890232f2SAndroid Build Coastguard Worker         builder.putBlob(new byte[]{5, 124, 118, -1});
861*890232f2SAndroid Build Coastguard Worker         ByteBuffer b = builder.finish();
862*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Reference r = FlexBuffers.getRoot(b);
863*890232f2SAndroid Build Coastguard Worker         byte[] result = r.asBlob().getBytes();
864*890232f2SAndroid Build Coastguard Worker         TestEq((byte)5, result[0]);
865*890232f2SAndroid Build Coastguard Worker         TestEq((byte)124, result[1]);
866*890232f2SAndroid Build Coastguard Worker         TestEq((byte)118, result[2]);
867*890232f2SAndroid Build Coastguard Worker         TestEq((byte)-1, result[3]);
868*890232f2SAndroid Build Coastguard Worker     }
869*890232f2SAndroid Build Coastguard Worker 
testSingleElementLongBlob()870*890232f2SAndroid Build Coastguard Worker     public static void testSingleElementLongBlob() {
871*890232f2SAndroid Build Coastguard Worker 
872*890232f2SAndroid Build Coastguard Worker         // verifies blobs of up to 2^16 in length
873*890232f2SAndroid Build Coastguard Worker         for (int i = 2; i <= 1<<16; i = i<<1) {
874*890232f2SAndroid Build Coastguard Worker             byte[] input = new byte[i-1];
875*890232f2SAndroid Build Coastguard Worker             for (int index = 0; index < input.length; index++) {
876*890232f2SAndroid Build Coastguard Worker                 input[index] = (byte)(index % 64);
877*890232f2SAndroid Build Coastguard Worker             }
878*890232f2SAndroid Build Coastguard Worker 
879*890232f2SAndroid Build Coastguard Worker             FlexBuffersBuilder builder = new FlexBuffersBuilder();
880*890232f2SAndroid Build Coastguard Worker             builder.putBlob(input);
881*890232f2SAndroid Build Coastguard Worker             ByteBuffer b = builder.finish();
882*890232f2SAndroid Build Coastguard Worker             FlexBuffers.Reference r = FlexBuffers.getRoot(b);
883*890232f2SAndroid Build Coastguard Worker             byte[] result = r.asBlob().getBytes();
884*890232f2SAndroid Build Coastguard Worker 
885*890232f2SAndroid Build Coastguard Worker             for (int index = 0; index < input.length; index++) {
886*890232f2SAndroid Build Coastguard Worker                 TestEq((byte)(index % 64), result[index]);
887*890232f2SAndroid Build Coastguard Worker             }
888*890232f2SAndroid Build Coastguard Worker         }
889*890232f2SAndroid Build Coastguard Worker     }
890*890232f2SAndroid Build Coastguard Worker 
testSingleElementUByte()891*890232f2SAndroid Build Coastguard Worker     public static void testSingleElementUByte() {
892*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder();
893*890232f2SAndroid Build Coastguard Worker         builder.putUInt(0xFF);
894*890232f2SAndroid Build Coastguard Worker         ByteBuffer b = builder.finish();
895*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Reference r = FlexBuffers.getRoot(b);
896*890232f2SAndroid Build Coastguard Worker         TestEq(255, (int)r.asUInt());
897*890232f2SAndroid Build Coastguard Worker     }
898*890232f2SAndroid Build Coastguard Worker 
testSingleElementUShort()899*890232f2SAndroid Build Coastguard Worker     public static void testSingleElementUShort() {
900*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder();
901*890232f2SAndroid Build Coastguard Worker         builder.putUInt(0xFFFF);
902*890232f2SAndroid Build Coastguard Worker         ByteBuffer b = builder.finish();
903*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Reference r = FlexBuffers.getRoot(b);
904*890232f2SAndroid Build Coastguard Worker         TestEq(65535, (int)r.asUInt());
905*890232f2SAndroid Build Coastguard Worker     }
906*890232f2SAndroid Build Coastguard Worker 
testSingleElementUInt()907*890232f2SAndroid Build Coastguard Worker     public static void testSingleElementUInt() {
908*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder();
909*890232f2SAndroid Build Coastguard Worker         builder.putUInt(0xFFFF_FFFFL);
910*890232f2SAndroid Build Coastguard Worker         ByteBuffer b = builder.finish();
911*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Reference r = FlexBuffers.getRoot(b);
912*890232f2SAndroid Build Coastguard Worker         TestEq(4294967295L, r.asUInt());
913*890232f2SAndroid Build Coastguard Worker     }
914*890232f2SAndroid Build Coastguard Worker 
testSingleFixedTypeVector()915*890232f2SAndroid Build Coastguard Worker     public static void testSingleFixedTypeVector() {
916*890232f2SAndroid Build Coastguard Worker 
917*890232f2SAndroid Build Coastguard Worker         int[] ints = new int[]{5, 124, 118, -1};
918*890232f2SAndroid Build Coastguard Worker         float[] floats = new float[]{5.5f, 124.124f, 118.118f, -1.1f};
919*890232f2SAndroid Build Coastguard Worker         String[] strings = new String[]{"This", "is", "a", "typed", "array"};
920*890232f2SAndroid Build Coastguard Worker         boolean[] booleans = new boolean[]{false, true, true, false};
921*890232f2SAndroid Build Coastguard Worker 
922*890232f2SAndroid Build Coastguard Worker 
923*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(512),
924*890232f2SAndroid Build Coastguard Worker                 FlexBuffersBuilder.BUILDER_FLAG_NONE);
925*890232f2SAndroid Build Coastguard Worker 
926*890232f2SAndroid Build Coastguard Worker         int mapPos = builder.startMap();
927*890232f2SAndroid Build Coastguard Worker 
928*890232f2SAndroid Build Coastguard Worker         int vecPos = builder.startVector();
929*890232f2SAndroid Build Coastguard Worker         for (final int i : ints) {
930*890232f2SAndroid Build Coastguard Worker             builder.putInt(i);
931*890232f2SAndroid Build Coastguard Worker         }
932*890232f2SAndroid Build Coastguard Worker         builder.endVector("ints", vecPos, true, false);
933*890232f2SAndroid Build Coastguard Worker 
934*890232f2SAndroid Build Coastguard Worker         vecPos = builder.startVector();
935*890232f2SAndroid Build Coastguard Worker         for (final float i : floats) {
936*890232f2SAndroid Build Coastguard Worker             builder.putFloat(i);
937*890232f2SAndroid Build Coastguard Worker         }
938*890232f2SAndroid Build Coastguard Worker         builder.endVector("floats", vecPos, true, false);
939*890232f2SAndroid Build Coastguard Worker 
940*890232f2SAndroid Build Coastguard Worker         vecPos = builder.startVector();
941*890232f2SAndroid Build Coastguard Worker         for (final boolean i : booleans) {
942*890232f2SAndroid Build Coastguard Worker             builder.putBoolean(i);
943*890232f2SAndroid Build Coastguard Worker         }
944*890232f2SAndroid Build Coastguard Worker         builder.endVector("booleans", vecPos, true, false);
945*890232f2SAndroid Build Coastguard Worker 
946*890232f2SAndroid Build Coastguard Worker         builder.endMap(null, mapPos);
947*890232f2SAndroid Build Coastguard Worker 
948*890232f2SAndroid Build Coastguard Worker 
949*890232f2SAndroid Build Coastguard Worker         ByteBuffer b = builder.finish();
950*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Reference r = FlexBuffers.getRoot(b);
951*890232f2SAndroid Build Coastguard Worker         assert(r.asMap().get("ints").isTypedVector());
952*890232f2SAndroid Build Coastguard Worker         assert(r.asMap().get("floats").isTypedVector());
953*890232f2SAndroid Build Coastguard Worker         assert(r.asMap().get("booleans").isTypedVector());
954*890232f2SAndroid Build Coastguard Worker     }
955*890232f2SAndroid Build Coastguard Worker 
testSingleElementVector()956*890232f2SAndroid Build Coastguard Worker     public static void testSingleElementVector() {
957*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder b = new FlexBuffersBuilder();
958*890232f2SAndroid Build Coastguard Worker 
959*890232f2SAndroid Build Coastguard Worker         int vecPos = b.startVector();
960*890232f2SAndroid Build Coastguard Worker         b.putInt(99);
961*890232f2SAndroid Build Coastguard Worker         b.putString("wow");
962*890232f2SAndroid Build Coastguard Worker         int vecpos2 = b.startVector();
963*890232f2SAndroid Build Coastguard Worker         b.putInt(99);
964*890232f2SAndroid Build Coastguard Worker         b.putString("wow");
965*890232f2SAndroid Build Coastguard Worker         b.endVector(null, vecpos2, false, false);
966*890232f2SAndroid Build Coastguard Worker         b.endVector(null, vecPos, false, false);
967*890232f2SAndroid Build Coastguard Worker         b.finish();
968*890232f2SAndroid Build Coastguard Worker 
969*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Reference r = FlexBuffers.getRoot(b.getBuffer());
970*890232f2SAndroid Build Coastguard Worker         TestEq(FlexBuffers.FBT_VECTOR, r.getType());
971*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Vector vec = FlexBuffers.getRoot(b.getBuffer()).asVector();
972*890232f2SAndroid Build Coastguard Worker         TestEq(3, vec.size());
973*890232f2SAndroid Build Coastguard Worker         TestEq(99, vec.get(0).asInt());
974*890232f2SAndroid Build Coastguard Worker         TestEq("wow", vec.get(1).asString());
975*890232f2SAndroid Build Coastguard Worker         TestEq("[ 99, \"wow\" ]", vec.get(2).toString());
976*890232f2SAndroid Build Coastguard Worker         TestEq("[ 99, \"wow\", [ 99, \"wow\" ] ]", FlexBuffers.getRoot(b.getBuffer()).toString());
977*890232f2SAndroid Build Coastguard Worker     }
978*890232f2SAndroid Build Coastguard Worker 
testSingleElementMap()979*890232f2SAndroid Build Coastguard Worker     public static void testSingleElementMap() {
980*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder b = new FlexBuffersBuilder();
981*890232f2SAndroid Build Coastguard Worker 
982*890232f2SAndroid Build Coastguard Worker         int mapPost = b.startMap();
983*890232f2SAndroid Build Coastguard Worker         b.putInt("myInt", 0x7fffffbbbfffffffL);
984*890232f2SAndroid Build Coastguard Worker         b.putString("myString", "wow");
985*890232f2SAndroid Build Coastguard Worker         b.putString("myString2", "incredible");
986*890232f2SAndroid Build Coastguard Worker         int start = b.startVector();
987*890232f2SAndroid Build Coastguard Worker         b.putInt(99);
988*890232f2SAndroid Build Coastguard Worker         b.putString("wow");
989*890232f2SAndroid Build Coastguard Worker         b.endVector("myVec", start, false, false);
990*890232f2SAndroid Build Coastguard Worker 
991*890232f2SAndroid Build Coastguard Worker         b.putFloat("double", 0x1.ffffbbbffffffP+1023);
992*890232f2SAndroid Build Coastguard Worker         b.endMap(null, mapPost);
993*890232f2SAndroid Build Coastguard Worker         b.finish();
994*890232f2SAndroid Build Coastguard Worker 
995*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Reference r = FlexBuffers.getRoot(b.getBuffer());
996*890232f2SAndroid Build Coastguard Worker         TestEq(FlexBuffers.FBT_MAP, r.getType());
997*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Map map = FlexBuffers.getRoot(b.getBuffer()).asMap();
998*890232f2SAndroid Build Coastguard Worker         TestEq(5, map.size());
999*890232f2SAndroid Build Coastguard Worker         TestEq(0x7fffffbbbfffffffL, map.get("myInt").asLong());
1000*890232f2SAndroid Build Coastguard Worker         TestEq("wow", map.get("myString").asString());
1001*890232f2SAndroid Build Coastguard Worker         TestEq("incredible", map.get("myString2").asString());
1002*890232f2SAndroid Build Coastguard Worker         TestEq(99, map.get("myVec").asVector().get(0).asInt());
1003*890232f2SAndroid Build Coastguard Worker         TestEq("wow", map.get("myVec").asVector().get(1).asString());
1004*890232f2SAndroid Build Coastguard Worker         TestEq(Double.compare(0x1.ffffbbbffffffP+1023, map.get("double").asFloat()), 0);
1005*890232f2SAndroid Build Coastguard Worker         TestEq("{ \"double\" : 1.7976894783391937E308, \"myInt\" : 9223371743723257855, \"myString\" : \"wow\", \"myString2\" : \"incredible\", \"myVec\" : [ 99, \"wow\" ] }",
1006*890232f2SAndroid Build Coastguard Worker                 FlexBuffers.getRoot(b.getBuffer()).toString());
1007*890232f2SAndroid Build Coastguard Worker     }
1008*890232f2SAndroid Build Coastguard Worker 
testFlexBuferEmpty()1009*890232f2SAndroid Build Coastguard Worker     public static void testFlexBuferEmpty() {
1010*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Blob blob = FlexBuffers.Blob.empty();
1011*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Map ary = FlexBuffers.Map.empty();
1012*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Vector map = FlexBuffers.Vector.empty();
1013*890232f2SAndroid Build Coastguard Worker         FlexBuffers.TypedVector typedAry = FlexBuffers.TypedVector.empty();
1014*890232f2SAndroid Build Coastguard Worker         TestEq(blob.size(), 0);
1015*890232f2SAndroid Build Coastguard Worker         TestEq(map.size(), 0);
1016*890232f2SAndroid Build Coastguard Worker         TestEq(ary.size(), 0);
1017*890232f2SAndroid Build Coastguard Worker         TestEq(typedAry.size(), 0);
1018*890232f2SAndroid Build Coastguard Worker     }
1019*890232f2SAndroid Build Coastguard Worker 
testHashMapToMap()1020*890232f2SAndroid Build Coastguard Worker     public static void testHashMapToMap() {
1021*890232f2SAndroid Build Coastguard Worker         int entriesCount = 12;
1022*890232f2SAndroid Build Coastguard Worker 
1023*890232f2SAndroid Build Coastguard Worker         HashMap<String, String> source =  new HashMap<>();
1024*890232f2SAndroid Build Coastguard Worker         for (int i = 0; i < entriesCount; i++) {
1025*890232f2SAndroid Build Coastguard Worker             source.put("foo_param_" + i, "foo_value_" + i);
1026*890232f2SAndroid Build Coastguard Worker         }
1027*890232f2SAndroid Build Coastguard Worker 
1028*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder(1000);
1029*890232f2SAndroid Build Coastguard Worker         int mapStart = builder.startMap();
1030*890232f2SAndroid Build Coastguard Worker         for (Map.Entry<String, String> entry : source.entrySet()) {
1031*890232f2SAndroid Build Coastguard Worker             builder.putString(entry.getKey(), entry.getValue());
1032*890232f2SAndroid Build Coastguard Worker         }
1033*890232f2SAndroid Build Coastguard Worker         builder.endMap(null, mapStart);
1034*890232f2SAndroid Build Coastguard Worker         ByteBuffer bb = builder.finish();
1035*890232f2SAndroid Build Coastguard Worker         bb.rewind();
1036*890232f2SAndroid Build Coastguard Worker 
1037*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Reference rootReference = FlexBuffers.getRoot(bb);
1038*890232f2SAndroid Build Coastguard Worker 
1039*890232f2SAndroid Build Coastguard Worker         TestEq(rootReference.isMap(), true);
1040*890232f2SAndroid Build Coastguard Worker 
1041*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Map flexMap = rootReference.asMap();
1042*890232f2SAndroid Build Coastguard Worker 
1043*890232f2SAndroid Build Coastguard Worker         FlexBuffers.KeyVector keys = flexMap.keys();
1044*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Vector values = flexMap.values();
1045*890232f2SAndroid Build Coastguard Worker 
1046*890232f2SAndroid Build Coastguard Worker         TestEq(entriesCount, keys.size());
1047*890232f2SAndroid Build Coastguard Worker         TestEq(entriesCount, values.size());
1048*890232f2SAndroid Build Coastguard Worker 
1049*890232f2SAndroid Build Coastguard Worker         HashMap<String, String> result =  new HashMap<>();
1050*890232f2SAndroid Build Coastguard Worker         for (int i = 0; i < keys.size(); i++) {
1051*890232f2SAndroid Build Coastguard Worker             result.put(keys.get(i).toString(), values.get(i).asString());
1052*890232f2SAndroid Build Coastguard Worker         }
1053*890232f2SAndroid Build Coastguard Worker 
1054*890232f2SAndroid Build Coastguard Worker         TestEq(source, result);
1055*890232f2SAndroid Build Coastguard Worker     }
1056*890232f2SAndroid Build Coastguard Worker 
testBuilderGrowth()1057*890232f2SAndroid Build Coastguard Worker     public static void testBuilderGrowth() {
1058*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder();
1059*890232f2SAndroid Build Coastguard Worker         String someString = "This is a small string";
1060*890232f2SAndroid Build Coastguard Worker         builder.putString(someString);
1061*890232f2SAndroid Build Coastguard Worker         ByteBuffer b = builder.finish();
1062*890232f2SAndroid Build Coastguard Worker         TestEq(someString, FlexBuffers.getRoot(b).asString());
1063*890232f2SAndroid Build Coastguard Worker 
1064*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder failBuilder = new FlexBuffersBuilder(ByteBuffer.allocate(1));
1065*890232f2SAndroid Build Coastguard Worker         failBuilder.putString(someString);
1066*890232f2SAndroid Build Coastguard Worker     }
1067*890232f2SAndroid Build Coastguard Worker 
testFlexBuffersUtf8Map()1068*890232f2SAndroid Build Coastguard Worker     public static void testFlexBuffersUtf8Map() {
1069*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(512),
1070*890232f2SAndroid Build Coastguard Worker                 FlexBuffersBuilder.BUILDER_FLAG_SHARE_KEYS_AND_STRINGS);
1071*890232f2SAndroid Build Coastguard Worker 
1072*890232f2SAndroid Build Coastguard Worker         String key0 = "�� face1";
1073*890232f2SAndroid Build Coastguard Worker         String key1 = "�� face2";
1074*890232f2SAndroid Build Coastguard Worker         String key2 = "�� face3";
1075*890232f2SAndroid Build Coastguard Worker         String key3 = "trademark ®";
1076*890232f2SAndroid Build Coastguard Worker         String key4 = "€ euro";
1077*890232f2SAndroid Build Coastguard Worker         String utf8keys[] = { "�� face1", "�� face2", "�� face3", "trademark ®", "€ euro"};
1078*890232f2SAndroid Build Coastguard Worker 
1079*890232f2SAndroid Build Coastguard Worker         int map = builder.startMap();
1080*890232f2SAndroid Build Coastguard Worker 
1081*890232f2SAndroid Build Coastguard Worker         for (int i=0; i< utf8keys.length; i++) {
1082*890232f2SAndroid Build Coastguard Worker             builder.putString(utf8keys[i], utf8keys[i]);  // Testing key and string reuse.
1083*890232f2SAndroid Build Coastguard Worker         }
1084*890232f2SAndroid Build Coastguard Worker         builder.endMap(null, map);
1085*890232f2SAndroid Build Coastguard Worker         builder.finish();
1086*890232f2SAndroid Build Coastguard Worker 
1087*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Map m = FlexBuffers.getRoot(builder.getBuffer()).asMap();
1088*890232f2SAndroid Build Coastguard Worker 
1089*890232f2SAndroid Build Coastguard Worker         TestEq(m.size(), 5);
1090*890232f2SAndroid Build Coastguard Worker 
1091*890232f2SAndroid Build Coastguard Worker         KeyVector kv = m.keys();
1092*890232f2SAndroid Build Coastguard Worker         for (int i=0; i< utf8keys.length; i++) {
1093*890232f2SAndroid Build Coastguard Worker             TestEq(kv.get(i).toString(), m.get(i).asString());
1094*890232f2SAndroid Build Coastguard Worker         }
1095*890232f2SAndroid Build Coastguard Worker 
1096*890232f2SAndroid Build Coastguard Worker         TestEq(m.get(key0).asString(), utf8keys[0]);
1097*890232f2SAndroid Build Coastguard Worker         TestEq(m.get(key1).asString(), utf8keys[1]);
1098*890232f2SAndroid Build Coastguard Worker         TestEq(m.get(key2).asString(), utf8keys[2]);
1099*890232f2SAndroid Build Coastguard Worker         TestEq(m.get(key3).asString(), utf8keys[3]);
1100*890232f2SAndroid Build Coastguard Worker         TestEq(m.get(key4).asString(), utf8keys[4]);
1101*890232f2SAndroid Build Coastguard Worker     }
1102*890232f2SAndroid Build Coastguard Worker 
testFlexBuffersMapLookup()1103*890232f2SAndroid Build Coastguard Worker     public static void testFlexBuffersMapLookup() {
1104*890232f2SAndroid Build Coastguard Worker         FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(512),
1105*890232f2SAndroid Build Coastguard Worker                 FlexBuffersBuilder.BUILDER_FLAG_SHARE_KEYS_AND_STRINGS);
1106*890232f2SAndroid Build Coastguard Worker 
1107*890232f2SAndroid Build Coastguard Worker         String key0 = "123";
1108*890232f2SAndroid Build Coastguard Worker         String key1 = "1234";
1109*890232f2SAndroid Build Coastguard Worker         String key2 = "12345";
1110*890232f2SAndroid Build Coastguard Worker         String[] keys = new String[]{key0, key1, key2};
1111*890232f2SAndroid Build Coastguard Worker 
1112*890232f2SAndroid Build Coastguard Worker         int map = builder.startMap();
1113*890232f2SAndroid Build Coastguard Worker 
1114*890232f2SAndroid Build Coastguard Worker         for (int i=0; i< keys.length; i++) {
1115*890232f2SAndroid Build Coastguard Worker             builder.putString(keys[i], keys[i]);  // Testing key and string reuse.
1116*890232f2SAndroid Build Coastguard Worker         }
1117*890232f2SAndroid Build Coastguard Worker         builder.endMap(null, map);
1118*890232f2SAndroid Build Coastguard Worker         builder.finish();
1119*890232f2SAndroid Build Coastguard Worker 
1120*890232f2SAndroid Build Coastguard Worker         FlexBuffers.Map m = FlexBuffers.getRoot(builder.getBuffer()).asMap();
1121*890232f2SAndroid Build Coastguard Worker         for (int i=0; i< keys.length; i++) {
1122*890232f2SAndroid Build Coastguard Worker             TestEq(m.get(keys[i]).asString(), keys[i]);
1123*890232f2SAndroid Build Coastguard Worker             TestEq(m.get(keys[i].getBytes(StandardCharsets.UTF_8)).asString(), keys[i]);
1124*890232f2SAndroid Build Coastguard Worker         }
1125*890232f2SAndroid Build Coastguard Worker     }
1126*890232f2SAndroid Build Coastguard Worker 
TestFlexBuffers()1127*890232f2SAndroid Build Coastguard Worker     public static void TestFlexBuffers() {
1128*890232f2SAndroid Build Coastguard Worker         testSingleElementByte();
1129*890232f2SAndroid Build Coastguard Worker         testSingleElementShort();
1130*890232f2SAndroid Build Coastguard Worker         testSingleElementInt();
1131*890232f2SAndroid Build Coastguard Worker         testSingleElementLong();
1132*890232f2SAndroid Build Coastguard Worker         testSingleElementFloat();
1133*890232f2SAndroid Build Coastguard Worker         testSingleElementDouble();
1134*890232f2SAndroid Build Coastguard Worker         testSingleElementSmallString();
1135*890232f2SAndroid Build Coastguard Worker         testSingleElementBigString();
1136*890232f2SAndroid Build Coastguard Worker         testSingleElementBlob();
1137*890232f2SAndroid Build Coastguard Worker         testSingleElementLongBlob();
1138*890232f2SAndroid Build Coastguard Worker         testSingleElementVector();
1139*890232f2SAndroid Build Coastguard Worker         testSingleFixedTypeVector();
1140*890232f2SAndroid Build Coastguard Worker         testSingleElementUShort();
1141*890232f2SAndroid Build Coastguard Worker         testSingleElementUInt();
1142*890232f2SAndroid Build Coastguard Worker         testSingleElementUByte();
1143*890232f2SAndroid Build Coastguard Worker         testSingleElementMap();
1144*890232f2SAndroid Build Coastguard Worker         testFlexBuffersTest();
1145*890232f2SAndroid Build Coastguard Worker         testHashMapToMap();
1146*890232f2SAndroid Build Coastguard Worker         testFlexBuferEmpty();
1147*890232f2SAndroid Build Coastguard Worker         testFlexBufferVectorStrings();
1148*890232f2SAndroid Build Coastguard Worker         testDeprecatedTypedVectorString();
1149*890232f2SAndroid Build Coastguard Worker         testBuilderGrowth();
1150*890232f2SAndroid Build Coastguard Worker         testFlexBuffersUtf8Map();
1151*890232f2SAndroid Build Coastguard Worker         testFlexBuffersMapLookup();
1152*890232f2SAndroid Build Coastguard Worker     }
1153*890232f2SAndroid Build Coastguard Worker 
TestDictionaryLookup()1154*890232f2SAndroid Build Coastguard Worker     static void TestDictionaryLookup() {
1155*890232f2SAndroid Build Coastguard Worker         FlatBufferBuilder fbb = new FlatBufferBuilder(16);
1156*890232f2SAndroid Build Coastguard Worker         int lfIndex = LongFloatEntry.createLongFloatEntry(fbb, 0, 99);
1157*890232f2SAndroid Build Coastguard Worker         int vectorEntriesIdx = LongFloatMap.createEntriesVector(fbb, new int[] { lfIndex });
1158*890232f2SAndroid Build Coastguard Worker         int rootIdx = LongFloatMap.createLongFloatMap(fbb, vectorEntriesIdx);
1159*890232f2SAndroid Build Coastguard Worker 
1160*890232f2SAndroid Build Coastguard Worker         LongFloatMap.finishLongFloatMapBuffer(fbb, rootIdx);
1161*890232f2SAndroid Build Coastguard Worker         LongFloatMap map = LongFloatMap.getRootAsLongFloatMap(fbb.dataBuffer());
1162*890232f2SAndroid Build Coastguard Worker         TestEq(map.entriesLength(), 1);
1163*890232f2SAndroid Build Coastguard Worker 
1164*890232f2SAndroid Build Coastguard Worker         LongFloatEntry e = map.entries(0);
1165*890232f2SAndroid Build Coastguard Worker         TestEq(e.key(), 0L);
1166*890232f2SAndroid Build Coastguard Worker         TestEq(e.value(), 99.0f);
1167*890232f2SAndroid Build Coastguard Worker 
1168*890232f2SAndroid Build Coastguard Worker         LongFloatEntry e2 = map.entriesByKey(0);
1169*890232f2SAndroid Build Coastguard Worker         TestEq(e2.key(), 0L);
1170*890232f2SAndroid Build Coastguard Worker         TestEq(e2.value(), 99.0f);
1171*890232f2SAndroid Build Coastguard Worker     }
1172*890232f2SAndroid Build Coastguard Worker 
TestVectorOfBytes()1173*890232f2SAndroid Build Coastguard Worker     static void TestVectorOfBytes() {
1174*890232f2SAndroid Build Coastguard Worker         FlatBufferBuilder fbb = new FlatBufferBuilder(16);
1175*890232f2SAndroid Build Coastguard Worker         int str = fbb.createString("ByteMonster");
1176*890232f2SAndroid Build Coastguard Worker         byte[] data = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
1177*890232f2SAndroid Build Coastguard Worker         int offset = Monster.createInventoryVector(fbb, data);
1178*890232f2SAndroid Build Coastguard Worker         Monster.startMonster(fbb);
1179*890232f2SAndroid Build Coastguard Worker         Monster.addName(fbb, str);
1180*890232f2SAndroid Build Coastguard Worker         Monster.addInventory(fbb, offset);
1181*890232f2SAndroid Build Coastguard Worker         int monster1 = Monster.endMonster(fbb);
1182*890232f2SAndroid Build Coastguard Worker         Monster.finishMonsterBuffer(fbb, monster1);
1183*890232f2SAndroid Build Coastguard Worker         Monster monsterObject = Monster.getRootAsMonster(fbb.dataBuffer());
1184*890232f2SAndroid Build Coastguard Worker 
1185*890232f2SAndroid Build Coastguard Worker         TestEq(monsterObject.inventoryLength(), data.length);
1186*890232f2SAndroid Build Coastguard Worker         TestEq(monsterObject.inventory(4), (int) data[4]);
1187*890232f2SAndroid Build Coastguard Worker         TestEq(ByteBuffer.wrap(data), monsterObject.inventoryAsByteBuffer());
1188*890232f2SAndroid Build Coastguard Worker 
1189*890232f2SAndroid Build Coastguard Worker         fbb.clear();
1190*890232f2SAndroid Build Coastguard Worker         ByteBuffer bb = ByteBuffer.wrap(data);
1191*890232f2SAndroid Build Coastguard Worker         offset = fbb.createByteVector(bb);
1192*890232f2SAndroid Build Coastguard Worker         str = fbb.createString("ByteMonster");
1193*890232f2SAndroid Build Coastguard Worker         Monster.startMonster(fbb);
1194*890232f2SAndroid Build Coastguard Worker         Monster.addName(fbb, str);
1195*890232f2SAndroid Build Coastguard Worker         Monster.addInventory(fbb, offset);
1196*890232f2SAndroid Build Coastguard Worker         monster1 = Monster.endMonster(fbb);
1197*890232f2SAndroid Build Coastguard Worker         Monster.finishMonsterBuffer(fbb, monster1);
1198*890232f2SAndroid Build Coastguard Worker         Monster monsterObject2 = Monster.getRootAsMonster(fbb.dataBuffer());
1199*890232f2SAndroid Build Coastguard Worker 
1200*890232f2SAndroid Build Coastguard Worker         TestEq(monsterObject2.inventoryLength(), data.length);
1201*890232f2SAndroid Build Coastguard Worker         for (int i = 0; i < data.length; i++) {
1202*890232f2SAndroid Build Coastguard Worker           TestEq(monsterObject2.inventory(i), (int) bb.get(i));
1203*890232f2SAndroid Build Coastguard Worker         }
1204*890232f2SAndroid Build Coastguard Worker 
1205*890232f2SAndroid Build Coastguard Worker         fbb.clear();
1206*890232f2SAndroid Build Coastguard Worker         offset = fbb.createByteVector(data, 3, 4);
1207*890232f2SAndroid Build Coastguard Worker         str = fbb.createString("ByteMonster");
1208*890232f2SAndroid Build Coastguard Worker         Monster.startMonster(fbb);
1209*890232f2SAndroid Build Coastguard Worker         Monster.addName(fbb, str);
1210*890232f2SAndroid Build Coastguard Worker         Monster.addInventory(fbb, offset);
1211*890232f2SAndroid Build Coastguard Worker         monster1 = Monster.endMonster(fbb);
1212*890232f2SAndroid Build Coastguard Worker         Monster.finishMonsterBuffer(fbb, monster1);
1213*890232f2SAndroid Build Coastguard Worker         Monster monsterObject3 = Monster.getRootAsMonster(fbb.dataBuffer());
1214*890232f2SAndroid Build Coastguard Worker 
1215*890232f2SAndroid Build Coastguard Worker         TestEq(monsterObject3.inventoryLength(), 4);
1216*890232f2SAndroid Build Coastguard Worker         TestEq(monsterObject3.inventory(0), (int) data[3]);
1217*890232f2SAndroid Build Coastguard Worker 
1218*890232f2SAndroid Build Coastguard Worker         fbb.clear();
1219*890232f2SAndroid Build Coastguard Worker         bb = ByteBuffer.wrap(data);
1220*890232f2SAndroid Build Coastguard Worker         offset = Monster.createInventoryVector(fbb, bb);
1221*890232f2SAndroid Build Coastguard Worker         str = fbb.createString("ByteMonster");
1222*890232f2SAndroid Build Coastguard Worker         Monster.startMonster(fbb);
1223*890232f2SAndroid Build Coastguard Worker         Monster.addName(fbb, str);
1224*890232f2SAndroid Build Coastguard Worker         Monster.addInventory(fbb, offset);
1225*890232f2SAndroid Build Coastguard Worker         monster1 = Monster.endMonster(fbb);
1226*890232f2SAndroid Build Coastguard Worker         Monster.finishMonsterBuffer(fbb, monster1);
1227*890232f2SAndroid Build Coastguard Worker         Monster monsterObject4 = Monster.getRootAsMonster(fbb.dataBuffer());
1228*890232f2SAndroid Build Coastguard Worker 
1229*890232f2SAndroid Build Coastguard Worker         TestEq(monsterObject4.inventoryLength(), data.length);
1230*890232f2SAndroid Build Coastguard Worker         TestEq(monsterObject4.inventory(8), (int) 8);
1231*890232f2SAndroid Build Coastguard Worker 
1232*890232f2SAndroid Build Coastguard Worker         fbb.clear();
1233*890232f2SAndroid Build Coastguard Worker         byte[] largeData = new byte[1024];
1234*890232f2SAndroid Build Coastguard Worker         offset = fbb.createByteVector(largeData);
1235*890232f2SAndroid Build Coastguard Worker         str = fbb.createString("ByteMonster");
1236*890232f2SAndroid Build Coastguard Worker         Monster.startMonster(fbb);
1237*890232f2SAndroid Build Coastguard Worker         Monster.addName(fbb, str);
1238*890232f2SAndroid Build Coastguard Worker         Monster.addInventory(fbb, offset);
1239*890232f2SAndroid Build Coastguard Worker         monster1 = Monster.endMonster(fbb);
1240*890232f2SAndroid Build Coastguard Worker         Monster.finishMonsterBuffer(fbb, monster1);
1241*890232f2SAndroid Build Coastguard Worker         Monster monsterObject5 = Monster.getRootAsMonster(fbb.dataBuffer());
1242*890232f2SAndroid Build Coastguard Worker 
1243*890232f2SAndroid Build Coastguard Worker         TestEq(monsterObject5.inventoryLength(), largeData.length);
1244*890232f2SAndroid Build Coastguard Worker         TestEq(monsterObject5.inventory(25), (int) largeData[25]);
1245*890232f2SAndroid Build Coastguard Worker 
1246*890232f2SAndroid Build Coastguard Worker         fbb.clear();
1247*890232f2SAndroid Build Coastguard Worker         bb = ByteBuffer.wrap(largeData);
1248*890232f2SAndroid Build Coastguard Worker         bb.position(512);
1249*890232f2SAndroid Build Coastguard Worker         ByteBuffer bb2 = bb.slice();
1250*890232f2SAndroid Build Coastguard Worker         TestEq(bb2.arrayOffset(), 512);
1251*890232f2SAndroid Build Coastguard Worker         offset = fbb.createByteVector(bb2);
1252*890232f2SAndroid Build Coastguard Worker         str = fbb.createString("ByteMonster");
1253*890232f2SAndroid Build Coastguard Worker         Monster.startMonster(fbb);
1254*890232f2SAndroid Build Coastguard Worker         Monster.addName(fbb, str);
1255*890232f2SAndroid Build Coastguard Worker         Monster.addInventory(fbb, offset);
1256*890232f2SAndroid Build Coastguard Worker         monster1 = Monster.endMonster(fbb);
1257*890232f2SAndroid Build Coastguard Worker         Monster.finishMonsterBuffer(fbb, monster1);
1258*890232f2SAndroid Build Coastguard Worker         Monster monsterObject6 = Monster.getRootAsMonster(fbb.dataBuffer());
1259*890232f2SAndroid Build Coastguard Worker 
1260*890232f2SAndroid Build Coastguard Worker         TestEq(monsterObject6.inventoryLength(), 512);
1261*890232f2SAndroid Build Coastguard Worker         TestEq(monsterObject6.inventory(0), (int) largeData[512]);
1262*890232f2SAndroid Build Coastguard Worker 
1263*890232f2SAndroid Build Coastguard Worker         fbb.clear();
1264*890232f2SAndroid Build Coastguard Worker         bb = ByteBuffer.wrap(largeData);
1265*890232f2SAndroid Build Coastguard Worker         bb.limit(256);
1266*890232f2SAndroid Build Coastguard Worker         offset = fbb.createByteVector(bb);
1267*890232f2SAndroid Build Coastguard Worker         str = fbb.createString("ByteMonster");
1268*890232f2SAndroid Build Coastguard Worker         Monster.startMonster(fbb);
1269*890232f2SAndroid Build Coastguard Worker         Monster.addName(fbb, str);
1270*890232f2SAndroid Build Coastguard Worker         Monster.addInventory(fbb, offset);
1271*890232f2SAndroid Build Coastguard Worker         monster1 = Monster.endMonster(fbb);
1272*890232f2SAndroid Build Coastguard Worker         Monster.finishMonsterBuffer(fbb, monster1);
1273*890232f2SAndroid Build Coastguard Worker         Monster monsterObject7 = Monster.getRootAsMonster(fbb.dataBuffer());
1274*890232f2SAndroid Build Coastguard Worker 
1275*890232f2SAndroid Build Coastguard Worker         TestEq(monsterObject7.inventoryLength(), 256);
1276*890232f2SAndroid Build Coastguard Worker 
1277*890232f2SAndroid Build Coastguard Worker         fbb.clear();
1278*890232f2SAndroid Build Coastguard Worker         bb = ByteBuffer.allocateDirect(2048);
1279*890232f2SAndroid Build Coastguard Worker         offset = fbb.createByteVector(bb);
1280*890232f2SAndroid Build Coastguard Worker         str = fbb.createString("ByteMonster");
1281*890232f2SAndroid Build Coastguard Worker         Monster.startMonster(fbb);
1282*890232f2SAndroid Build Coastguard Worker         Monster.addName(fbb, str);
1283*890232f2SAndroid Build Coastguard Worker         Monster.addInventory(fbb, offset);
1284*890232f2SAndroid Build Coastguard Worker         monster1 = Monster.endMonster(fbb);
1285*890232f2SAndroid Build Coastguard Worker         Monster.finishMonsterBuffer(fbb, monster1);
1286*890232f2SAndroid Build Coastguard Worker         Monster monsterObject8 = Monster.getRootAsMonster(fbb.dataBuffer());
1287*890232f2SAndroid Build Coastguard Worker 
1288*890232f2SAndroid Build Coastguard Worker         TestEq(monsterObject8.inventoryLength(), 2048);
1289*890232f2SAndroid Build Coastguard Worker     }
1290*890232f2SAndroid Build Coastguard Worker 
TestSharedStringPool()1291*890232f2SAndroid Build Coastguard Worker     static void TestSharedStringPool() {
1292*890232f2SAndroid Build Coastguard Worker         FlatBufferBuilder fb = new FlatBufferBuilder(1);
1293*890232f2SAndroid Build Coastguard Worker         String testString = "My string";
1294*890232f2SAndroid Build Coastguard Worker         int offset = fb.createSharedString(testString);
1295*890232f2SAndroid Build Coastguard Worker         for (int i=0; i< 10; i++) {
1296*890232f2SAndroid Build Coastguard Worker             TestEq(offset, fb.createSharedString(testString));
1297*890232f2SAndroid Build Coastguard Worker         }
1298*890232f2SAndroid Build Coastguard Worker     }
1299*890232f2SAndroid Build Coastguard Worker 
TestScalarOptional()1300*890232f2SAndroid Build Coastguard Worker     static void TestScalarOptional() {
1301*890232f2SAndroid Build Coastguard Worker         FlatBufferBuilder fbb = new FlatBufferBuilder(1);
1302*890232f2SAndroid Build Coastguard Worker         ScalarStuff.startScalarStuff(fbb);
1303*890232f2SAndroid Build Coastguard Worker         int pos = ScalarStuff.endScalarStuff(fbb);
1304*890232f2SAndroid Build Coastguard Worker         fbb.finish(pos);
1305*890232f2SAndroid Build Coastguard Worker 
1306*890232f2SAndroid Build Coastguard Worker         ScalarStuff scalarStuff = ScalarStuff.getRootAsScalarStuff(fbb.dataBuffer());
1307*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justI8(), (byte)0);
1308*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeI8(), (byte)0);
1309*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultI8(), (byte)42);
1310*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justU8(), 0);
1311*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeU8(), 0);
1312*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultU8(), 42);
1313*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justI16(), (short)0);
1314*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeI16(), (short)0);
1315*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultI16(), (short)42);
1316*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justU16(), 0);
1317*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeU16(), 0);
1318*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultU16(), 42);
1319*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justI32(), 0);
1320*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeI32(), 0);
1321*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultI32(), 42);
1322*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justU32(), 0L);
1323*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeU32(), 0L);
1324*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultU32(), 42L);
1325*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justI64(), 0L);
1326*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeI64(), 0L);
1327*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultI64(), 42L);
1328*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justU64(), 0L);
1329*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeU64(), 0L);
1330*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultU64(), 42L);
1331*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justF32(), 0.0f);
1332*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeF32(), 0f);
1333*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultF32(), 42.0f);
1334*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justF64(), 0.0);
1335*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeF64(), 0.0);
1336*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultF64(), 42.0);
1337*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justBool(), false);
1338*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeBool(), false);
1339*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultBool(), true);
1340*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justEnum(), OptionalByte.None);
1341*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeEnum(), OptionalByte.None);
1342*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultEnum(), OptionalByte.One);
1343*890232f2SAndroid Build Coastguard Worker 
1344*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeI8(), false);
1345*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeI16(), false);
1346*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeI32(), false);
1347*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeI64(), false);
1348*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeU8(), false);
1349*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeU16(), false);
1350*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeU32(), false);
1351*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeU64(), false);
1352*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeF32(), false);
1353*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeF64(), false);
1354*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeBool(), false);
1355*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeEnum(), false);
1356*890232f2SAndroid Build Coastguard Worker 
1357*890232f2SAndroid Build Coastguard Worker         fbb.clear();
1358*890232f2SAndroid Build Coastguard Worker 
1359*890232f2SAndroid Build Coastguard Worker         ScalarStuff.startScalarStuff(fbb);
1360*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addJustI8(fbb, (byte)5);
1361*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addMaybeI8(fbb, (byte)5);
1362*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addDefaultI8(fbb, (byte)5);
1363*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addJustU8(fbb, 6);
1364*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addMaybeU8(fbb, 6);
1365*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addDefaultU8(fbb, 6);
1366*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addJustI16(fbb, (short)7);
1367*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addMaybeI16(fbb, (short)7);
1368*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addDefaultI16(fbb, (short)7);
1369*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addJustU16(fbb, 8);
1370*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addMaybeU16(fbb, 8);
1371*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addDefaultU16(fbb, 8);
1372*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addJustI32(fbb, 9);
1373*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addMaybeI32(fbb, 9);
1374*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addDefaultI32(fbb, 9);
1375*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addJustU32(fbb, (long)10);
1376*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addMaybeU32(fbb, (long)10);
1377*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addDefaultU32(fbb, (long)10);
1378*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addJustI64(fbb, 11L);
1379*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addMaybeI64(fbb, 11L);
1380*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addDefaultI64(fbb, 11L);
1381*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addJustU64(fbb, 12L);
1382*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addMaybeU64(fbb, 12L);
1383*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addDefaultU64(fbb, 12L);
1384*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addJustF32(fbb, 13.0f);
1385*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addMaybeF32(fbb, 13.0f);
1386*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addDefaultF32(fbb, 13.0f);
1387*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addJustF64(fbb, 14.0);
1388*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addMaybeF64(fbb, 14.0);
1389*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addDefaultF64(fbb, 14.0);
1390*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addJustBool(fbb, true);
1391*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addMaybeBool(fbb, true);
1392*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addDefaultBool(fbb, true);
1393*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addJustEnum(fbb, OptionalByte.Two);
1394*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addMaybeEnum(fbb, OptionalByte.Two);
1395*890232f2SAndroid Build Coastguard Worker         ScalarStuff.addDefaultEnum(fbb, OptionalByte.Two);
1396*890232f2SAndroid Build Coastguard Worker 
1397*890232f2SAndroid Build Coastguard Worker         pos = ScalarStuff.endScalarStuff(fbb);
1398*890232f2SAndroid Build Coastguard Worker 
1399*890232f2SAndroid Build Coastguard Worker         fbb.finish(pos);
1400*890232f2SAndroid Build Coastguard Worker 
1401*890232f2SAndroid Build Coastguard Worker         scalarStuff = ScalarStuff.getRootAsScalarStuff(fbb.dataBuffer());
1402*890232f2SAndroid Build Coastguard Worker 
1403*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justI8(), (byte)5);
1404*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeI8(), (byte)5);
1405*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultI8(), (byte)5);
1406*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justU8(), 6);
1407*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeU8(), 6);
1408*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultU8(), 6);
1409*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justI16(), (short)7);
1410*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeI16(), (short)7);
1411*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultI16(), (short)7);
1412*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justU16(), 8);
1413*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeU16(), 8);
1414*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultU16(), 8);
1415*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justI32(), 9);
1416*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeI32(), 9);
1417*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultI32(), 9);
1418*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justU32(), 10L);
1419*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeU32(), 10L);
1420*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultU32(), 10L);
1421*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justI64(), 11L);
1422*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeI64(), 11L);
1423*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultI64(), 11L);
1424*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justU64(), 12L);
1425*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeU64(), 12L);
1426*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultU64(), 12L);
1427*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justF32(), 13.0f);
1428*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeF32(), 13.0f);
1429*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultF32(), 13.0f);
1430*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justF64(), 14.0);
1431*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeF64(), 14.0);
1432*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultF64(), 14.0);
1433*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justBool(), true);
1434*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeBool(), true);
1435*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultBool(), true);
1436*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.justEnum(), OptionalByte.Two);
1437*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.maybeEnum(), OptionalByte.Two);
1438*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.defaultEnum(), OptionalByte.Two);
1439*890232f2SAndroid Build Coastguard Worker 
1440*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeI8(), true);
1441*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeI16(), true);
1442*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeI32(), true);
1443*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeI64(), true);
1444*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeU8(), true);
1445*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeU16(), true);
1446*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeU32(), true);
1447*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeU64(), true);
1448*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeF32(), true);
1449*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeF64(), true);
1450*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeBool(), true);
1451*890232f2SAndroid Build Coastguard Worker         TestEq(scalarStuff.hasMaybeEnum(), true);
1452*890232f2SAndroid Build Coastguard Worker     }
1453*890232f2SAndroid Build Coastguard Worker 
TestObject(MonsterT monster)1454*890232f2SAndroid Build Coastguard Worker     static void TestObject(MonsterT monster) {
1455*890232f2SAndroid Build Coastguard Worker         TestEq(monster.getHp(), (short) 80);
1456*890232f2SAndroid Build Coastguard Worker         TestEq(monster.getMana(), (short) 150);  // default
1457*890232f2SAndroid Build Coastguard Worker 
1458*890232f2SAndroid Build Coastguard Worker         TestEq(monster.getName(), "MyMonster");
1459*890232f2SAndroid Build Coastguard Worker         TestEq(monster.getColor(), Color.Blue);
1460*890232f2SAndroid Build Coastguard Worker         // monster.friendly() // can't access, deprecated
1461*890232f2SAndroid Build Coastguard Worker 
1462*890232f2SAndroid Build Coastguard Worker         Vec3T pos = monster.getPos();
1463*890232f2SAndroid Build Coastguard Worker         TestEq(pos.getX(), 1.0f);
1464*890232f2SAndroid Build Coastguard Worker         TestEq(pos.getY(), 2.0f);
1465*890232f2SAndroid Build Coastguard Worker         TestEq(pos.getZ(), 3.0f);
1466*890232f2SAndroid Build Coastguard Worker         TestEq(pos.getTest1(), 3.0);
1467*890232f2SAndroid Build Coastguard Worker         // issue: int != byte
1468*890232f2SAndroid Build Coastguard Worker         TestEq(pos.getTest2(), (int) Color.Green);
1469*890232f2SAndroid Build Coastguard Worker         TestT t = pos.getTest3();
1470*890232f2SAndroid Build Coastguard Worker         TestEq(t.getA(), (short) 5);
1471*890232f2SAndroid Build Coastguard Worker         TestEq(t.getB(), (byte) 6);
1472*890232f2SAndroid Build Coastguard Worker 
1473*890232f2SAndroid Build Coastguard Worker         TestEq(monster.getTest().getType(), (byte) Any.Monster);
1474*890232f2SAndroid Build Coastguard Worker         MonsterT monster2 = (MonsterT) monster.getTest().getValue();
1475*890232f2SAndroid Build Coastguard Worker         TestEq(monster2 != null, true);
1476*890232f2SAndroid Build Coastguard Worker         TestEq(monster2.getName(), "Fred");
1477*890232f2SAndroid Build Coastguard Worker 
1478*890232f2SAndroid Build Coastguard Worker         int[] inv = monster.getInventory();
1479*890232f2SAndroid Build Coastguard Worker         TestEq(inv.length, 5);
1480*890232f2SAndroid Build Coastguard Worker         int[] expInv = {0, 1, 2, 3, 4};
1481*890232f2SAndroid Build Coastguard Worker         for (int i = 0; i < inv.length; i++)
1482*890232f2SAndroid Build Coastguard Worker             TestEq(expInv[i], inv[i]);
1483*890232f2SAndroid Build Coastguard Worker 
1484*890232f2SAndroid Build Coastguard Worker         TestT[] test4 = monster.getTest4();
1485*890232f2SAndroid Build Coastguard Worker         TestT test_0 = test4[0];
1486*890232f2SAndroid Build Coastguard Worker         TestT test_1 = test4[1];
1487*890232f2SAndroid Build Coastguard Worker         TestEq(test4.length, 2);
1488*890232f2SAndroid Build Coastguard Worker         TestEq(test_0.getA(), (short) 10);
1489*890232f2SAndroid Build Coastguard Worker         TestEq(test_0.getB(), (byte) 20);
1490*890232f2SAndroid Build Coastguard Worker         TestEq(test_1.getA(), (short) 30);
1491*890232f2SAndroid Build Coastguard Worker         TestEq(test_1.getB(), (byte) 40);
1492*890232f2SAndroid Build Coastguard Worker 
1493*890232f2SAndroid Build Coastguard Worker         String[] testarrayofstring = monster.getTestarrayofstring();
1494*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayofstring.length, 2);
1495*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayofstring[0], "test1");
1496*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayofstring[1], "test2");
1497*890232f2SAndroid Build Coastguard Worker 
1498*890232f2SAndroid Build Coastguard Worker         MonsterT[] testarrayoftables = monster.getTestarrayoftables();
1499*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayoftables.length, 0);
1500*890232f2SAndroid Build Coastguard Worker 
1501*890232f2SAndroid Build Coastguard Worker         MonsterT enemy = monster.getEnemy();
1502*890232f2SAndroid Build Coastguard Worker         TestEq(enemy != null, true);
1503*890232f2SAndroid Build Coastguard Worker         TestEq(enemy.getName(), "Fred");
1504*890232f2SAndroid Build Coastguard Worker 
1505*890232f2SAndroid Build Coastguard Worker         int[] testnestedflatbuffer = monster.getTestnestedflatbuffer();
1506*890232f2SAndroid Build Coastguard Worker         TestEq(testnestedflatbuffer.length, 0);
1507*890232f2SAndroid Build Coastguard Worker 
1508*890232f2SAndroid Build Coastguard Worker         TestEq(monster.getTestempty() == null, true);
1509*890232f2SAndroid Build Coastguard Worker 
1510*890232f2SAndroid Build Coastguard Worker         TestEq(monster.getTestbool(), true);
1511*890232f2SAndroid Build Coastguard Worker 
1512*890232f2SAndroid Build Coastguard Worker         boolean[] testarrayofbools = monster.getTestarrayofbools();
1513*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayofbools.length, 3);
1514*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayofbools[0], true);
1515*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayofbools[1], false);
1516*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayofbools[2], true);
1517*890232f2SAndroid Build Coastguard Worker 
1518*890232f2SAndroid Build Coastguard Worker         TestEq(monster.getTestf(), 3.14159f);
1519*890232f2SAndroid Build Coastguard Worker         TestEq(monster.getTestf2(), 3.0f);
1520*890232f2SAndroid Build Coastguard Worker         TestEq(monster.getTestf3(), 0.0f);
1521*890232f2SAndroid Build Coastguard Worker         TestEq(monster.getTestf3(), 0.0f);
1522*890232f2SAndroid Build Coastguard Worker 
1523*890232f2SAndroid Build Coastguard Worker         AbilityT[] testarrayofsortedstruct = monster.getTestarrayofsortedstruct();
1524*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayofsortedstruct.length, 3);
1525*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayofsortedstruct[0].getId(), (long) 0);
1526*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayofsortedstruct[1].getId(), (long) 1);
1527*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayofsortedstruct[2].getId(), (long) 5);
1528*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayofsortedstruct[0].getDistance(), (long) 45);
1529*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayofsortedstruct[1].getDistance(), (long) 21);
1530*890232f2SAndroid Build Coastguard Worker         TestEq(testarrayofsortedstruct[2].getDistance(), (long) 12);
1531*890232f2SAndroid Build Coastguard Worker 
1532*890232f2SAndroid Build Coastguard Worker         int[] flex = monster.getFlex();
1533*890232f2SAndroid Build Coastguard Worker         TestEq(flex.length, 0);
1534*890232f2SAndroid Build Coastguard Worker 
1535*890232f2SAndroid Build Coastguard Worker         long[] vectorOfLongs = monster.getVectorOfLongs();
1536*890232f2SAndroid Build Coastguard Worker         TestEq(vectorOfLongs.length, 5);
1537*890232f2SAndroid Build Coastguard Worker         long l = 1;
1538*890232f2SAndroid Build Coastguard Worker         for (int i = 0; i < vectorOfLongs.length; i++) {
1539*890232f2SAndroid Build Coastguard Worker             TestEq(vectorOfLongs[i], l);
1540*890232f2SAndroid Build Coastguard Worker             l *= 100;
1541*890232f2SAndroid Build Coastguard Worker         }
1542*890232f2SAndroid Build Coastguard Worker 
1543*890232f2SAndroid Build Coastguard Worker         double[] vectorOfDoubles = monster.getVectorOfDoubles();
1544*890232f2SAndroid Build Coastguard Worker         TestEq(vectorOfDoubles.length, 3);
1545*890232f2SAndroid Build Coastguard Worker         TestEq(vectorOfDoubles[0], -1.7976931348623157E308);
1546*890232f2SAndroid Build Coastguard Worker         TestEq(vectorOfDoubles[1], 0.0);
1547*890232f2SAndroid Build Coastguard Worker         TestEq(vectorOfDoubles[2], 1.7976931348623157E308);
1548*890232f2SAndroid Build Coastguard Worker 
1549*890232f2SAndroid Build Coastguard Worker         TestEq(monster.getParentNamespaceTest() == null, true);
1550*890232f2SAndroid Build Coastguard Worker         ReferrableT[] vectorOfReferrables = monster.getVectorOfReferrables();
1551*890232f2SAndroid Build Coastguard Worker         TestEq(vectorOfReferrables.length, 0);
1552*890232f2SAndroid Build Coastguard Worker 
1553*890232f2SAndroid Build Coastguard Worker         TestEq(monster.getSignedEnum(), (byte) -1);
1554*890232f2SAndroid Build Coastguard Worker     }
1555*890232f2SAndroid Build Coastguard Worker 
TestPackUnpack(ByteBuffer bb)1556*890232f2SAndroid Build Coastguard Worker     static void TestPackUnpack(ByteBuffer bb) {
1557*890232f2SAndroid Build Coastguard Worker         Monster m = Monster.getRootAsMonster(bb);
1558*890232f2SAndroid Build Coastguard Worker         MonsterT mObject = m.unpack();
1559*890232f2SAndroid Build Coastguard Worker         TestObject(mObject);
1560*890232f2SAndroid Build Coastguard Worker         FlatBufferBuilder fbb = new FlatBufferBuilder();
1561*890232f2SAndroid Build Coastguard Worker         int monster = Monster.pack(fbb, mObject);
1562*890232f2SAndroid Build Coastguard Worker         Monster.finishMonsterBuffer(fbb, monster);
1563*890232f2SAndroid Build Coastguard Worker         TestBuffer(fbb.dataBuffer());
1564*890232f2SAndroid Build Coastguard Worker 
1565*890232f2SAndroid Build Coastguard Worker         byte[] bytes = mObject.serializeToBinary();
1566*890232f2SAndroid Build Coastguard Worker         MonsterT newMonsterT = MonsterT.deserializeFromBinary(bytes);
1567*890232f2SAndroid Build Coastguard Worker         TestObject(newMonsterT);
1568*890232f2SAndroid Build Coastguard Worker     }
1569*890232f2SAndroid Build Coastguard Worker 
TestEq(T a, T b)1570*890232f2SAndroid Build Coastguard Worker     static <T> void TestEq(T a, T b) {
1571*890232f2SAndroid Build Coastguard Worker         if ((a == null && a != b) || (a != null && !a.equals(b))) {
1572*890232f2SAndroid Build Coastguard Worker             System.out.println("" + a.getClass().getName() + " " + b.getClass().getName());
1573*890232f2SAndroid Build Coastguard Worker             System.out.println("FlatBuffers test FAILED: \'" + a + "\' != \'" + b + "\'");
1574*890232f2SAndroid Build Coastguard Worker             new Throwable().printStackTrace();
1575*890232f2SAndroid Build Coastguard Worker             assert false;
1576*890232f2SAndroid Build Coastguard Worker             System.exit(1);
1577*890232f2SAndroid Build Coastguard Worker         }
1578*890232f2SAndroid Build Coastguard Worker     }
1579*890232f2SAndroid Build Coastguard Worker 
1580*890232f2SAndroid Build Coastguard Worker }
1581