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