xref: /aosp_15_r20/external/flatbuffers/tests/FlatBuffers.Test/FlatBuffersExampleTests.cs (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Worker /*
2*890232f2SAndroid Build Coastguard Worker  * Copyright 2014 Google Inc. All rights reserved.
3*890232f2SAndroid Build Coastguard Worker  *
4*890232f2SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*890232f2SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*890232f2SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*890232f2SAndroid Build Coastguard Worker  *
8*890232f2SAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
9*890232f2SAndroid Build Coastguard Worker  *
10*890232f2SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*890232f2SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*890232f2SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*890232f2SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*890232f2SAndroid Build Coastguard Worker  * limitations under the License.
15*890232f2SAndroid Build Coastguard Worker  */
16*890232f2SAndroid Build Coastguard Worker 
17*890232f2SAndroid Build Coastguard Worker using System.IO;
18*890232f2SAndroid Build Coastguard Worker using System.Text;
19*890232f2SAndroid Build Coastguard Worker using System.Threading;
20*890232f2SAndroid Build Coastguard Worker using MyGame.Example;
21*890232f2SAndroid Build Coastguard Worker using optional_scalars;
22*890232f2SAndroid Build Coastguard Worker using KeywordTest;
23*890232f2SAndroid Build Coastguard Worker 
24*890232f2SAndroid Build Coastguard Worker namespace FlatBuffers.Test
25*890232f2SAndroid Build Coastguard Worker {
26*890232f2SAndroid Build Coastguard Worker     [FlatBuffersTestClass]
27*890232f2SAndroid Build Coastguard Worker     public class FlatBuffersExampleTests
28*890232f2SAndroid Build Coastguard Worker     {
RunTests()29*890232f2SAndroid Build Coastguard Worker         public void RunTests()
30*890232f2SAndroid Build Coastguard Worker         {
31*890232f2SAndroid Build Coastguard Worker             CanCreateNewFlatBufferFromScratch();
32*890232f2SAndroid Build Coastguard Worker             CanReadCppGeneratedWireFile();
33*890232f2SAndroid Build Coastguard Worker             TestEnums();
34*890232f2SAndroid Build Coastguard Worker         }
35*890232f2SAndroid Build Coastguard Worker 
36*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
CanCreateNewFlatBufferFromScratch()37*890232f2SAndroid Build Coastguard Worker         public void CanCreateNewFlatBufferFromScratch()
38*890232f2SAndroid Build Coastguard Worker         {
39*890232f2SAndroid Build Coastguard Worker             CanCreateNewFlatBufferFromScratch(true);
40*890232f2SAndroid Build Coastguard Worker             CanCreateNewFlatBufferFromScratch(false);
41*890232f2SAndroid Build Coastguard Worker         }
42*890232f2SAndroid Build Coastguard Worker 
CanCreateNewFlatBufferFromScratch(bool sizePrefix)43*890232f2SAndroid Build Coastguard Worker         private void CanCreateNewFlatBufferFromScratch(bool sizePrefix)
44*890232f2SAndroid Build Coastguard Worker         {
45*890232f2SAndroid Build Coastguard Worker             // Second, let's create a FlatBuffer from scratch in C#, and test it also.
46*890232f2SAndroid Build Coastguard Worker             // We use an initial size of 1 to exercise the reallocation algorithm,
47*890232f2SAndroid Build Coastguard Worker             // normally a size larger than the typical FlatBuffer you generate would be
48*890232f2SAndroid Build Coastguard Worker             // better for performance.
49*890232f2SAndroid Build Coastguard Worker             var fbb = new FlatBufferBuilder(1);
50*890232f2SAndroid Build Coastguard Worker 
51*890232f2SAndroid Build Coastguard Worker             StringOffset[] names = { fbb.CreateString("Frodo"), fbb.CreateString("Barney"), fbb.CreateString("Wilma") };
52*890232f2SAndroid Build Coastguard Worker             Offset<Monster>[] off = new Offset<Monster>[3];
53*890232f2SAndroid Build Coastguard Worker             Monster.StartMonster(fbb);
54*890232f2SAndroid Build Coastguard Worker             Monster.AddName(fbb, names[0]);
55*890232f2SAndroid Build Coastguard Worker             off[0] = Monster.EndMonster(fbb);
56*890232f2SAndroid Build Coastguard Worker             Monster.StartMonster(fbb);
57*890232f2SAndroid Build Coastguard Worker             Monster.AddName(fbb, names[1]);
58*890232f2SAndroid Build Coastguard Worker             off[1] = Monster.EndMonster(fbb);
59*890232f2SAndroid Build Coastguard Worker             Monster.StartMonster(fbb);
60*890232f2SAndroid Build Coastguard Worker             Monster.AddName(fbb, names[2]);
61*890232f2SAndroid Build Coastguard Worker             off[2] = Monster.EndMonster(fbb);
62*890232f2SAndroid Build Coastguard Worker             var sortMons = Monster.CreateSortedVectorOfMonster(fbb, off);
63*890232f2SAndroid Build Coastguard Worker 
64*890232f2SAndroid Build Coastguard Worker             // We set up the same values as monsterdata.json:
65*890232f2SAndroid Build Coastguard Worker 
66*890232f2SAndroid Build Coastguard Worker             var str = fbb.CreateString("MyMonster");
67*890232f2SAndroid Build Coastguard Worker             var test1 = fbb.CreateString("test1");
68*890232f2SAndroid Build Coastguard Worker             var test2 = fbb.CreateString("test2");
69*890232f2SAndroid Build Coastguard Worker 
70*890232f2SAndroid Build Coastguard Worker 
71*890232f2SAndroid Build Coastguard Worker             Monster.StartInventoryVector(fbb, 5);
72*890232f2SAndroid Build Coastguard Worker             for (int i = 4; i >= 0; i--)
73*890232f2SAndroid Build Coastguard Worker             {
74*890232f2SAndroid Build Coastguard Worker                 fbb.AddByte((byte)i);
75*890232f2SAndroid Build Coastguard Worker             }
76*890232f2SAndroid Build Coastguard Worker             var inv = fbb.EndVector();
77*890232f2SAndroid Build Coastguard Worker 
78*890232f2SAndroid Build Coastguard Worker             var fred = fbb.CreateString("Fred");
79*890232f2SAndroid Build Coastguard Worker             Monster.StartMonster(fbb);
80*890232f2SAndroid Build Coastguard Worker             Monster.AddName(fbb, fred);
81*890232f2SAndroid Build Coastguard Worker             var mon2 = Monster.EndMonster(fbb);
82*890232f2SAndroid Build Coastguard Worker 
83*890232f2SAndroid Build Coastguard Worker             Monster.StartTest4Vector(fbb, 2);
84*890232f2SAndroid Build Coastguard Worker             MyGame.Example.Test.CreateTest(fbb, (short)10, (sbyte)20);
85*890232f2SAndroid Build Coastguard Worker             MyGame.Example.Test.CreateTest(fbb, (short)30, (sbyte)40);
86*890232f2SAndroid Build Coastguard Worker             var test4 = fbb.EndVector();
87*890232f2SAndroid Build Coastguard Worker 
88*890232f2SAndroid Build Coastguard Worker             Monster.StartTestarrayofstringVector(fbb, 2);
89*890232f2SAndroid Build Coastguard Worker             fbb.AddOffset(test2.Value);
90*890232f2SAndroid Build Coastguard Worker             fbb.AddOffset(test1.Value);
91*890232f2SAndroid Build Coastguard Worker             var testArrayOfString = fbb.EndVector();
92*890232f2SAndroid Build Coastguard Worker 
93*890232f2SAndroid Build Coastguard Worker             Monster.StartMonster(fbb);
94*890232f2SAndroid Build Coastguard Worker             Monster.AddPos(fbb, Vec3.CreateVec3(fbb, 1.0f, 2.0f, 3.0f, 3.0,
95*890232f2SAndroid Build Coastguard Worker                                                      Color.Green, (short)5, (sbyte)6));
96*890232f2SAndroid Build Coastguard Worker             Monster.AddHp(fbb, (short)80);
97*890232f2SAndroid Build Coastguard Worker             Monster.AddName(fbb, str);
98*890232f2SAndroid Build Coastguard Worker             Monster.AddInventory(fbb, inv);
99*890232f2SAndroid Build Coastguard Worker             Monster.AddTestType(fbb, Any.Monster);
100*890232f2SAndroid Build Coastguard Worker             Monster.AddTest(fbb, mon2.Value);
101*890232f2SAndroid Build Coastguard Worker             Monster.AddTest4(fbb, test4);
102*890232f2SAndroid Build Coastguard Worker             Monster.AddTestarrayofstring(fbb, testArrayOfString);
103*890232f2SAndroid Build Coastguard Worker             Monster.AddTestbool(fbb, true);
104*890232f2SAndroid Build Coastguard Worker             Monster.AddTestarrayoftables(fbb, sortMons);
105*890232f2SAndroid Build Coastguard Worker             var mon = Monster.EndMonster(fbb);
106*890232f2SAndroid Build Coastguard Worker 
107*890232f2SAndroid Build Coastguard Worker             if (sizePrefix)
108*890232f2SAndroid Build Coastguard Worker             {
109*890232f2SAndroid Build Coastguard Worker                 Monster.FinishSizePrefixedMonsterBuffer(fbb, mon);
110*890232f2SAndroid Build Coastguard Worker             }
111*890232f2SAndroid Build Coastguard Worker             else
112*890232f2SAndroid Build Coastguard Worker             {
113*890232f2SAndroid Build Coastguard Worker                 Monster.FinishMonsterBuffer(fbb, mon);
114*890232f2SAndroid Build Coastguard Worker             }
115*890232f2SAndroid Build Coastguard Worker 
116*890232f2SAndroid Build Coastguard Worker             // Dump to output directory so we can inspect later, if needed
117*890232f2SAndroid Build Coastguard Worker             #if ENABLE_SPAN_T
118*890232f2SAndroid Build Coastguard Worker             var data = fbb.DataBuffer.ToSizedArray();
119*890232f2SAndroid Build Coastguard Worker             string filename = @"monsterdata_cstest" + (sizePrefix ? "_sp" : "") + ".mon";
120*890232f2SAndroid Build Coastguard Worker             File.WriteAllBytes(filename, data);
121*890232f2SAndroid Build Coastguard Worker             #else
122*890232f2SAndroid Build Coastguard Worker             using (var ms = fbb.DataBuffer.ToMemoryStream(fbb.DataBuffer.Position, fbb.Offset))
123*890232f2SAndroid Build Coastguard Worker             {
124*890232f2SAndroid Build Coastguard Worker                 var data = ms.ToArray();
125*890232f2SAndroid Build Coastguard Worker                 string filename = @"monsterdata_cstest" + (sizePrefix ? "_sp" : "") + ".mon";
126*890232f2SAndroid Build Coastguard Worker                 File.WriteAllBytes(filename, data);
127*890232f2SAndroid Build Coastguard Worker             }
128*890232f2SAndroid Build Coastguard Worker             #endif
129*890232f2SAndroid Build Coastguard Worker 
130*890232f2SAndroid Build Coastguard Worker             // Remove the size prefix if necessary for further testing
131*890232f2SAndroid Build Coastguard Worker             ByteBuffer dataBuffer = fbb.DataBuffer;
132*890232f2SAndroid Build Coastguard Worker             if (sizePrefix)
133*890232f2SAndroid Build Coastguard Worker             {
134*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(ByteBufferUtil.GetSizePrefix(dataBuffer) + FlatBufferConstants.SizePrefixLength,
135*890232f2SAndroid Build Coastguard Worker                                 dataBuffer.Length - dataBuffer.Position);
136*890232f2SAndroid Build Coastguard Worker                 dataBuffer = ByteBufferUtil.RemoveSizePrefix(dataBuffer);
137*890232f2SAndroid Build Coastguard Worker             }
138*890232f2SAndroid Build Coastguard Worker 
139*890232f2SAndroid Build Coastguard Worker             // Now assert the buffer
140*890232f2SAndroid Build Coastguard Worker             TestBuffer(dataBuffer);
141*890232f2SAndroid Build Coastguard Worker 
142*890232f2SAndroid Build Coastguard Worker             //Attempt to mutate Monster fields and check whether the buffer has been mutated properly
143*890232f2SAndroid Build Coastguard Worker             // revert to original values after testing
144*890232f2SAndroid Build Coastguard Worker             Monster monster = Monster.GetRootAsMonster(dataBuffer);
145*890232f2SAndroid Build Coastguard Worker 
146*890232f2SAndroid Build Coastguard Worker 
147*890232f2SAndroid Build Coastguard Worker             // mana is optional and does not exist in the buffer so the mutation should fail
148*890232f2SAndroid Build Coastguard Worker             // the mana field should retain its default value
149*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(monster.MutateMana((short)10), false);
150*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(monster.Mana, (short)150);
151*890232f2SAndroid Build Coastguard Worker 
152*890232f2SAndroid Build Coastguard Worker             // Accessing a vector of sorted by the key tables
153*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(monster.Testarrayoftables(0).Value.Name, "Barney");
154*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(monster.Testarrayoftables(1).Value.Name, "Frodo");
155*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(monster.Testarrayoftables(2).Value.Name, "Wilma");
156*890232f2SAndroid Build Coastguard Worker 
157*890232f2SAndroid Build Coastguard Worker             // Example of searching for a table by the key
158*890232f2SAndroid Build Coastguard Worker             Assert.IsTrue(monster.TestarrayoftablesByKey("Frodo") != null);
159*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(monster.TestarrayoftablesByKey("Frodo").Value.Name, "Frodo");
160*890232f2SAndroid Build Coastguard Worker             Assert.IsTrue(monster.TestarrayoftablesByKey("Barney") != null);
161*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(monster.TestarrayoftablesByKey("Barney").Value.Name, "Barney");
162*890232f2SAndroid Build Coastguard Worker             Assert.IsTrue(monster.TestarrayoftablesByKey("Wilma") != null);
163*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(monster.TestarrayoftablesByKey("Wilma").Value.Name, "Wilma");
164*890232f2SAndroid Build Coastguard Worker 
165*890232f2SAndroid Build Coastguard Worker             // testType is an existing field
166*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(monster.TestType, Any.Monster);
167*890232f2SAndroid Build Coastguard Worker 
168*890232f2SAndroid Build Coastguard Worker             //mutate the inventory vector
169*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(monster.MutateInventory(0, 1), true);
170*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(monster.MutateInventory(1, 2), true);
171*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(monster.MutateInventory(2, 3), true);
172*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(monster.MutateInventory(3, 4), true);
173*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(monster.MutateInventory(4, 5), true);
174*890232f2SAndroid Build Coastguard Worker 
175*890232f2SAndroid Build Coastguard Worker             for (int i = 0; i < monster.InventoryLength; i++)
176*890232f2SAndroid Build Coastguard Worker             {
177*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(monster.Inventory(i), i + 1);
178*890232f2SAndroid Build Coastguard Worker             }
179*890232f2SAndroid Build Coastguard Worker 
180*890232f2SAndroid Build Coastguard Worker             //reverse mutation
181*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(monster.MutateInventory(0, 0), true);
182*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(monster.MutateInventory(1, 1), true);
183*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(monster.MutateInventory(2, 2), true);
184*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(monster.MutateInventory(3, 3), true);
185*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(monster.MutateInventory(4, 4), true);
186*890232f2SAndroid Build Coastguard Worker 
187*890232f2SAndroid Build Coastguard Worker             // get a struct field and edit one of its fields
188*890232f2SAndroid Build Coastguard Worker             Vec3 pos = (Vec3)monster.Pos;
189*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(pos.X, 1.0f);
190*890232f2SAndroid Build Coastguard Worker             pos.MutateX(55.0f);
191*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(pos.X, 55.0f);
192*890232f2SAndroid Build Coastguard Worker             pos.MutateX(1.0f);
193*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(pos.X, 1.0f);
194*890232f2SAndroid Build Coastguard Worker 
195*890232f2SAndroid Build Coastguard Worker             TestBuffer(dataBuffer);
196*890232f2SAndroid Build Coastguard Worker             TestObjectAPI(Monster.GetRootAsMonster(dataBuffer));
197*890232f2SAndroid Build Coastguard Worker         }
198*890232f2SAndroid Build Coastguard Worker 
TestBuffer(ByteBuffer bb)199*890232f2SAndroid Build Coastguard Worker         private void TestBuffer(ByteBuffer bb)
200*890232f2SAndroid Build Coastguard Worker         {
201*890232f2SAndroid Build Coastguard Worker             Monster monster = Monster.GetRootAsMonster(bb);
202*890232f2SAndroid Build Coastguard Worker 
203*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(80, monster.Hp);
204*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(150, monster.Mana);
205*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual("MyMonster", monster.Name);
206*890232f2SAndroid Build Coastguard Worker 
207*890232f2SAndroid Build Coastguard Worker             var pos = monster.Pos.Value;
208*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(1.0f, pos.X);
209*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(2.0f, pos.Y);
210*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(3.0f, pos.Z);
211*890232f2SAndroid Build Coastguard Worker 
212*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(3.0f, pos.Test1);
213*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(Color.Green, pos.Test2);
214*890232f2SAndroid Build Coastguard Worker             var t = (MyGame.Example.Test)pos.Test3;
215*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((short)5, t.A);
216*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((sbyte)6, t.B);
217*890232f2SAndroid Build Coastguard Worker 
218*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(Any.Monster, monster.TestType);
219*890232f2SAndroid Build Coastguard Worker 
220*890232f2SAndroid Build Coastguard Worker             var monster2 = monster.Test<Monster>().Value;
221*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual("Fred", monster2.Name);
222*890232f2SAndroid Build Coastguard Worker 
223*890232f2SAndroid Build Coastguard Worker 
224*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(5, monster.InventoryLength);
225*890232f2SAndroid Build Coastguard Worker             var invsum = 0;
226*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < monster.InventoryLength; i++)
227*890232f2SAndroid Build Coastguard Worker             {
228*890232f2SAndroid Build Coastguard Worker                 invsum += monster.Inventory(i);
229*890232f2SAndroid Build Coastguard Worker             }
230*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(10, invsum);
231*890232f2SAndroid Build Coastguard Worker 
232*890232f2SAndroid Build Coastguard Worker             // Get the inventory as an array and subtract the
233*890232f2SAndroid Build Coastguard Worker             // sum to get it back to 0
234*890232f2SAndroid Build Coastguard Worker             var inventoryArray = monster.GetInventoryArray();
235*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(5, inventoryArray.Length);
236*890232f2SAndroid Build Coastguard Worker             foreach(var inv in inventoryArray)
237*890232f2SAndroid Build Coastguard Worker             {
238*890232f2SAndroid Build Coastguard Worker                 invsum -= inv;
239*890232f2SAndroid Build Coastguard Worker             }
240*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(0, invsum);
241*890232f2SAndroid Build Coastguard Worker 
242*890232f2SAndroid Build Coastguard Worker             var test0 = monster.Test4(0).Value;
243*890232f2SAndroid Build Coastguard Worker             var test1 = monster.Test4(1).Value;
244*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(2, monster.Test4Length);
245*890232f2SAndroid Build Coastguard Worker 
246*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(100, test0.A + test0.B + test1.A + test1.B);
247*890232f2SAndroid Build Coastguard Worker 
248*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(2, monster.TestarrayofstringLength);
249*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual("test1", monster.Testarrayofstring(0));
250*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual("test2", monster.Testarrayofstring(1));
251*890232f2SAndroid Build Coastguard Worker 
252*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(true, monster.Testbool);
253*890232f2SAndroid Build Coastguard Worker 
254*890232f2SAndroid Build Coastguard Worker             #if ENABLE_SPAN_T
255*890232f2SAndroid Build Coastguard Worker             var nameBytes = monster.GetNameBytes();
256*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual("MyMonster", Encoding.UTF8.GetString(nameBytes.ToArray(), 0, nameBytes.Length));
257*890232f2SAndroid Build Coastguard Worker 
258*890232f2SAndroid Build Coastguard Worker             if (0 == monster.TestarrayofboolsLength)
259*890232f2SAndroid Build Coastguard Worker             {
260*890232f2SAndroid Build Coastguard Worker                 Assert.IsFalse(monster.GetTestarrayofboolsBytes().Length != 0);
261*890232f2SAndroid Build Coastguard Worker             }
262*890232f2SAndroid Build Coastguard Worker             else
263*890232f2SAndroid Build Coastguard Worker             {
264*890232f2SAndroid Build Coastguard Worker                 Assert.IsTrue(monster.GetTestarrayofboolsBytes().Length != 0);
265*890232f2SAndroid Build Coastguard Worker             }
266*890232f2SAndroid Build Coastguard Worker 
267*890232f2SAndroid Build Coastguard Worker             var longArrayBytes = monster.GetVectorOfLongsBytes();
268*890232f2SAndroid Build Coastguard Worker             Assert.IsTrue(monster.VectorOfLongsLength * 8 == longArrayBytes.Length);
269*890232f2SAndroid Build Coastguard Worker 
270*890232f2SAndroid Build Coastguard Worker             var doubleArrayBytes = monster.GetVectorOfDoublesBytes();
271*890232f2SAndroid Build Coastguard Worker             Assert.IsTrue(monster.VectorOfDoublesLength * 8 == doubleArrayBytes.Length);
272*890232f2SAndroid Build Coastguard Worker             #else
273*890232f2SAndroid Build Coastguard Worker             var nameBytes = monster.GetNameBytes().Value;
274*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual("MyMonster", Encoding.UTF8.GetString(nameBytes.Array, nameBytes.Offset, nameBytes.Count));
275*890232f2SAndroid Build Coastguard Worker 
276*890232f2SAndroid Build Coastguard Worker             if (0 == monster.TestarrayofboolsLength)
277*890232f2SAndroid Build Coastguard Worker             {
278*890232f2SAndroid Build Coastguard Worker                 Assert.IsFalse(monster.GetTestarrayofboolsBytes().HasValue);
279*890232f2SAndroid Build Coastguard Worker             }
280*890232f2SAndroid Build Coastguard Worker             else
281*890232f2SAndroid Build Coastguard Worker             {
282*890232f2SAndroid Build Coastguard Worker                 Assert.IsTrue(monster.GetTestarrayofboolsBytes().HasValue);
283*890232f2SAndroid Build Coastguard Worker             }
284*890232f2SAndroid Build Coastguard Worker             #endif
285*890232f2SAndroid Build Coastguard Worker         }
286*890232f2SAndroid Build Coastguard Worker 
287*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
CanReadCppGeneratedWireFile()288*890232f2SAndroid Build Coastguard Worker         public void CanReadCppGeneratedWireFile()
289*890232f2SAndroid Build Coastguard Worker         {
290*890232f2SAndroid Build Coastguard Worker             var data = File.ReadAllBytes(@"../monsterdata_test.mon");
291*890232f2SAndroid Build Coastguard Worker             var bb = new ByteBuffer(data);
292*890232f2SAndroid Build Coastguard Worker             TestBuffer(bb);
293*890232f2SAndroid Build Coastguard Worker             TestObjectAPI(Monster.GetRootAsMonster(bb));
294*890232f2SAndroid Build Coastguard Worker         }
295*890232f2SAndroid Build Coastguard Worker 
296*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
CanReadJsonFile()297*890232f2SAndroid Build Coastguard Worker         public void CanReadJsonFile()
298*890232f2SAndroid Build Coastguard Worker         {
299*890232f2SAndroid Build Coastguard Worker             var jsonText = File.ReadAllText(@"../monsterdata_test.json");
300*890232f2SAndroid Build Coastguard Worker             var mon = MonsterT.DeserializeFromJson(jsonText);
301*890232f2SAndroid Build Coastguard Worker             var fbb = new FlatBufferBuilder(1);
302*890232f2SAndroid Build Coastguard Worker             fbb.Finish(Monster.Pack(fbb, mon).Value);
303*890232f2SAndroid Build Coastguard Worker             TestBuffer(fbb.DataBuffer);
304*890232f2SAndroid Build Coastguard Worker         }
305*890232f2SAndroid Build Coastguard Worker 
306*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestEnums()307*890232f2SAndroid Build Coastguard Worker         public void TestEnums()
308*890232f2SAndroid Build Coastguard Worker         {
309*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual("Red", Color.Red.ToString());
310*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual("Blue", Color.Blue.ToString());
311*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual("NONE", Any.NONE.ToString());
312*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual("Monster", Any.Monster.ToString());
313*890232f2SAndroid Build Coastguard Worker         }
314*890232f2SAndroid Build Coastguard Worker 
315*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestVectorOfEnums()316*890232f2SAndroid Build Coastguard Worker         public void TestVectorOfEnums()
317*890232f2SAndroid Build Coastguard Worker         {
318*890232f2SAndroid Build Coastguard Worker             const string monsterName = "TestVectorOfEnumsMonster";
319*890232f2SAndroid Build Coastguard Worker             var colorVec = new Color[] { Color.Red, Color.Green, Color.Blue };
320*890232f2SAndroid Build Coastguard Worker             var fbb = new FlatBufferBuilder(32);
321*890232f2SAndroid Build Coastguard Worker             var str1 = fbb.CreateString(monsterName);
322*890232f2SAndroid Build Coastguard Worker             var vec1 = Monster.CreateVectorOfEnumsVector(fbb, colorVec);
323*890232f2SAndroid Build Coastguard Worker             Monster.StartMonster(fbb);
324*890232f2SAndroid Build Coastguard Worker             Monster.AddName(fbb, str1);
325*890232f2SAndroid Build Coastguard Worker             Monster.AddVectorOfEnums(fbb, vec1);
326*890232f2SAndroid Build Coastguard Worker             var monster1 = Monster.EndMonster(fbb);
327*890232f2SAndroid Build Coastguard Worker             Monster.FinishMonsterBuffer(fbb, monster1);
328*890232f2SAndroid Build Coastguard Worker 
329*890232f2SAndroid Build Coastguard Worker             var mons = Monster.GetRootAsMonster(fbb.DataBuffer);
330*890232f2SAndroid Build Coastguard Worker             var colors = mons.GetVectorOfEnumsArray();
331*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(colorVec, colors);
332*890232f2SAndroid Build Coastguard Worker 
333*890232f2SAndroid Build Coastguard Worker             TestObjectAPI(mons);
334*890232f2SAndroid Build Coastguard Worker         }
335*890232f2SAndroid Build Coastguard Worker 
336*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestNestedFlatBuffer()337*890232f2SAndroid Build Coastguard Worker         public void TestNestedFlatBuffer()
338*890232f2SAndroid Build Coastguard Worker         {
339*890232f2SAndroid Build Coastguard Worker             const string nestedMonsterName = "NestedMonsterName";
340*890232f2SAndroid Build Coastguard Worker             const short nestedMonsterHp = 600;
341*890232f2SAndroid Build Coastguard Worker             const short nestedMonsterMana = 1024;
342*890232f2SAndroid Build Coastguard Worker             // Create nested buffer as a Monster type
343*890232f2SAndroid Build Coastguard Worker             var fbb1 = new FlatBufferBuilder(16);
344*890232f2SAndroid Build Coastguard Worker             var str1 = fbb1.CreateString(nestedMonsterName);
345*890232f2SAndroid Build Coastguard Worker             Monster.StartMonster(fbb1);
346*890232f2SAndroid Build Coastguard Worker             Monster.AddName(fbb1, str1);
347*890232f2SAndroid Build Coastguard Worker             Monster.AddHp(fbb1, nestedMonsterHp);
348*890232f2SAndroid Build Coastguard Worker             Monster.AddMana(fbb1, nestedMonsterMana);
349*890232f2SAndroid Build Coastguard Worker             var monster1 = Monster.EndMonster(fbb1);
350*890232f2SAndroid Build Coastguard Worker             Monster.FinishMonsterBuffer(fbb1, monster1);
351*890232f2SAndroid Build Coastguard Worker             var fbb1Bytes = fbb1.SizedByteArray();
352*890232f2SAndroid Build Coastguard Worker             fbb1 = null;
353*890232f2SAndroid Build Coastguard Worker 
354*890232f2SAndroid Build Coastguard Worker             // Create a Monster which has the first buffer as a nested buffer
355*890232f2SAndroid Build Coastguard Worker             var fbb2 = new FlatBufferBuilder(16);
356*890232f2SAndroid Build Coastguard Worker             var str2 = fbb2.CreateString("My Monster");
357*890232f2SAndroid Build Coastguard Worker             var nestedBuffer = Monster.CreateTestnestedflatbufferVector(fbb2, fbb1Bytes);
358*890232f2SAndroid Build Coastguard Worker             Monster.StartMonster(fbb2);
359*890232f2SAndroid Build Coastguard Worker             Monster.AddName(fbb2, str2);
360*890232f2SAndroid Build Coastguard Worker             Monster.AddHp(fbb2, 50);
361*890232f2SAndroid Build Coastguard Worker             Monster.AddMana(fbb2, 32);
362*890232f2SAndroid Build Coastguard Worker             Monster.AddTestnestedflatbuffer(fbb2, nestedBuffer);
363*890232f2SAndroid Build Coastguard Worker             var monster = Monster.EndMonster(fbb2);
364*890232f2SAndroid Build Coastguard Worker             Monster.FinishMonsterBuffer(fbb2, monster);
365*890232f2SAndroid Build Coastguard Worker 
366*890232f2SAndroid Build Coastguard Worker             // Now test the data extracted from the nested buffer
367*890232f2SAndroid Build Coastguard Worker             var mons = Monster.GetRootAsMonster(fbb2.DataBuffer);
368*890232f2SAndroid Build Coastguard Worker             var nestedMonster = mons.GetTestnestedflatbufferAsMonster().Value;
369*890232f2SAndroid Build Coastguard Worker 
370*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(nestedMonsterMana, nestedMonster.Mana);
371*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(nestedMonsterHp, nestedMonster.Hp);
372*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(nestedMonsterName, nestedMonster.Name);
373*890232f2SAndroid Build Coastguard Worker 
374*890232f2SAndroid Build Coastguard Worker             TestObjectAPI(mons);
375*890232f2SAndroid Build Coastguard Worker             TestObjectAPI(nestedMonster);
376*890232f2SAndroid Build Coastguard Worker         }
377*890232f2SAndroid Build Coastguard Worker 
378*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestFixedLenghtArrays()379*890232f2SAndroid Build Coastguard Worker         public void TestFixedLenghtArrays()
380*890232f2SAndroid Build Coastguard Worker         {
381*890232f2SAndroid Build Coastguard Worker             FlatBufferBuilder builder = new FlatBufferBuilder(100);
382*890232f2SAndroid Build Coastguard Worker 
383*890232f2SAndroid Build Coastguard Worker             float   a;
384*890232f2SAndroid Build Coastguard Worker             int[]   b = new int[15];
385*890232f2SAndroid Build Coastguard Worker             sbyte   c;
386*890232f2SAndroid Build Coastguard Worker             int[,]  d_a = new int[2, 2];
387*890232f2SAndroid Build Coastguard Worker             TestEnum[]  d_b = new TestEnum[2];
388*890232f2SAndroid Build Coastguard Worker             TestEnum[,] d_c = new TestEnum[2, 2];
389*890232f2SAndroid Build Coastguard Worker             long[,]     d_d = new long[2, 2];
390*890232f2SAndroid Build Coastguard Worker             int         e;
391*890232f2SAndroid Build Coastguard Worker             long[]      f = new long[2];
392*890232f2SAndroid Build Coastguard Worker 
393*890232f2SAndroid Build Coastguard Worker             a = 0.5f;
394*890232f2SAndroid Build Coastguard Worker             for (int i = 0; i < 15; i++) b[i] = i;
395*890232f2SAndroid Build Coastguard Worker             c = 1;
396*890232f2SAndroid Build Coastguard Worker             d_a[0, 0] = 1;
397*890232f2SAndroid Build Coastguard Worker             d_a[0, 1] = 2;
398*890232f2SAndroid Build Coastguard Worker             d_a[1, 0] = 3;
399*890232f2SAndroid Build Coastguard Worker             d_a[1, 1] = 4;
400*890232f2SAndroid Build Coastguard Worker             d_b[0] = TestEnum.B;
401*890232f2SAndroid Build Coastguard Worker             d_b[1] = TestEnum.C;
402*890232f2SAndroid Build Coastguard Worker             d_c[0, 0] = TestEnum.A;
403*890232f2SAndroid Build Coastguard Worker             d_c[0, 1] = TestEnum.B;
404*890232f2SAndroid Build Coastguard Worker             d_c[1, 0] = TestEnum.C;
405*890232f2SAndroid Build Coastguard Worker             d_c[1, 1] = TestEnum.B;
406*890232f2SAndroid Build Coastguard Worker             d_d[0, 0] = -1;
407*890232f2SAndroid Build Coastguard Worker             d_d[0, 1] = 1;
408*890232f2SAndroid Build Coastguard Worker             d_d[1, 0] = -2;
409*890232f2SAndroid Build Coastguard Worker             d_d[1, 1] = 2;
410*890232f2SAndroid Build Coastguard Worker             e = 2;
411*890232f2SAndroid Build Coastguard Worker             f[0] = -1;
412*890232f2SAndroid Build Coastguard Worker             f[1] = 1;
413*890232f2SAndroid Build Coastguard Worker 
414*890232f2SAndroid Build Coastguard Worker             Offset<ArrayStruct> arrayOffset = ArrayStruct.CreateArrayStruct(
415*890232f2SAndroid Build Coastguard Worker                 builder, a, b, c, d_a, d_b, d_c, d_d, e, f);
416*890232f2SAndroid Build Coastguard Worker 
417*890232f2SAndroid Build Coastguard Worker             // Create a table with the ArrayStruct.
418*890232f2SAndroid Build Coastguard Worker             ArrayTable.StartArrayTable(builder);
419*890232f2SAndroid Build Coastguard Worker             ArrayTable.AddA(builder, arrayOffset);
420*890232f2SAndroid Build Coastguard Worker             Offset<ArrayTable> tableOffset = ArrayTable.EndArrayTable(builder);
421*890232f2SAndroid Build Coastguard Worker 
422*890232f2SAndroid Build Coastguard Worker             ArrayTable.FinishArrayTableBuffer(builder, tableOffset);
423*890232f2SAndroid Build Coastguard Worker 
424*890232f2SAndroid Build Coastguard Worker             ArrayTable table = ArrayTable.GetRootAsArrayTable(builder.DataBuffer);
425*890232f2SAndroid Build Coastguard Worker 
426*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(table.A.Value.A, 0.5f);
427*890232f2SAndroid Build Coastguard Worker             for (int i = 0; i < 15; i++) Assert.AreEqual(table.A.Value.B(i), i);
428*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(table.A.Value.C, (sbyte)1);
429*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(table.A.Value.D(0).A(0), 1);
430*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(table.A.Value.D(0).A(1), 2);
431*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(table.A.Value.D(1).A(0), 3);
432*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(table.A.Value.D(1).A(1), 4);
433*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(table.A.Value.D(0).B, TestEnum.B);
434*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(table.A.Value.D(1).B, TestEnum.C);
435*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(table.A.Value.D(0).C(0), TestEnum.A);
436*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(table.A.Value.D(0).C(1), TestEnum.B);
437*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(table.A.Value.D(1).C(0), TestEnum.C);
438*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(table.A.Value.D(1).C(1), TestEnum.B);
439*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(table.A.Value.D(0).D(0), -1);
440*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(table.A.Value.D(0).D(1), 1);
441*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(table.A.Value.D(1).D(0), -2);
442*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(table.A.Value.D(1).D(1), 2);
443*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(table.A.Value.E, 2);
444*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(table.A.Value.F(0), -1);
445*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(table.A.Value.F(1), 1);
446*890232f2SAndroid Build Coastguard Worker 
447*890232f2SAndroid Build Coastguard Worker             TestObjectAPI(table);
448*890232f2SAndroid Build Coastguard Worker         }
449*890232f2SAndroid Build Coastguard Worker 
450*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestUnionVector()451*890232f2SAndroid Build Coastguard Worker         public void TestUnionVector()
452*890232f2SAndroid Build Coastguard Worker         {
453*890232f2SAndroid Build Coastguard Worker             var fbb = new FlatBufferBuilder(100);
454*890232f2SAndroid Build Coastguard Worker             var rapunzel = Rapunzel.CreateRapunzel(fbb, 40).Value;
455*890232f2SAndroid Build Coastguard Worker 
456*890232f2SAndroid Build Coastguard Worker             var characterTypes = new[]
457*890232f2SAndroid Build Coastguard Worker             {
458*890232f2SAndroid Build Coastguard Worker                 Character.MuLan,
459*890232f2SAndroid Build Coastguard Worker                 Character.Belle,
460*890232f2SAndroid Build Coastguard Worker                 Character.Other,
461*890232f2SAndroid Build Coastguard Worker             };
462*890232f2SAndroid Build Coastguard Worker             var characterTypesOffset = Movie.CreateCharactersTypeVector(fbb, characterTypes);
463*890232f2SAndroid Build Coastguard Worker 
464*890232f2SAndroid Build Coastguard Worker             var characters = new[]
465*890232f2SAndroid Build Coastguard Worker             {
466*890232f2SAndroid Build Coastguard Worker                 Attacker.CreateAttacker(fbb, 10).Value,
467*890232f2SAndroid Build Coastguard Worker                 BookReader.CreateBookReader(fbb, 20).Value,
468*890232f2SAndroid Build Coastguard Worker                 fbb.CreateSharedString("Chip").Value,
469*890232f2SAndroid Build Coastguard Worker             };
470*890232f2SAndroid Build Coastguard Worker             var charactersOffset = Movie.CreateCharactersVector(fbb, characters);
471*890232f2SAndroid Build Coastguard Worker 
472*890232f2SAndroid Build Coastguard Worker             var movieOffset = Movie.CreateMovie(
473*890232f2SAndroid Build Coastguard Worker                 fbb,
474*890232f2SAndroid Build Coastguard Worker                 Character.Rapunzel,
475*890232f2SAndroid Build Coastguard Worker                 rapunzel,
476*890232f2SAndroid Build Coastguard Worker                 characterTypesOffset,
477*890232f2SAndroid Build Coastguard Worker                 charactersOffset);
478*890232f2SAndroid Build Coastguard Worker             Movie.FinishMovieBuffer(fbb, movieOffset);
479*890232f2SAndroid Build Coastguard Worker 
480*890232f2SAndroid Build Coastguard Worker             var movie = Movie.GetRootAsMovie(fbb.DataBuffer);
481*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(Character.Rapunzel, movie.MainCharacterType);
482*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(40, movie.MainCharacter<Rapunzel>().Value.HairLength);
483*890232f2SAndroid Build Coastguard Worker 
484*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(3, movie.CharactersLength);
485*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(Character.MuLan, movie.CharactersType(0));
486*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(10, movie.Characters<Attacker>(0).Value.SwordAttackDamage);
487*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(Character.Belle, movie.CharactersType(1));
488*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(20, movie.Characters<BookReader>(1).Value.BooksRead);
489*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(Character.Other, movie.CharactersType(2));
490*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual("Chip", movie.CharactersAsString(2));
491*890232f2SAndroid Build Coastguard Worker 
492*890232f2SAndroid Build Coastguard Worker             TestObjectAPI(movie);
493*890232f2SAndroid Build Coastguard Worker         }
494*890232f2SAndroid Build Coastguard Worker 
495*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestUnionUtility()496*890232f2SAndroid Build Coastguard Worker         public void TestUnionUtility()
497*890232f2SAndroid Build Coastguard Worker         {
498*890232f2SAndroid Build Coastguard Worker             var movie = new MovieT
499*890232f2SAndroid Build Coastguard Worker             {
500*890232f2SAndroid Build Coastguard Worker                 MainCharacter = CharacterUnion.FromRapunzel(new RapunzelT { HairLength = 40 }),
501*890232f2SAndroid Build Coastguard Worker                 Characters = new System.Collections.Generic.List<CharacterUnion>
502*890232f2SAndroid Build Coastguard Worker                 {
503*890232f2SAndroid Build Coastguard Worker                     CharacterUnion.FromMuLan(new AttackerT { SwordAttackDamage = 10 }),
504*890232f2SAndroid Build Coastguard Worker                     CharacterUnion.FromBelle(new BookReaderT { BooksRead = 20 }),
505*890232f2SAndroid Build Coastguard Worker                     CharacterUnion.FromOther("Chip"),
506*890232f2SAndroid Build Coastguard Worker                 },
507*890232f2SAndroid Build Coastguard Worker             };
508*890232f2SAndroid Build Coastguard Worker 
509*890232f2SAndroid Build Coastguard Worker             var fbb = new FlatBufferBuilder(100);
510*890232f2SAndroid Build Coastguard Worker             Movie.FinishMovieBuffer(fbb, Movie.Pack(fbb, movie));
511*890232f2SAndroid Build Coastguard Worker 
512*890232f2SAndroid Build Coastguard Worker             TestObjectAPI(Movie.GetRootAsMovie(fbb.DataBuffer));
513*890232f2SAndroid Build Coastguard Worker         }
514*890232f2SAndroid Build Coastguard Worker 
AreEqual(Monster a, MonsterT b)515*890232f2SAndroid Build Coastguard Worker         private void AreEqual(Monster a, MonsterT b)
516*890232f2SAndroid Build Coastguard Worker         {
517*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.Hp, b.Hp);
518*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.Mana, b.Mana);
519*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.Name, b.Name);
520*890232f2SAndroid Build Coastguard Worker 
521*890232f2SAndroid Build Coastguard Worker             var posA = a.Pos;
522*890232f2SAndroid Build Coastguard Worker             var posB = b.Pos;
523*890232f2SAndroid Build Coastguard Worker             if (posA != null)
524*890232f2SAndroid Build Coastguard Worker             {
525*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(posA.Value.X, posB.X);
526*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(posA.Value.Y, posB.Y);
527*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(posA.Value.Z, posB.Z);
528*890232f2SAndroid Build Coastguard Worker 
529*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(posA.Value.Test1, posB.Test1);
530*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(posA.Value.Test2, posB.Test2);
531*890232f2SAndroid Build Coastguard Worker                 var tA = posA.Value.Test3;
532*890232f2SAndroid Build Coastguard Worker                 var tB = posB.Test3;
533*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(tA.A, tB.A);
534*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(tA.B, tB.B);
535*890232f2SAndroid Build Coastguard Worker             }
536*890232f2SAndroid Build Coastguard Worker 
537*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.TestType, b.Test.Type);
538*890232f2SAndroid Build Coastguard Worker             if (a.TestType == Any.Monster)
539*890232f2SAndroid Build Coastguard Worker             {
540*890232f2SAndroid Build Coastguard Worker                 var monster2A = a.Test<Monster>().Value;
541*890232f2SAndroid Build Coastguard Worker                 var monster2B = b.Test.AsMonster();
542*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(monster2A.Name, monster2B.Name);
543*890232f2SAndroid Build Coastguard Worker             }
544*890232f2SAndroid Build Coastguard Worker 
545*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.InventoryLength, b.Inventory.Count);
546*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < a.InventoryLength; ++i)
547*890232f2SAndroid Build Coastguard Worker             {
548*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(a.Inventory(i), b.Inventory[i]);
549*890232f2SAndroid Build Coastguard Worker             }
550*890232f2SAndroid Build Coastguard Worker 
551*890232f2SAndroid Build Coastguard Worker             var inventoryArray = a.GetInventoryArray();
552*890232f2SAndroid Build Coastguard Worker             var inventoryArrayLength = inventoryArray == null ? 0 : inventoryArray.Length;
553*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(inventoryArrayLength, b.Inventory.Count);
554*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < inventoryArrayLength; ++i)
555*890232f2SAndroid Build Coastguard Worker             {
556*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(inventoryArray[i], b.Inventory[i]);
557*890232f2SAndroid Build Coastguard Worker             }
558*890232f2SAndroid Build Coastguard Worker 
559*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.Test4Length, b.Test4.Count);
560*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < a.Test4Length; ++i)
561*890232f2SAndroid Build Coastguard Worker             {
562*890232f2SAndroid Build Coastguard Worker                 var t4A = a.Test4(i);
563*890232f2SAndroid Build Coastguard Worker                 var t4B = b.Test4[i];
564*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(t4A.Value.A, t4B.A);
565*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(t4A.Value.B, t4B.B);
566*890232f2SAndroid Build Coastguard Worker             }
567*890232f2SAndroid Build Coastguard Worker 
568*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.TestarrayofstringLength, b.Testarrayofstring.Count);
569*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < a.TestarrayofstringLength; ++i)
570*890232f2SAndroid Build Coastguard Worker             {
571*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(a.Testarrayofstring(i), b.Testarrayofstring[i]);
572*890232f2SAndroid Build Coastguard Worker             }
573*890232f2SAndroid Build Coastguard Worker 
574*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.Testbool, b.Testbool);
575*890232f2SAndroid Build Coastguard Worker 
576*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.TestarrayofboolsLength, b.Testarrayofbools.Count);
577*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < a.TestarrayofboolsLength; ++i)
578*890232f2SAndroid Build Coastguard Worker             {
579*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(a.Testarrayofbools(i), b.Testarrayofbools[i]);
580*890232f2SAndroid Build Coastguard Worker             }
581*890232f2SAndroid Build Coastguard Worker 
582*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.VectorOfLongsLength, b.VectorOfLongs.Count);
583*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < a.VectorOfLongsLength; ++i)
584*890232f2SAndroid Build Coastguard Worker             {
585*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(a.VectorOfLongs(i), b.VectorOfLongs[i]);
586*890232f2SAndroid Build Coastguard Worker             }
587*890232f2SAndroid Build Coastguard Worker 
588*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.VectorOfDoublesLength, b.VectorOfDoubles.Count);
589*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < a.VectorOfDoublesLength; ++i)
590*890232f2SAndroid Build Coastguard Worker             {
591*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(a.VectorOfDoubles(i), b.VectorOfDoubles[i]);
592*890232f2SAndroid Build Coastguard Worker             }
593*890232f2SAndroid Build Coastguard Worker 
594*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.VectorOfEnumsLength, b.VectorOfEnums.Count);
595*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < a.VectorOfEnumsLength; ++i)
596*890232f2SAndroid Build Coastguard Worker             {
597*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(a.VectorOfEnums(i), b.VectorOfEnums[i]);
598*890232f2SAndroid Build Coastguard Worker             }
599*890232f2SAndroid Build Coastguard Worker         }
600*890232f2SAndroid Build Coastguard Worker 
AreEqual(Monster a, Monster b)601*890232f2SAndroid Build Coastguard Worker         private void AreEqual(Monster a, Monster b)
602*890232f2SAndroid Build Coastguard Worker         {
603*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.Hp, b.Hp);
604*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.Mana, b.Mana);
605*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.Name, b.Name);
606*890232f2SAndroid Build Coastguard Worker 
607*890232f2SAndroid Build Coastguard Worker             var posA = a.Pos;
608*890232f2SAndroid Build Coastguard Worker             var posB = b.Pos;
609*890232f2SAndroid Build Coastguard Worker             if (posA != null)
610*890232f2SAndroid Build Coastguard Worker             {
611*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(posA.Value.X, posB.Value.X);
612*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(posA.Value.Y, posB.Value.Y);
613*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(posA.Value.Z, posB.Value.Z);
614*890232f2SAndroid Build Coastguard Worker 
615*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(posA.Value.Test1, posB.Value.Test1);
616*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(posA.Value.Test2, posB.Value.Test2);
617*890232f2SAndroid Build Coastguard Worker                 var tA = posA.Value.Test3;
618*890232f2SAndroid Build Coastguard Worker                 var tB = posB.Value.Test3;
619*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(tA.A, tB.A);
620*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(tA.B, tB.B);
621*890232f2SAndroid Build Coastguard Worker             }
622*890232f2SAndroid Build Coastguard Worker 
623*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.TestType, b.TestType);
624*890232f2SAndroid Build Coastguard Worker             if (a.TestType == Any.Monster)
625*890232f2SAndroid Build Coastguard Worker             {
626*890232f2SAndroid Build Coastguard Worker                 var monster2A = a.Test<Monster>().Value;
627*890232f2SAndroid Build Coastguard Worker                 var monster2B = b.Test<Monster>().Value;
628*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(monster2A.Name, monster2B.Name);
629*890232f2SAndroid Build Coastguard Worker             }
630*890232f2SAndroid Build Coastguard Worker 
631*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.InventoryLength, b.InventoryLength);
632*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < a.InventoryLength; ++i)
633*890232f2SAndroid Build Coastguard Worker             {
634*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(a.Inventory(i), b.Inventory(i));
635*890232f2SAndroid Build Coastguard Worker             }
636*890232f2SAndroid Build Coastguard Worker 
637*890232f2SAndroid Build Coastguard Worker             var inventoryArrayA = a.GetInventoryArray();
638*890232f2SAndroid Build Coastguard Worker             var inventoryArrayALength = inventoryArrayA == null ? 0 : inventoryArrayA.Length;
639*890232f2SAndroid Build Coastguard Worker             var inventoryArrayB = b.GetInventoryArray();
640*890232f2SAndroid Build Coastguard Worker             var inventoryArrayBLength = inventoryArrayB == null ? 0 : inventoryArrayB.Length;
641*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(inventoryArrayALength, inventoryArrayBLength);
642*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < inventoryArrayALength; ++i)
643*890232f2SAndroid Build Coastguard Worker             {
644*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(inventoryArrayA[i], inventoryArrayB[i]);
645*890232f2SAndroid Build Coastguard Worker             }
646*890232f2SAndroid Build Coastguard Worker 
647*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.Test4Length, b.Test4Length);
648*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < a.Test4Length; ++i)
649*890232f2SAndroid Build Coastguard Worker             {
650*890232f2SAndroid Build Coastguard Worker                 var t4A = a.Test4(i);
651*890232f2SAndroid Build Coastguard Worker                 var t4B = b.Test4(i);
652*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(t4A.Value.A, t4B.Value.A);
653*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(t4A.Value.B, t4B.Value.B);
654*890232f2SAndroid Build Coastguard Worker             }
655*890232f2SAndroid Build Coastguard Worker 
656*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.TestarrayofstringLength, b.TestarrayofstringLength);
657*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < a.TestarrayofstringLength; ++i)
658*890232f2SAndroid Build Coastguard Worker             {
659*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(a.Testarrayofstring(i), b.Testarrayofstring(i));
660*890232f2SAndroid Build Coastguard Worker             }
661*890232f2SAndroid Build Coastguard Worker 
662*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.Testbool, b.Testbool);
663*890232f2SAndroid Build Coastguard Worker 
664*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.TestarrayofboolsLength, b.TestarrayofboolsLength);
665*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < a.TestarrayofboolsLength; ++i)
666*890232f2SAndroid Build Coastguard Worker             {
667*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(a.Testarrayofbools(i), b.Testarrayofbools(i));
668*890232f2SAndroid Build Coastguard Worker             }
669*890232f2SAndroid Build Coastguard Worker 
670*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.VectorOfLongsLength, b.VectorOfLongsLength);
671*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < a.VectorOfLongsLength; ++i)
672*890232f2SAndroid Build Coastguard Worker             {
673*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(a.VectorOfLongs(i), b.VectorOfLongs(i));
674*890232f2SAndroid Build Coastguard Worker             }
675*890232f2SAndroid Build Coastguard Worker 
676*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.VectorOfDoublesLength, b.VectorOfDoublesLength);
677*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < a.VectorOfDoublesLength; ++i)
678*890232f2SAndroid Build Coastguard Worker             {
679*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(a.VectorOfDoubles(i), b.VectorOfDoubles(i));
680*890232f2SAndroid Build Coastguard Worker             }
681*890232f2SAndroid Build Coastguard Worker 
682*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.VectorOfEnumsLength, b.VectorOfEnumsLength);
683*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < a.VectorOfEnumsLength; ++i)
684*890232f2SAndroid Build Coastguard Worker             {
685*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(a.VectorOfEnums(i), b.VectorOfEnums(i));
686*890232f2SAndroid Build Coastguard Worker             }
687*890232f2SAndroid Build Coastguard Worker         }
688*890232f2SAndroid Build Coastguard Worker 
TestObjectAPI(Monster a)689*890232f2SAndroid Build Coastguard Worker         private void TestObjectAPI(Monster a)
690*890232f2SAndroid Build Coastguard Worker         {
691*890232f2SAndroid Build Coastguard Worker             var b = a.UnPack();
692*890232f2SAndroid Build Coastguard Worker             AreEqual(a, b);
693*890232f2SAndroid Build Coastguard Worker 
694*890232f2SAndroid Build Coastguard Worker             var fbb = new FlatBufferBuilder(1);
695*890232f2SAndroid Build Coastguard Worker             fbb.Finish(Monster.Pack(fbb, b).Value);
696*890232f2SAndroid Build Coastguard Worker             var c = Monster.GetRootAsMonster(fbb.DataBuffer);
697*890232f2SAndroid Build Coastguard Worker             AreEqual(a, c);
698*890232f2SAndroid Build Coastguard Worker 
699*890232f2SAndroid Build Coastguard Worker             var jsonText = b.SerializeToJson();
700*890232f2SAndroid Build Coastguard Worker             var d = MonsterT.DeserializeFromJson(jsonText);
701*890232f2SAndroid Build Coastguard Worker             AreEqual(a, d);
702*890232f2SAndroid Build Coastguard Worker 
703*890232f2SAndroid Build Coastguard Worker             var fbBuffer = b.SerializeToBinary();
704*890232f2SAndroid Build Coastguard Worker             Assert.IsTrue(Monster.MonsterBufferHasIdentifier(new ByteBuffer(fbBuffer)));
705*890232f2SAndroid Build Coastguard Worker             var e = MonsterT.DeserializeFromBinary(fbBuffer);
706*890232f2SAndroid Build Coastguard Worker             AreEqual(a, e);
707*890232f2SAndroid Build Coastguard Worker         }
708*890232f2SAndroid Build Coastguard Worker 
AreEqual(ArrayTable a, ArrayTableT b)709*890232f2SAndroid Build Coastguard Worker         private void AreEqual(ArrayTable a, ArrayTableT b)
710*890232f2SAndroid Build Coastguard Worker         {
711*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.A.Value.A, b.A.A);
712*890232f2SAndroid Build Coastguard Worker 
713*890232f2SAndroid Build Coastguard Worker             for (int i = 0; i < 15; ++i)
714*890232f2SAndroid Build Coastguard Worker             {
715*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(a.A.Value.B(i), b.A.B[i]);
716*890232f2SAndroid Build Coastguard Worker             }
717*890232f2SAndroid Build Coastguard Worker 
718*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.A.Value.C, b.A.C);
719*890232f2SAndroid Build Coastguard Worker 
720*890232f2SAndroid Build Coastguard Worker             for (int i = 0; i < 2; ++i)
721*890232f2SAndroid Build Coastguard Worker             {
722*890232f2SAndroid Build Coastguard Worker                 var ad = a.A.Value.D(i);
723*890232f2SAndroid Build Coastguard Worker                 var bd = b.A.D[i];
724*890232f2SAndroid Build Coastguard Worker 
725*890232f2SAndroid Build Coastguard Worker                 for (int j = 0; j < 2; ++j)
726*890232f2SAndroid Build Coastguard Worker                 {
727*890232f2SAndroid Build Coastguard Worker                     Assert.AreEqual(ad.A(j), bd.A[j]);
728*890232f2SAndroid Build Coastguard Worker                 }
729*890232f2SAndroid Build Coastguard Worker 
730*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(ad.B, bd.B);
731*890232f2SAndroid Build Coastguard Worker 
732*890232f2SAndroid Build Coastguard Worker                 for (int j = 0; j < 2; ++j)
733*890232f2SAndroid Build Coastguard Worker                 {
734*890232f2SAndroid Build Coastguard Worker                     Assert.AreEqual(ad.C(j), bd.C[j]);
735*890232f2SAndroid Build Coastguard Worker                 }
736*890232f2SAndroid Build Coastguard Worker 
737*890232f2SAndroid Build Coastguard Worker                 for (int j = 0; j < 2; ++j)
738*890232f2SAndroid Build Coastguard Worker                 {
739*890232f2SAndroid Build Coastguard Worker                     Assert.AreEqual(ad.D(j), bd.D[j]);
740*890232f2SAndroid Build Coastguard Worker                 }
741*890232f2SAndroid Build Coastguard Worker             }
742*890232f2SAndroid Build Coastguard Worker 
743*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.A.Value.E, b.A.E);
744*890232f2SAndroid Build Coastguard Worker 
745*890232f2SAndroid Build Coastguard Worker             for (int i = 0; i < 2; ++i)
746*890232f2SAndroid Build Coastguard Worker             {
747*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(a.A.Value.F(i), b.A.F[i]);
748*890232f2SAndroid Build Coastguard Worker             }
749*890232f2SAndroid Build Coastguard Worker         }
750*890232f2SAndroid Build Coastguard Worker 
AreEqual(ArrayTable a, ArrayTable b)751*890232f2SAndroid Build Coastguard Worker         private void AreEqual(ArrayTable a, ArrayTable b)
752*890232f2SAndroid Build Coastguard Worker         {
753*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.A.Value.A, b.A.Value.A);
754*890232f2SAndroid Build Coastguard Worker 
755*890232f2SAndroid Build Coastguard Worker             for (int i = 0; i < 15; ++i)
756*890232f2SAndroid Build Coastguard Worker             {
757*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(a.A.Value.B(i), b.A.Value.B(i));
758*890232f2SAndroid Build Coastguard Worker             }
759*890232f2SAndroid Build Coastguard Worker 
760*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.A.Value.C, b.A.Value.C);
761*890232f2SAndroid Build Coastguard Worker 
762*890232f2SAndroid Build Coastguard Worker             for (int i = 0; i < 2; ++i)
763*890232f2SAndroid Build Coastguard Worker             {
764*890232f2SAndroid Build Coastguard Worker                 var ad = a.A.Value.D(i);
765*890232f2SAndroid Build Coastguard Worker                 var bd = b.A.Value.D(i);
766*890232f2SAndroid Build Coastguard Worker 
767*890232f2SAndroid Build Coastguard Worker                 for (int j = 0; j < 2; ++j)
768*890232f2SAndroid Build Coastguard Worker                 {
769*890232f2SAndroid Build Coastguard Worker                     Assert.AreEqual(ad.A(j), bd.A(j));
770*890232f2SAndroid Build Coastguard Worker                 }
771*890232f2SAndroid Build Coastguard Worker 
772*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(ad.B, bd.B);
773*890232f2SAndroid Build Coastguard Worker 
774*890232f2SAndroid Build Coastguard Worker                 for (int j = 0; j < 2; ++j)
775*890232f2SAndroid Build Coastguard Worker                 {
776*890232f2SAndroid Build Coastguard Worker                     Assert.AreEqual(ad.C(j), bd.C(j));
777*890232f2SAndroid Build Coastguard Worker                 }
778*890232f2SAndroid Build Coastguard Worker 
779*890232f2SAndroid Build Coastguard Worker                 for (int j = 0; j < 2; ++j)
780*890232f2SAndroid Build Coastguard Worker                 {
781*890232f2SAndroid Build Coastguard Worker                     Assert.AreEqual(ad.D(j), bd.D(j));
782*890232f2SAndroid Build Coastguard Worker                 }
783*890232f2SAndroid Build Coastguard Worker             }
784*890232f2SAndroid Build Coastguard Worker 
785*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.A.Value.E, b.A.Value.E);
786*890232f2SAndroid Build Coastguard Worker 
787*890232f2SAndroid Build Coastguard Worker             for (int i = 0; i < 2; ++i)
788*890232f2SAndroid Build Coastguard Worker             {
789*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(a.A.Value.F(i), b.A.Value.F(i));
790*890232f2SAndroid Build Coastguard Worker             }
791*890232f2SAndroid Build Coastguard Worker         }
792*890232f2SAndroid Build Coastguard Worker 
TestObjectAPI(ArrayTable a)793*890232f2SAndroid Build Coastguard Worker         private void TestObjectAPI(ArrayTable a)
794*890232f2SAndroid Build Coastguard Worker         {
795*890232f2SAndroid Build Coastguard Worker             var b = a.UnPack();
796*890232f2SAndroid Build Coastguard Worker             AreEqual(a, b);
797*890232f2SAndroid Build Coastguard Worker 
798*890232f2SAndroid Build Coastguard Worker             var fbb = new FlatBufferBuilder(1);
799*890232f2SAndroid Build Coastguard Worker             fbb.Finish(ArrayTable.Pack(fbb, b).Value);
800*890232f2SAndroid Build Coastguard Worker             var c = ArrayTable.GetRootAsArrayTable(fbb.DataBuffer);
801*890232f2SAndroid Build Coastguard Worker             AreEqual(a, c);
802*890232f2SAndroid Build Coastguard Worker 
803*890232f2SAndroid Build Coastguard Worker             var jsonText = b.SerializeToJson();
804*890232f2SAndroid Build Coastguard Worker             var d = ArrayTableT.DeserializeFromJson(jsonText);
805*890232f2SAndroid Build Coastguard Worker             AreEqual(a, d);
806*890232f2SAndroid Build Coastguard Worker 
807*890232f2SAndroid Build Coastguard Worker             var fbBuffer = b.SerializeToBinary();
808*890232f2SAndroid Build Coastguard Worker             Assert.IsTrue(ArrayTable.ArrayTableBufferHasIdentifier(new ByteBuffer(fbBuffer)));
809*890232f2SAndroid Build Coastguard Worker             var e = ArrayTableT.DeserializeFromBinary(fbBuffer);
810*890232f2SAndroid Build Coastguard Worker             AreEqual(a, e);
811*890232f2SAndroid Build Coastguard Worker         }
812*890232f2SAndroid Build Coastguard Worker 
AreEqual(Movie a, MovieT b)813*890232f2SAndroid Build Coastguard Worker         private void AreEqual(Movie a, MovieT b)
814*890232f2SAndroid Build Coastguard Worker         {
815*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.MainCharacterType, b.MainCharacter.Type);
816*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.MainCharacter<Rapunzel>().Value.HairLength, b.MainCharacter.AsRapunzel().HairLength);
817*890232f2SAndroid Build Coastguard Worker 
818*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.CharactersLength, b.Characters.Count);
819*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.CharactersType(0), b.Characters[0].Type);
820*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.Characters<Attacker>(0).Value.SwordAttackDamage, b.Characters[0].AsMuLan().SwordAttackDamage);
821*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.CharactersType(1), b.Characters[1].Type);
822*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.Characters<BookReader>(1).Value.BooksRead, b.Characters[1].AsBelle().BooksRead);
823*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.CharactersType(2), b.Characters[2].Type);
824*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.CharactersAsString(2), b.Characters[2].AsOther());
825*890232f2SAndroid Build Coastguard Worker         }
826*890232f2SAndroid Build Coastguard Worker 
AreEqual(Movie a, Movie b)827*890232f2SAndroid Build Coastguard Worker         private void AreEqual(Movie a, Movie b)
828*890232f2SAndroid Build Coastguard Worker         {
829*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.MainCharacterType, b.MainCharacterType);
830*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.MainCharacter<Rapunzel>().Value.HairLength, b.MainCharacter<Rapunzel>().Value.HairLength);
831*890232f2SAndroid Build Coastguard Worker 
832*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.CharactersLength, b.CharactersLength);
833*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.CharactersType(0), b.CharactersType(0));
834*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.Characters<Attacker>(0).Value.SwordAttackDamage, b.Characters<Attacker>(0).Value.SwordAttackDamage);
835*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.CharactersType(1), b.CharactersType(1));
836*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.Characters<BookReader>(1).Value.BooksRead, b.Characters<BookReader>(1).Value.BooksRead);
837*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.CharactersType(2), b.CharactersType(2));
838*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(a.CharactersAsString(2), b.CharactersAsString(2));
839*890232f2SAndroid Build Coastguard Worker         }
840*890232f2SAndroid Build Coastguard Worker 
TestObjectAPI(Movie a)841*890232f2SAndroid Build Coastguard Worker         private void TestObjectAPI(Movie a)
842*890232f2SAndroid Build Coastguard Worker         {
843*890232f2SAndroid Build Coastguard Worker             var b = a.UnPack();
844*890232f2SAndroid Build Coastguard Worker             AreEqual(a, b);
845*890232f2SAndroid Build Coastguard Worker 
846*890232f2SAndroid Build Coastguard Worker             var fbb = new FlatBufferBuilder(1);
847*890232f2SAndroid Build Coastguard Worker             fbb.Finish(Movie.Pack(fbb, b).Value);
848*890232f2SAndroid Build Coastguard Worker             var c = Movie.GetRootAsMovie(fbb.DataBuffer);
849*890232f2SAndroid Build Coastguard Worker             AreEqual(a, c);
850*890232f2SAndroid Build Coastguard Worker 
851*890232f2SAndroid Build Coastguard Worker             var jsonText = b.SerializeToJson();
852*890232f2SAndroid Build Coastguard Worker             var d = MovieT.DeserializeFromJson(jsonText);
853*890232f2SAndroid Build Coastguard Worker             AreEqual(a, d);
854*890232f2SAndroid Build Coastguard Worker 
855*890232f2SAndroid Build Coastguard Worker             var fbBuffer = b.SerializeToBinary();
856*890232f2SAndroid Build Coastguard Worker             Assert.IsTrue(Movie.MovieBufferHasIdentifier(new ByteBuffer(fbBuffer)));
857*890232f2SAndroid Build Coastguard Worker             var e = MovieT.DeserializeFromBinary(fbBuffer);
858*890232f2SAndroid Build Coastguard Worker             AreEqual(a, e);
859*890232f2SAndroid Build Coastguard Worker         }
860*890232f2SAndroid Build Coastguard Worker 
861*890232f2SAndroid Build Coastguard Worker         // For use in TestParallelAccess test case.
862*890232f2SAndroid Build Coastguard Worker         static private int _comparisons = 0;
863*890232f2SAndroid Build Coastguard Worker         static private int _failures = 0;
KeepComparing(Monster mon, int count, float floatValue, double doubleValue)864*890232f2SAndroid Build Coastguard Worker         static private void KeepComparing(Monster mon, int count, float floatValue, double doubleValue)
865*890232f2SAndroid Build Coastguard Worker         {
866*890232f2SAndroid Build Coastguard Worker             int i = 0;
867*890232f2SAndroid Build Coastguard Worker             while (++i <= count)
868*890232f2SAndroid Build Coastguard Worker             {
869*890232f2SAndroid Build Coastguard Worker                 Interlocked.Add(ref _comparisons, 1);
870*890232f2SAndroid Build Coastguard Worker                 if(mon.Pos.Value.Test1 != doubleValue || mon.Pos.Value.Z != floatValue) {
871*890232f2SAndroid Build Coastguard Worker                     Interlocked.Add(ref _failures, 1);
872*890232f2SAndroid Build Coastguard Worker                 }
873*890232f2SAndroid Build Coastguard Worker             }
874*890232f2SAndroid Build Coastguard Worker         }
875*890232f2SAndroid Build Coastguard Worker 
876*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestParallelAccess()877*890232f2SAndroid Build Coastguard Worker         public void TestParallelAccess() {
878*890232f2SAndroid Build Coastguard Worker             // Tests that reading from a flatbuffer over multiple threads is thread-safe in regard to double and float
879*890232f2SAndroid Build Coastguard Worker             // values, since they previously were non-thread safe
880*890232f2SAndroid Build Coastguard Worker             const float floatValue = 3.141592F;
881*890232f2SAndroid Build Coastguard Worker             const double doubleValue = 1.618033988;
882*890232f2SAndroid Build Coastguard Worker 
883*890232f2SAndroid Build Coastguard Worker             var fbb = new FlatBufferBuilder(1);
884*890232f2SAndroid Build Coastguard Worker             var str = fbb.CreateString("ParallelTest");
885*890232f2SAndroid Build Coastguard Worker             Monster.StartMonster(fbb);
886*890232f2SAndroid Build Coastguard Worker             Monster.AddPos(fbb, Vec3.CreateVec3(fbb, 1.0f, 2.0f, floatValue, doubleValue,
887*890232f2SAndroid Build Coastguard Worker                                                      Color.Green, (short)5, (sbyte)6));
888*890232f2SAndroid Build Coastguard Worker 
889*890232f2SAndroid Build Coastguard Worker             Monster.AddName(fbb, str);
890*890232f2SAndroid Build Coastguard Worker             Monster.FinishMonsterBuffer(fbb, Monster.EndMonster(fbb));
891*890232f2SAndroid Build Coastguard Worker 
892*890232f2SAndroid Build Coastguard Worker             var mon = Monster.GetRootAsMonster(fbb.DataBuffer);
893*890232f2SAndroid Build Coastguard Worker 
894*890232f2SAndroid Build Coastguard Worker             var pos = mon.Pos.Value;
895*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(pos.Test1, doubleValue);
896*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(pos.Z, floatValue);
897*890232f2SAndroid Build Coastguard Worker 
898*890232f2SAndroid Build Coastguard Worker             const int thread_count = 10;
899*890232f2SAndroid Build Coastguard Worker             const int reps = 1000000;
900*890232f2SAndroid Build Coastguard Worker 
901*890232f2SAndroid Build Coastguard Worker             // Need to use raw Threads since Tasks are not supported in .NET 3.5
902*890232f2SAndroid Build Coastguard Worker             Thread[] threads = new Thread[thread_count];
903*890232f2SAndroid Build Coastguard Worker             for(int i = 0; i < thread_count; i++) {
904*890232f2SAndroid Build Coastguard Worker                threads[i] = new Thread(() => KeepComparing(mon, reps, floatValue, doubleValue));
905*890232f2SAndroid Build Coastguard Worker             }
906*890232f2SAndroid Build Coastguard Worker             for(int i = 0; i < thread_count; i++) {
907*890232f2SAndroid Build Coastguard Worker                threads[i].Start();
908*890232f2SAndroid Build Coastguard Worker             }
909*890232f2SAndroid Build Coastguard Worker             for(int i = 0; i < thread_count; i++) {
910*890232f2SAndroid Build Coastguard Worker                threads[i].Join();
911*890232f2SAndroid Build Coastguard Worker             }
912*890232f2SAndroid Build Coastguard Worker 
913*890232f2SAndroid Build Coastguard Worker             // Make sure the threads actually did the comparisons.
914*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(thread_count * reps, _comparisons);
915*890232f2SAndroid Build Coastguard Worker 
916*890232f2SAndroid Build Coastguard Worker             // Make sure we never read the values incorrectly.
917*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(0, _failures);
918*890232f2SAndroid Build Coastguard Worker         }
919*890232f2SAndroid Build Coastguard Worker 
920*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestScalarOptional_EmptyBuffer()921*890232f2SAndroid Build Coastguard Worker         public void TestScalarOptional_EmptyBuffer() {
922*890232f2SAndroid Build Coastguard Worker             var fbb = new FlatBufferBuilder(1);
923*890232f2SAndroid Build Coastguard Worker             ScalarStuff.StartScalarStuff(fbb);
924*890232f2SAndroid Build Coastguard Worker             var offset = ScalarStuff.EndScalarStuff(fbb);
925*890232f2SAndroid Build Coastguard Worker             ScalarStuff.FinishScalarStuffBuffer(fbb, offset);
926*890232f2SAndroid Build Coastguard Worker 
927*890232f2SAndroid Build Coastguard Worker             ScalarStuff scalarStuff = ScalarStuff.GetRootAsScalarStuff(fbb.DataBuffer);
928*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((sbyte)0, scalarStuff.JustI8);
929*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(null, scalarStuff.MaybeI8);
930*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((sbyte)42, scalarStuff.DefaultI8);
931*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((byte)0, scalarStuff.JustU8);
932*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(null, scalarStuff.MaybeU8);
933*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((byte)42, scalarStuff.DefaultU8);
934*890232f2SAndroid Build Coastguard Worker 
935*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((short)0, scalarStuff.JustI16);
936*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(null, scalarStuff.MaybeI16);
937*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((short)42, scalarStuff.DefaultI16);
938*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((ushort)0, scalarStuff.JustU16);
939*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(null, scalarStuff.MaybeU16);
940*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((ushort)42, scalarStuff.DefaultU16);
941*890232f2SAndroid Build Coastguard Worker 
942*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((int)0, scalarStuff.JustI32);
943*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(null, scalarStuff.MaybeI32);
944*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((int)42, scalarStuff.DefaultI32);
945*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((uint)0, scalarStuff.JustU32);
946*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(null, scalarStuff.MaybeU32);
947*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((uint)42, scalarStuff.DefaultU32);
948*890232f2SAndroid Build Coastguard Worker 
949*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((long)0, scalarStuff.JustI64);
950*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(null, scalarStuff.MaybeI64);
951*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((long)42, scalarStuff.DefaultI64);
952*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((ulong)0, scalarStuff.JustU64);
953*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(null, scalarStuff.MaybeU64);
954*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((ulong)42, scalarStuff.DefaultU64);
955*890232f2SAndroid Build Coastguard Worker 
956*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((float)0.0F, scalarStuff.JustF32);
957*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(null, scalarStuff.MaybeF32);
958*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((float)42.0F, scalarStuff.DefaultF32);
959*890232f2SAndroid Build Coastguard Worker 
960*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((double)0.0, scalarStuff.JustF64);
961*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(null, scalarStuff.MaybeF64);
962*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((double)42.0, scalarStuff.DefaultF64);
963*890232f2SAndroid Build Coastguard Worker 
964*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(false, scalarStuff.JustBool);
965*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(null, scalarStuff.MaybeBool);
966*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(true, scalarStuff.DefaultBool);
967*890232f2SAndroid Build Coastguard Worker 
968*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(OptionalByte.None, scalarStuff.JustEnum);
969*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(null, scalarStuff.MaybeEnum);
970*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(OptionalByte.One, scalarStuff.DefaultEnum);
971*890232f2SAndroid Build Coastguard Worker         }
972*890232f2SAndroid Build Coastguard Worker 
973*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestScalarOptional_Construction()974*890232f2SAndroid Build Coastguard Worker         public void TestScalarOptional_Construction() {
975*890232f2SAndroid Build Coastguard Worker             var fbb = new FlatBufferBuilder(1);
976*890232f2SAndroid Build Coastguard Worker             ScalarStuff.StartScalarStuff(fbb);
977*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddJustI8(fbb, 5);
978*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddMaybeI8(fbb, 5);
979*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddDefaultI8(fbb, 5);
980*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddJustU8(fbb, 6);
981*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddMaybeU8(fbb, 6);
982*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddDefaultU8(fbb, 6);
983*890232f2SAndroid Build Coastguard Worker 
984*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddJustI16(fbb, 7);
985*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddMaybeI16(fbb, 7);
986*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddDefaultI16(fbb, 7);
987*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddJustU16(fbb, 8);
988*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddMaybeU16(fbb, 8);
989*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddDefaultU16(fbb, 8);
990*890232f2SAndroid Build Coastguard Worker 
991*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddJustI32(fbb, 9);
992*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddMaybeI32(fbb, 9);
993*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddDefaultI32(fbb, 9);
994*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddJustU32(fbb, 10);
995*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddMaybeU32(fbb, 10);
996*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddDefaultU32(fbb, 10);
997*890232f2SAndroid Build Coastguard Worker 
998*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddJustI64(fbb, 11);
999*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddMaybeI64(fbb, 11);
1000*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddDefaultI64(fbb, 11);
1001*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddJustU64(fbb, 12);
1002*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddMaybeU64(fbb, 12);
1003*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddDefaultU64(fbb, 12);
1004*890232f2SAndroid Build Coastguard Worker 
1005*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddJustF32(fbb, 13.0f);
1006*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddMaybeF32(fbb, 13.0f);
1007*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddDefaultF32(fbb, 13.0f);
1008*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddJustF64(fbb, 14.0);
1009*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddMaybeF64(fbb, 14.0);
1010*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddDefaultF64(fbb, 14.0);
1011*890232f2SAndroid Build Coastguard Worker 
1012*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddJustBool(fbb, true);
1013*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddMaybeBool(fbb, true);
1014*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddDefaultBool(fbb, false); // note this is the opposite
1015*890232f2SAndroid Build Coastguard Worker 
1016*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddJustEnum(fbb, OptionalByte.Two);
1017*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddMaybeEnum(fbb, OptionalByte.Two);
1018*890232f2SAndroid Build Coastguard Worker             ScalarStuff.AddDefaultEnum(fbb, OptionalByte.Two);
1019*890232f2SAndroid Build Coastguard Worker 
1020*890232f2SAndroid Build Coastguard Worker             var offset = ScalarStuff.EndScalarStuff(fbb);
1021*890232f2SAndroid Build Coastguard Worker             ScalarStuff.FinishScalarStuffBuffer(fbb, offset);
1022*890232f2SAndroid Build Coastguard Worker 
1023*890232f2SAndroid Build Coastguard Worker             ScalarStuff scalarStuff = ScalarStuff.GetRootAsScalarStuff(fbb.DataBuffer);
1024*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((sbyte)5, scalarStuff.JustI8);
1025*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((sbyte)5, scalarStuff.MaybeI8);
1026*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((sbyte)5, scalarStuff.DefaultI8);
1027*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((byte)6, scalarStuff.JustU8);
1028*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((byte)6, scalarStuff.MaybeU8);
1029*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((byte)6, scalarStuff.DefaultU8);
1030*890232f2SAndroid Build Coastguard Worker 
1031*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((short)7, scalarStuff.JustI16);
1032*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((short)7, scalarStuff.MaybeI16);
1033*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((short)7, scalarStuff.DefaultI16);
1034*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((ushort)8, scalarStuff.JustU16);
1035*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((ushort)8, scalarStuff.MaybeU16);
1036*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((ushort)8, scalarStuff.DefaultU16);
1037*890232f2SAndroid Build Coastguard Worker 
1038*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((int)9, scalarStuff.JustI32);
1039*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((int)9, scalarStuff.MaybeI32);
1040*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((int)9, scalarStuff.DefaultI32);
1041*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((uint)10, scalarStuff.JustU32);
1042*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((uint)10, scalarStuff.MaybeU32);
1043*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((uint)10, scalarStuff.DefaultU32);
1044*890232f2SAndroid Build Coastguard Worker 
1045*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((long)11, scalarStuff.JustI64);
1046*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((long)11, scalarStuff.MaybeI64);
1047*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((long)11, scalarStuff.DefaultI64);
1048*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((ulong)12, scalarStuff.JustU64);
1049*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((ulong)12, scalarStuff.MaybeU64);
1050*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((ulong)12, scalarStuff.DefaultU64);
1051*890232f2SAndroid Build Coastguard Worker 
1052*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((float)13.0F, scalarStuff.JustF32);
1053*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((float)13.0F, scalarStuff.MaybeF32);
1054*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((float)13.0F, scalarStuff.DefaultF32);
1055*890232f2SAndroid Build Coastguard Worker 
1056*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((double)14.0, scalarStuff.JustF64);
1057*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((double)14.0, scalarStuff.MaybeF64);
1058*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((double)14.0, scalarStuff.DefaultF64);
1059*890232f2SAndroid Build Coastguard Worker 
1060*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(true, scalarStuff.JustBool);
1061*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(true, scalarStuff.MaybeBool);
1062*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(false, scalarStuff.DefaultBool);
1063*890232f2SAndroid Build Coastguard Worker 
1064*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(OptionalByte.Two, scalarStuff.JustEnum);
1065*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(OptionalByte.Two, scalarStuff.MaybeEnum);
1066*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(OptionalByte.Two, scalarStuff.DefaultEnum);
1067*890232f2SAndroid Build Coastguard Worker         }
1068*890232f2SAndroid Build Coastguard Worker 
1069*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestScalarOptional_Construction_CreatorMethod()1070*890232f2SAndroid Build Coastguard Worker         public void TestScalarOptional_Construction_CreatorMethod() {
1071*890232f2SAndroid Build Coastguard Worker             var fbb = new FlatBufferBuilder(1);
1072*890232f2SAndroid Build Coastguard Worker 
1073*890232f2SAndroid Build Coastguard Worker             var offset = ScalarStuff.CreateScalarStuff(fbb,5,5,5,6,6,6,7,7,7,
1074*890232f2SAndroid Build Coastguard Worker                 8,8,8,9,9,9,10,10,10,11,11,11,12,12,12,13.0f,13.0f,13.0f,14.0,
1075*890232f2SAndroid Build Coastguard Worker                 14.0,14.0,true,true,false,OptionalByte.Two,OptionalByte.Two,
1076*890232f2SAndroid Build Coastguard Worker                 OptionalByte.Two);
1077*890232f2SAndroid Build Coastguard Worker             ScalarStuff.FinishScalarStuffBuffer(fbb, offset);
1078*890232f2SAndroid Build Coastguard Worker 
1079*890232f2SAndroid Build Coastguard Worker             ScalarStuff scalarStuff = ScalarStuff.GetRootAsScalarStuff(fbb.DataBuffer);
1080*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((sbyte)5, scalarStuff.JustI8);
1081*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((sbyte)5, scalarStuff.MaybeI8);
1082*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((sbyte)5, scalarStuff.DefaultI8);
1083*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((byte)6, scalarStuff.JustU8);
1084*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((byte)6, scalarStuff.MaybeU8);
1085*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((byte)6, scalarStuff.DefaultU8);
1086*890232f2SAndroid Build Coastguard Worker 
1087*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((short)7, scalarStuff.JustI16);
1088*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((short)7, scalarStuff.MaybeI16);
1089*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((short)7, scalarStuff.DefaultI16);
1090*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((ushort)8, scalarStuff.JustU16);
1091*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((ushort)8, scalarStuff.MaybeU16);
1092*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((ushort)8, scalarStuff.DefaultU16);
1093*890232f2SAndroid Build Coastguard Worker 
1094*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((int)9, scalarStuff.JustI32);
1095*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((int)9, scalarStuff.MaybeI32);
1096*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((int)9, scalarStuff.DefaultI32);
1097*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((uint)10, scalarStuff.JustU32);
1098*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((uint)10, scalarStuff.MaybeU32);
1099*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((uint)10, scalarStuff.DefaultU32);
1100*890232f2SAndroid Build Coastguard Worker 
1101*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((long)11, scalarStuff.JustI64);
1102*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((long)11, scalarStuff.MaybeI64);
1103*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((long)11, scalarStuff.DefaultI64);
1104*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((ulong)12, scalarStuff.JustU64);
1105*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((ulong)12, scalarStuff.MaybeU64);
1106*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((ulong)12, scalarStuff.DefaultU64);
1107*890232f2SAndroid Build Coastguard Worker 
1108*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((float)13.0F, scalarStuff.JustF32);
1109*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((float)13.0F, scalarStuff.MaybeF32);
1110*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((float)13.0F, scalarStuff.DefaultF32);
1111*890232f2SAndroid Build Coastguard Worker 
1112*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((double)14.0, scalarStuff.JustF64);
1113*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((double)14.0, scalarStuff.MaybeF64);
1114*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((double)14.0, scalarStuff.DefaultF64);
1115*890232f2SAndroid Build Coastguard Worker 
1116*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(true, scalarStuff.JustBool);
1117*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(true, scalarStuff.MaybeBool);
1118*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(false, scalarStuff.DefaultBool);
1119*890232f2SAndroid Build Coastguard Worker 
1120*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(OptionalByte.Two, scalarStuff.JustEnum);
1121*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(OptionalByte.Two, scalarStuff.MaybeEnum);
1122*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(OptionalByte.Two, scalarStuff.DefaultEnum);
1123*890232f2SAndroid Build Coastguard Worker         }
1124*890232f2SAndroid Build Coastguard Worker 
1125*890232f2SAndroid Build Coastguard Worker 
1126*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestKeywordEscaping()1127*890232f2SAndroid Build Coastguard Worker         public void TestKeywordEscaping() {
1128*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((int)KeywordTest.@public.NONE, 0);
1129*890232f2SAndroid Build Coastguard Worker 
1130*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((int)KeywordTest.ABC.@void, 0);
1131*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((int)KeywordTest.ABC.where, 1);
1132*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual((int)KeywordTest.ABC.@stackalloc, 2);
1133*890232f2SAndroid Build Coastguard Worker 
1134*890232f2SAndroid Build Coastguard Worker             var fbb = new FlatBufferBuilder(1);
1135*890232f2SAndroid Build Coastguard Worker             var offset = KeywordsInTable.CreateKeywordsInTable(
1136*890232f2SAndroid Build Coastguard Worker                 fbb, KeywordTest.ABC.@stackalloc, KeywordTest.@public.NONE);
1137*890232f2SAndroid Build Coastguard Worker             fbb.Finish(offset.Value);
1138*890232f2SAndroid Build Coastguard Worker 
1139*890232f2SAndroid Build Coastguard Worker             KeywordsInTable keywordsInTable =
1140*890232f2SAndroid Build Coastguard Worker                 KeywordsInTable.GetRootAsKeywordsInTable(fbb.DataBuffer);
1141*890232f2SAndroid Build Coastguard Worker 
1142*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(keywordsInTable.Is, KeywordTest.ABC.@stackalloc);
1143*890232f2SAndroid Build Coastguard Worker             Assert.AreEqual(keywordsInTable.Private, KeywordTest.@public.NONE);
1144*890232f2SAndroid Build Coastguard Worker         }
1145*890232f2SAndroid Build Coastguard Worker 
1146*890232f2SAndroid Build Coastguard Worker 
1147*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
AddOptionalEnum_WhenPassNull_ShouldWorkProperly()1148*890232f2SAndroid Build Coastguard Worker         public void AddOptionalEnum_WhenPassNull_ShouldWorkProperly() {
1149*890232f2SAndroid Build Coastguard Worker           var fbb = new FlatBufferBuilder(1);
1150*890232f2SAndroid Build Coastguard Worker           ScalarStuff.StartScalarStuff(fbb);
1151*890232f2SAndroid Build Coastguard Worker           ScalarStuff.AddMaybeEnum(fbb, null);
1152*890232f2SAndroid Build Coastguard Worker           var offset = ScalarStuff.EndScalarStuff(fbb);
1153*890232f2SAndroid Build Coastguard Worker           ScalarStuff.FinishScalarStuffBuffer(fbb, offset);
1154*890232f2SAndroid Build Coastguard Worker 
1155*890232f2SAndroid Build Coastguard Worker           ScalarStuff scalarStuff = ScalarStuff.GetRootAsScalarStuff(fbb.DataBuffer);
1156*890232f2SAndroid Build Coastguard Worker           Assert.AreEqual(null, scalarStuff.MaybeEnum);
1157*890232f2SAndroid Build Coastguard Worker         }
1158*890232f2SAndroid Build Coastguard Worker 
1159*890232f2SAndroid Build Coastguard Worker 
1160*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
SortKey_WithDefaultedValue_IsFindable()1161*890232f2SAndroid Build Coastguard Worker         public void SortKey_WithDefaultedValue_IsFindable() {
1162*890232f2SAndroid Build Coastguard Worker             // This checks if using the `key` attribute that includes the
1163*890232f2SAndroid Build Coastguard Worker             // default value (e.g., 0) is still searchable. This is a regression
1164*890232f2SAndroid Build Coastguard Worker             // test for https://github.com/google/flatbuffers/issues/7380.
1165*890232f2SAndroid Build Coastguard Worker             var fbb = new FlatBufferBuilder(1);
1166*890232f2SAndroid Build Coastguard Worker 
1167*890232f2SAndroid Build Coastguard Worker             // Create a vector of Stat objects, with Count being the key.
1168*890232f2SAndroid Build Coastguard Worker             var stat_offsets = new Offset<Stat>[4];
1169*890232f2SAndroid Build Coastguard Worker             for(ushort i = 0; i < stat_offsets.Length; i++) {
1170*890232f2SAndroid Build Coastguard Worker                 Stat.StartStat(fbb);
1171*890232f2SAndroid Build Coastguard Worker                 Stat.AddCount(fbb, i);
1172*890232f2SAndroid Build Coastguard Worker                 stat_offsets[stat_offsets.Length - 1 - i] = Stat.EndStat(fbb);
1173*890232f2SAndroid Build Coastguard Worker             }
1174*890232f2SAndroid Build Coastguard Worker 
1175*890232f2SAndroid Build Coastguard Worker             // Ensure the sort works.
1176*890232f2SAndroid Build Coastguard Worker             var sort = Stat.CreateSortedVectorOfStat(fbb, stat_offsets);
1177*890232f2SAndroid Build Coastguard Worker 
1178*890232f2SAndroid Build Coastguard Worker             // Create the monster with the sorted vector of Stat objects.
1179*890232f2SAndroid Build Coastguard Worker             var str = fbb.CreateString("MyMonster");
1180*890232f2SAndroid Build Coastguard Worker             Monster.StartMonster(fbb);
1181*890232f2SAndroid Build Coastguard Worker             Monster.AddName(fbb, str);
1182*890232f2SAndroid Build Coastguard Worker             Monster.AddScalarKeySortedTables(fbb, sort);
1183*890232f2SAndroid Build Coastguard Worker             fbb.Finish(Monster.EndMonster(fbb).Value);
1184*890232f2SAndroid Build Coastguard Worker 
1185*890232f2SAndroid Build Coastguard Worker             // Get the monster.
1186*890232f2SAndroid Build Coastguard Worker             var monster = Monster.GetRootAsMonster(fbb.DataBuffer);
1187*890232f2SAndroid Build Coastguard Worker 
1188*890232f2SAndroid Build Coastguard Worker             // Ensure each key is findable.
1189*890232f2SAndroid Build Coastguard Worker             for(ushort i =0 ; i < stat_offsets.Length; i++) {
1190*890232f2SAndroid Build Coastguard Worker                 Assert.IsTrue(monster.ScalarKeySortedTablesByKey(i) != null);
1191*890232f2SAndroid Build Coastguard Worker                 Assert.AreEqual(monster.ScalarKeySortedTablesByKey(i).Value.Count, i);
1192*890232f2SAndroid Build Coastguard Worker             }
1193*890232f2SAndroid Build Coastguard Worker         }
1194*890232f2SAndroid Build Coastguard Worker     }
1195*890232f2SAndroid Build Coastguard Worker }
1196