xref: /aosp_15_r20/external/flatbuffers/tests/FlatBuffers.Test/FlatBuffersFuzzTests.cs (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Worker /*
2*890232f2SAndroid Build Coastguard Worker  * Copyright 2015 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;
18*890232f2SAndroid Build Coastguard Worker 
19*890232f2SAndroid Build Coastguard Worker namespace FlatBuffers.Test
20*890232f2SAndroid Build Coastguard Worker {
21*890232f2SAndroid Build Coastguard Worker     [FlatBuffersTestClass]
22*890232f2SAndroid Build Coastguard Worker     public class FlatBuffersFuzzTests
23*890232f2SAndroid Build Coastguard Worker     {
24*890232f2SAndroid Build Coastguard Worker         private readonly Lcg _lcg = new Lcg();
25*890232f2SAndroid Build Coastguard Worker 
26*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestObjects()27*890232f2SAndroid Build Coastguard Worker         public void TestObjects()
28*890232f2SAndroid Build Coastguard Worker         {
29*890232f2SAndroid Build Coastguard Worker             CheckObjects(11, 100);
30*890232f2SAndroid Build Coastguard Worker         }
31*890232f2SAndroid Build Coastguard Worker 
32*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestNumbers()33*890232f2SAndroid Build Coastguard Worker         public void TestNumbers()
34*890232f2SAndroid Build Coastguard Worker         {
35*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
36*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0 }, builder.DataBuffer.ToFullArray());
37*890232f2SAndroid Build Coastguard Worker             builder.AddBool(true);
38*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 1 }, builder.DataBuffer.ToFullArray());
39*890232f2SAndroid Build Coastguard Worker             builder.AddSbyte(-127);
40*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 129, 1 }, builder.DataBuffer.ToFullArray());
41*890232f2SAndroid Build Coastguard Worker             builder.AddByte(255);
42*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0, 255, 129, 1 }, builder.DataBuffer.ToFullArray()); // First pad
43*890232f2SAndroid Build Coastguard Worker             builder.AddShort(-32222);
44*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0, 0, 0x22, 0x82, 0, 255, 129, 1 }, builder.DataBuffer.ToFullArray()); // Second pad
45*890232f2SAndroid Build Coastguard Worker             builder.AddUshort(0xFEEE);
46*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0xEE, 0xFE, 0x22, 0x82, 0, 255, 129, 1 }, builder.DataBuffer.ToFullArray()); // no pad
47*890232f2SAndroid Build Coastguard Worker             builder.AddInt(-53687092);
48*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 204, 204, 204, 252, 0xEE, 0xFE, 0x22, 0x82, 0, 255, 129, 1 }, builder.DataBuffer.ToFullArray()); // third pad
49*890232f2SAndroid Build Coastguard Worker             builder.AddUint(0x98765432);
50*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0x32, 0x54, 0x76, 0x98, 204, 204, 204, 252, 0xEE, 0xFE, 0x22, 0x82, 0, 255, 129, 1 }, builder.DataBuffer.ToFullArray()); // no pad
51*890232f2SAndroid Build Coastguard Worker         }
52*890232f2SAndroid Build Coastguard Worker 
53*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestNumbers64()54*890232f2SAndroid Build Coastguard Worker         public void TestNumbers64()
55*890232f2SAndroid Build Coastguard Worker         {
56*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
57*890232f2SAndroid Build Coastguard Worker             builder.AddUlong(0x1122334455667788);
58*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11 }, builder.DataBuffer.ToFullArray());
59*890232f2SAndroid Build Coastguard Worker 
60*890232f2SAndroid Build Coastguard Worker             builder = new FlatBufferBuilder(1);
61*890232f2SAndroid Build Coastguard Worker             builder.AddLong(0x1122334455667788);
62*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11 }, builder.DataBuffer.ToFullArray());
63*890232f2SAndroid Build Coastguard Worker         }
64*890232f2SAndroid Build Coastguard Worker 
65*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestVector_1xUInt8()66*890232f2SAndroid Build Coastguard Worker         public void TestVector_1xUInt8()
67*890232f2SAndroid Build Coastguard Worker         {
68*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
69*890232f2SAndroid Build Coastguard Worker             builder.StartVector(sizeof(byte), 1, 1);
70*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, builder.DataBuffer.ToFullArray());
71*890232f2SAndroid Build Coastguard Worker             builder.AddByte(1);
72*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }, builder.DataBuffer.ToFullArray());
73*890232f2SAndroid Build Coastguard Worker             builder.EndVector();
74*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 1, 0, 0, 0, 1, 0, 0, 0 }, builder.DataBuffer.ToFullArray());
75*890232f2SAndroid Build Coastguard Worker         }
76*890232f2SAndroid Build Coastguard Worker 
77*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestVector_2xUint8()78*890232f2SAndroid Build Coastguard Worker         public void TestVector_2xUint8()
79*890232f2SAndroid Build Coastguard Worker         {
80*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
81*890232f2SAndroid Build Coastguard Worker             builder.StartVector(sizeof(byte), 2, 1);
82*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, builder.DataBuffer.ToFullArray());
83*890232f2SAndroid Build Coastguard Worker             builder.AddByte(1);
84*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 0, 1, 0, 0 }, builder.DataBuffer.ToFullArray());
85*890232f2SAndroid Build Coastguard Worker             builder.AddByte(2);
86*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 2, 1, 0, 0 }, builder.DataBuffer.ToFullArray());
87*890232f2SAndroid Build Coastguard Worker             builder.EndVector();
88*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 2, 0, 0, 0, 2, 1, 0, 0 }, builder.DataBuffer.ToFullArray());
89*890232f2SAndroid Build Coastguard Worker         }
90*890232f2SAndroid Build Coastguard Worker 
91*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestVector_1xUInt16()92*890232f2SAndroid Build Coastguard Worker         public void TestVector_1xUInt16()
93*890232f2SAndroid Build Coastguard Worker         {
94*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
95*890232f2SAndroid Build Coastguard Worker             builder.StartVector(sizeof(ushort), 1, 1);
96*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, builder.DataBuffer.ToFullArray());
97*890232f2SAndroid Build Coastguard Worker             builder.AddUshort(1);
98*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }, builder.DataBuffer.ToFullArray());
99*890232f2SAndroid Build Coastguard Worker             builder.EndVector();
100*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 1, 0, 0, 0, 1, 0, 0, 0 }, builder.DataBuffer.ToFullArray());
101*890232f2SAndroid Build Coastguard Worker         }
102*890232f2SAndroid Build Coastguard Worker 
103*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestVector_2xUInt16()104*890232f2SAndroid Build Coastguard Worker         public void TestVector_2xUInt16()
105*890232f2SAndroid Build Coastguard Worker         {
106*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
107*890232f2SAndroid Build Coastguard Worker             builder.StartVector(sizeof(ushort), 2, 1);
108*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, builder.DataBuffer.ToFullArray());
109*890232f2SAndroid Build Coastguard Worker             builder.AddUshort(0xABCD);
110*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 0, 0, 0xCD, 0xAB }, builder.DataBuffer.ToFullArray());
111*890232f2SAndroid Build Coastguard Worker             builder.AddUshort(0xDCBA);
112*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0, 0, 0, 0, 0xBA, 0xDC, 0xCD, 0xAB }, builder.DataBuffer.ToFullArray());
113*890232f2SAndroid Build Coastguard Worker             builder.EndVector();
114*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 2, 0, 0, 0, 0xBA, 0xDC, 0xCD, 0xAB }, builder.DataBuffer.ToFullArray());
115*890232f2SAndroid Build Coastguard Worker         }
116*890232f2SAndroid Build Coastguard Worker 
117*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestCreateAsciiString()118*890232f2SAndroid Build Coastguard Worker         public void TestCreateAsciiString()
119*890232f2SAndroid Build Coastguard Worker         {
120*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
121*890232f2SAndroid Build Coastguard Worker             builder.CreateString("foo");
122*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 3, 0, 0, 0, (byte)'f', (byte)'o', (byte)'o', 0 }, builder.DataBuffer.ToFullArray());
123*890232f2SAndroid Build Coastguard Worker 
124*890232f2SAndroid Build Coastguard Worker             builder.CreateString("moop");
125*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[]
126*890232f2SAndroid Build Coastguard Worker             {
127*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
128*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
129*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,  // Padding to 32 bytes
130*890232f2SAndroid Build Coastguard Worker                 4, 0, 0, 0,
131*890232f2SAndroid Build Coastguard Worker                 (byte)'m', (byte)'o', (byte)'o', (byte)'p',
132*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0, // zero terminator with 3 byte pad
133*890232f2SAndroid Build Coastguard Worker                 3, 0, 0, 0,
134*890232f2SAndroid Build Coastguard Worker                 (byte)'f', (byte)'o', (byte)'o', 0
135*890232f2SAndroid Build Coastguard Worker             }, builder.DataBuffer.ToFullArray());
136*890232f2SAndroid Build Coastguard Worker         }
137*890232f2SAndroid Build Coastguard Worker 
138*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestCreateSharedAsciiString()139*890232f2SAndroid Build Coastguard Worker         public void TestCreateSharedAsciiString()
140*890232f2SAndroid Build Coastguard Worker         {
141*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
142*890232f2SAndroid Build Coastguard Worker             builder.CreateSharedString("foo");
143*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 3, 0, 0, 0, (byte)'f', (byte)'o', (byte)'o', 0 }, builder.DataBuffer.ToFullArray());
144*890232f2SAndroid Build Coastguard Worker 
145*890232f2SAndroid Build Coastguard Worker             builder.CreateSharedString("foo");
146*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 3, 0, 0, 0, (byte)'f', (byte)'o', (byte)'o', 0 }, builder.DataBuffer.ToFullArray());
147*890232f2SAndroid Build Coastguard Worker         }
148*890232f2SAndroid Build Coastguard Worker 
149*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestCreateArbitarytring()150*890232f2SAndroid Build Coastguard Worker         public void TestCreateArbitarytring()
151*890232f2SAndroid Build Coastguard Worker         {
152*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
153*890232f2SAndroid Build Coastguard Worker             builder.CreateString("\x01\x02\x03");
154*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[]
155*890232f2SAndroid Build Coastguard Worker             {
156*890232f2SAndroid Build Coastguard Worker                 3, 0, 0, 0,
157*890232f2SAndroid Build Coastguard Worker                 0x01, 0x02, 0x03, 0
158*890232f2SAndroid Build Coastguard Worker             }, builder.DataBuffer.ToFullArray()); // No padding
159*890232f2SAndroid Build Coastguard Worker             builder.CreateString("\x04\x05\x06\x07");
160*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[]
161*890232f2SAndroid Build Coastguard Worker             {
162*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
163*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
164*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,  // Padding to 32 bytes
165*890232f2SAndroid Build Coastguard Worker                 4, 0, 0, 0,
166*890232f2SAndroid Build Coastguard Worker                 0x04, 0x05, 0x06, 0x07,
167*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0, // zero terminator with 3 byte pad
168*890232f2SAndroid Build Coastguard Worker                 3, 0, 0, 0,
169*890232f2SAndroid Build Coastguard Worker                 0x01, 0x02, 0x03, 0
170*890232f2SAndroid Build Coastguard Worker             }, builder.DataBuffer.ToFullArray()); // No padding
171*890232f2SAndroid Build Coastguard Worker         }
172*890232f2SAndroid Build Coastguard Worker 
173*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestEmptyVTable()174*890232f2SAndroid Build Coastguard Worker         public void TestEmptyVTable()
175*890232f2SAndroid Build Coastguard Worker         {
176*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
177*890232f2SAndroid Build Coastguard Worker             builder.StartTable(0);
178*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0 }, builder.DataBuffer.ToFullArray());
179*890232f2SAndroid Build Coastguard Worker             builder.EndTable();
180*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[]
181*890232f2SAndroid Build Coastguard Worker             {
182*890232f2SAndroid Build Coastguard Worker                 4, 0, 4, 0,
183*890232f2SAndroid Build Coastguard Worker                 4, 0, 0, 0
184*890232f2SAndroid Build Coastguard Worker             },
185*890232f2SAndroid Build Coastguard Worker                 builder.DataBuffer.ToFullArray());
186*890232f2SAndroid Build Coastguard Worker         }
187*890232f2SAndroid Build Coastguard Worker 
188*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestVTableWithOneBool()189*890232f2SAndroid Build Coastguard Worker         public void TestVTableWithOneBool()
190*890232f2SAndroid Build Coastguard Worker         {
191*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
192*890232f2SAndroid Build Coastguard Worker             builder.StartTable(1);
193*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0 }, builder.DataBuffer.ToFullArray());
194*890232f2SAndroid Build Coastguard Worker             builder.AddBool(0, true, false);
195*890232f2SAndroid Build Coastguard Worker             builder.EndTable();
196*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[]
197*890232f2SAndroid Build Coastguard Worker             {
198*890232f2SAndroid Build Coastguard Worker                 0, 0, // padding to 16 bytes
199*890232f2SAndroid Build Coastguard Worker                 6, 0, // vtable bytes
200*890232f2SAndroid Build Coastguard Worker                 8, 0, // object length inc vtable offset
201*890232f2SAndroid Build Coastguard Worker                 7, 0, // start of bool value
202*890232f2SAndroid Build Coastguard Worker                 6, 0, 0, 0, // int32 offset for start of vtable
203*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, // padding
204*890232f2SAndroid Build Coastguard Worker                 1, // value 0
205*890232f2SAndroid Build Coastguard Worker             },
206*890232f2SAndroid Build Coastguard Worker                 builder.DataBuffer.ToFullArray());
207*890232f2SAndroid Build Coastguard Worker         }
208*890232f2SAndroid Build Coastguard Worker 
209*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestVTableWithOneBool_DefaultValue()210*890232f2SAndroid Build Coastguard Worker         public void TestVTableWithOneBool_DefaultValue()
211*890232f2SAndroid Build Coastguard Worker         {
212*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
213*890232f2SAndroid Build Coastguard Worker             builder.StartTable(1);
214*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0 }, builder.DataBuffer.ToFullArray());
215*890232f2SAndroid Build Coastguard Worker             builder.AddBool(0, false, false);
216*890232f2SAndroid Build Coastguard Worker             builder.EndTable();
217*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[]
218*890232f2SAndroid Build Coastguard Worker             {
219*890232f2SAndroid Build Coastguard Worker                 // No padding.
220*890232f2SAndroid Build Coastguard Worker                 4, 0, // vtable bytes
221*890232f2SAndroid Build Coastguard Worker                 4, 0, // end of object from here
222*890232f2SAndroid Build Coastguard Worker                 // entry 0 is not stored (trimmed end of vtable)
223*890232f2SAndroid Build Coastguard Worker                 4, 0, 0, 0, // int32 offset for start of vtable
224*890232f2SAndroid Build Coastguard Worker             },
225*890232f2SAndroid Build Coastguard Worker                 builder.DataBuffer.ToFullArray());
226*890232f2SAndroid Build Coastguard Worker         }
227*890232f2SAndroid Build Coastguard Worker 
228*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestVTableWithOneInt16()229*890232f2SAndroid Build Coastguard Worker         public void TestVTableWithOneInt16()
230*890232f2SAndroid Build Coastguard Worker         {
231*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
232*890232f2SAndroid Build Coastguard Worker             builder.StartTable(1);
233*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0 }, builder.DataBuffer.ToFullArray());
234*890232f2SAndroid Build Coastguard Worker             builder.AddShort(0, 0x789A, 0);
235*890232f2SAndroid Build Coastguard Worker             builder.EndTable();
236*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[]
237*890232f2SAndroid Build Coastguard Worker             {
238*890232f2SAndroid Build Coastguard Worker                 0, 0, // padding to 16 bytes
239*890232f2SAndroid Build Coastguard Worker                 6, 0, // vtable bytes
240*890232f2SAndroid Build Coastguard Worker                 8, 0, // object length inc vtable offset
241*890232f2SAndroid Build Coastguard Worker                 6, 0, // start of int16 value
242*890232f2SAndroid Build Coastguard Worker                 6, 0, 0, 0, // int32 offset for start of vtable
243*890232f2SAndroid Build Coastguard Worker                 0, 0, // padding
244*890232f2SAndroid Build Coastguard Worker                 0x9A, 0x78, //value 0
245*890232f2SAndroid Build Coastguard Worker             },
246*890232f2SAndroid Build Coastguard Worker                 builder.DataBuffer.ToFullArray());
247*890232f2SAndroid Build Coastguard Worker         }
248*890232f2SAndroid Build Coastguard Worker 
249*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestVTableWithTwoInt16()250*890232f2SAndroid Build Coastguard Worker         public void TestVTableWithTwoInt16()
251*890232f2SAndroid Build Coastguard Worker         {
252*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
253*890232f2SAndroid Build Coastguard Worker             builder.StartTable(2);
254*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0 }, builder.DataBuffer.ToFullArray());
255*890232f2SAndroid Build Coastguard Worker             builder.AddShort(0, 0x3456, 0);
256*890232f2SAndroid Build Coastguard Worker             builder.AddShort(1, 0x789A, 0);
257*890232f2SAndroid Build Coastguard Worker             builder.EndTable();
258*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[]
259*890232f2SAndroid Build Coastguard Worker             {
260*890232f2SAndroid Build Coastguard Worker                 8, 0, // vtable bytes
261*890232f2SAndroid Build Coastguard Worker                 8, 0, // object length inc vtable offset
262*890232f2SAndroid Build Coastguard Worker                 6, 0, // start of int16 value 0
263*890232f2SAndroid Build Coastguard Worker                 4, 0, // start of int16 value 1
264*890232f2SAndroid Build Coastguard Worker                 8, 0, 0, 0, // int32 offset for start of vtable
265*890232f2SAndroid Build Coastguard Worker                 0x9A, 0x78, // value 1
266*890232f2SAndroid Build Coastguard Worker                 0x56, 0x34, // value 0
267*890232f2SAndroid Build Coastguard Worker             },
268*890232f2SAndroid Build Coastguard Worker                 builder.DataBuffer.ToFullArray());
269*890232f2SAndroid Build Coastguard Worker         }
270*890232f2SAndroid Build Coastguard Worker 
271*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestVTableWithInt16AndBool()272*890232f2SAndroid Build Coastguard Worker         public void TestVTableWithInt16AndBool()
273*890232f2SAndroid Build Coastguard Worker         {
274*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
275*890232f2SAndroid Build Coastguard Worker             builder.StartTable(2);
276*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[] { 0 }, builder.DataBuffer.ToFullArray());
277*890232f2SAndroid Build Coastguard Worker             builder.AddShort(0, 0x3456, 0);
278*890232f2SAndroid Build Coastguard Worker             builder.AddBool(1, true, false);
279*890232f2SAndroid Build Coastguard Worker             builder.EndTable();
280*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[]
281*890232f2SAndroid Build Coastguard Worker             {
282*890232f2SAndroid Build Coastguard Worker                 8, 0, // vtable bytes
283*890232f2SAndroid Build Coastguard Worker                 8, 0, // object length inc vtable offset
284*890232f2SAndroid Build Coastguard Worker                 6, 0, // start of int16 value 0
285*890232f2SAndroid Build Coastguard Worker                 5, 0, // start of bool value 1
286*890232f2SAndroid Build Coastguard Worker                 8, 0, 0, 0, // int32 offset for start of vtable
287*890232f2SAndroid Build Coastguard Worker                 0, 1, // padding + value 1
288*890232f2SAndroid Build Coastguard Worker                 0x56, 0x34, // value 0
289*890232f2SAndroid Build Coastguard Worker             },
290*890232f2SAndroid Build Coastguard Worker                 builder.DataBuffer.ToFullArray());
291*890232f2SAndroid Build Coastguard Worker         }
292*890232f2SAndroid Build Coastguard Worker 
293*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestVTableWithEmptyVector()294*890232f2SAndroid Build Coastguard Worker         public void TestVTableWithEmptyVector()
295*890232f2SAndroid Build Coastguard Worker         {
296*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
297*890232f2SAndroid Build Coastguard Worker             builder.StartVector(sizeof(byte), 0, 1);
298*890232f2SAndroid Build Coastguard Worker             var vecEnd = builder.EndVector();
299*890232f2SAndroid Build Coastguard Worker 
300*890232f2SAndroid Build Coastguard Worker             builder.StartTable(1);
301*890232f2SAndroid Build Coastguard Worker 
302*890232f2SAndroid Build Coastguard Worker             builder.AddOffset(0, vecEnd.Value, 0);
303*890232f2SAndroid Build Coastguard Worker             builder.EndTable();
304*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[]
305*890232f2SAndroid Build Coastguard Worker             {
306*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
307*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
308*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
309*890232f2SAndroid Build Coastguard Worker                 0, 0,       // Padding to 32 bytes
310*890232f2SAndroid Build Coastguard Worker                 6, 0, // vtable bytes
311*890232f2SAndroid Build Coastguard Worker                 8, 0, // object length inc vtable offset
312*890232f2SAndroid Build Coastguard Worker                 4, 0, // start of vector offset value 0
313*890232f2SAndroid Build Coastguard Worker                 6, 0, 0, 0, // int32 offset for start of vtable
314*890232f2SAndroid Build Coastguard Worker                 4, 0, 0, 0,
315*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
316*890232f2SAndroid Build Coastguard Worker             },
317*890232f2SAndroid Build Coastguard Worker                 builder.DataBuffer.ToFullArray());
318*890232f2SAndroid Build Coastguard Worker         }
319*890232f2SAndroid Build Coastguard Worker 
320*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestVTableWithEmptyVectorAndScalars()321*890232f2SAndroid Build Coastguard Worker         public void TestVTableWithEmptyVectorAndScalars()
322*890232f2SAndroid Build Coastguard Worker         {
323*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
324*890232f2SAndroid Build Coastguard Worker             builder.StartVector(sizeof(byte), 0, 1);
325*890232f2SAndroid Build Coastguard Worker             var vecEnd = builder.EndVector();
326*890232f2SAndroid Build Coastguard Worker 
327*890232f2SAndroid Build Coastguard Worker             builder.StartTable(2);
328*890232f2SAndroid Build Coastguard Worker             builder.AddShort(0, 55, 0);
329*890232f2SAndroid Build Coastguard Worker             builder.AddOffset(1, vecEnd.Value, 0);
330*890232f2SAndroid Build Coastguard Worker             builder.EndTable();
331*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[]
332*890232f2SAndroid Build Coastguard Worker             {
333*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
334*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0, // Padding to 32 bytes
335*890232f2SAndroid Build Coastguard Worker                 8, 0, // vtable bytes
336*890232f2SAndroid Build Coastguard Worker                 12, 0, // object length inc vtable offset
337*890232f2SAndroid Build Coastguard Worker                 10, 0,     // offset to int16 value 0
338*890232f2SAndroid Build Coastguard Worker                 4, 0, // start of vector offset value 1
339*890232f2SAndroid Build Coastguard Worker                 8, 0, 0, 0, // int32 offset for start of vtable
340*890232f2SAndroid Build Coastguard Worker                 8, 0, 0, 0, // value 1
341*890232f2SAndroid Build Coastguard Worker                 0, 0, 55, 0, // value 0
342*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0, // length of vector (not in sctruc)
343*890232f2SAndroid Build Coastguard Worker             },
344*890232f2SAndroid Build Coastguard Worker                 builder.DataBuffer.ToFullArray());
345*890232f2SAndroid Build Coastguard Worker         }
346*890232f2SAndroid Build Coastguard Worker 
347*890232f2SAndroid Build Coastguard Worker 
348*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestVTableWith_1xInt16_and_Vector_or_2xInt16()349*890232f2SAndroid Build Coastguard Worker         public void TestVTableWith_1xInt16_and_Vector_or_2xInt16()
350*890232f2SAndroid Build Coastguard Worker         {
351*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
352*890232f2SAndroid Build Coastguard Worker             builder.StartVector(sizeof(short), 2, 1);
353*890232f2SAndroid Build Coastguard Worker             builder.AddShort(0x1234);
354*890232f2SAndroid Build Coastguard Worker             builder.AddShort(0x5678);
355*890232f2SAndroid Build Coastguard Worker             var vecEnd = builder.EndVector();
356*890232f2SAndroid Build Coastguard Worker 
357*890232f2SAndroid Build Coastguard Worker             builder.StartTable(2);
358*890232f2SAndroid Build Coastguard Worker             builder.AddOffset(1, vecEnd.Value, 0);
359*890232f2SAndroid Build Coastguard Worker             builder.AddShort(0, 55, 0);
360*890232f2SAndroid Build Coastguard Worker             builder.EndTable();
361*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[]
362*890232f2SAndroid Build Coastguard Worker             {
363*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0, // Padding to 32 bytes
364*890232f2SAndroid Build Coastguard Worker                 8, 0, // vtable bytes
365*890232f2SAndroid Build Coastguard Worker                 12, 0, // object length
366*890232f2SAndroid Build Coastguard Worker                 6, 0,     // start of value 0 from end of vtable
367*890232f2SAndroid Build Coastguard Worker                 8, 0,     // start of value 1 from end of buffer
368*890232f2SAndroid Build Coastguard Worker                 8, 0, 0, 0, // int32 offset for start of vtable
369*890232f2SAndroid Build Coastguard Worker                 0, 0, 55, 0,    // padding + value 0
370*890232f2SAndroid Build Coastguard Worker                 4, 0, 0, 0, // position of vector from here
371*890232f2SAndroid Build Coastguard Worker                 2, 0, 0, 0, // length of vector
372*890232f2SAndroid Build Coastguard Worker                 0x78, 0x56,       // vector value 0
373*890232f2SAndroid Build Coastguard Worker                 0x34, 0x12,       // vector value 1
374*890232f2SAndroid Build Coastguard Worker             },
375*890232f2SAndroid Build Coastguard Worker                 builder.DataBuffer.ToFullArray());
376*890232f2SAndroid Build Coastguard Worker         }
377*890232f2SAndroid Build Coastguard Worker 
378*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestVTableWithAStruct_of_int8_int16_int32()379*890232f2SAndroid Build Coastguard Worker         public void TestVTableWithAStruct_of_int8_int16_int32()
380*890232f2SAndroid Build Coastguard Worker         {
381*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
382*890232f2SAndroid Build Coastguard Worker             builder.StartTable(1);
383*890232f2SAndroid Build Coastguard Worker             builder.Prep(4+4+4, 0);
384*890232f2SAndroid Build Coastguard Worker             builder.AddSbyte(55);
385*890232f2SAndroid Build Coastguard Worker             builder.Pad(3);
386*890232f2SAndroid Build Coastguard Worker             builder.AddShort(0x1234);
387*890232f2SAndroid Build Coastguard Worker             builder.Pad(2);
388*890232f2SAndroid Build Coastguard Worker             builder.AddInt(0x12345678);
389*890232f2SAndroid Build Coastguard Worker             var structStart = builder.Offset;
390*890232f2SAndroid Build Coastguard Worker             builder.AddStruct(0, structStart, 0);
391*890232f2SAndroid Build Coastguard Worker             builder.EndTable();
392*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[]
393*890232f2SAndroid Build Coastguard Worker             {
394*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
395*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
396*890232f2SAndroid Build Coastguard Worker                 0, 0, // Padding to 32 bytes
397*890232f2SAndroid Build Coastguard Worker                 6, 0, // vtable bytes
398*890232f2SAndroid Build Coastguard Worker                 16, 0, // object length
399*890232f2SAndroid Build Coastguard Worker                 4, 0,     // start of struct from here
400*890232f2SAndroid Build Coastguard Worker                 6, 0, 0, 0, // int32 offset for start of vtable
401*890232f2SAndroid Build Coastguard Worker                 0x78, 0x56, 0x34, 0x12,  // struct value 2
402*890232f2SAndroid Build Coastguard Worker                 0x00, 0x00, 0x34, 0x12, // struct value 1
403*890232f2SAndroid Build Coastguard Worker                 0x00, 0x00, 0x00, 55, // struct value 0
404*890232f2SAndroid Build Coastguard Worker             },
405*890232f2SAndroid Build Coastguard Worker                 builder.DataBuffer.ToFullArray());
406*890232f2SAndroid Build Coastguard Worker         }
407*890232f2SAndroid Build Coastguard Worker 
408*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestVTableWithAVectorOf_2xStructOf_2xInt8()409*890232f2SAndroid Build Coastguard Worker         public void TestVTableWithAVectorOf_2xStructOf_2xInt8()
410*890232f2SAndroid Build Coastguard Worker         {
411*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
412*890232f2SAndroid Build Coastguard Worker             builder.StartVector(sizeof(byte)*2, 2, 1);
413*890232f2SAndroid Build Coastguard Worker             builder.AddByte(33);
414*890232f2SAndroid Build Coastguard Worker             builder.AddByte(44);
415*890232f2SAndroid Build Coastguard Worker             builder.AddByte(55);
416*890232f2SAndroid Build Coastguard Worker             builder.AddByte(66);
417*890232f2SAndroid Build Coastguard Worker             var vecEnd = builder.EndVector();
418*890232f2SAndroid Build Coastguard Worker 
419*890232f2SAndroid Build Coastguard Worker             builder.StartTable(1);
420*890232f2SAndroid Build Coastguard Worker             builder.AddOffset(0, vecEnd.Value, 0);
421*890232f2SAndroid Build Coastguard Worker             builder.EndTable();
422*890232f2SAndroid Build Coastguard Worker 
423*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[]
424*890232f2SAndroid Build Coastguard Worker             {
425*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
426*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
427*890232f2SAndroid Build Coastguard Worker                 0, 0, // Padding to 32 bytes
428*890232f2SAndroid Build Coastguard Worker                 6, 0, // vtable bytes
429*890232f2SAndroid Build Coastguard Worker                 8, 0, // object length
430*890232f2SAndroid Build Coastguard Worker                 4, 0,     // offset of vector offset
431*890232f2SAndroid Build Coastguard Worker                 6, 0, 0, 0, // int32 offset for start of vtable
432*890232f2SAndroid Build Coastguard Worker                 4, 0, 0, 0, // Vector start offset
433*890232f2SAndroid Build Coastguard Worker                 2, 0, 0, 0, // Vector len
434*890232f2SAndroid Build Coastguard Worker                 66, // vector 1, 1
435*890232f2SAndroid Build Coastguard Worker                 55, // vector 1, 0
436*890232f2SAndroid Build Coastguard Worker                 44, // vector 0, 1
437*890232f2SAndroid Build Coastguard Worker                 33, // vector 0, 0
438*890232f2SAndroid Build Coastguard Worker             },
439*890232f2SAndroid Build Coastguard Worker                 builder.DataBuffer.ToFullArray());
440*890232f2SAndroid Build Coastguard Worker         }
441*890232f2SAndroid Build Coastguard Worker 
442*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestVTableWithSomeElements()443*890232f2SAndroid Build Coastguard Worker         public void TestVTableWithSomeElements()
444*890232f2SAndroid Build Coastguard Worker         {
445*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
446*890232f2SAndroid Build Coastguard Worker             builder.StartTable(2);
447*890232f2SAndroid Build Coastguard Worker             builder.AddByte(0, 33, 0);
448*890232f2SAndroid Build Coastguard Worker             builder.AddShort(1, 66, 0);
449*890232f2SAndroid Build Coastguard Worker             var off = builder.EndTable();
450*890232f2SAndroid Build Coastguard Worker             builder.Finish(off);
451*890232f2SAndroid Build Coastguard Worker 
452*890232f2SAndroid Build Coastguard Worker             byte[] padded = new byte[]
453*890232f2SAndroid Build Coastguard Worker             {
454*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
455*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
456*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0, //Padding to 32 bytes
457*890232f2SAndroid Build Coastguard Worker                 12, 0, 0, 0,     // root of table, pointing to vtable offset
458*890232f2SAndroid Build Coastguard Worker                 8, 0, // vtable bytes
459*890232f2SAndroid Build Coastguard Worker                 8, 0, // object length
460*890232f2SAndroid Build Coastguard Worker                 7, 0, // start of value 0
461*890232f2SAndroid Build Coastguard Worker                 4, 0, // start of value 1
462*890232f2SAndroid Build Coastguard Worker                 8, 0, 0, 0, // int32 offset for start of vtable
463*890232f2SAndroid Build Coastguard Worker                 66, 0, // value 1
464*890232f2SAndroid Build Coastguard Worker                 0, 33, // value 0
465*890232f2SAndroid Build Coastguard Worker 
466*890232f2SAndroid Build Coastguard Worker             };
467*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(padded, builder.DataBuffer.ToFullArray());
468*890232f2SAndroid Build Coastguard Worker 
469*890232f2SAndroid Build Coastguard Worker             // no padding in sized array
470*890232f2SAndroid Build Coastguard Worker             byte[] unpadded = new byte[padded.Length - 12];
471*890232f2SAndroid Build Coastguard Worker             Buffer.BlockCopy(padded, 12, unpadded, 0, unpadded.Length);
472*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(unpadded, builder.DataBuffer.ToSizedArray());
473*890232f2SAndroid Build Coastguard Worker         }
474*890232f2SAndroid Build Coastguard Worker 
475*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestTwoFinishTable()476*890232f2SAndroid Build Coastguard Worker         public void TestTwoFinishTable()
477*890232f2SAndroid Build Coastguard Worker         {
478*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
479*890232f2SAndroid Build Coastguard Worker             builder.StartTable(2);
480*890232f2SAndroid Build Coastguard Worker             builder.AddByte(0, 33, 0);
481*890232f2SAndroid Build Coastguard Worker             builder.AddByte(1, 44, 0);
482*890232f2SAndroid Build Coastguard Worker             var off0 = builder.EndTable();
483*890232f2SAndroid Build Coastguard Worker             builder.Finish(off0);
484*890232f2SAndroid Build Coastguard Worker 
485*890232f2SAndroid Build Coastguard Worker             builder.StartTable(3);
486*890232f2SAndroid Build Coastguard Worker             builder.AddByte(0, 55, 0);
487*890232f2SAndroid Build Coastguard Worker             builder.AddByte(1, 66, 0);
488*890232f2SAndroid Build Coastguard Worker             builder.AddByte(2, 77, 0);
489*890232f2SAndroid Build Coastguard Worker             var off1 = builder.EndTable();
490*890232f2SAndroid Build Coastguard Worker             builder.Finish(off1);
491*890232f2SAndroid Build Coastguard Worker 
492*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[]
493*890232f2SAndroid Build Coastguard Worker             {
494*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
495*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
496*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
497*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
498*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,       // padding to 64 bytes
499*890232f2SAndroid Build Coastguard Worker                 16, 0, 0, 0,     // root of table, pointing to vtable offset (obj1)
500*890232f2SAndroid Build Coastguard Worker                 0, 0, // padding
501*890232f2SAndroid Build Coastguard Worker 
502*890232f2SAndroid Build Coastguard Worker                 10, 0, // vtable bytes
503*890232f2SAndroid Build Coastguard Worker                 8, 0, // object length
504*890232f2SAndroid Build Coastguard Worker                 7, 0, // start of value 0
505*890232f2SAndroid Build Coastguard Worker                 6, 0, // start of value 1
506*890232f2SAndroid Build Coastguard Worker                 5, 0, // start of value 2
507*890232f2SAndroid Build Coastguard Worker                 10, 0, 0, 0, // int32 offset for start of vtable
508*890232f2SAndroid Build Coastguard Worker                 0, // pad
509*890232f2SAndroid Build Coastguard Worker                 77, // values 2, 1, 0
510*890232f2SAndroid Build Coastguard Worker                 66,
511*890232f2SAndroid Build Coastguard Worker                 55,
512*890232f2SAndroid Build Coastguard Worker 
513*890232f2SAndroid Build Coastguard Worker                 12, 0, 0, 0,     // root of table, pointing to vtable offset (obj0)
514*890232f2SAndroid Build Coastguard Worker                 8, 0, // vtable bytes
515*890232f2SAndroid Build Coastguard Worker                 8, 0, // object length
516*890232f2SAndroid Build Coastguard Worker                 7, 0, // start of value 0
517*890232f2SAndroid Build Coastguard Worker                 6, 0, // start of value 1
518*890232f2SAndroid Build Coastguard Worker                 8, 0, 0, 0, // int32 offset for start of vtable
519*890232f2SAndroid Build Coastguard Worker                 0, 0, // pad
520*890232f2SAndroid Build Coastguard Worker                 44, // value 1, 0
521*890232f2SAndroid Build Coastguard Worker                 33,
522*890232f2SAndroid Build Coastguard Worker             },
523*890232f2SAndroid Build Coastguard Worker                 builder.DataBuffer.ToFullArray());
524*890232f2SAndroid Build Coastguard Worker         }
525*890232f2SAndroid Build Coastguard Worker 
526*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestBunchOfBools()527*890232f2SAndroid Build Coastguard Worker         public void TestBunchOfBools()
528*890232f2SAndroid Build Coastguard Worker         {
529*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
530*890232f2SAndroid Build Coastguard Worker             builder.StartTable(8);
531*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < 8; i++)
532*890232f2SAndroid Build Coastguard Worker             {
533*890232f2SAndroid Build Coastguard Worker                 builder.AddBool(i, true, false);
534*890232f2SAndroid Build Coastguard Worker             }
535*890232f2SAndroid Build Coastguard Worker             var off = builder.EndTable();
536*890232f2SAndroid Build Coastguard Worker             builder.Finish(off);
537*890232f2SAndroid Build Coastguard Worker 
538*890232f2SAndroid Build Coastguard Worker             byte[] padded = new byte[]
539*890232f2SAndroid Build Coastguard Worker             {
540*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
541*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
542*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
543*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
544*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
545*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
546*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,       // padding to 64 bytes
547*890232f2SAndroid Build Coastguard Worker 
548*890232f2SAndroid Build Coastguard Worker                 24, 0, 0, 0,     // root of table, pointing to vtable offset (obj0)
549*890232f2SAndroid Build Coastguard Worker                 20, 0, // vtable bytes
550*890232f2SAndroid Build Coastguard Worker                 12, 0, // object length
551*890232f2SAndroid Build Coastguard Worker                 11, 0, // start of value 0
552*890232f2SAndroid Build Coastguard Worker                 10, 0, // start of value 1
553*890232f2SAndroid Build Coastguard Worker                 9, 0, // start of value 2
554*890232f2SAndroid Build Coastguard Worker                 8, 0, // start of value 3
555*890232f2SAndroid Build Coastguard Worker                 7, 0, // start of value 4
556*890232f2SAndroid Build Coastguard Worker                 6, 0, // start of value 5
557*890232f2SAndroid Build Coastguard Worker                 5, 0, // start of value 6
558*890232f2SAndroid Build Coastguard Worker                 4, 0, // start of value 7
559*890232f2SAndroid Build Coastguard Worker 
560*890232f2SAndroid Build Coastguard Worker                 20, 0, 0, 0, // int32 offset for start of vtable
561*890232f2SAndroid Build Coastguard Worker 
562*890232f2SAndroid Build Coastguard Worker                 1, 1, 1, 1,  // values
563*890232f2SAndroid Build Coastguard Worker                 1, 1, 1, 1,
564*890232f2SAndroid Build Coastguard Worker 
565*890232f2SAndroid Build Coastguard Worker             };
566*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(padded, builder.DataBuffer.ToFullArray());
567*890232f2SAndroid Build Coastguard Worker 
568*890232f2SAndroid Build Coastguard Worker             // no padding in sized array
569*890232f2SAndroid Build Coastguard Worker             byte[] unpadded = new byte[padded.Length - 28];
570*890232f2SAndroid Build Coastguard Worker             Buffer.BlockCopy(padded, 28, unpadded, 0, unpadded.Length);
571*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(unpadded, builder.DataBuffer.ToSizedArray());
572*890232f2SAndroid Build Coastguard Worker         }
573*890232f2SAndroid Build Coastguard Worker 
574*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestBunchOfBoolsSizePrefixed()575*890232f2SAndroid Build Coastguard Worker         public void TestBunchOfBoolsSizePrefixed()
576*890232f2SAndroid Build Coastguard Worker         {
577*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
578*890232f2SAndroid Build Coastguard Worker             builder.StartTable(8);
579*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < 8; i++)
580*890232f2SAndroid Build Coastguard Worker             {
581*890232f2SAndroid Build Coastguard Worker                 builder.AddBool(i, true, false);
582*890232f2SAndroid Build Coastguard Worker             }
583*890232f2SAndroid Build Coastguard Worker             var off = builder.EndTable();
584*890232f2SAndroid Build Coastguard Worker             builder.FinishSizePrefixed(off);
585*890232f2SAndroid Build Coastguard Worker 
586*890232f2SAndroid Build Coastguard Worker             byte[] padded = new byte[]
587*890232f2SAndroid Build Coastguard Worker             {
588*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
589*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
590*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
591*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
592*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,
593*890232f2SAndroid Build Coastguard Worker                 0, 0, 0, 0,      // padding to 64 bytes
594*890232f2SAndroid Build Coastguard Worker 
595*890232f2SAndroid Build Coastguard Worker                 36, 0, 0, 0,     // size prefix
596*890232f2SAndroid Build Coastguard Worker                 24, 0, 0, 0,     // root of table, pointing to vtable offset (obj0)
597*890232f2SAndroid Build Coastguard Worker                 20, 0, // vtable bytes
598*890232f2SAndroid Build Coastguard Worker                 12, 0, // object length
599*890232f2SAndroid Build Coastguard Worker                 11, 0, // start of value 0
600*890232f2SAndroid Build Coastguard Worker                 10, 0, // start of value 1
601*890232f2SAndroid Build Coastguard Worker                 9, 0, // start of value 2
602*890232f2SAndroid Build Coastguard Worker                 8, 0, // start of value 3
603*890232f2SAndroid Build Coastguard Worker                 7, 0, // start of value 4
604*890232f2SAndroid Build Coastguard Worker                 6, 0, // start of value 5
605*890232f2SAndroid Build Coastguard Worker                 5, 0, // start of value 6
606*890232f2SAndroid Build Coastguard Worker                 4, 0, // start of value 7
607*890232f2SAndroid Build Coastguard Worker 
608*890232f2SAndroid Build Coastguard Worker                 20, 0, 0, 0, // int32 offset for start of vtable
609*890232f2SAndroid Build Coastguard Worker 
610*890232f2SAndroid Build Coastguard Worker                 1, 1, 1, 1,  // values
611*890232f2SAndroid Build Coastguard Worker                 1, 1, 1, 1,
612*890232f2SAndroid Build Coastguard Worker 
613*890232f2SAndroid Build Coastguard Worker             };
614*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(padded, builder.DataBuffer.ToFullArray());
615*890232f2SAndroid Build Coastguard Worker 
616*890232f2SAndroid Build Coastguard Worker             // no padding in sized array
617*890232f2SAndroid Build Coastguard Worker             byte[] unpadded = new byte[padded.Length - 24];
618*890232f2SAndroid Build Coastguard Worker             Buffer.BlockCopy(padded, 24, unpadded, 0, unpadded.Length);
619*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(unpadded, builder.DataBuffer.ToSizedArray());
620*890232f2SAndroid Build Coastguard Worker         }
621*890232f2SAndroid Build Coastguard Worker 
622*890232f2SAndroid Build Coastguard Worker         [FlatBuffersTestMethod]
TestWithFloat()623*890232f2SAndroid Build Coastguard Worker         public void TestWithFloat()
624*890232f2SAndroid Build Coastguard Worker         {
625*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
626*890232f2SAndroid Build Coastguard Worker             builder.StartTable(1);
627*890232f2SAndroid Build Coastguard Worker             builder.AddFloat(0, 1, 0);
628*890232f2SAndroid Build Coastguard Worker             builder.EndTable();
629*890232f2SAndroid Build Coastguard Worker 
630*890232f2SAndroid Build Coastguard Worker 
631*890232f2SAndroid Build Coastguard Worker             Assert.ArrayEqual(new byte[]
632*890232f2SAndroid Build Coastguard Worker             {
633*890232f2SAndroid Build Coastguard Worker                 0, 0,
634*890232f2SAndroid Build Coastguard Worker                 6, 0, // vtable bytes
635*890232f2SAndroid Build Coastguard Worker                 8, 0, // object length
636*890232f2SAndroid Build Coastguard Worker                 4, 0, // start of value 0
637*890232f2SAndroid Build Coastguard Worker                 6, 0, 0, 0, // int32 offset for start of vtable
638*890232f2SAndroid Build Coastguard Worker                 0, 0, 128, 63,  // value
639*890232f2SAndroid Build Coastguard Worker 
640*890232f2SAndroid Build Coastguard Worker             },
641*890232f2SAndroid Build Coastguard Worker                 builder.DataBuffer.ToFullArray());
642*890232f2SAndroid Build Coastguard Worker         }
643*890232f2SAndroid Build Coastguard Worker 
CheckObjects(int fieldCount, int objectCount)644*890232f2SAndroid Build Coastguard Worker         private void CheckObjects(int fieldCount, int objectCount)
645*890232f2SAndroid Build Coastguard Worker         {
646*890232f2SAndroid Build Coastguard Worker             _lcg.Reset();
647*890232f2SAndroid Build Coastguard Worker 
648*890232f2SAndroid Build Coastguard Worker             const int testValuesMax = 11;
649*890232f2SAndroid Build Coastguard Worker 
650*890232f2SAndroid Build Coastguard Worker             var builder = new FlatBufferBuilder(1);
651*890232f2SAndroid Build Coastguard Worker 
652*890232f2SAndroid Build Coastguard Worker             var objects = new int[objectCount];
653*890232f2SAndroid Build Coastguard Worker 
654*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < objectCount; ++i)
655*890232f2SAndroid Build Coastguard Worker             {
656*890232f2SAndroid Build Coastguard Worker                 builder.StartTable(fieldCount);
657*890232f2SAndroid Build Coastguard Worker 
658*890232f2SAndroid Build Coastguard Worker                 for (var j = 0; j < fieldCount; ++j)
659*890232f2SAndroid Build Coastguard Worker                 {
660*890232f2SAndroid Build Coastguard Worker                     var fieldType = _lcg.Next()%testValuesMax;
661*890232f2SAndroid Build Coastguard Worker 
662*890232f2SAndroid Build Coastguard Worker                     switch (fieldType)
663*890232f2SAndroid Build Coastguard Worker                     {
664*890232f2SAndroid Build Coastguard Worker                         case 0:
665*890232f2SAndroid Build Coastguard Worker                         {
666*890232f2SAndroid Build Coastguard Worker                             builder.AddBool(j, FuzzTestData.BoolValue, false);
667*890232f2SAndroid Build Coastguard Worker                             break;
668*890232f2SAndroid Build Coastguard Worker                         }
669*890232f2SAndroid Build Coastguard Worker                         case 1:
670*890232f2SAndroid Build Coastguard Worker                         {
671*890232f2SAndroid Build Coastguard Worker                             builder.AddSbyte(j, FuzzTestData.Int8Value, 0);
672*890232f2SAndroid Build Coastguard Worker                             break;
673*890232f2SAndroid Build Coastguard Worker                         }
674*890232f2SAndroid Build Coastguard Worker                         case 2:
675*890232f2SAndroid Build Coastguard Worker                         {
676*890232f2SAndroid Build Coastguard Worker                             builder.AddByte(j, FuzzTestData.UInt8Value, 0);
677*890232f2SAndroid Build Coastguard Worker                             break;
678*890232f2SAndroid Build Coastguard Worker                         }
679*890232f2SAndroid Build Coastguard Worker                         case 3:
680*890232f2SAndroid Build Coastguard Worker                         {
681*890232f2SAndroid Build Coastguard Worker                             builder.AddShort(j, FuzzTestData.Int16Value, 0);
682*890232f2SAndroid Build Coastguard Worker                             break;
683*890232f2SAndroid Build Coastguard Worker                         }
684*890232f2SAndroid Build Coastguard Worker                         case 4:
685*890232f2SAndroid Build Coastguard Worker                         {
686*890232f2SAndroid Build Coastguard Worker                             builder.AddUshort(j, FuzzTestData.UInt16Value, 0);
687*890232f2SAndroid Build Coastguard Worker                             break;
688*890232f2SAndroid Build Coastguard Worker                         }
689*890232f2SAndroid Build Coastguard Worker                         case 5:
690*890232f2SAndroid Build Coastguard Worker                         {
691*890232f2SAndroid Build Coastguard Worker                             builder.AddInt(j, FuzzTestData.Int32Value, 0);
692*890232f2SAndroid Build Coastguard Worker                             break;
693*890232f2SAndroid Build Coastguard Worker                         }
694*890232f2SAndroid Build Coastguard Worker                         case 6:
695*890232f2SAndroid Build Coastguard Worker                         {
696*890232f2SAndroid Build Coastguard Worker                             builder.AddUint(j, FuzzTestData.UInt32Value, 0);
697*890232f2SAndroid Build Coastguard Worker                             break;
698*890232f2SAndroid Build Coastguard Worker                         }
699*890232f2SAndroid Build Coastguard Worker                         case 7:
700*890232f2SAndroid Build Coastguard Worker                         {
701*890232f2SAndroid Build Coastguard Worker                             builder.AddLong(j, FuzzTestData.Int64Value, 0);
702*890232f2SAndroid Build Coastguard Worker                             break;
703*890232f2SAndroid Build Coastguard Worker                         }
704*890232f2SAndroid Build Coastguard Worker                         case 8:
705*890232f2SAndroid Build Coastguard Worker                         {
706*890232f2SAndroid Build Coastguard Worker                             builder.AddUlong(j, FuzzTestData.UInt64Value, 0);
707*890232f2SAndroid Build Coastguard Worker                             break;
708*890232f2SAndroid Build Coastguard Worker                         }
709*890232f2SAndroid Build Coastguard Worker                         case 9:
710*890232f2SAndroid Build Coastguard Worker                         {
711*890232f2SAndroid Build Coastguard Worker                             builder.AddFloat(j, FuzzTestData.Float32Value, 0);
712*890232f2SAndroid Build Coastguard Worker                             break;
713*890232f2SAndroid Build Coastguard Worker                         }
714*890232f2SAndroid Build Coastguard Worker                         case 10:
715*890232f2SAndroid Build Coastguard Worker                         {
716*890232f2SAndroid Build Coastguard Worker                             builder.AddDouble(j, FuzzTestData.Float64Value, 0);
717*890232f2SAndroid Build Coastguard Worker                             break;
718*890232f2SAndroid Build Coastguard Worker                         }
719*890232f2SAndroid Build Coastguard Worker                         default:
720*890232f2SAndroid Build Coastguard Worker                             throw new Exception("Unreachable");
721*890232f2SAndroid Build Coastguard Worker                     }
722*890232f2SAndroid Build Coastguard Worker 
723*890232f2SAndroid Build Coastguard Worker                 }
724*890232f2SAndroid Build Coastguard Worker 
725*890232f2SAndroid Build Coastguard Worker                 var offset = builder.EndTable();
726*890232f2SAndroid Build Coastguard Worker 
727*890232f2SAndroid Build Coastguard Worker                 // Store the object offset
728*890232f2SAndroid Build Coastguard Worker                 objects[i] = offset;
729*890232f2SAndroid Build Coastguard Worker             }
730*890232f2SAndroid Build Coastguard Worker 
731*890232f2SAndroid Build Coastguard Worker             _lcg.Reset();
732*890232f2SAndroid Build Coastguard Worker 
733*890232f2SAndroid Build Coastguard Worker             // Test all objects are readable and return expected values...
734*890232f2SAndroid Build Coastguard Worker             for (var i = 0; i < objectCount; ++i)
735*890232f2SAndroid Build Coastguard Worker             {
736*890232f2SAndroid Build Coastguard Worker                 var table = new TestTable(builder.DataBuffer, builder.DataBuffer.Length - objects[i]);
737*890232f2SAndroid Build Coastguard Worker 
738*890232f2SAndroid Build Coastguard Worker                 for (var j = 0; j < fieldCount; ++j)
739*890232f2SAndroid Build Coastguard Worker                 {
740*890232f2SAndroid Build Coastguard Worker                     var fieldType = _lcg.Next() % testValuesMax;
741*890232f2SAndroid Build Coastguard Worker                     var fc = 2 + j; // 2 == VtableMetadataFields
742*890232f2SAndroid Build Coastguard Worker                     var f = fc * 2;
743*890232f2SAndroid Build Coastguard Worker 
744*890232f2SAndroid Build Coastguard Worker                     switch (fieldType)
745*890232f2SAndroid Build Coastguard Worker                     {
746*890232f2SAndroid Build Coastguard Worker                         case 0:
747*890232f2SAndroid Build Coastguard Worker                         {
748*890232f2SAndroid Build Coastguard Worker                             Assert.AreEqual(FuzzTestData.BoolValue, table.GetSlot(f, false));
749*890232f2SAndroid Build Coastguard Worker                             break;
750*890232f2SAndroid Build Coastguard Worker                         }
751*890232f2SAndroid Build Coastguard Worker                         case 1:
752*890232f2SAndroid Build Coastguard Worker                         {
753*890232f2SAndroid Build Coastguard Worker                             Assert.AreEqual(FuzzTestData.Int8Value, table.GetSlot(f, (sbyte)0));
754*890232f2SAndroid Build Coastguard Worker                             break;
755*890232f2SAndroid Build Coastguard Worker                         }
756*890232f2SAndroid Build Coastguard Worker                         case 2:
757*890232f2SAndroid Build Coastguard Worker                         {
758*890232f2SAndroid Build Coastguard Worker                             Assert.AreEqual(FuzzTestData.UInt8Value, table.GetSlot(f, (byte)0));
759*890232f2SAndroid Build Coastguard Worker                             break;
760*890232f2SAndroid Build Coastguard Worker                         }
761*890232f2SAndroid Build Coastguard Worker                         case 3:
762*890232f2SAndroid Build Coastguard Worker                         {
763*890232f2SAndroid Build Coastguard Worker                             Assert.AreEqual(FuzzTestData.Int16Value, table.GetSlot(f, (short)0));
764*890232f2SAndroid Build Coastguard Worker                             break;
765*890232f2SAndroid Build Coastguard Worker                         }
766*890232f2SAndroid Build Coastguard Worker                         case 4:
767*890232f2SAndroid Build Coastguard Worker                         {
768*890232f2SAndroid Build Coastguard Worker                             Assert.AreEqual(FuzzTestData.UInt16Value, table.GetSlot(f, (ushort)0));
769*890232f2SAndroid Build Coastguard Worker                             break;
770*890232f2SAndroid Build Coastguard Worker                         }
771*890232f2SAndroid Build Coastguard Worker                         case 5:
772*890232f2SAndroid Build Coastguard Worker                         {
773*890232f2SAndroid Build Coastguard Worker                             Assert.AreEqual(FuzzTestData.Int32Value, table.GetSlot(f, (int)0));
774*890232f2SAndroid Build Coastguard Worker                             break;
775*890232f2SAndroid Build Coastguard Worker                         }
776*890232f2SAndroid Build Coastguard Worker                         case 6:
777*890232f2SAndroid Build Coastguard Worker                         {
778*890232f2SAndroid Build Coastguard Worker                             Assert.AreEqual(FuzzTestData.UInt32Value, table.GetSlot(f, (uint)0));
779*890232f2SAndroid Build Coastguard Worker                             break;
780*890232f2SAndroid Build Coastguard Worker                         }
781*890232f2SAndroid Build Coastguard Worker                         case 7:
782*890232f2SAndroid Build Coastguard Worker                         {
783*890232f2SAndroid Build Coastguard Worker                             Assert.AreEqual(FuzzTestData.Int64Value, table.GetSlot(f, (long)0));
784*890232f2SAndroid Build Coastguard Worker                             break;
785*890232f2SAndroid Build Coastguard Worker                         }
786*890232f2SAndroid Build Coastguard Worker                         case 8:
787*890232f2SAndroid Build Coastguard Worker                         {
788*890232f2SAndroid Build Coastguard Worker                             Assert.AreEqual(FuzzTestData.UInt64Value, table.GetSlot(f, (ulong)0));
789*890232f2SAndroid Build Coastguard Worker                             break;
790*890232f2SAndroid Build Coastguard Worker                         }
791*890232f2SAndroid Build Coastguard Worker                         case 9:
792*890232f2SAndroid Build Coastguard Worker                         {
793*890232f2SAndroid Build Coastguard Worker                             Assert.AreEqual(FuzzTestData.Float32Value, table.GetSlot(f, (float)0));
794*890232f2SAndroid Build Coastguard Worker                             break;
795*890232f2SAndroid Build Coastguard Worker                         }
796*890232f2SAndroid Build Coastguard Worker                         case 10:
797*890232f2SAndroid Build Coastguard Worker                         {
798*890232f2SAndroid Build Coastguard Worker                             Assert.AreEqual(FuzzTestData.Float64Value, table.GetSlot(f, (double)0));
799*890232f2SAndroid Build Coastguard Worker                             break;
800*890232f2SAndroid Build Coastguard Worker                         }
801*890232f2SAndroid Build Coastguard Worker                         default:
802*890232f2SAndroid Build Coastguard Worker                             throw new Exception("Unreachable");
803*890232f2SAndroid Build Coastguard Worker                     }
804*890232f2SAndroid Build Coastguard Worker 
805*890232f2SAndroid Build Coastguard Worker                 }
806*890232f2SAndroid Build Coastguard Worker 
807*890232f2SAndroid Build Coastguard Worker             }
808*890232f2SAndroid Build Coastguard Worker 
809*890232f2SAndroid Build Coastguard Worker         }
810*890232f2SAndroid Build Coastguard Worker     }
811*890232f2SAndroid Build Coastguard Worker }
812