1*890232f2SAndroid Build Coastguard Worker/* 2*890232f2SAndroid Build Coastguard Worker * Copyright 2014 Google Inc. All rights reserved. 3*890232f2SAndroid Build Coastguard Worker * 4*890232f2SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*890232f2SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*890232f2SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*890232f2SAndroid Build Coastguard Worker * 8*890232f2SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*890232f2SAndroid Build Coastguard Worker * 10*890232f2SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*890232f2SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*890232f2SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*890232f2SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*890232f2SAndroid Build Coastguard Worker * limitations under the License. 15*890232f2SAndroid Build Coastguard Worker */ 16*890232f2SAndroid Build Coastguard Worker 17*890232f2SAndroid Build Coastguard Workerpackage main 18*890232f2SAndroid Build Coastguard Worker 19*890232f2SAndroid Build Coastguard Workerimport ( 20*890232f2SAndroid Build Coastguard Worker mygame "MyGame" // refers to generated code 21*890232f2SAndroid Build Coastguard Worker example "MyGame/Example" // refers to generated code 22*890232f2SAndroid Build Coastguard Worker "encoding/json" 23*890232f2SAndroid Build Coastguard Worker optional_scalars "optional_scalars" // refers to generated code 24*890232f2SAndroid Build Coastguard Worker 25*890232f2SAndroid Build Coastguard Worker "bytes" 26*890232f2SAndroid Build Coastguard Worker "flag" 27*890232f2SAndroid Build Coastguard Worker "fmt" 28*890232f2SAndroid Build Coastguard Worker "os" 29*890232f2SAndroid Build Coastguard Worker "reflect" 30*890232f2SAndroid Build Coastguard Worker "sort" 31*890232f2SAndroid Build Coastguard Worker "testing" 32*890232f2SAndroid Build Coastguard Worker "testing/quick" 33*890232f2SAndroid Build Coastguard Worker 34*890232f2SAndroid Build Coastguard Worker flatbuffers "github.com/google/flatbuffers/go" 35*890232f2SAndroid Build Coastguard Worker) 36*890232f2SAndroid Build Coastguard Worker 37*890232f2SAndroid Build Coastguard Workervar ( 38*890232f2SAndroid Build Coastguard Worker cppData, javaData, outData string 39*890232f2SAndroid Build Coastguard Worker fuzz bool 40*890232f2SAndroid Build Coastguard Worker fuzzFields, fuzzObjects int 41*890232f2SAndroid Build Coastguard Worker) 42*890232f2SAndroid Build Coastguard Worker 43*890232f2SAndroid Build Coastguard Workerfunc init() { 44*890232f2SAndroid Build Coastguard Worker flag.StringVar(&cppData, "cpp_data", "", 45*890232f2SAndroid Build Coastguard Worker "location of monsterdata_test.mon to verify against (required)") 46*890232f2SAndroid Build Coastguard Worker flag.StringVar(&javaData, "java_data", "", 47*890232f2SAndroid Build Coastguard Worker "location of monsterdata_java_wire.mon to verify against (optional)") 48*890232f2SAndroid Build Coastguard Worker flag.StringVar(&outData, "out_data", "", 49*890232f2SAndroid Build Coastguard Worker "location to write generated Go data") 50*890232f2SAndroid Build Coastguard Worker flag.BoolVar(&fuzz, "fuzz", false, "perform fuzzing") 51*890232f2SAndroid Build Coastguard Worker flag.IntVar(&fuzzFields, "fuzz_fields", 4, "fields per fuzzer object") 52*890232f2SAndroid Build Coastguard Worker flag.IntVar(&fuzzObjects, "fuzz_objects", 10000, 53*890232f2SAndroid Build Coastguard Worker "number of fuzzer objects (higher is slower and more thorough") 54*890232f2SAndroid Build Coastguard Worker} 55*890232f2SAndroid Build Coastguard Worker 56*890232f2SAndroid Build Coastguard Worker// Store specific byte patterns in these variables for the fuzzer. These 57*890232f2SAndroid Build Coastguard Worker// values are taken verbatim from the C++ function FuzzTest1. 58*890232f2SAndroid Build Coastguard Workervar ( 59*890232f2SAndroid Build Coastguard Worker overflowingInt32Val = flatbuffers.GetInt32([]byte{0x83, 0x33, 0x33, 0x33}) 60*890232f2SAndroid Build Coastguard Worker overflowingInt64Val = flatbuffers.GetInt64([]byte{0x84, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44}) 61*890232f2SAndroid Build Coastguard Worker) 62*890232f2SAndroid Build Coastguard Worker 63*890232f2SAndroid Build Coastguard Workerfunc TestMain(m *testing.M) { 64*890232f2SAndroid Build Coastguard Worker flag.Parse() 65*890232f2SAndroid Build Coastguard Worker if cppData == "" { 66*890232f2SAndroid Build Coastguard Worker fmt.Fprintf(os.Stderr, "cpp_data argument is required\n") 67*890232f2SAndroid Build Coastguard Worker os.Exit(1) 68*890232f2SAndroid Build Coastguard Worker } 69*890232f2SAndroid Build Coastguard Worker os.Exit(m.Run()) 70*890232f2SAndroid Build Coastguard Worker} 71*890232f2SAndroid Build Coastguard Worker 72*890232f2SAndroid Build Coastguard Worker// TestTextParsing test if text parsing works with object API. 73*890232f2SAndroid Build Coastguard Workerfunc TestTextParsing(t *testing.T) { 74*890232f2SAndroid Build Coastguard Worker expectedMonster := example.MonsterT{ 75*890232f2SAndroid Build Coastguard Worker Mana: 42, 76*890232f2SAndroid Build Coastguard Worker Name: "foo", 77*890232f2SAndroid Build Coastguard Worker LongEnumNormalDefault: example.LongEnumLongTwo, 78*890232f2SAndroid Build Coastguard Worker } 79*890232f2SAndroid Build Coastguard Worker 80*890232f2SAndroid Build Coastguard Worker buf := new(bytes.Buffer) 81*890232f2SAndroid Build Coastguard Worker if err := json.NewEncoder(buf).Encode(expectedMonster); err != nil { 82*890232f2SAndroid Build Coastguard Worker t.Fatal(err) 83*890232f2SAndroid Build Coastguard Worker } 84*890232f2SAndroid Build Coastguard Worker 85*890232f2SAndroid Build Coastguard Worker var monster example.MonsterT 86*890232f2SAndroid Build Coastguard Worker if err := json.NewDecoder(buf).Decode(&monster); err != nil { 87*890232f2SAndroid Build Coastguard Worker t.Fatal(err) 88*890232f2SAndroid Build Coastguard Worker } 89*890232f2SAndroid Build Coastguard Worker 90*890232f2SAndroid Build Coastguard Worker if monster.Mana != expectedMonster.Mana { 91*890232f2SAndroid Build Coastguard Worker t.Fatal("wrong mana:", monster.Mana) 92*890232f2SAndroid Build Coastguard Worker } 93*890232f2SAndroid Build Coastguard Worker if monster.Name != expectedMonster.Name { 94*890232f2SAndroid Build Coastguard Worker t.Fatal("wrong name:", monster.Name) 95*890232f2SAndroid Build Coastguard Worker } 96*890232f2SAndroid Build Coastguard Worker if monster.LongEnumNormalDefault != expectedMonster.LongEnumNormalDefault { 97*890232f2SAndroid Build Coastguard Worker t.Fatal("wrong enum:", monster.LongEnumNormalDefault) 98*890232f2SAndroid Build Coastguard Worker } 99*890232f2SAndroid Build Coastguard Worker} 100*890232f2SAndroid Build Coastguard Worker 101*890232f2SAndroid Build Coastguard Worker// TestAll runs all checks, failing if any errors occur. 102*890232f2SAndroid Build Coastguard Workerfunc TestAll(t *testing.T) { 103*890232f2SAndroid Build Coastguard Worker // Verify that the Go FlatBuffers runtime library generates the 104*890232f2SAndroid Build Coastguard Worker // expected bytes (does not use any schema): 105*890232f2SAndroid Build Coastguard Worker CheckByteLayout(t.Fatalf) 106*890232f2SAndroid Build Coastguard Worker CheckMutateMethods(t.Fatalf) 107*890232f2SAndroid Build Coastguard Worker 108*890232f2SAndroid Build Coastguard Worker // Verify that panics are raised during exceptional conditions: 109*890232f2SAndroid Build Coastguard Worker CheckNotInObjectError(t.Fatalf) 110*890232f2SAndroid Build Coastguard Worker CheckStringIsNestedError(t.Fatalf) 111*890232f2SAndroid Build Coastguard Worker CheckByteStringIsNestedError(t.Fatalf) 112*890232f2SAndroid Build Coastguard Worker CheckStructIsNotInlineError(t.Fatalf) 113*890232f2SAndroid Build Coastguard Worker CheckFinishedBytesError(t.Fatalf) 114*890232f2SAndroid Build Coastguard Worker CheckSharedStrings(t.Fatalf) 115*890232f2SAndroid Build Coastguard Worker CheckEmptiedBuilder(t.Fatalf) 116*890232f2SAndroid Build Coastguard Worker 117*890232f2SAndroid Build Coastguard Worker // Verify that GetRootAs works for non-root tables 118*890232f2SAndroid Build Coastguard Worker CheckGetRootAsForNonRootTable(t.Fatalf) 119*890232f2SAndroid Build Coastguard Worker CheckTableAccessors(t.Fatalf) 120*890232f2SAndroid Build Coastguard Worker 121*890232f2SAndroid Build Coastguard Worker // Verify that using the generated Go code builds a buffer without 122*890232f2SAndroid Build Coastguard Worker // returning errors: 123*890232f2SAndroid Build Coastguard Worker generated, off := CheckGeneratedBuild(false, t.Fatalf) 124*890232f2SAndroid Build Coastguard Worker 125*890232f2SAndroid Build Coastguard Worker // Verify that the buffer generated by Go code is readable by the 126*890232f2SAndroid Build Coastguard Worker // generated Go code: 127*890232f2SAndroid Build Coastguard Worker CheckReadBuffer(generated, off, false, t.Fatalf) 128*890232f2SAndroid Build Coastguard Worker CheckMutateBuffer(generated, off, false, t.Fatalf) 129*890232f2SAndroid Build Coastguard Worker CheckObjectAPI(generated, off, false, t.Fatalf) 130*890232f2SAndroid Build Coastguard Worker 131*890232f2SAndroid Build Coastguard Worker // Verify that the buffer generated by C++ code is readable by the 132*890232f2SAndroid Build Coastguard Worker // generated Go code: 133*890232f2SAndroid Build Coastguard Worker monsterDataCpp, err := os.ReadFile(cppData) 134*890232f2SAndroid Build Coastguard Worker if err != nil { 135*890232f2SAndroid Build Coastguard Worker t.Fatal(err) 136*890232f2SAndroid Build Coastguard Worker } 137*890232f2SAndroid Build Coastguard Worker CheckReadBuffer(monsterDataCpp, 0, false, t.Fatalf) 138*890232f2SAndroid Build Coastguard Worker CheckMutateBuffer(monsterDataCpp, 0, false, t.Fatalf) 139*890232f2SAndroid Build Coastguard Worker CheckObjectAPI(monsterDataCpp, 0, false, t.Fatalf) 140*890232f2SAndroid Build Coastguard Worker 141*890232f2SAndroid Build Coastguard Worker // Verify that vtables are deduplicated when written: 142*890232f2SAndroid Build Coastguard Worker CheckVtableDeduplication(t.Fatalf) 143*890232f2SAndroid Build Coastguard Worker 144*890232f2SAndroid Build Coastguard Worker // Verify the enum names 145*890232f2SAndroid Build Coastguard Worker CheckEnumNames(t.Fatalf) 146*890232f2SAndroid Build Coastguard Worker 147*890232f2SAndroid Build Coastguard Worker // Verify enum String methods 148*890232f2SAndroid Build Coastguard Worker CheckEnumString(t.Fatalf) 149*890232f2SAndroid Build Coastguard Worker 150*890232f2SAndroid Build Coastguard Worker // Verify the enum values maps 151*890232f2SAndroid Build Coastguard Worker CheckEnumValues(t.Fatalf) 152*890232f2SAndroid Build Coastguard Worker 153*890232f2SAndroid Build Coastguard Worker // Verify that the Go code used in FlatBuffers documentation passes 154*890232f2SAndroid Build Coastguard Worker // some sanity checks: 155*890232f2SAndroid Build Coastguard Worker CheckDocExample(generated, off, t.Fatalf) 156*890232f2SAndroid Build Coastguard Worker 157*890232f2SAndroid Build Coastguard Worker // Check Builder.CreateByteVector 158*890232f2SAndroid Build Coastguard Worker CheckCreateByteVector(t.Fatalf) 159*890232f2SAndroid Build Coastguard Worker 160*890232f2SAndroid Build Coastguard Worker // Check a parent namespace import 161*890232f2SAndroid Build Coastguard Worker CheckParentNamespace(t.Fatalf) 162*890232f2SAndroid Build Coastguard Worker 163*890232f2SAndroid Build Coastguard Worker // Check size-prefixed flatbuffers 164*890232f2SAndroid Build Coastguard Worker CheckSizePrefixedBuffer(t.Fatalf) 165*890232f2SAndroid Build Coastguard Worker 166*890232f2SAndroid Build Coastguard Worker // Check that optional scalars work 167*890232f2SAndroid Build Coastguard Worker CheckOptionalScalars(t.Fatalf) 168*890232f2SAndroid Build Coastguard Worker 169*890232f2SAndroid Build Coastguard Worker // If the filename of the FlatBuffers file generated by the Java test 170*890232f2SAndroid Build Coastguard Worker // is given, check that Go code can read it, and that Go code 171*890232f2SAndroid Build Coastguard Worker // generates an identical buffer when used to create the example data: 172*890232f2SAndroid Build Coastguard Worker if javaData != "" { 173*890232f2SAndroid Build Coastguard Worker monsterDataJava, err := os.ReadFile(javaData) 174*890232f2SAndroid Build Coastguard Worker if err != nil { 175*890232f2SAndroid Build Coastguard Worker t.Fatal(err) 176*890232f2SAndroid Build Coastguard Worker } 177*890232f2SAndroid Build Coastguard Worker CheckReadBuffer(monsterDataJava, 0, false, t.Fatalf) 178*890232f2SAndroid Build Coastguard Worker CheckByteEquality(generated[off:], monsterDataJava, t.Fatalf) 179*890232f2SAndroid Build Coastguard Worker } 180*890232f2SAndroid Build Coastguard Worker 181*890232f2SAndroid Build Coastguard Worker // Verify that various fuzzing scenarios produce a valid FlatBuffer. 182*890232f2SAndroid Build Coastguard Worker if fuzz { 183*890232f2SAndroid Build Coastguard Worker checkFuzz(fuzzFields, fuzzObjects, t.Fatalf) 184*890232f2SAndroid Build Coastguard Worker } 185*890232f2SAndroid Build Coastguard Worker 186*890232f2SAndroid Build Coastguard Worker // Write the generated buffer out to a file: 187*890232f2SAndroid Build Coastguard Worker err = os.WriteFile(outData, generated[off:], os.FileMode(0644)) 188*890232f2SAndroid Build Coastguard Worker if err != nil { 189*890232f2SAndroid Build Coastguard Worker t.Fatal(err) 190*890232f2SAndroid Build Coastguard Worker } 191*890232f2SAndroid Build Coastguard Worker} 192*890232f2SAndroid Build Coastguard Worker 193*890232f2SAndroid Build Coastguard Worker// CheckReadBuffer checks that the given buffer is evaluated correctly 194*890232f2SAndroid Build Coastguard Worker// as the example Monster. 195*890232f2SAndroid Build Coastguard Workerfunc CheckReadBuffer(buf []byte, offset flatbuffers.UOffsetT, sizePrefix bool, fail func(string, ...interface{})) { 196*890232f2SAndroid Build Coastguard Worker // try the two ways of generating a monster 197*890232f2SAndroid Build Coastguard Worker var monster1 *example.Monster 198*890232f2SAndroid Build Coastguard Worker monster2 := &example.Monster{} 199*890232f2SAndroid Build Coastguard Worker 200*890232f2SAndroid Build Coastguard Worker if sizePrefix { 201*890232f2SAndroid Build Coastguard Worker monster1 = example.GetSizePrefixedRootAsMonster(buf, offset) 202*890232f2SAndroid Build Coastguard Worker flatbuffers.GetSizePrefixedRootAs(buf, offset, monster2) 203*890232f2SAndroid Build Coastguard Worker } else { 204*890232f2SAndroid Build Coastguard Worker monster1 = example.GetRootAsMonster(buf, offset) 205*890232f2SAndroid Build Coastguard Worker flatbuffers.GetRootAs(buf, offset, monster2) 206*890232f2SAndroid Build Coastguard Worker } 207*890232f2SAndroid Build Coastguard Worker 208*890232f2SAndroid Build Coastguard Worker for _, monster := range []*example.Monster{monster1, monster2} { 209*890232f2SAndroid Build Coastguard Worker if got := monster.Hp(); 80 != got { 210*890232f2SAndroid Build Coastguard Worker fail(FailString("hp", 80, got)) 211*890232f2SAndroid Build Coastguard Worker } 212*890232f2SAndroid Build Coastguard Worker 213*890232f2SAndroid Build Coastguard Worker // default 214*890232f2SAndroid Build Coastguard Worker if got := monster.Mana(); 150 != got { 215*890232f2SAndroid Build Coastguard Worker fail(FailString("mana", 150, got)) 216*890232f2SAndroid Build Coastguard Worker } 217*890232f2SAndroid Build Coastguard Worker 218*890232f2SAndroid Build Coastguard Worker if got := monster.Name(); !bytes.Equal([]byte("MyMonster"), got) { 219*890232f2SAndroid Build Coastguard Worker fail(FailString("name", "MyMonster", got)) 220*890232f2SAndroid Build Coastguard Worker } 221*890232f2SAndroid Build Coastguard Worker 222*890232f2SAndroid Build Coastguard Worker if got := monster.Color(); example.ColorBlue != got { 223*890232f2SAndroid Build Coastguard Worker fail(FailString("color", example.ColorBlue, got)) 224*890232f2SAndroid Build Coastguard Worker } 225*890232f2SAndroid Build Coastguard Worker 226*890232f2SAndroid Build Coastguard Worker if got := monster.Testbool(); true != got { 227*890232f2SAndroid Build Coastguard Worker fail(FailString("testbool", true, got)) 228*890232f2SAndroid Build Coastguard Worker } 229*890232f2SAndroid Build Coastguard Worker 230*890232f2SAndroid Build Coastguard Worker // initialize a Vec3 from Pos() 231*890232f2SAndroid Build Coastguard Worker vec := new(example.Vec3) 232*890232f2SAndroid Build Coastguard Worker vec = monster.Pos(vec) 233*890232f2SAndroid Build Coastguard Worker if vec == nil { 234*890232f2SAndroid Build Coastguard Worker fail("vec3 initialization failed") 235*890232f2SAndroid Build Coastguard Worker } 236*890232f2SAndroid Build Coastguard Worker 237*890232f2SAndroid Build Coastguard Worker // check that new allocs equal given ones: 238*890232f2SAndroid Build Coastguard Worker vec2 := monster.Pos(nil) 239*890232f2SAndroid Build Coastguard Worker if !reflect.DeepEqual(vec, vec2) { 240*890232f2SAndroid Build Coastguard Worker fail("fresh allocation failed") 241*890232f2SAndroid Build Coastguard Worker } 242*890232f2SAndroid Build Coastguard Worker 243*890232f2SAndroid Build Coastguard Worker // verify the properties of the Vec3 244*890232f2SAndroid Build Coastguard Worker if got := vec.X(); float32(1.0) != got { 245*890232f2SAndroid Build Coastguard Worker fail(FailString("Pos.X", float32(1.0), got)) 246*890232f2SAndroid Build Coastguard Worker } 247*890232f2SAndroid Build Coastguard Worker 248*890232f2SAndroid Build Coastguard Worker if got := vec.Y(); float32(2.0) != got { 249*890232f2SAndroid Build Coastguard Worker fail(FailString("Pos.Y", float32(2.0), got)) 250*890232f2SAndroid Build Coastguard Worker } 251*890232f2SAndroid Build Coastguard Worker 252*890232f2SAndroid Build Coastguard Worker if got := vec.Z(); float32(3.0) != got { 253*890232f2SAndroid Build Coastguard Worker fail(FailString("Pos.Z", float32(3.0), got)) 254*890232f2SAndroid Build Coastguard Worker } 255*890232f2SAndroid Build Coastguard Worker 256*890232f2SAndroid Build Coastguard Worker if got := vec.Test1(); float64(3.0) != got { 257*890232f2SAndroid Build Coastguard Worker fail(FailString("Pos.Test1", float64(3.0), got)) 258*890232f2SAndroid Build Coastguard Worker } 259*890232f2SAndroid Build Coastguard Worker 260*890232f2SAndroid Build Coastguard Worker if got := vec.Test2(); example.ColorGreen != got { 261*890232f2SAndroid Build Coastguard Worker fail(FailString("Pos.Test2", example.ColorGreen, got)) 262*890232f2SAndroid Build Coastguard Worker } 263*890232f2SAndroid Build Coastguard Worker 264*890232f2SAndroid Build Coastguard Worker // initialize a Test from Test3(...) 265*890232f2SAndroid Build Coastguard Worker t := new(example.Test) 266*890232f2SAndroid Build Coastguard Worker t = vec.Test3(t) 267*890232f2SAndroid Build Coastguard Worker if t == nil { 268*890232f2SAndroid Build Coastguard Worker fail("vec.Test3(&t) failed") 269*890232f2SAndroid Build Coastguard Worker } 270*890232f2SAndroid Build Coastguard Worker 271*890232f2SAndroid Build Coastguard Worker // check that new allocs equal given ones: 272*890232f2SAndroid Build Coastguard Worker t2 := vec.Test3(nil) 273*890232f2SAndroid Build Coastguard Worker if !reflect.DeepEqual(t, t2) { 274*890232f2SAndroid Build Coastguard Worker fail("fresh allocation failed") 275*890232f2SAndroid Build Coastguard Worker } 276*890232f2SAndroid Build Coastguard Worker 277*890232f2SAndroid Build Coastguard Worker // verify the properties of the Test 278*890232f2SAndroid Build Coastguard Worker if got := t.A(); int16(5) != got { 279*890232f2SAndroid Build Coastguard Worker fail(FailString("t.A()", int16(5), got)) 280*890232f2SAndroid Build Coastguard Worker } 281*890232f2SAndroid Build Coastguard Worker 282*890232f2SAndroid Build Coastguard Worker if got := t.B(); int8(6) != got { 283*890232f2SAndroid Build Coastguard Worker fail(FailString("t.B()", int8(6), got)) 284*890232f2SAndroid Build Coastguard Worker } 285*890232f2SAndroid Build Coastguard Worker 286*890232f2SAndroid Build Coastguard Worker if got := monster.TestType(); example.AnyMonster != got { 287*890232f2SAndroid Build Coastguard Worker fail(FailString("monster.TestType()", example.AnyMonster, got)) 288*890232f2SAndroid Build Coastguard Worker } 289*890232f2SAndroid Build Coastguard Worker 290*890232f2SAndroid Build Coastguard Worker // initialize a Table from a union field Test(...) 291*890232f2SAndroid Build Coastguard Worker var table2 flatbuffers.Table 292*890232f2SAndroid Build Coastguard Worker if ok := monster.Test(&table2); !ok { 293*890232f2SAndroid Build Coastguard Worker fail("monster.Test(&monster2) failed") 294*890232f2SAndroid Build Coastguard Worker } 295*890232f2SAndroid Build Coastguard Worker 296*890232f2SAndroid Build Coastguard Worker // initialize a Monster from the Table from the union 297*890232f2SAndroid Build Coastguard Worker var monster2 example.Monster 298*890232f2SAndroid Build Coastguard Worker monster2.Init(table2.Bytes, table2.Pos) 299*890232f2SAndroid Build Coastguard Worker 300*890232f2SAndroid Build Coastguard Worker if got := monster2.Name(); !bytes.Equal([]byte("Fred"), got) { 301*890232f2SAndroid Build Coastguard Worker fail(FailString("monster2.Name()", "Fred", got)) 302*890232f2SAndroid Build Coastguard Worker } 303*890232f2SAndroid Build Coastguard Worker 304*890232f2SAndroid Build Coastguard Worker inventorySlice := monster.InventoryBytes() 305*890232f2SAndroid Build Coastguard Worker if len(inventorySlice) != monster.InventoryLength() { 306*890232f2SAndroid Build Coastguard Worker fail(FailString("len(monster.InventoryBytes) != monster.InventoryLength", len(inventorySlice), monster.InventoryLength())) 307*890232f2SAndroid Build Coastguard Worker } 308*890232f2SAndroid Build Coastguard Worker 309*890232f2SAndroid Build Coastguard Worker if got := monster.InventoryLength(); 5 != got { 310*890232f2SAndroid Build Coastguard Worker fail(FailString("monster.InventoryLength", 5, got)) 311*890232f2SAndroid Build Coastguard Worker } 312*890232f2SAndroid Build Coastguard Worker 313*890232f2SAndroid Build Coastguard Worker invsum := 0 314*890232f2SAndroid Build Coastguard Worker l := monster.InventoryLength() 315*890232f2SAndroid Build Coastguard Worker for i := 0; i < l; i++ { 316*890232f2SAndroid Build Coastguard Worker v := monster.Inventory(i) 317*890232f2SAndroid Build Coastguard Worker if v != inventorySlice[i] { 318*890232f2SAndroid Build Coastguard Worker fail(FailString("monster inventory slice[i] != Inventory(i)", v, inventorySlice[i])) 319*890232f2SAndroid Build Coastguard Worker } 320*890232f2SAndroid Build Coastguard Worker invsum += int(v) 321*890232f2SAndroid Build Coastguard Worker } 322*890232f2SAndroid Build Coastguard Worker if invsum != 10 { 323*890232f2SAndroid Build Coastguard Worker fail(FailString("monster inventory sum", 10, invsum)) 324*890232f2SAndroid Build Coastguard Worker } 325*890232f2SAndroid Build Coastguard Worker 326*890232f2SAndroid Build Coastguard Worker if got := monster.Test4Length(); 2 != got { 327*890232f2SAndroid Build Coastguard Worker fail(FailString("monster.Test4Length()", 2, got)) 328*890232f2SAndroid Build Coastguard Worker } 329*890232f2SAndroid Build Coastguard Worker 330*890232f2SAndroid Build Coastguard Worker var test0 example.Test 331*890232f2SAndroid Build Coastguard Worker ok := monster.Test4(&test0, 0) 332*890232f2SAndroid Build Coastguard Worker if !ok { 333*890232f2SAndroid Build Coastguard Worker fail(FailString("monster.Test4(&test0, 0)", true, ok)) 334*890232f2SAndroid Build Coastguard Worker } 335*890232f2SAndroid Build Coastguard Worker 336*890232f2SAndroid Build Coastguard Worker var test1 example.Test 337*890232f2SAndroid Build Coastguard Worker ok = monster.Test4(&test1, 1) 338*890232f2SAndroid Build Coastguard Worker if !ok { 339*890232f2SAndroid Build Coastguard Worker fail(FailString("monster.Test4(&test1, 1)", true, ok)) 340*890232f2SAndroid Build Coastguard Worker } 341*890232f2SAndroid Build Coastguard Worker 342*890232f2SAndroid Build Coastguard Worker // the position of test0 and test1 are swapped in monsterdata_java_wire 343*890232f2SAndroid Build Coastguard Worker // and monsterdata_test_wire, so ignore ordering 344*890232f2SAndroid Build Coastguard Worker v0 := test0.A() 345*890232f2SAndroid Build Coastguard Worker v1 := test0.B() 346*890232f2SAndroid Build Coastguard Worker v2 := test1.A() 347*890232f2SAndroid Build Coastguard Worker v3 := test1.B() 348*890232f2SAndroid Build Coastguard Worker sum := int(v0) + int(v1) + int(v2) + int(v3) 349*890232f2SAndroid Build Coastguard Worker 350*890232f2SAndroid Build Coastguard Worker if 100 != sum { 351*890232f2SAndroid Build Coastguard Worker fail(FailString("test0 and test1 sum", 100, sum)) 352*890232f2SAndroid Build Coastguard Worker } 353*890232f2SAndroid Build Coastguard Worker 354*890232f2SAndroid Build Coastguard Worker if got := monster.TestarrayofstringLength(); 2 != got { 355*890232f2SAndroid Build Coastguard Worker fail(FailString("Testarrayofstring length", 2, got)) 356*890232f2SAndroid Build Coastguard Worker } 357*890232f2SAndroid Build Coastguard Worker 358*890232f2SAndroid Build Coastguard Worker if got := monster.Testarrayofstring(0); !bytes.Equal([]byte("test1"), got) { 359*890232f2SAndroid Build Coastguard Worker fail(FailString("Testarrayofstring(0)", "test1", got)) 360*890232f2SAndroid Build Coastguard Worker } 361*890232f2SAndroid Build Coastguard Worker 362*890232f2SAndroid Build Coastguard Worker if got := monster.Testarrayofstring(1); !bytes.Equal([]byte("test2"), got) { 363*890232f2SAndroid Build Coastguard Worker fail(FailString("Testarrayofstring(1)", "test2", got)) 364*890232f2SAndroid Build Coastguard Worker } 365*890232f2SAndroid Build Coastguard Worker } 366*890232f2SAndroid Build Coastguard Worker} 367*890232f2SAndroid Build Coastguard Worker 368*890232f2SAndroid Build Coastguard Worker// CheckMutateBuffer checks that the given buffer can be mutated correctly 369*890232f2SAndroid Build Coastguard Worker// as the example Monster. Only available scalar values are mutated. 370*890232f2SAndroid Build Coastguard Workerfunc CheckMutateBuffer(org []byte, offset flatbuffers.UOffsetT, sizePrefix bool, fail func(string, ...interface{})) { 371*890232f2SAndroid Build Coastguard Worker // make a copy to mutate 372*890232f2SAndroid Build Coastguard Worker buf := make([]byte, len(org)) 373*890232f2SAndroid Build Coastguard Worker copy(buf, org) 374*890232f2SAndroid Build Coastguard Worker 375*890232f2SAndroid Build Coastguard Worker // load monster data from the buffer 376*890232f2SAndroid Build Coastguard Worker var monster *example.Monster 377*890232f2SAndroid Build Coastguard Worker if sizePrefix { 378*890232f2SAndroid Build Coastguard Worker monster = example.GetSizePrefixedRootAsMonster(buf, offset) 379*890232f2SAndroid Build Coastguard Worker } else { 380*890232f2SAndroid Build Coastguard Worker monster = example.GetRootAsMonster(buf, offset) 381*890232f2SAndroid Build Coastguard Worker } 382*890232f2SAndroid Build Coastguard Worker 383*890232f2SAndroid Build Coastguard Worker // test case struct 384*890232f2SAndroid Build Coastguard Worker type testcase struct { 385*890232f2SAndroid Build Coastguard Worker field string 386*890232f2SAndroid Build Coastguard Worker testfn func() bool 387*890232f2SAndroid Build Coastguard Worker } 388*890232f2SAndroid Build Coastguard Worker 389*890232f2SAndroid Build Coastguard Worker testForOriginalValues := []testcase{ 390*890232f2SAndroid Build Coastguard Worker testcase{"Hp", func() bool { return monster.Hp() == 80 }}, 391*890232f2SAndroid Build Coastguard Worker testcase{"Mana", func() bool { return monster.Mana() == 150 }}, 392*890232f2SAndroid Build Coastguard Worker testcase{"Testbool", func() bool { return monster.Testbool() == true }}, 393*890232f2SAndroid Build Coastguard Worker testcase{"Pos.X'", func() bool { return monster.Pos(nil).X() == float32(1.0) }}, 394*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Y'", func() bool { return monster.Pos(nil).Y() == float32(2.0) }}, 395*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Z'", func() bool { return monster.Pos(nil).Z() == float32(3.0) }}, 396*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Test1'", func() bool { return monster.Pos(nil).Test1() == float64(3.0) }}, 397*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Test2'", func() bool { return monster.Pos(nil).Test2() == example.ColorGreen }}, 398*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Test3.A", func() bool { return monster.Pos(nil).Test3(nil).A() == int16(5) }}, 399*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Test3.B", func() bool { return monster.Pos(nil).Test3(nil).B() == int8(6) }}, 400*890232f2SAndroid Build Coastguard Worker testcase{"Inventory[2]", func() bool { return monster.Inventory(2) == byte(2) }}, 401*890232f2SAndroid Build Coastguard Worker } 402*890232f2SAndroid Build Coastguard Worker 403*890232f2SAndroid Build Coastguard Worker testMutability := []testcase{ 404*890232f2SAndroid Build Coastguard Worker testcase{"Hp", func() bool { return monster.MutateHp(70) }}, 405*890232f2SAndroid Build Coastguard Worker testcase{"Mana", func() bool { return !monster.MutateMana(140) }}, 406*890232f2SAndroid Build Coastguard Worker testcase{"Testbool", func() bool { return monster.MutateTestbool(false) }}, 407*890232f2SAndroid Build Coastguard Worker testcase{"Pos.X", func() bool { return monster.Pos(nil).MutateX(10.0) }}, 408*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Y", func() bool { return monster.Pos(nil).MutateY(20.0) }}, 409*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Z", func() bool { return monster.Pos(nil).MutateZ(30.0) }}, 410*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Test1", func() bool { return monster.Pos(nil).MutateTest1(30.0) }}, 411*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Test2", func() bool { return monster.Pos(nil).MutateTest2(example.ColorBlue) }}, 412*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Test3.A", func() bool { return monster.Pos(nil).Test3(nil).MutateA(50) }}, 413*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Test3.B", func() bool { return monster.Pos(nil).Test3(nil).MutateB(60) }}, 414*890232f2SAndroid Build Coastguard Worker testcase{"Inventory[2]", func() bool { return monster.MutateInventory(2, 200) }}, 415*890232f2SAndroid Build Coastguard Worker } 416*890232f2SAndroid Build Coastguard Worker 417*890232f2SAndroid Build Coastguard Worker testForMutatedValues := []testcase{ 418*890232f2SAndroid Build Coastguard Worker testcase{"Hp", func() bool { return monster.Hp() == 70 }}, 419*890232f2SAndroid Build Coastguard Worker testcase{"Mana", func() bool { return monster.Mana() == 150 }}, 420*890232f2SAndroid Build Coastguard Worker testcase{"Testbool", func() bool { return monster.Testbool() == false }}, 421*890232f2SAndroid Build Coastguard Worker testcase{"Pos.X'", func() bool { return monster.Pos(nil).X() == float32(10.0) }}, 422*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Y'", func() bool { return monster.Pos(nil).Y() == float32(20.0) }}, 423*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Z'", func() bool { return monster.Pos(nil).Z() == float32(30.0) }}, 424*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Test1'", func() bool { return monster.Pos(nil).Test1() == float64(30.0) }}, 425*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Test2'", func() bool { return monster.Pos(nil).Test2() == example.ColorBlue }}, 426*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Test3.A", func() bool { return monster.Pos(nil).Test3(nil).A() == int16(50) }}, 427*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Test3.B", func() bool { return monster.Pos(nil).Test3(nil).B() == int8(60) }}, 428*890232f2SAndroid Build Coastguard Worker testcase{"Inventory[2]", func() bool { return monster.Inventory(2) == byte(200) }}, 429*890232f2SAndroid Build Coastguard Worker } 430*890232f2SAndroid Build Coastguard Worker 431*890232f2SAndroid Build Coastguard Worker testInvalidEnumValues := []testcase{ 432*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Test2", func() bool { return monster.Pos(nil).MutateTest2(example.Color(20)) }}, 433*890232f2SAndroid Build Coastguard Worker testcase{"Pos.Test2", func() bool { return monster.Pos(nil).Test2() == example.Color(20) }}, 434*890232f2SAndroid Build Coastguard Worker } 435*890232f2SAndroid Build Coastguard Worker 436*890232f2SAndroid Build Coastguard Worker // make sure original values are okay 437*890232f2SAndroid Build Coastguard Worker for _, t := range testForOriginalValues { 438*890232f2SAndroid Build Coastguard Worker if !t.testfn() { 439*890232f2SAndroid Build Coastguard Worker fail("field '" + t.field + "' doesn't have the expected original value") 440*890232f2SAndroid Build Coastguard Worker } 441*890232f2SAndroid Build Coastguard Worker } 442*890232f2SAndroid Build Coastguard Worker 443*890232f2SAndroid Build Coastguard Worker // try to mutate fields and check mutability 444*890232f2SAndroid Build Coastguard Worker for _, t := range testMutability { 445*890232f2SAndroid Build Coastguard Worker if !t.testfn() { 446*890232f2SAndroid Build Coastguard Worker fail(FailString("field '"+t.field+"' failed mutability test", true, false)) 447*890232f2SAndroid Build Coastguard Worker } 448*890232f2SAndroid Build Coastguard Worker } 449*890232f2SAndroid Build Coastguard Worker 450*890232f2SAndroid Build Coastguard Worker // test whether values have changed 451*890232f2SAndroid Build Coastguard Worker for _, t := range testForMutatedValues { 452*890232f2SAndroid Build Coastguard Worker if !t.testfn() { 453*890232f2SAndroid Build Coastguard Worker fail("field '" + t.field + "' doesn't have the expected mutated value") 454*890232f2SAndroid Build Coastguard Worker } 455*890232f2SAndroid Build Coastguard Worker } 456*890232f2SAndroid Build Coastguard Worker 457*890232f2SAndroid Build Coastguard Worker // make sure the buffer has changed 458*890232f2SAndroid Build Coastguard Worker if reflect.DeepEqual(buf, org) { 459*890232f2SAndroid Build Coastguard Worker fail("mutate buffer failed") 460*890232f2SAndroid Build Coastguard Worker } 461*890232f2SAndroid Build Coastguard Worker 462*890232f2SAndroid Build Coastguard Worker // To make sure the buffer has changed accordingly 463*890232f2SAndroid Build Coastguard Worker // Read data from the buffer and verify all fields 464*890232f2SAndroid Build Coastguard Worker if sizePrefix { 465*890232f2SAndroid Build Coastguard Worker monster = example.GetSizePrefixedRootAsMonster(buf, offset) 466*890232f2SAndroid Build Coastguard Worker } else { 467*890232f2SAndroid Build Coastguard Worker monster = example.GetRootAsMonster(buf, offset) 468*890232f2SAndroid Build Coastguard Worker } 469*890232f2SAndroid Build Coastguard Worker 470*890232f2SAndroid Build Coastguard Worker for _, t := range testForMutatedValues { 471*890232f2SAndroid Build Coastguard Worker if !t.testfn() { 472*890232f2SAndroid Build Coastguard Worker fail("field '" + t.field + "' doesn't have the expected mutated value") 473*890232f2SAndroid Build Coastguard Worker } 474*890232f2SAndroid Build Coastguard Worker } 475*890232f2SAndroid Build Coastguard Worker 476*890232f2SAndroid Build Coastguard Worker // a couple extra tests for "invalid" enum values, which don't correspond to 477*890232f2SAndroid Build Coastguard Worker // anything in the schema, but are allowed 478*890232f2SAndroid Build Coastguard Worker for _, t := range testInvalidEnumValues { 479*890232f2SAndroid Build Coastguard Worker if !t.testfn() { 480*890232f2SAndroid Build Coastguard Worker fail("field '" + t.field + "' doesn't work with an invalid enum value") 481*890232f2SAndroid Build Coastguard Worker } 482*890232f2SAndroid Build Coastguard Worker } 483*890232f2SAndroid Build Coastguard Worker 484*890232f2SAndroid Build Coastguard Worker // reverting all fields to original values should 485*890232f2SAndroid Build Coastguard Worker // re-create the original buffer. Mutate all fields 486*890232f2SAndroid Build Coastguard Worker // back to their original values and compare buffers. 487*890232f2SAndroid Build Coastguard Worker // This test is done to make sure mutations do not do 488*890232f2SAndroid Build Coastguard Worker // any unnecessary changes to the buffer. 489*890232f2SAndroid Build Coastguard Worker if sizePrefix { 490*890232f2SAndroid Build Coastguard Worker monster = example.GetSizePrefixedRootAsMonster(buf, offset) 491*890232f2SAndroid Build Coastguard Worker } else { 492*890232f2SAndroid Build Coastguard Worker monster = example.GetRootAsMonster(buf, offset) 493*890232f2SAndroid Build Coastguard Worker } 494*890232f2SAndroid Build Coastguard Worker 495*890232f2SAndroid Build Coastguard Worker monster.MutateHp(80) 496*890232f2SAndroid Build Coastguard Worker monster.MutateTestbool(true) 497*890232f2SAndroid Build Coastguard Worker monster.Pos(nil).MutateX(1.0) 498*890232f2SAndroid Build Coastguard Worker monster.Pos(nil).MutateY(2.0) 499*890232f2SAndroid Build Coastguard Worker monster.Pos(nil).MutateZ(3.0) 500*890232f2SAndroid Build Coastguard Worker monster.Pos(nil).MutateTest1(3.0) 501*890232f2SAndroid Build Coastguard Worker monster.Pos(nil).MutateTest2(example.ColorGreen) 502*890232f2SAndroid Build Coastguard Worker monster.Pos(nil).Test3(nil).MutateA(5) 503*890232f2SAndroid Build Coastguard Worker monster.Pos(nil).Test3(nil).MutateB(6) 504*890232f2SAndroid Build Coastguard Worker monster.MutateInventory(2, 2) 505*890232f2SAndroid Build Coastguard Worker 506*890232f2SAndroid Build Coastguard Worker for _, t := range testForOriginalValues { 507*890232f2SAndroid Build Coastguard Worker if !t.testfn() { 508*890232f2SAndroid Build Coastguard Worker fail("field '" + t.field + "' doesn't have the expected original value") 509*890232f2SAndroid Build Coastguard Worker } 510*890232f2SAndroid Build Coastguard Worker } 511*890232f2SAndroid Build Coastguard Worker 512*890232f2SAndroid Build Coastguard Worker // buffer should have original values 513*890232f2SAndroid Build Coastguard Worker if !reflect.DeepEqual(buf, org) { 514*890232f2SAndroid Build Coastguard Worker fail("revert changes failed") 515*890232f2SAndroid Build Coastguard Worker } 516*890232f2SAndroid Build Coastguard Worker} 517*890232f2SAndroid Build Coastguard Worker 518*890232f2SAndroid Build Coastguard Workerfunc CheckObjectAPI(buf []byte, offset flatbuffers.UOffsetT, sizePrefix bool, fail func(string, ...interface{})) { 519*890232f2SAndroid Build Coastguard Worker var monster *example.MonsterT 520*890232f2SAndroid Build Coastguard Worker 521*890232f2SAndroid Build Coastguard Worker if sizePrefix { 522*890232f2SAndroid Build Coastguard Worker monster = example.GetSizePrefixedRootAsMonster(buf, offset).UnPack() 523*890232f2SAndroid Build Coastguard Worker } else { 524*890232f2SAndroid Build Coastguard Worker monster = example.GetRootAsMonster(buf, offset).UnPack() 525*890232f2SAndroid Build Coastguard Worker } 526*890232f2SAndroid Build Coastguard Worker 527*890232f2SAndroid Build Coastguard Worker if got := monster.Hp; 80 != got { 528*890232f2SAndroid Build Coastguard Worker fail(FailString("hp", 80, got)) 529*890232f2SAndroid Build Coastguard Worker } 530*890232f2SAndroid Build Coastguard Worker 531*890232f2SAndroid Build Coastguard Worker // default 532*890232f2SAndroid Build Coastguard Worker if got := monster.Mana; 150 != got { 533*890232f2SAndroid Build Coastguard Worker fail(FailString("mana", 150, got)) 534*890232f2SAndroid Build Coastguard Worker } 535*890232f2SAndroid Build Coastguard Worker 536*890232f2SAndroid Build Coastguard Worker builder := flatbuffers.NewBuilder(0) 537*890232f2SAndroid Build Coastguard Worker builder.Finish(monster.Pack(builder)) 538*890232f2SAndroid Build Coastguard Worker monster2 := example.GetRootAsMonster(builder.FinishedBytes(), 0).UnPack() 539*890232f2SAndroid Build Coastguard Worker if !reflect.DeepEqual(monster, monster2) { 540*890232f2SAndroid Build Coastguard Worker fail(FailString("Pack/Unpack()", monster, monster2)) 541*890232f2SAndroid Build Coastguard Worker } 542*890232f2SAndroid Build Coastguard Worker} 543*890232f2SAndroid Build Coastguard Worker 544*890232f2SAndroid Build Coastguard Worker// Low level stress/fuzz test: serialize/deserialize a variety of 545*890232f2SAndroid Build Coastguard Worker// different kinds of data in different combinations 546*890232f2SAndroid Build Coastguard Workerfunc checkFuzz(fuzzFields, fuzzObjects int, fail func(string, ...interface{})) { 547*890232f2SAndroid Build Coastguard Worker 548*890232f2SAndroid Build Coastguard Worker // Values we're testing against: chosen to ensure no bits get chopped 549*890232f2SAndroid Build Coastguard Worker // off anywhere, and also be different from eachother. 550*890232f2SAndroid Build Coastguard Worker boolVal := true 551*890232f2SAndroid Build Coastguard Worker int8Val := int8(-127) // 0x81 552*890232f2SAndroid Build Coastguard Worker uint8Val := uint8(0xFF) 553*890232f2SAndroid Build Coastguard Worker int16Val := int16(-32222) // 0x8222 554*890232f2SAndroid Build Coastguard Worker uint16Val := uint16(0xFEEE) 555*890232f2SAndroid Build Coastguard Worker int32Val := int32(overflowingInt32Val) 556*890232f2SAndroid Build Coastguard Worker uint32Val := uint32(0xFDDDDDDD) 557*890232f2SAndroid Build Coastguard Worker int64Val := int64(overflowingInt64Val) 558*890232f2SAndroid Build Coastguard Worker uint64Val := uint64(0xFCCCCCCCCCCCCCCC) 559*890232f2SAndroid Build Coastguard Worker float32Val := float32(3.14159) 560*890232f2SAndroid Build Coastguard Worker float64Val := float64(3.14159265359) 561*890232f2SAndroid Build Coastguard Worker 562*890232f2SAndroid Build Coastguard Worker testValuesMax := 11 // hardcoded to the number of scalar types 563*890232f2SAndroid Build Coastguard Worker 564*890232f2SAndroid Build Coastguard Worker builder := flatbuffers.NewBuilder(0) 565*890232f2SAndroid Build Coastguard Worker l := NewLCG() 566*890232f2SAndroid Build Coastguard Worker 567*890232f2SAndroid Build Coastguard Worker objects := make([]flatbuffers.UOffsetT, fuzzObjects) 568*890232f2SAndroid Build Coastguard Worker 569*890232f2SAndroid Build Coastguard Worker // Generate fuzzObjects random objects each consisting of 570*890232f2SAndroid Build Coastguard Worker // fuzzFields fields, each of a random type. 571*890232f2SAndroid Build Coastguard Worker for i := 0; i < fuzzObjects; i++ { 572*890232f2SAndroid Build Coastguard Worker builder.StartObject(fuzzFields) 573*890232f2SAndroid Build Coastguard Worker 574*890232f2SAndroid Build Coastguard Worker for f := 0; f < fuzzFields; f++ { 575*890232f2SAndroid Build Coastguard Worker choice := l.Next() % uint32(testValuesMax) 576*890232f2SAndroid Build Coastguard Worker switch choice { 577*890232f2SAndroid Build Coastguard Worker case 0: 578*890232f2SAndroid Build Coastguard Worker builder.PrependBoolSlot(int(f), boolVal, false) 579*890232f2SAndroid Build Coastguard Worker case 1: 580*890232f2SAndroid Build Coastguard Worker builder.PrependInt8Slot(int(f), int8Val, 0) 581*890232f2SAndroid Build Coastguard Worker case 2: 582*890232f2SAndroid Build Coastguard Worker builder.PrependUint8Slot(int(f), uint8Val, 0) 583*890232f2SAndroid Build Coastguard Worker case 3: 584*890232f2SAndroid Build Coastguard Worker builder.PrependInt16Slot(int(f), int16Val, 0) 585*890232f2SAndroid Build Coastguard Worker case 4: 586*890232f2SAndroid Build Coastguard Worker builder.PrependUint16Slot(int(f), uint16Val, 0) 587*890232f2SAndroid Build Coastguard Worker case 5: 588*890232f2SAndroid Build Coastguard Worker builder.PrependInt32Slot(int(f), int32Val, 0) 589*890232f2SAndroid Build Coastguard Worker case 6: 590*890232f2SAndroid Build Coastguard Worker builder.PrependUint32Slot(int(f), uint32Val, 0) 591*890232f2SAndroid Build Coastguard Worker case 7: 592*890232f2SAndroid Build Coastguard Worker builder.PrependInt64Slot(int(f), int64Val, 0) 593*890232f2SAndroid Build Coastguard Worker case 8: 594*890232f2SAndroid Build Coastguard Worker builder.PrependUint64Slot(int(f), uint64Val, 0) 595*890232f2SAndroid Build Coastguard Worker case 9: 596*890232f2SAndroid Build Coastguard Worker builder.PrependFloat32Slot(int(f), float32Val, 0) 597*890232f2SAndroid Build Coastguard Worker case 10: 598*890232f2SAndroid Build Coastguard Worker builder.PrependFloat64Slot(int(f), float64Val, 0) 599*890232f2SAndroid Build Coastguard Worker } 600*890232f2SAndroid Build Coastguard Worker } 601*890232f2SAndroid Build Coastguard Worker 602*890232f2SAndroid Build Coastguard Worker off := builder.EndObject() 603*890232f2SAndroid Build Coastguard Worker 604*890232f2SAndroid Build Coastguard Worker // store the offset from the end of the builder buffer, 605*890232f2SAndroid Build Coastguard Worker // since it will keep growing: 606*890232f2SAndroid Build Coastguard Worker objects[i] = off 607*890232f2SAndroid Build Coastguard Worker } 608*890232f2SAndroid Build Coastguard Worker 609*890232f2SAndroid Build Coastguard Worker // Do some bookkeeping to generate stats on fuzzes: 610*890232f2SAndroid Build Coastguard Worker stats := map[string]int{} 611*890232f2SAndroid Build Coastguard Worker check := func(desc string, want, got interface{}) { 612*890232f2SAndroid Build Coastguard Worker stats[desc]++ 613*890232f2SAndroid Build Coastguard Worker if want != got { 614*890232f2SAndroid Build Coastguard Worker fail("%s want %v got %v", desc, want, got) 615*890232f2SAndroid Build Coastguard Worker } 616*890232f2SAndroid Build Coastguard Worker } 617*890232f2SAndroid Build Coastguard Worker 618*890232f2SAndroid Build Coastguard Worker l = NewLCG() // Reset. 619*890232f2SAndroid Build Coastguard Worker 620*890232f2SAndroid Build Coastguard Worker // Test that all objects we generated are readable and return the 621*890232f2SAndroid Build Coastguard Worker // expected values. We generate random objects in the same order 622*890232f2SAndroid Build Coastguard Worker // so this is deterministic. 623*890232f2SAndroid Build Coastguard Worker for i := 0; i < fuzzObjects; i++ { 624*890232f2SAndroid Build Coastguard Worker 625*890232f2SAndroid Build Coastguard Worker table := &flatbuffers.Table{ 626*890232f2SAndroid Build Coastguard Worker Bytes: builder.Bytes, 627*890232f2SAndroid Build Coastguard Worker Pos: flatbuffers.UOffsetT(len(builder.Bytes)) - objects[i], 628*890232f2SAndroid Build Coastguard Worker } 629*890232f2SAndroid Build Coastguard Worker 630*890232f2SAndroid Build Coastguard Worker for j := 0; j < fuzzFields; j++ { 631*890232f2SAndroid Build Coastguard Worker f := flatbuffers.VOffsetT((flatbuffers.VtableMetadataFields + j) * flatbuffers.SizeVOffsetT) 632*890232f2SAndroid Build Coastguard Worker choice := l.Next() % uint32(testValuesMax) 633*890232f2SAndroid Build Coastguard Worker 634*890232f2SAndroid Build Coastguard Worker switch choice { 635*890232f2SAndroid Build Coastguard Worker case 0: 636*890232f2SAndroid Build Coastguard Worker check("bool", boolVal, table.GetBoolSlot(f, false)) 637*890232f2SAndroid Build Coastguard Worker case 1: 638*890232f2SAndroid Build Coastguard Worker check("int8", int8Val, table.GetInt8Slot(f, 0)) 639*890232f2SAndroid Build Coastguard Worker case 2: 640*890232f2SAndroid Build Coastguard Worker check("uint8", uint8Val, table.GetUint8Slot(f, 0)) 641*890232f2SAndroid Build Coastguard Worker case 3: 642*890232f2SAndroid Build Coastguard Worker check("int16", int16Val, table.GetInt16Slot(f, 0)) 643*890232f2SAndroid Build Coastguard Worker case 4: 644*890232f2SAndroid Build Coastguard Worker check("uint16", uint16Val, table.GetUint16Slot(f, 0)) 645*890232f2SAndroid Build Coastguard Worker case 5: 646*890232f2SAndroid Build Coastguard Worker check("int32", int32Val, table.GetInt32Slot(f, 0)) 647*890232f2SAndroid Build Coastguard Worker case 6: 648*890232f2SAndroid Build Coastguard Worker check("uint32", uint32Val, table.GetUint32Slot(f, 0)) 649*890232f2SAndroid Build Coastguard Worker case 7: 650*890232f2SAndroid Build Coastguard Worker check("int64", int64Val, table.GetInt64Slot(f, 0)) 651*890232f2SAndroid Build Coastguard Worker case 8: 652*890232f2SAndroid Build Coastguard Worker check("uint64", uint64Val, table.GetUint64Slot(f, 0)) 653*890232f2SAndroid Build Coastguard Worker case 9: 654*890232f2SAndroid Build Coastguard Worker check("float32", float32Val, table.GetFloat32Slot(f, 0)) 655*890232f2SAndroid Build Coastguard Worker case 10: 656*890232f2SAndroid Build Coastguard Worker check("float64", float64Val, table.GetFloat64Slot(f, 0)) 657*890232f2SAndroid Build Coastguard Worker } 658*890232f2SAndroid Build Coastguard Worker } 659*890232f2SAndroid Build Coastguard Worker } 660*890232f2SAndroid Build Coastguard Worker 661*890232f2SAndroid Build Coastguard Worker // If enough checks were made, verify that all scalar types were used: 662*890232f2SAndroid Build Coastguard Worker if fuzzFields*fuzzObjects >= testValuesMax { 663*890232f2SAndroid Build Coastguard Worker if len(stats) != testValuesMax { 664*890232f2SAndroid Build Coastguard Worker fail("fuzzing failed to test all scalar types") 665*890232f2SAndroid Build Coastguard Worker } 666*890232f2SAndroid Build Coastguard Worker } 667*890232f2SAndroid Build Coastguard Worker 668*890232f2SAndroid Build Coastguard Worker // Print some counts, if needed: 669*890232f2SAndroid Build Coastguard Worker if testing.Verbose() { 670*890232f2SAndroid Build Coastguard Worker if fuzzFields == 0 || fuzzObjects == 0 { 671*890232f2SAndroid Build Coastguard Worker fmt.Printf("fuzz\tfields: %d\tobjects: %d\t[none]\t%d\n", 672*890232f2SAndroid Build Coastguard Worker fuzzFields, fuzzObjects, 0) 673*890232f2SAndroid Build Coastguard Worker } else { 674*890232f2SAndroid Build Coastguard Worker keys := make([]string, 0, len(stats)) 675*890232f2SAndroid Build Coastguard Worker for k := range stats { 676*890232f2SAndroid Build Coastguard Worker keys = append(keys, k) 677*890232f2SAndroid Build Coastguard Worker } 678*890232f2SAndroid Build Coastguard Worker sort.Strings(keys) 679*890232f2SAndroid Build Coastguard Worker for _, k := range keys { 680*890232f2SAndroid Build Coastguard Worker fmt.Printf("fuzz\tfields: %d\tobjects: %d\t%s\t%d\n", 681*890232f2SAndroid Build Coastguard Worker fuzzFields, fuzzObjects, k, stats[k]) 682*890232f2SAndroid Build Coastguard Worker } 683*890232f2SAndroid Build Coastguard Worker } 684*890232f2SAndroid Build Coastguard Worker } 685*890232f2SAndroid Build Coastguard Worker 686*890232f2SAndroid Build Coastguard Worker return 687*890232f2SAndroid Build Coastguard Worker} 688*890232f2SAndroid Build Coastguard Worker 689*890232f2SAndroid Build Coastguard Worker// FailString makes a message for when expectations differ from reality. 690*890232f2SAndroid Build Coastguard Workerfunc FailString(name string, want, got interface{}) string { 691*890232f2SAndroid Build Coastguard Worker return fmt.Sprintf("bad %s: want %#v got %#v", name, want, got) 692*890232f2SAndroid Build Coastguard Worker} 693*890232f2SAndroid Build Coastguard Worker 694*890232f2SAndroid Build Coastguard Worker// CheckByteLayout verifies the bytes of a Builder in various scenarios. 695*890232f2SAndroid Build Coastguard Workerfunc CheckByteLayout(fail func(string, ...interface{})) { 696*890232f2SAndroid Build Coastguard Worker var b *flatbuffers.Builder 697*890232f2SAndroid Build Coastguard Worker 698*890232f2SAndroid Build Coastguard Worker var i int 699*890232f2SAndroid Build Coastguard Worker check := func(want []byte) { 700*890232f2SAndroid Build Coastguard Worker i++ 701*890232f2SAndroid Build Coastguard Worker got := b.Bytes[b.Head():] 702*890232f2SAndroid Build Coastguard Worker if !bytes.Equal(want, got) { 703*890232f2SAndroid Build Coastguard Worker fail("case %d: want\n%v\nbut got\n%v\n", i, want, got) 704*890232f2SAndroid Build Coastguard Worker } 705*890232f2SAndroid Build Coastguard Worker } 706*890232f2SAndroid Build Coastguard Worker 707*890232f2SAndroid Build Coastguard Worker // test 1: numbers 708*890232f2SAndroid Build Coastguard Worker 709*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 710*890232f2SAndroid Build Coastguard Worker check([]byte{}) 711*890232f2SAndroid Build Coastguard Worker b.PrependBool(true) 712*890232f2SAndroid Build Coastguard Worker check([]byte{1}) 713*890232f2SAndroid Build Coastguard Worker b.PrependInt8(-127) 714*890232f2SAndroid Build Coastguard Worker check([]byte{129, 1}) 715*890232f2SAndroid Build Coastguard Worker b.PrependUint8(255) 716*890232f2SAndroid Build Coastguard Worker check([]byte{255, 129, 1}) 717*890232f2SAndroid Build Coastguard Worker b.PrependInt16(-32222) 718*890232f2SAndroid Build Coastguard Worker check([]byte{0x22, 0x82, 0, 255, 129, 1}) // first pad 719*890232f2SAndroid Build Coastguard Worker b.PrependUint16(0xFEEE) 720*890232f2SAndroid Build Coastguard Worker check([]byte{0xEE, 0xFE, 0x22, 0x82, 0, 255, 129, 1}) // no pad this time 721*890232f2SAndroid Build Coastguard Worker b.PrependInt32(-53687092) 722*890232f2SAndroid Build Coastguard Worker check([]byte{204, 204, 204, 252, 0xEE, 0xFE, 0x22, 0x82, 0, 255, 129, 1}) 723*890232f2SAndroid Build Coastguard Worker b.PrependUint32(0x98765432) 724*890232f2SAndroid Build Coastguard Worker check([]byte{0x32, 0x54, 0x76, 0x98, 204, 204, 204, 252, 0xEE, 0xFE, 0x22, 0x82, 0, 255, 129, 1}) 725*890232f2SAndroid Build Coastguard Worker 726*890232f2SAndroid Build Coastguard Worker // test 1b: numbers 2 727*890232f2SAndroid Build Coastguard Worker 728*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 729*890232f2SAndroid Build Coastguard Worker b.PrependUint64(0x1122334455667788) 730*890232f2SAndroid Build Coastguard Worker check([]byte{0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11}) 731*890232f2SAndroid Build Coastguard Worker 732*890232f2SAndroid Build Coastguard Worker // test 2: 1xbyte vector 733*890232f2SAndroid Build Coastguard Worker 734*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 735*890232f2SAndroid Build Coastguard Worker check([]byte{}) 736*890232f2SAndroid Build Coastguard Worker b.StartVector(flatbuffers.SizeByte, 1, 1) 737*890232f2SAndroid Build Coastguard Worker check([]byte{0, 0, 0}) // align to 4bytes 738*890232f2SAndroid Build Coastguard Worker b.PrependByte(1) 739*890232f2SAndroid Build Coastguard Worker check([]byte{1, 0, 0, 0}) 740*890232f2SAndroid Build Coastguard Worker b.EndVector(1) 741*890232f2SAndroid Build Coastguard Worker check([]byte{1, 0, 0, 0, 1, 0, 0, 0}) // padding 742*890232f2SAndroid Build Coastguard Worker 743*890232f2SAndroid Build Coastguard Worker // test 3: 2xbyte vector 744*890232f2SAndroid Build Coastguard Worker 745*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 746*890232f2SAndroid Build Coastguard Worker b.StartVector(flatbuffers.SizeByte, 2, 1) 747*890232f2SAndroid Build Coastguard Worker check([]byte{0, 0}) // align to 4bytes 748*890232f2SAndroid Build Coastguard Worker b.PrependByte(1) 749*890232f2SAndroid Build Coastguard Worker check([]byte{1, 0, 0}) 750*890232f2SAndroid Build Coastguard Worker b.PrependByte(2) 751*890232f2SAndroid Build Coastguard Worker check([]byte{2, 1, 0, 0}) 752*890232f2SAndroid Build Coastguard Worker b.EndVector(2) 753*890232f2SAndroid Build Coastguard Worker check([]byte{2, 0, 0, 0, 2, 1, 0, 0}) // padding 754*890232f2SAndroid Build Coastguard Worker 755*890232f2SAndroid Build Coastguard Worker // test 3b: 11xbyte vector matches builder size 756*890232f2SAndroid Build Coastguard Worker 757*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(12) 758*890232f2SAndroid Build Coastguard Worker b.StartVector(flatbuffers.SizeByte, 8, 1) 759*890232f2SAndroid Build Coastguard Worker start := []byte{} 760*890232f2SAndroid Build Coastguard Worker check(start) 761*890232f2SAndroid Build Coastguard Worker for i := 1; i < 12; i++ { 762*890232f2SAndroid Build Coastguard Worker b.PrependByte(byte(i)) 763*890232f2SAndroid Build Coastguard Worker start = append([]byte{byte(i)}, start...) 764*890232f2SAndroid Build Coastguard Worker check(start) 765*890232f2SAndroid Build Coastguard Worker } 766*890232f2SAndroid Build Coastguard Worker b.EndVector(8) 767*890232f2SAndroid Build Coastguard Worker check(append([]byte{8, 0, 0, 0}, start...)) 768*890232f2SAndroid Build Coastguard Worker 769*890232f2SAndroid Build Coastguard Worker // test 4: 1xuint16 vector 770*890232f2SAndroid Build Coastguard Worker 771*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 772*890232f2SAndroid Build Coastguard Worker b.StartVector(flatbuffers.SizeUint16, 1, 1) 773*890232f2SAndroid Build Coastguard Worker check([]byte{0, 0}) // align to 4bytes 774*890232f2SAndroid Build Coastguard Worker b.PrependUint16(1) 775*890232f2SAndroid Build Coastguard Worker check([]byte{1, 0, 0, 0}) 776*890232f2SAndroid Build Coastguard Worker b.EndVector(1) 777*890232f2SAndroid Build Coastguard Worker check([]byte{1, 0, 0, 0, 1, 0, 0, 0}) // padding 778*890232f2SAndroid Build Coastguard Worker 779*890232f2SAndroid Build Coastguard Worker // test 5: 2xuint16 vector 780*890232f2SAndroid Build Coastguard Worker 781*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 782*890232f2SAndroid Build Coastguard Worker b.StartVector(flatbuffers.SizeUint16, 2, 1) 783*890232f2SAndroid Build Coastguard Worker check([]byte{}) // align to 4bytes 784*890232f2SAndroid Build Coastguard Worker b.PrependUint16(0xABCD) 785*890232f2SAndroid Build Coastguard Worker check([]byte{0xCD, 0xAB}) 786*890232f2SAndroid Build Coastguard Worker b.PrependUint16(0xDCBA) 787*890232f2SAndroid Build Coastguard Worker check([]byte{0xBA, 0xDC, 0xCD, 0xAB}) 788*890232f2SAndroid Build Coastguard Worker b.EndVector(2) 789*890232f2SAndroid Build Coastguard Worker check([]byte{2, 0, 0, 0, 0xBA, 0xDC, 0xCD, 0xAB}) 790*890232f2SAndroid Build Coastguard Worker 791*890232f2SAndroid Build Coastguard Worker // test 6: CreateString 792*890232f2SAndroid Build Coastguard Worker 793*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 794*890232f2SAndroid Build Coastguard Worker b.CreateString("foo") 795*890232f2SAndroid Build Coastguard Worker check([]byte{3, 0, 0, 0, 'f', 'o', 'o', 0}) // 0-terminated, no pad 796*890232f2SAndroid Build Coastguard Worker b.CreateString("moop") 797*890232f2SAndroid Build Coastguard Worker check([]byte{4, 0, 0, 0, 'm', 'o', 'o', 'p', 0, 0, 0, 0, // 0-terminated, 3-byte pad 798*890232f2SAndroid Build Coastguard Worker 3, 0, 0, 0, 'f', 'o', 'o', 0}) 799*890232f2SAndroid Build Coastguard Worker 800*890232f2SAndroid Build Coastguard Worker // test 6b: CreateString unicode 801*890232f2SAndroid Build Coastguard Worker 802*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 803*890232f2SAndroid Build Coastguard Worker // These characters are chinese from blog.golang.org/strings 804*890232f2SAndroid Build Coastguard Worker // We use escape codes here so that editors without unicode support 805*890232f2SAndroid Build Coastguard Worker // aren't bothered: 806*890232f2SAndroid Build Coastguard Worker uni_str := "\u65e5\u672c\u8a9e" 807*890232f2SAndroid Build Coastguard Worker b.CreateString(uni_str) 808*890232f2SAndroid Build Coastguard Worker check([]byte{9, 0, 0, 0, 230, 151, 165, 230, 156, 172, 232, 170, 158, 0, // null-terminated, 2-byte pad 809*890232f2SAndroid Build Coastguard Worker 0, 0}) 810*890232f2SAndroid Build Coastguard Worker 811*890232f2SAndroid Build Coastguard Worker // test 6c: CreateByteString 812*890232f2SAndroid Build Coastguard Worker 813*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 814*890232f2SAndroid Build Coastguard Worker b.CreateByteString([]byte("foo")) 815*890232f2SAndroid Build Coastguard Worker check([]byte{3, 0, 0, 0, 'f', 'o', 'o', 0}) // 0-terminated, no pad 816*890232f2SAndroid Build Coastguard Worker b.CreateByteString([]byte("moop")) 817*890232f2SAndroid Build Coastguard Worker check([]byte{4, 0, 0, 0, 'm', 'o', 'o', 'p', 0, 0, 0, 0, // 0-terminated, 3-byte pad 818*890232f2SAndroid Build Coastguard Worker 3, 0, 0, 0, 'f', 'o', 'o', 0}) 819*890232f2SAndroid Build Coastguard Worker 820*890232f2SAndroid Build Coastguard Worker // test 7: empty vtable 821*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 822*890232f2SAndroid Build Coastguard Worker b.StartObject(0) 823*890232f2SAndroid Build Coastguard Worker check([]byte{}) 824*890232f2SAndroid Build Coastguard Worker b.EndObject() 825*890232f2SAndroid Build Coastguard Worker check([]byte{4, 0, 4, 0, 4, 0, 0, 0}) 826*890232f2SAndroid Build Coastguard Worker 827*890232f2SAndroid Build Coastguard Worker // test 8: vtable with one true bool 828*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 829*890232f2SAndroid Build Coastguard Worker check([]byte{}) 830*890232f2SAndroid Build Coastguard Worker b.StartObject(1) 831*890232f2SAndroid Build Coastguard Worker check([]byte{}) 832*890232f2SAndroid Build Coastguard Worker b.PrependBoolSlot(0, true, false) 833*890232f2SAndroid Build Coastguard Worker b.EndObject() 834*890232f2SAndroid Build Coastguard Worker check([]byte{ 835*890232f2SAndroid Build Coastguard Worker 6, 0, // vtable bytes 836*890232f2SAndroid Build Coastguard Worker 8, 0, // length of object including vtable offset 837*890232f2SAndroid Build Coastguard Worker 7, 0, // start of bool value 838*890232f2SAndroid Build Coastguard Worker 6, 0, 0, 0, // offset for start of vtable (int32) 839*890232f2SAndroid Build Coastguard Worker 0, 0, 0, // padded to 4 bytes 840*890232f2SAndroid Build Coastguard Worker 1, // bool value 841*890232f2SAndroid Build Coastguard Worker }) 842*890232f2SAndroid Build Coastguard Worker 843*890232f2SAndroid Build Coastguard Worker // test 9: vtable with one default bool 844*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 845*890232f2SAndroid Build Coastguard Worker check([]byte{}) 846*890232f2SAndroid Build Coastguard Worker b.StartObject(1) 847*890232f2SAndroid Build Coastguard Worker check([]byte{}) 848*890232f2SAndroid Build Coastguard Worker b.PrependBoolSlot(0, false, false) 849*890232f2SAndroid Build Coastguard Worker b.EndObject() 850*890232f2SAndroid Build Coastguard Worker check([]byte{ 851*890232f2SAndroid Build Coastguard Worker 4, 0, // vtable bytes 852*890232f2SAndroid Build Coastguard Worker 4, 0, // end of object from here 853*890232f2SAndroid Build Coastguard Worker // entry 1 is zero and not stored. 854*890232f2SAndroid Build Coastguard Worker 4, 0, 0, 0, // offset for start of vtable (int32) 855*890232f2SAndroid Build Coastguard Worker }) 856*890232f2SAndroid Build Coastguard Worker 857*890232f2SAndroid Build Coastguard Worker // test 10: vtable with one int16 858*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 859*890232f2SAndroid Build Coastguard Worker b.StartObject(1) 860*890232f2SAndroid Build Coastguard Worker b.PrependInt16Slot(0, 0x789A, 0) 861*890232f2SAndroid Build Coastguard Worker b.EndObject() 862*890232f2SAndroid Build Coastguard Worker check([]byte{ 863*890232f2SAndroid Build Coastguard Worker 6, 0, // vtable bytes 864*890232f2SAndroid Build Coastguard Worker 8, 0, // end of object from here 865*890232f2SAndroid Build Coastguard Worker 6, 0, // offset to value 866*890232f2SAndroid Build Coastguard Worker 6, 0, 0, 0, // offset for start of vtable (int32) 867*890232f2SAndroid Build Coastguard Worker 0, 0, // padding to 4 bytes 868*890232f2SAndroid Build Coastguard Worker 0x9A, 0x78, 869*890232f2SAndroid Build Coastguard Worker }) 870*890232f2SAndroid Build Coastguard Worker 871*890232f2SAndroid Build Coastguard Worker // test 11: vtable with two int16 872*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 873*890232f2SAndroid Build Coastguard Worker b.StartObject(2) 874*890232f2SAndroid Build Coastguard Worker b.PrependInt16Slot(0, 0x3456, 0) 875*890232f2SAndroid Build Coastguard Worker b.PrependInt16Slot(1, 0x789A, 0) 876*890232f2SAndroid Build Coastguard Worker b.EndObject() 877*890232f2SAndroid Build Coastguard Worker check([]byte{ 878*890232f2SAndroid Build Coastguard Worker 8, 0, // vtable bytes 879*890232f2SAndroid Build Coastguard Worker 8, 0, // end of object from here 880*890232f2SAndroid Build Coastguard Worker 6, 0, // offset to value 0 881*890232f2SAndroid Build Coastguard Worker 4, 0, // offset to value 1 882*890232f2SAndroid Build Coastguard Worker 8, 0, 0, 0, // offset for start of vtable (int32) 883*890232f2SAndroid Build Coastguard Worker 0x9A, 0x78, // value 1 884*890232f2SAndroid Build Coastguard Worker 0x56, 0x34, // value 0 885*890232f2SAndroid Build Coastguard Worker }) 886*890232f2SAndroid Build Coastguard Worker 887*890232f2SAndroid Build Coastguard Worker // test 12: vtable with int16 and bool 888*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 889*890232f2SAndroid Build Coastguard Worker b.StartObject(2) 890*890232f2SAndroid Build Coastguard Worker b.PrependInt16Slot(0, 0x3456, 0) 891*890232f2SAndroid Build Coastguard Worker b.PrependBoolSlot(1, true, false) 892*890232f2SAndroid Build Coastguard Worker b.EndObject() 893*890232f2SAndroid Build Coastguard Worker check([]byte{ 894*890232f2SAndroid Build Coastguard Worker 8, 0, // vtable bytes 895*890232f2SAndroid Build Coastguard Worker 8, 0, // end of object from here 896*890232f2SAndroid Build Coastguard Worker 6, 0, // offset to value 0 897*890232f2SAndroid Build Coastguard Worker 5, 0, // offset to value 1 898*890232f2SAndroid Build Coastguard Worker 8, 0, 0, 0, // offset for start of vtable (int32) 899*890232f2SAndroid Build Coastguard Worker 0, // padding 900*890232f2SAndroid Build Coastguard Worker 1, // value 1 901*890232f2SAndroid Build Coastguard Worker 0x56, 0x34, // value 0 902*890232f2SAndroid Build Coastguard Worker }) 903*890232f2SAndroid Build Coastguard Worker 904*890232f2SAndroid Build Coastguard Worker // test 12: vtable with empty vector 905*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 906*890232f2SAndroid Build Coastguard Worker b.StartVector(flatbuffers.SizeByte, 0, 1) 907*890232f2SAndroid Build Coastguard Worker vecend := b.EndVector(0) 908*890232f2SAndroid Build Coastguard Worker b.StartObject(1) 909*890232f2SAndroid Build Coastguard Worker b.PrependUOffsetTSlot(0, vecend, 0) 910*890232f2SAndroid Build Coastguard Worker b.EndObject() 911*890232f2SAndroid Build Coastguard Worker check([]byte{ 912*890232f2SAndroid Build Coastguard Worker 6, 0, // vtable bytes 913*890232f2SAndroid Build Coastguard Worker 8, 0, 914*890232f2SAndroid Build Coastguard Worker 4, 0, // offset to vector offset 915*890232f2SAndroid Build Coastguard Worker 6, 0, 0, 0, // offset for start of vtable (int32) 916*890232f2SAndroid Build Coastguard Worker 4, 0, 0, 0, 917*890232f2SAndroid Build Coastguard Worker 0, 0, 0, 0, // length of vector (not in struct) 918*890232f2SAndroid Build Coastguard Worker }) 919*890232f2SAndroid Build Coastguard Worker 920*890232f2SAndroid Build Coastguard Worker // test 12b: vtable with empty vector of byte and some scalars 921*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 922*890232f2SAndroid Build Coastguard Worker b.StartVector(flatbuffers.SizeByte, 0, 1) 923*890232f2SAndroid Build Coastguard Worker vecend = b.EndVector(0) 924*890232f2SAndroid Build Coastguard Worker b.StartObject(2) 925*890232f2SAndroid Build Coastguard Worker b.PrependInt16Slot(0, 55, 0) 926*890232f2SAndroid Build Coastguard Worker b.PrependUOffsetTSlot(1, vecend, 0) 927*890232f2SAndroid Build Coastguard Worker b.EndObject() 928*890232f2SAndroid Build Coastguard Worker check([]byte{ 929*890232f2SAndroid Build Coastguard Worker 8, 0, // vtable bytes 930*890232f2SAndroid Build Coastguard Worker 12, 0, 931*890232f2SAndroid Build Coastguard Worker 10, 0, // offset to value 0 932*890232f2SAndroid Build Coastguard Worker 4, 0, // offset to vector offset 933*890232f2SAndroid Build Coastguard Worker 8, 0, 0, 0, // vtable loc 934*890232f2SAndroid Build Coastguard Worker 8, 0, 0, 0, // value 1 935*890232f2SAndroid Build Coastguard Worker 0, 0, 55, 0, // value 0 936*890232f2SAndroid Build Coastguard Worker 937*890232f2SAndroid Build Coastguard Worker 0, 0, 0, 0, // length of vector (not in struct) 938*890232f2SAndroid Build Coastguard Worker }) 939*890232f2SAndroid Build Coastguard Worker 940*890232f2SAndroid Build Coastguard Worker // test 13: vtable with 1 int16 and 2-vector of int16 941*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 942*890232f2SAndroid Build Coastguard Worker b.StartVector(flatbuffers.SizeInt16, 2, 1) 943*890232f2SAndroid Build Coastguard Worker b.PrependInt16(0x1234) 944*890232f2SAndroid Build Coastguard Worker b.PrependInt16(0x5678) 945*890232f2SAndroid Build Coastguard Worker vecend = b.EndVector(2) 946*890232f2SAndroid Build Coastguard Worker b.StartObject(2) 947*890232f2SAndroid Build Coastguard Worker b.PrependUOffsetTSlot(1, vecend, 0) 948*890232f2SAndroid Build Coastguard Worker b.PrependInt16Slot(0, 55, 0) 949*890232f2SAndroid Build Coastguard Worker b.EndObject() 950*890232f2SAndroid Build Coastguard Worker check([]byte{ 951*890232f2SAndroid Build Coastguard Worker 8, 0, // vtable bytes 952*890232f2SAndroid Build Coastguard Worker 12, 0, // length of object 953*890232f2SAndroid Build Coastguard Worker 6, 0, // start of value 0 from end of vtable 954*890232f2SAndroid Build Coastguard Worker 8, 0, // start of value 1 from end of buffer 955*890232f2SAndroid Build Coastguard Worker 8, 0, 0, 0, // offset for start of vtable (int32) 956*890232f2SAndroid Build Coastguard Worker 0, 0, // padding 957*890232f2SAndroid Build Coastguard Worker 55, 0, // value 0 958*890232f2SAndroid Build Coastguard Worker 4, 0, 0, 0, // vector position from here 959*890232f2SAndroid Build Coastguard Worker 2, 0, 0, 0, // length of vector (uint32) 960*890232f2SAndroid Build Coastguard Worker 0x78, 0x56, // vector value 1 961*890232f2SAndroid Build Coastguard Worker 0x34, 0x12, // vector value 0 962*890232f2SAndroid Build Coastguard Worker }) 963*890232f2SAndroid Build Coastguard Worker 964*890232f2SAndroid Build Coastguard Worker // test 14: vtable with 1 struct of 1 int8, 1 int16, 1 int32 965*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 966*890232f2SAndroid Build Coastguard Worker b.StartObject(1) 967*890232f2SAndroid Build Coastguard Worker b.Prep(4+4+4, 0) 968*890232f2SAndroid Build Coastguard Worker b.PrependInt8(55) 969*890232f2SAndroid Build Coastguard Worker b.Pad(3) 970*890232f2SAndroid Build Coastguard Worker b.PrependInt16(0x1234) 971*890232f2SAndroid Build Coastguard Worker b.Pad(2) 972*890232f2SAndroid Build Coastguard Worker b.PrependInt32(0x12345678) 973*890232f2SAndroid Build Coastguard Worker structStart := b.Offset() 974*890232f2SAndroid Build Coastguard Worker b.PrependStructSlot(0, structStart, 0) 975*890232f2SAndroid Build Coastguard Worker b.EndObject() 976*890232f2SAndroid Build Coastguard Worker check([]byte{ 977*890232f2SAndroid Build Coastguard Worker 6, 0, // vtable bytes 978*890232f2SAndroid Build Coastguard Worker 16, 0, // end of object from here 979*890232f2SAndroid Build Coastguard Worker 4, 0, // start of struct from here 980*890232f2SAndroid Build Coastguard Worker 6, 0, 0, 0, // offset for start of vtable (int32) 981*890232f2SAndroid Build Coastguard Worker 0x78, 0x56, 0x34, 0x12, // value 2 982*890232f2SAndroid Build Coastguard Worker 0, 0, // padding 983*890232f2SAndroid Build Coastguard Worker 0x34, 0x12, // value 1 984*890232f2SAndroid Build Coastguard Worker 0, 0, 0, // padding 985*890232f2SAndroid Build Coastguard Worker 55, // value 0 986*890232f2SAndroid Build Coastguard Worker }) 987*890232f2SAndroid Build Coastguard Worker 988*890232f2SAndroid Build Coastguard Worker // test 15: vtable with 1 vector of 2 struct of 2 int8 989*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 990*890232f2SAndroid Build Coastguard Worker b.StartVector(flatbuffers.SizeInt8*2, 2, 1) 991*890232f2SAndroid Build Coastguard Worker b.PrependInt8(33) 992*890232f2SAndroid Build Coastguard Worker b.PrependInt8(44) 993*890232f2SAndroid Build Coastguard Worker b.PrependInt8(55) 994*890232f2SAndroid Build Coastguard Worker b.PrependInt8(66) 995*890232f2SAndroid Build Coastguard Worker vecend = b.EndVector(2) 996*890232f2SAndroid Build Coastguard Worker b.StartObject(1) 997*890232f2SAndroid Build Coastguard Worker b.PrependUOffsetTSlot(0, vecend, 0) 998*890232f2SAndroid Build Coastguard Worker b.EndObject() 999*890232f2SAndroid Build Coastguard Worker check([]byte{ 1000*890232f2SAndroid Build Coastguard Worker 6, 0, // vtable bytes 1001*890232f2SAndroid Build Coastguard Worker 8, 0, 1002*890232f2SAndroid Build Coastguard Worker 4, 0, // offset of vector offset 1003*890232f2SAndroid Build Coastguard Worker 6, 0, 0, 0, // offset for start of vtable (int32) 1004*890232f2SAndroid Build Coastguard Worker 4, 0, 0, 0, // vector start offset 1005*890232f2SAndroid Build Coastguard Worker 1006*890232f2SAndroid Build Coastguard Worker 2, 0, 0, 0, // vector length 1007*890232f2SAndroid Build Coastguard Worker 66, // vector value 1,1 1008*890232f2SAndroid Build Coastguard Worker 55, // vector value 1,0 1009*890232f2SAndroid Build Coastguard Worker 44, // vector value 0,1 1010*890232f2SAndroid Build Coastguard Worker 33, // vector value 0,0 1011*890232f2SAndroid Build Coastguard Worker }) 1012*890232f2SAndroid Build Coastguard Worker 1013*890232f2SAndroid Build Coastguard Worker // test 16: table with some elements 1014*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 1015*890232f2SAndroid Build Coastguard Worker b.StartObject(2) 1016*890232f2SAndroid Build Coastguard Worker b.PrependInt8Slot(0, 33, 0) 1017*890232f2SAndroid Build Coastguard Worker b.PrependInt16Slot(1, 66, 0) 1018*890232f2SAndroid Build Coastguard Worker off := b.EndObject() 1019*890232f2SAndroid Build Coastguard Worker b.Finish(off) 1020*890232f2SAndroid Build Coastguard Worker 1021*890232f2SAndroid Build Coastguard Worker check([]byte{ 1022*890232f2SAndroid Build Coastguard Worker 12, 0, 0, 0, // root of table: points to vtable offset 1023*890232f2SAndroid Build Coastguard Worker 1024*890232f2SAndroid Build Coastguard Worker 8, 0, // vtable bytes 1025*890232f2SAndroid Build Coastguard Worker 8, 0, // end of object from here 1026*890232f2SAndroid Build Coastguard Worker 7, 0, // start of value 0 1027*890232f2SAndroid Build Coastguard Worker 4, 0, // start of value 1 1028*890232f2SAndroid Build Coastguard Worker 1029*890232f2SAndroid Build Coastguard Worker 8, 0, 0, 0, // offset for start of vtable (int32) 1030*890232f2SAndroid Build Coastguard Worker 1031*890232f2SAndroid Build Coastguard Worker 66, 0, // value 1 1032*890232f2SAndroid Build Coastguard Worker 0, // padding 1033*890232f2SAndroid Build Coastguard Worker 33, // value 0 1034*890232f2SAndroid Build Coastguard Worker }) 1035*890232f2SAndroid Build Coastguard Worker 1036*890232f2SAndroid Build Coastguard Worker // test 17: one unfinished table and one finished table 1037*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 1038*890232f2SAndroid Build Coastguard Worker b.StartObject(2) 1039*890232f2SAndroid Build Coastguard Worker b.PrependInt8Slot(0, 33, 0) 1040*890232f2SAndroid Build Coastguard Worker b.PrependInt8Slot(1, 44, 0) 1041*890232f2SAndroid Build Coastguard Worker off = b.EndObject() 1042*890232f2SAndroid Build Coastguard Worker b.Finish(off) 1043*890232f2SAndroid Build Coastguard Worker 1044*890232f2SAndroid Build Coastguard Worker b.StartObject(3) 1045*890232f2SAndroid Build Coastguard Worker b.PrependInt8Slot(0, 55, 0) 1046*890232f2SAndroid Build Coastguard Worker b.PrependInt8Slot(1, 66, 0) 1047*890232f2SAndroid Build Coastguard Worker b.PrependInt8Slot(2, 77, 0) 1048*890232f2SAndroid Build Coastguard Worker off = b.EndObject() 1049*890232f2SAndroid Build Coastguard Worker b.Finish(off) 1050*890232f2SAndroid Build Coastguard Worker 1051*890232f2SAndroid Build Coastguard Worker check([]byte{ 1052*890232f2SAndroid Build Coastguard Worker 16, 0, 0, 0, // root of table: points to object 1053*890232f2SAndroid Build Coastguard Worker 0, 0, // padding 1054*890232f2SAndroid Build Coastguard Worker 1055*890232f2SAndroid Build Coastguard Worker 10, 0, // vtable bytes 1056*890232f2SAndroid Build Coastguard Worker 8, 0, // size of object 1057*890232f2SAndroid Build Coastguard Worker 7, 0, // start of value 0 1058*890232f2SAndroid Build Coastguard Worker 6, 0, // start of value 1 1059*890232f2SAndroid Build Coastguard Worker 5, 0, // start of value 2 1060*890232f2SAndroid Build Coastguard Worker 10, 0, 0, 0, // offset for start of vtable (int32) 1061*890232f2SAndroid Build Coastguard Worker 0, // padding 1062*890232f2SAndroid Build Coastguard Worker 77, // value 2 1063*890232f2SAndroid Build Coastguard Worker 66, // value 1 1064*890232f2SAndroid Build Coastguard Worker 55, // value 0 1065*890232f2SAndroid Build Coastguard Worker 1066*890232f2SAndroid Build Coastguard Worker 12, 0, 0, 0, // root of table: points to object 1067*890232f2SAndroid Build Coastguard Worker 1068*890232f2SAndroid Build Coastguard Worker 8, 0, // vtable bytes 1069*890232f2SAndroid Build Coastguard Worker 8, 0, // size of object 1070*890232f2SAndroid Build Coastguard Worker 7, 0, // start of value 0 1071*890232f2SAndroid Build Coastguard Worker 6, 0, // start of value 1 1072*890232f2SAndroid Build Coastguard Worker 8, 0, 0, 0, // offset for start of vtable (int32) 1073*890232f2SAndroid Build Coastguard Worker 0, 0, // padding 1074*890232f2SAndroid Build Coastguard Worker 44, // value 1 1075*890232f2SAndroid Build Coastguard Worker 33, // value 0 1076*890232f2SAndroid Build Coastguard Worker }) 1077*890232f2SAndroid Build Coastguard Worker 1078*890232f2SAndroid Build Coastguard Worker // test 18: a bunch of bools 1079*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 1080*890232f2SAndroid Build Coastguard Worker b.StartObject(8) 1081*890232f2SAndroid Build Coastguard Worker b.PrependBoolSlot(0, true, false) 1082*890232f2SAndroid Build Coastguard Worker b.PrependBoolSlot(1, true, false) 1083*890232f2SAndroid Build Coastguard Worker b.PrependBoolSlot(2, true, false) 1084*890232f2SAndroid Build Coastguard Worker b.PrependBoolSlot(3, true, false) 1085*890232f2SAndroid Build Coastguard Worker b.PrependBoolSlot(4, true, false) 1086*890232f2SAndroid Build Coastguard Worker b.PrependBoolSlot(5, true, false) 1087*890232f2SAndroid Build Coastguard Worker b.PrependBoolSlot(6, true, false) 1088*890232f2SAndroid Build Coastguard Worker b.PrependBoolSlot(7, true, false) 1089*890232f2SAndroid Build Coastguard Worker off = b.EndObject() 1090*890232f2SAndroid Build Coastguard Worker b.Finish(off) 1091*890232f2SAndroid Build Coastguard Worker 1092*890232f2SAndroid Build Coastguard Worker check([]byte{ 1093*890232f2SAndroid Build Coastguard Worker 24, 0, 0, 0, // root of table: points to vtable offset 1094*890232f2SAndroid Build Coastguard Worker 1095*890232f2SAndroid Build Coastguard Worker 20, 0, // vtable bytes 1096*890232f2SAndroid Build Coastguard Worker 12, 0, // size of object 1097*890232f2SAndroid Build Coastguard Worker 11, 0, // start of value 0 1098*890232f2SAndroid Build Coastguard Worker 10, 0, // start of value 1 1099*890232f2SAndroid Build Coastguard Worker 9, 0, // start of value 2 1100*890232f2SAndroid Build Coastguard Worker 8, 0, // start of value 3 1101*890232f2SAndroid Build Coastguard Worker 7, 0, // start of value 4 1102*890232f2SAndroid Build Coastguard Worker 6, 0, // start of value 5 1103*890232f2SAndroid Build Coastguard Worker 5, 0, // start of value 6 1104*890232f2SAndroid Build Coastguard Worker 4, 0, // start of value 7 1105*890232f2SAndroid Build Coastguard Worker 20, 0, 0, 0, // vtable offset 1106*890232f2SAndroid Build Coastguard Worker 1107*890232f2SAndroid Build Coastguard Worker 1, // value 7 1108*890232f2SAndroid Build Coastguard Worker 1, // value 6 1109*890232f2SAndroid Build Coastguard Worker 1, // value 5 1110*890232f2SAndroid Build Coastguard Worker 1, // value 4 1111*890232f2SAndroid Build Coastguard Worker 1, // value 3 1112*890232f2SAndroid Build Coastguard Worker 1, // value 2 1113*890232f2SAndroid Build Coastguard Worker 1, // value 1 1114*890232f2SAndroid Build Coastguard Worker 1, // value 0 1115*890232f2SAndroid Build Coastguard Worker }) 1116*890232f2SAndroid Build Coastguard Worker 1117*890232f2SAndroid Build Coastguard Worker // test 19: three bools 1118*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 1119*890232f2SAndroid Build Coastguard Worker b.StartObject(3) 1120*890232f2SAndroid Build Coastguard Worker b.PrependBoolSlot(0, true, false) 1121*890232f2SAndroid Build Coastguard Worker b.PrependBoolSlot(1, true, false) 1122*890232f2SAndroid Build Coastguard Worker b.PrependBoolSlot(2, true, false) 1123*890232f2SAndroid Build Coastguard Worker off = b.EndObject() 1124*890232f2SAndroid Build Coastguard Worker b.Finish(off) 1125*890232f2SAndroid Build Coastguard Worker 1126*890232f2SAndroid Build Coastguard Worker check([]byte{ 1127*890232f2SAndroid Build Coastguard Worker 16, 0, 0, 0, // root of table: points to vtable offset 1128*890232f2SAndroid Build Coastguard Worker 1129*890232f2SAndroid Build Coastguard Worker 0, 0, // padding 1130*890232f2SAndroid Build Coastguard Worker 1131*890232f2SAndroid Build Coastguard Worker 10, 0, // vtable bytes 1132*890232f2SAndroid Build Coastguard Worker 8, 0, // size of object 1133*890232f2SAndroid Build Coastguard Worker 7, 0, // start of value 0 1134*890232f2SAndroid Build Coastguard Worker 6, 0, // start of value 1 1135*890232f2SAndroid Build Coastguard Worker 5, 0, // start of value 2 1136*890232f2SAndroid Build Coastguard Worker 10, 0, 0, 0, // vtable offset from here 1137*890232f2SAndroid Build Coastguard Worker 1138*890232f2SAndroid Build Coastguard Worker 0, // padding 1139*890232f2SAndroid Build Coastguard Worker 1, // value 2 1140*890232f2SAndroid Build Coastguard Worker 1, // value 1 1141*890232f2SAndroid Build Coastguard Worker 1, // value 0 1142*890232f2SAndroid Build Coastguard Worker }) 1143*890232f2SAndroid Build Coastguard Worker 1144*890232f2SAndroid Build Coastguard Worker // test 20: some floats 1145*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 1146*890232f2SAndroid Build Coastguard Worker b.StartObject(1) 1147*890232f2SAndroid Build Coastguard Worker b.PrependFloat32Slot(0, 1.0, 0.0) 1148*890232f2SAndroid Build Coastguard Worker off = b.EndObject() 1149*890232f2SAndroid Build Coastguard Worker 1150*890232f2SAndroid Build Coastguard Worker check([]byte{ 1151*890232f2SAndroid Build Coastguard Worker 6, 0, // vtable bytes 1152*890232f2SAndroid Build Coastguard Worker 8, 0, // size of object 1153*890232f2SAndroid Build Coastguard Worker 4, 0, // start of value 0 1154*890232f2SAndroid Build Coastguard Worker 6, 0, 0, 0, // vtable offset 1155*890232f2SAndroid Build Coastguard Worker 1156*890232f2SAndroid Build Coastguard Worker 0, 0, 128, 63, // value 0 1157*890232f2SAndroid Build Coastguard Worker }) 1158*890232f2SAndroid Build Coastguard Worker} 1159*890232f2SAndroid Build Coastguard Worker 1160*890232f2SAndroid Build Coastguard Worker// CheckManualBuild builds a Monster manually. 1161*890232f2SAndroid Build Coastguard Workerfunc CheckManualBuild(fail func(string, ...interface{})) ([]byte, flatbuffers.UOffsetT) { 1162*890232f2SAndroid Build Coastguard Worker b := flatbuffers.NewBuilder(0) 1163*890232f2SAndroid Build Coastguard Worker str := b.CreateString("MyMonster") 1164*890232f2SAndroid Build Coastguard Worker 1165*890232f2SAndroid Build Coastguard Worker b.StartVector(1, 5, 1) 1166*890232f2SAndroid Build Coastguard Worker b.PrependByte(4) 1167*890232f2SAndroid Build Coastguard Worker b.PrependByte(3) 1168*890232f2SAndroid Build Coastguard Worker b.PrependByte(2) 1169*890232f2SAndroid Build Coastguard Worker b.PrependByte(1) 1170*890232f2SAndroid Build Coastguard Worker b.PrependByte(0) 1171*890232f2SAndroid Build Coastguard Worker inv := b.EndVector(5) 1172*890232f2SAndroid Build Coastguard Worker 1173*890232f2SAndroid Build Coastguard Worker b.StartObject(13) 1174*890232f2SAndroid Build Coastguard Worker b.PrependInt16Slot(2, 20, 100) 1175*890232f2SAndroid Build Coastguard Worker mon2 := b.EndObject() 1176*890232f2SAndroid Build Coastguard Worker 1177*890232f2SAndroid Build Coastguard Worker // Test4Vector 1178*890232f2SAndroid Build Coastguard Worker b.StartVector(4, 2, 1) 1179*890232f2SAndroid Build Coastguard Worker 1180*890232f2SAndroid Build Coastguard Worker // Test 0 1181*890232f2SAndroid Build Coastguard Worker b.Prep(2, 4) 1182*890232f2SAndroid Build Coastguard Worker b.Pad(1) 1183*890232f2SAndroid Build Coastguard Worker b.PlaceInt8(20) 1184*890232f2SAndroid Build Coastguard Worker b.PlaceInt16(10) 1185*890232f2SAndroid Build Coastguard Worker 1186*890232f2SAndroid Build Coastguard Worker // Test 1 1187*890232f2SAndroid Build Coastguard Worker b.Prep(2, 4) 1188*890232f2SAndroid Build Coastguard Worker b.Pad(1) 1189*890232f2SAndroid Build Coastguard Worker b.PlaceInt8(40) 1190*890232f2SAndroid Build Coastguard Worker b.PlaceInt16(30) 1191*890232f2SAndroid Build Coastguard Worker 1192*890232f2SAndroid Build Coastguard Worker // end testvector 1193*890232f2SAndroid Build Coastguard Worker test4 := b.EndVector(2) 1194*890232f2SAndroid Build Coastguard Worker 1195*890232f2SAndroid Build Coastguard Worker b.StartObject(13) 1196*890232f2SAndroid Build Coastguard Worker 1197*890232f2SAndroid Build Coastguard Worker // a vec3 1198*890232f2SAndroid Build Coastguard Worker b.Prep(16, 32) 1199*890232f2SAndroid Build Coastguard Worker b.Pad(2) 1200*890232f2SAndroid Build Coastguard Worker b.Prep(2, 4) 1201*890232f2SAndroid Build Coastguard Worker b.Pad(1) 1202*890232f2SAndroid Build Coastguard Worker b.PlaceByte(6) 1203*890232f2SAndroid Build Coastguard Worker b.PlaceInt16(5) 1204*890232f2SAndroid Build Coastguard Worker b.Pad(1) 1205*890232f2SAndroid Build Coastguard Worker b.PlaceByte(4) 1206*890232f2SAndroid Build Coastguard Worker b.PlaceFloat64(3.0) 1207*890232f2SAndroid Build Coastguard Worker b.Pad(4) 1208*890232f2SAndroid Build Coastguard Worker b.PlaceFloat32(3.0) 1209*890232f2SAndroid Build Coastguard Worker b.PlaceFloat32(2.0) 1210*890232f2SAndroid Build Coastguard Worker b.PlaceFloat32(1.0) 1211*890232f2SAndroid Build Coastguard Worker vec3Loc := b.Offset() 1212*890232f2SAndroid Build Coastguard Worker // end vec3 1213*890232f2SAndroid Build Coastguard Worker 1214*890232f2SAndroid Build Coastguard Worker b.PrependStructSlot(0, vec3Loc, 0) // vec3. noop 1215*890232f2SAndroid Build Coastguard Worker b.PrependInt16Slot(2, 80, 100) // hp 1216*890232f2SAndroid Build Coastguard Worker b.PrependUOffsetTSlot(3, str, 0) 1217*890232f2SAndroid Build Coastguard Worker b.PrependUOffsetTSlot(5, inv, 0) // inventory 1218*890232f2SAndroid Build Coastguard Worker b.PrependByteSlot(7, 1, 0) 1219*890232f2SAndroid Build Coastguard Worker b.PrependUOffsetTSlot(8, mon2, 0) 1220*890232f2SAndroid Build Coastguard Worker b.PrependUOffsetTSlot(9, test4, 0) 1221*890232f2SAndroid Build Coastguard Worker mon := b.EndObject() 1222*890232f2SAndroid Build Coastguard Worker 1223*890232f2SAndroid Build Coastguard Worker b.Finish(mon) 1224*890232f2SAndroid Build Coastguard Worker 1225*890232f2SAndroid Build Coastguard Worker return b.Bytes, b.Head() 1226*890232f2SAndroid Build Coastguard Worker} 1227*890232f2SAndroid Build Coastguard Worker 1228*890232f2SAndroid Build Coastguard Workerfunc CheckGetRootAsForNonRootTable(fail func(string, ...interface{})) { 1229*890232f2SAndroid Build Coastguard Worker b := flatbuffers.NewBuilder(0) 1230*890232f2SAndroid Build Coastguard Worker str := b.CreateString("MyStat") 1231*890232f2SAndroid Build Coastguard Worker example.StatStart(b) 1232*890232f2SAndroid Build Coastguard Worker example.StatAddId(b, str) 1233*890232f2SAndroid Build Coastguard Worker example.StatAddVal(b, 12345678) 1234*890232f2SAndroid Build Coastguard Worker example.StatAddCount(b, 12345) 1235*890232f2SAndroid Build Coastguard Worker stat_end := example.StatEnd(b) 1236*890232f2SAndroid Build Coastguard Worker b.Finish(stat_end) 1237*890232f2SAndroid Build Coastguard Worker 1238*890232f2SAndroid Build Coastguard Worker stat := example.GetRootAsStat(b.Bytes, b.Head()) 1239*890232f2SAndroid Build Coastguard Worker 1240*890232f2SAndroid Build Coastguard Worker if got := stat.Id(); !bytes.Equal([]byte("MyStat"), got) { 1241*890232f2SAndroid Build Coastguard Worker fail(FailString("stat.Id()", "MyStat", got)) 1242*890232f2SAndroid Build Coastguard Worker } 1243*890232f2SAndroid Build Coastguard Worker 1244*890232f2SAndroid Build Coastguard Worker if got := stat.Val(); 12345678 != got { 1245*890232f2SAndroid Build Coastguard Worker fail(FailString("stat.Val()", 12345678, got)) 1246*890232f2SAndroid Build Coastguard Worker } 1247*890232f2SAndroid Build Coastguard Worker 1248*890232f2SAndroid Build Coastguard Worker if got := stat.Count(); 12345 != got { 1249*890232f2SAndroid Build Coastguard Worker fail(FailString("stat.Count()", 12345, got)) 1250*890232f2SAndroid Build Coastguard Worker } 1251*890232f2SAndroid Build Coastguard Worker} 1252*890232f2SAndroid Build Coastguard Worker 1253*890232f2SAndroid Build Coastguard Worker// CheckGeneratedBuild uses generated code to build the example Monster. 1254*890232f2SAndroid Build Coastguard Workerfunc CheckGeneratedBuild(sizePrefix bool, fail func(string, ...interface{})) ([]byte, flatbuffers.UOffsetT) { 1255*890232f2SAndroid Build Coastguard Worker b := flatbuffers.NewBuilder(0) 1256*890232f2SAndroid Build Coastguard Worker str := b.CreateString("MyMonster") 1257*890232f2SAndroid Build Coastguard Worker test1 := b.CreateString("test1") 1258*890232f2SAndroid Build Coastguard Worker test2 := b.CreateString("test2") 1259*890232f2SAndroid Build Coastguard Worker fred := b.CreateString("Fred") 1260*890232f2SAndroid Build Coastguard Worker 1261*890232f2SAndroid Build Coastguard Worker example.MonsterStartInventoryVector(b, 5) 1262*890232f2SAndroid Build Coastguard Worker b.PrependByte(4) 1263*890232f2SAndroid Build Coastguard Worker b.PrependByte(3) 1264*890232f2SAndroid Build Coastguard Worker b.PrependByte(2) 1265*890232f2SAndroid Build Coastguard Worker b.PrependByte(1) 1266*890232f2SAndroid Build Coastguard Worker b.PrependByte(0) 1267*890232f2SAndroid Build Coastguard Worker inv := b.EndVector(5) 1268*890232f2SAndroid Build Coastguard Worker 1269*890232f2SAndroid Build Coastguard Worker example.MonsterStart(b) 1270*890232f2SAndroid Build Coastguard Worker example.MonsterAddName(b, fred) 1271*890232f2SAndroid Build Coastguard Worker mon2 := example.MonsterEnd(b) 1272*890232f2SAndroid Build Coastguard Worker 1273*890232f2SAndroid Build Coastguard Worker example.MonsterStartTest4Vector(b, 2) 1274*890232f2SAndroid Build Coastguard Worker example.CreateTest(b, 10, 20) 1275*890232f2SAndroid Build Coastguard Worker example.CreateTest(b, 30, 40) 1276*890232f2SAndroid Build Coastguard Worker test4 := b.EndVector(2) 1277*890232f2SAndroid Build Coastguard Worker 1278*890232f2SAndroid Build Coastguard Worker example.MonsterStartTestarrayofstringVector(b, 2) 1279*890232f2SAndroid Build Coastguard Worker b.PrependUOffsetT(test2) 1280*890232f2SAndroid Build Coastguard Worker b.PrependUOffsetT(test1) 1281*890232f2SAndroid Build Coastguard Worker testArrayOfString := b.EndVector(2) 1282*890232f2SAndroid Build Coastguard Worker 1283*890232f2SAndroid Build Coastguard Worker example.MonsterStart(b) 1284*890232f2SAndroid Build Coastguard Worker 1285*890232f2SAndroid Build Coastguard Worker pos := example.CreateVec3(b, 1.0, 2.0, 3.0, 3.0, example.ColorGreen, 5, 6) 1286*890232f2SAndroid Build Coastguard Worker example.MonsterAddPos(b, pos) 1287*890232f2SAndroid Build Coastguard Worker 1288*890232f2SAndroid Build Coastguard Worker example.MonsterAddHp(b, 80) 1289*890232f2SAndroid Build Coastguard Worker example.MonsterAddName(b, str) 1290*890232f2SAndroid Build Coastguard Worker example.MonsterAddTestbool(b, true) 1291*890232f2SAndroid Build Coastguard Worker example.MonsterAddInventory(b, inv) 1292*890232f2SAndroid Build Coastguard Worker example.MonsterAddTestType(b, 1) 1293*890232f2SAndroid Build Coastguard Worker example.MonsterAddTest(b, mon2) 1294*890232f2SAndroid Build Coastguard Worker example.MonsterAddTest4(b, test4) 1295*890232f2SAndroid Build Coastguard Worker example.MonsterAddTestarrayofstring(b, testArrayOfString) 1296*890232f2SAndroid Build Coastguard Worker mon := example.MonsterEnd(b) 1297*890232f2SAndroid Build Coastguard Worker 1298*890232f2SAndroid Build Coastguard Worker if sizePrefix { 1299*890232f2SAndroid Build Coastguard Worker b.FinishSizePrefixed(mon) 1300*890232f2SAndroid Build Coastguard Worker } else { 1301*890232f2SAndroid Build Coastguard Worker b.Finish(mon) 1302*890232f2SAndroid Build Coastguard Worker } 1303*890232f2SAndroid Build Coastguard Worker 1304*890232f2SAndroid Build Coastguard Worker return b.Bytes, b.Head() 1305*890232f2SAndroid Build Coastguard Worker} 1306*890232f2SAndroid Build Coastguard Worker 1307*890232f2SAndroid Build Coastguard Worker// CheckTableAccessors checks that the table accessors work as expected. 1308*890232f2SAndroid Build Coastguard Workerfunc CheckTableAccessors(fail func(string, ...interface{})) { 1309*890232f2SAndroid Build Coastguard Worker // test struct accessor 1310*890232f2SAndroid Build Coastguard Worker b := flatbuffers.NewBuilder(0) 1311*890232f2SAndroid Build Coastguard Worker pos := example.CreateVec3(b, 1.0, 2.0, 3.0, 3.0, 4, 5, 6) 1312*890232f2SAndroid Build Coastguard Worker b.Finish(pos) 1313*890232f2SAndroid Build Coastguard Worker vec3Bytes := b.FinishedBytes() 1314*890232f2SAndroid Build Coastguard Worker vec3 := &example.Vec3{} 1315*890232f2SAndroid Build Coastguard Worker flatbuffers.GetRootAs(vec3Bytes, 0, vec3) 1316*890232f2SAndroid Build Coastguard Worker 1317*890232f2SAndroid Build Coastguard Worker if bytes.Compare(vec3Bytes, vec3.Table().Bytes) != 0 { 1318*890232f2SAndroid Build Coastguard Worker fail("invalid vec3 table") 1319*890232f2SAndroid Build Coastguard Worker } 1320*890232f2SAndroid Build Coastguard Worker 1321*890232f2SAndroid Build Coastguard Worker // test table accessor 1322*890232f2SAndroid Build Coastguard Worker b = flatbuffers.NewBuilder(0) 1323*890232f2SAndroid Build Coastguard Worker str := b.CreateString("MyStat") 1324*890232f2SAndroid Build Coastguard Worker example.StatStart(b) 1325*890232f2SAndroid Build Coastguard Worker example.StatAddId(b, str) 1326*890232f2SAndroid Build Coastguard Worker example.StatAddVal(b, 12345678) 1327*890232f2SAndroid Build Coastguard Worker example.StatAddCount(b, 12345) 1328*890232f2SAndroid Build Coastguard Worker pos = example.StatEnd(b) 1329*890232f2SAndroid Build Coastguard Worker b.Finish(pos) 1330*890232f2SAndroid Build Coastguard Worker statBytes := b.FinishedBytes() 1331*890232f2SAndroid Build Coastguard Worker stat := &example.Stat{} 1332*890232f2SAndroid Build Coastguard Worker flatbuffers.GetRootAs(statBytes, 0, stat) 1333*890232f2SAndroid Build Coastguard Worker 1334*890232f2SAndroid Build Coastguard Worker if bytes.Compare(statBytes, stat.Table().Bytes) != 0 { 1335*890232f2SAndroid Build Coastguard Worker fail("invalid stat table") 1336*890232f2SAndroid Build Coastguard Worker } 1337*890232f2SAndroid Build Coastguard Worker} 1338*890232f2SAndroid Build Coastguard Worker 1339*890232f2SAndroid Build Coastguard Worker// CheckVtableDeduplication verifies that vtables are deduplicated. 1340*890232f2SAndroid Build Coastguard Workerfunc CheckVtableDeduplication(fail func(string, ...interface{})) { 1341*890232f2SAndroid Build Coastguard Worker b := flatbuffers.NewBuilder(0) 1342*890232f2SAndroid Build Coastguard Worker 1343*890232f2SAndroid Build Coastguard Worker b.StartObject(4) 1344*890232f2SAndroid Build Coastguard Worker b.PrependByteSlot(0, 0, 0) 1345*890232f2SAndroid Build Coastguard Worker b.PrependByteSlot(1, 11, 0) 1346*890232f2SAndroid Build Coastguard Worker b.PrependByteSlot(2, 22, 0) 1347*890232f2SAndroid Build Coastguard Worker b.PrependInt16Slot(3, 33, 0) 1348*890232f2SAndroid Build Coastguard Worker obj0 := b.EndObject() 1349*890232f2SAndroid Build Coastguard Worker 1350*890232f2SAndroid Build Coastguard Worker b.StartObject(4) 1351*890232f2SAndroid Build Coastguard Worker b.PrependByteSlot(0, 0, 0) 1352*890232f2SAndroid Build Coastguard Worker b.PrependByteSlot(1, 44, 0) 1353*890232f2SAndroid Build Coastguard Worker b.PrependByteSlot(2, 55, 0) 1354*890232f2SAndroid Build Coastguard Worker b.PrependInt16Slot(3, 66, 0) 1355*890232f2SAndroid Build Coastguard Worker obj1 := b.EndObject() 1356*890232f2SAndroid Build Coastguard Worker 1357*890232f2SAndroid Build Coastguard Worker b.StartObject(4) 1358*890232f2SAndroid Build Coastguard Worker b.PrependByteSlot(0, 0, 0) 1359*890232f2SAndroid Build Coastguard Worker b.PrependByteSlot(1, 77, 0) 1360*890232f2SAndroid Build Coastguard Worker b.PrependByteSlot(2, 88, 0) 1361*890232f2SAndroid Build Coastguard Worker b.PrependInt16Slot(3, 99, 0) 1362*890232f2SAndroid Build Coastguard Worker obj2 := b.EndObject() 1363*890232f2SAndroid Build Coastguard Worker 1364*890232f2SAndroid Build Coastguard Worker got := b.Bytes[b.Head():] 1365*890232f2SAndroid Build Coastguard Worker 1366*890232f2SAndroid Build Coastguard Worker want := []byte{ 1367*890232f2SAndroid Build Coastguard Worker 240, 255, 255, 255, // == -12. offset to dedupped vtable. 1368*890232f2SAndroid Build Coastguard Worker 99, 0, 1369*890232f2SAndroid Build Coastguard Worker 88, 1370*890232f2SAndroid Build Coastguard Worker 77, 1371*890232f2SAndroid Build Coastguard Worker 248, 255, 255, 255, // == -8. offset to dedupped vtable. 1372*890232f2SAndroid Build Coastguard Worker 66, 0, 1373*890232f2SAndroid Build Coastguard Worker 55, 1374*890232f2SAndroid Build Coastguard Worker 44, 1375*890232f2SAndroid Build Coastguard Worker 12, 0, 1376*890232f2SAndroid Build Coastguard Worker 8, 0, 1377*890232f2SAndroid Build Coastguard Worker 0, 0, 1378*890232f2SAndroid Build Coastguard Worker 7, 0, 1379*890232f2SAndroid Build Coastguard Worker 6, 0, 1380*890232f2SAndroid Build Coastguard Worker 4, 0, 1381*890232f2SAndroid Build Coastguard Worker 12, 0, 0, 0, 1382*890232f2SAndroid Build Coastguard Worker 33, 0, 1383*890232f2SAndroid Build Coastguard Worker 22, 1384*890232f2SAndroid Build Coastguard Worker 11, 1385*890232f2SAndroid Build Coastguard Worker } 1386*890232f2SAndroid Build Coastguard Worker 1387*890232f2SAndroid Build Coastguard Worker if !bytes.Equal(want, got) { 1388*890232f2SAndroid Build Coastguard Worker fail("testVtableDeduplication want:\n%d %v\nbut got:\n%d %v\n", 1389*890232f2SAndroid Build Coastguard Worker len(want), want, len(got), got) 1390*890232f2SAndroid Build Coastguard Worker } 1391*890232f2SAndroid Build Coastguard Worker 1392*890232f2SAndroid Build Coastguard Worker table0 := &flatbuffers.Table{Bytes: b.Bytes, Pos: flatbuffers.UOffsetT(len(b.Bytes)) - obj0} 1393*890232f2SAndroid Build Coastguard Worker table1 := &flatbuffers.Table{Bytes: b.Bytes, Pos: flatbuffers.UOffsetT(len(b.Bytes)) - obj1} 1394*890232f2SAndroid Build Coastguard Worker table2 := &flatbuffers.Table{Bytes: b.Bytes, Pos: flatbuffers.UOffsetT(len(b.Bytes)) - obj2} 1395*890232f2SAndroid Build Coastguard Worker 1396*890232f2SAndroid Build Coastguard Worker testTable := func(tab *flatbuffers.Table, a flatbuffers.VOffsetT, b, c, d byte) { 1397*890232f2SAndroid Build Coastguard Worker // vtable size 1398*890232f2SAndroid Build Coastguard Worker if got := tab.GetVOffsetTSlot(0, 0); 12 != got { 1399*890232f2SAndroid Build Coastguard Worker fail("failed 0, 0: %d", got) 1400*890232f2SAndroid Build Coastguard Worker } 1401*890232f2SAndroid Build Coastguard Worker // object size 1402*890232f2SAndroid Build Coastguard Worker if got := tab.GetVOffsetTSlot(2, 0); 8 != got { 1403*890232f2SAndroid Build Coastguard Worker fail("failed 2, 0: %d", got) 1404*890232f2SAndroid Build Coastguard Worker } 1405*890232f2SAndroid Build Coastguard Worker // default value 1406*890232f2SAndroid Build Coastguard Worker if got := tab.GetVOffsetTSlot(4, 0); a != got { 1407*890232f2SAndroid Build Coastguard Worker fail("failed 4, 0: %d", got) 1408*890232f2SAndroid Build Coastguard Worker } 1409*890232f2SAndroid Build Coastguard Worker if got := tab.GetByteSlot(6, 0); b != got { 1410*890232f2SAndroid Build Coastguard Worker fail("failed 6, 0: %d", got) 1411*890232f2SAndroid Build Coastguard Worker } 1412*890232f2SAndroid Build Coastguard Worker if val := tab.GetByteSlot(8, 0); c != val { 1413*890232f2SAndroid Build Coastguard Worker fail("failed 8, 0: %d", got) 1414*890232f2SAndroid Build Coastguard Worker } 1415*890232f2SAndroid Build Coastguard Worker if got := tab.GetByteSlot(10, 0); d != got { 1416*890232f2SAndroid Build Coastguard Worker fail("failed 10, 0: %d", got) 1417*890232f2SAndroid Build Coastguard Worker } 1418*890232f2SAndroid Build Coastguard Worker } 1419*890232f2SAndroid Build Coastguard Worker 1420*890232f2SAndroid Build Coastguard Worker testTable(table0, 0, 11, 22, 33) 1421*890232f2SAndroid Build Coastguard Worker testTable(table1, 0, 44, 55, 66) 1422*890232f2SAndroid Build Coastguard Worker testTable(table2, 0, 77, 88, 99) 1423*890232f2SAndroid Build Coastguard Worker} 1424*890232f2SAndroid Build Coastguard Worker 1425*890232f2SAndroid Build Coastguard Worker// CheckNotInObjectError verifies that `EndObject` fails if not inside an 1426*890232f2SAndroid Build Coastguard Worker// object. 1427*890232f2SAndroid Build Coastguard Workerfunc CheckNotInObjectError(fail func(string, ...interface{})) { 1428*890232f2SAndroid Build Coastguard Worker b := flatbuffers.NewBuilder(0) 1429*890232f2SAndroid Build Coastguard Worker 1430*890232f2SAndroid Build Coastguard Worker defer func() { 1431*890232f2SAndroid Build Coastguard Worker r := recover() 1432*890232f2SAndroid Build Coastguard Worker if r == nil { 1433*890232f2SAndroid Build Coastguard Worker fail("expected panic in CheckNotInObjectError") 1434*890232f2SAndroid Build Coastguard Worker } 1435*890232f2SAndroid Build Coastguard Worker }() 1436*890232f2SAndroid Build Coastguard Worker b.EndObject() 1437*890232f2SAndroid Build Coastguard Worker} 1438*890232f2SAndroid Build Coastguard Worker 1439*890232f2SAndroid Build Coastguard Worker// CheckStringIsNestedError verifies that a string can not be created inside 1440*890232f2SAndroid Build Coastguard Worker// another object. 1441*890232f2SAndroid Build Coastguard Workerfunc CheckStringIsNestedError(fail func(string, ...interface{})) { 1442*890232f2SAndroid Build Coastguard Worker b := flatbuffers.NewBuilder(0) 1443*890232f2SAndroid Build Coastguard Worker b.StartObject(0) 1444*890232f2SAndroid Build Coastguard Worker defer func() { 1445*890232f2SAndroid Build Coastguard Worker r := recover() 1446*890232f2SAndroid Build Coastguard Worker if r == nil { 1447*890232f2SAndroid Build Coastguard Worker fail("expected panic in CheckStringIsNestedError") 1448*890232f2SAndroid Build Coastguard Worker } 1449*890232f2SAndroid Build Coastguard Worker }() 1450*890232f2SAndroid Build Coastguard Worker b.CreateString("foo") 1451*890232f2SAndroid Build Coastguard Worker} 1452*890232f2SAndroid Build Coastguard Worker 1453*890232f2SAndroid Build Coastguard Workerfunc CheckEmptiedBuilder(fail func(string, ...interface{})) { 1454*890232f2SAndroid Build Coastguard Worker f := func(a, b string) bool { 1455*890232f2SAndroid Build Coastguard Worker if a == b { 1456*890232f2SAndroid Build Coastguard Worker return true 1457*890232f2SAndroid Build Coastguard Worker } 1458*890232f2SAndroid Build Coastguard Worker 1459*890232f2SAndroid Build Coastguard Worker builder := flatbuffers.NewBuilder(0) 1460*890232f2SAndroid Build Coastguard Worker 1461*890232f2SAndroid Build Coastguard Worker a1 := builder.CreateSharedString(a) 1462*890232f2SAndroid Build Coastguard Worker b1 := builder.CreateSharedString(b) 1463*890232f2SAndroid Build Coastguard Worker builder.Reset() 1464*890232f2SAndroid Build Coastguard Worker b2 := builder.CreateSharedString(b) 1465*890232f2SAndroid Build Coastguard Worker a2 := builder.CreateSharedString(a) 1466*890232f2SAndroid Build Coastguard Worker 1467*890232f2SAndroid Build Coastguard Worker return !(a1 == a2 || b1 == b2) 1468*890232f2SAndroid Build Coastguard Worker } 1469*890232f2SAndroid Build Coastguard Worker if err := quick.Check(f, nil); err != nil { 1470*890232f2SAndroid Build Coastguard Worker fail("expected different offset") 1471*890232f2SAndroid Build Coastguard Worker } 1472*890232f2SAndroid Build Coastguard Worker} 1473*890232f2SAndroid Build Coastguard Worker 1474*890232f2SAndroid Build Coastguard Workerfunc CheckSharedStrings(fail func(string, ...interface{})) { 1475*890232f2SAndroid Build Coastguard Worker f := func(strings []string) bool { 1476*890232f2SAndroid Build Coastguard Worker b := flatbuffers.NewBuilder(0) 1477*890232f2SAndroid Build Coastguard Worker for _, s1 := range strings { 1478*890232f2SAndroid Build Coastguard Worker for _, s2 := range strings { 1479*890232f2SAndroid Build Coastguard Worker off1 := b.CreateSharedString(s1) 1480*890232f2SAndroid Build Coastguard Worker off2 := b.CreateSharedString(s2) 1481*890232f2SAndroid Build Coastguard Worker 1482*890232f2SAndroid Build Coastguard Worker if (s1 == s2) && (off1 != off2) { 1483*890232f2SAndroid Build Coastguard Worker return false 1484*890232f2SAndroid Build Coastguard Worker } 1485*890232f2SAndroid Build Coastguard Worker if (s1 != s2) && (off1 == off2) { 1486*890232f2SAndroid Build Coastguard Worker return false 1487*890232f2SAndroid Build Coastguard Worker } 1488*890232f2SAndroid Build Coastguard Worker } 1489*890232f2SAndroid Build Coastguard Worker } 1490*890232f2SAndroid Build Coastguard Worker return true 1491*890232f2SAndroid Build Coastguard Worker } 1492*890232f2SAndroid Build Coastguard Worker if err := quick.Check(f, nil); err != nil { 1493*890232f2SAndroid Build Coastguard Worker fail("expected same offset") 1494*890232f2SAndroid Build Coastguard Worker } 1495*890232f2SAndroid Build Coastguard Worker} 1496*890232f2SAndroid Build Coastguard Worker 1497*890232f2SAndroid Build Coastguard Worker// CheckByteStringIsNestedError verifies that a bytestring can not be created 1498*890232f2SAndroid Build Coastguard Worker// inside another object. 1499*890232f2SAndroid Build Coastguard Workerfunc CheckByteStringIsNestedError(fail func(string, ...interface{})) { 1500*890232f2SAndroid Build Coastguard Worker b := flatbuffers.NewBuilder(0) 1501*890232f2SAndroid Build Coastguard Worker b.StartObject(0) 1502*890232f2SAndroid Build Coastguard Worker defer func() { 1503*890232f2SAndroid Build Coastguard Worker r := recover() 1504*890232f2SAndroid Build Coastguard Worker if r == nil { 1505*890232f2SAndroid Build Coastguard Worker fail("expected panic in CheckByteStringIsNestedError") 1506*890232f2SAndroid Build Coastguard Worker } 1507*890232f2SAndroid Build Coastguard Worker }() 1508*890232f2SAndroid Build Coastguard Worker b.CreateByteString([]byte("foo")) 1509*890232f2SAndroid Build Coastguard Worker} 1510*890232f2SAndroid Build Coastguard Worker 1511*890232f2SAndroid Build Coastguard Worker// CheckStructIsNotInlineError verifies that writing a struct in a location 1512*890232f2SAndroid Build Coastguard Worker// away from where it is used will cause a panic. 1513*890232f2SAndroid Build Coastguard Workerfunc CheckStructIsNotInlineError(fail func(string, ...interface{})) { 1514*890232f2SAndroid Build Coastguard Worker b := flatbuffers.NewBuilder(0) 1515*890232f2SAndroid Build Coastguard Worker b.StartObject(0) 1516*890232f2SAndroid Build Coastguard Worker defer func() { 1517*890232f2SAndroid Build Coastguard Worker r := recover() 1518*890232f2SAndroid Build Coastguard Worker if r == nil { 1519*890232f2SAndroid Build Coastguard Worker fail("expected panic in CheckStructIsNotInlineError") 1520*890232f2SAndroid Build Coastguard Worker } 1521*890232f2SAndroid Build Coastguard Worker }() 1522*890232f2SAndroid Build Coastguard Worker b.PrependStructSlot(0, 1, 0) 1523*890232f2SAndroid Build Coastguard Worker} 1524*890232f2SAndroid Build Coastguard Worker 1525*890232f2SAndroid Build Coastguard Worker// CheckFinishedBytesError verifies that `FinishedBytes` panics if the table 1526*890232f2SAndroid Build Coastguard Worker// is not finished. 1527*890232f2SAndroid Build Coastguard Workerfunc CheckFinishedBytesError(fail func(string, ...interface{})) { 1528*890232f2SAndroid Build Coastguard Worker b := flatbuffers.NewBuilder(0) 1529*890232f2SAndroid Build Coastguard Worker 1530*890232f2SAndroid Build Coastguard Worker defer func() { 1531*890232f2SAndroid Build Coastguard Worker r := recover() 1532*890232f2SAndroid Build Coastguard Worker if r == nil { 1533*890232f2SAndroid Build Coastguard Worker fail("expected panic in CheckFinishedBytesError") 1534*890232f2SAndroid Build Coastguard Worker } 1535*890232f2SAndroid Build Coastguard Worker }() 1536*890232f2SAndroid Build Coastguard Worker b.FinishedBytes() 1537*890232f2SAndroid Build Coastguard Worker} 1538*890232f2SAndroid Build Coastguard Worker 1539*890232f2SAndroid Build Coastguard Worker// CheckEnumNames checks that the generated enum names are correct. 1540*890232f2SAndroid Build Coastguard Workerfunc CheckEnumNames(fail func(string, ...interface{})) { 1541*890232f2SAndroid Build Coastguard Worker { 1542*890232f2SAndroid Build Coastguard Worker want := map[example.Any]string{ 1543*890232f2SAndroid Build Coastguard Worker example.AnyNONE: "NONE", 1544*890232f2SAndroid Build Coastguard Worker example.AnyMonster: "Monster", 1545*890232f2SAndroid Build Coastguard Worker example.AnyTestSimpleTableWithEnum: "TestSimpleTableWithEnum", 1546*890232f2SAndroid Build Coastguard Worker example.AnyMyGame_Example2_Monster: "MyGame_Example2_Monster", 1547*890232f2SAndroid Build Coastguard Worker } 1548*890232f2SAndroid Build Coastguard Worker got := example.EnumNamesAny 1549*890232f2SAndroid Build Coastguard Worker if !reflect.DeepEqual(got, want) { 1550*890232f2SAndroid Build Coastguard Worker fail("enum name is not equal") 1551*890232f2SAndroid Build Coastguard Worker } 1552*890232f2SAndroid Build Coastguard Worker } 1553*890232f2SAndroid Build Coastguard Worker { 1554*890232f2SAndroid Build Coastguard Worker want := map[example.Color]string{ 1555*890232f2SAndroid Build Coastguard Worker example.ColorRed: "Red", 1556*890232f2SAndroid Build Coastguard Worker example.ColorGreen: "Green", 1557*890232f2SAndroid Build Coastguard Worker example.ColorBlue: "Blue", 1558*890232f2SAndroid Build Coastguard Worker } 1559*890232f2SAndroid Build Coastguard Worker got := example.EnumNamesColor 1560*890232f2SAndroid Build Coastguard Worker if !reflect.DeepEqual(got, want) { 1561*890232f2SAndroid Build Coastguard Worker fail("enum name is not equal") 1562*890232f2SAndroid Build Coastguard Worker } 1563*890232f2SAndroid Build Coastguard Worker } 1564*890232f2SAndroid Build Coastguard Worker} 1565*890232f2SAndroid Build Coastguard Worker 1566*890232f2SAndroid Build Coastguard Worker// CheckEnumString checks the String method on generated enum types. 1567*890232f2SAndroid Build Coastguard Workerfunc CheckEnumString(fail func(string, ...interface{})) { 1568*890232f2SAndroid Build Coastguard Worker if got := example.AnyMonster.String(); got != "Monster" { 1569*890232f2SAndroid Build Coastguard Worker fail("Monster.String: %q != %q", got, "Monster") 1570*890232f2SAndroid Build Coastguard Worker } 1571*890232f2SAndroid Build Coastguard Worker if got := fmt.Sprintf("color: %s", example.ColorGreen); got != "color: Green" { 1572*890232f2SAndroid Build Coastguard Worker fail("color.String: %q != %q", got, "color: Green") 1573*890232f2SAndroid Build Coastguard Worker } 1574*890232f2SAndroid Build Coastguard Worker} 1575*890232f2SAndroid Build Coastguard Worker 1576*890232f2SAndroid Build Coastguard Worker// CheckEnumValues checks that the generated enum values maps are correct. 1577*890232f2SAndroid Build Coastguard Workerfunc CheckEnumValues(fail func(string, ...interface{})) { 1578*890232f2SAndroid Build Coastguard Worker { 1579*890232f2SAndroid Build Coastguard Worker want := map[string]example.Any{ 1580*890232f2SAndroid Build Coastguard Worker "NONE": example.AnyNONE, 1581*890232f2SAndroid Build Coastguard Worker "Monster": example.AnyMonster, 1582*890232f2SAndroid Build Coastguard Worker "TestSimpleTableWithEnum": example.AnyTestSimpleTableWithEnum, 1583*890232f2SAndroid Build Coastguard Worker "MyGame_Example2_Monster": example.AnyMyGame_Example2_Monster, 1584*890232f2SAndroid Build Coastguard Worker } 1585*890232f2SAndroid Build Coastguard Worker got := example.EnumValuesAny 1586*890232f2SAndroid Build Coastguard Worker if !reflect.DeepEqual(got, want) { 1587*890232f2SAndroid Build Coastguard Worker fail("enum name is not equal") 1588*890232f2SAndroid Build Coastguard Worker } 1589*890232f2SAndroid Build Coastguard Worker } 1590*890232f2SAndroid Build Coastguard Worker { 1591*890232f2SAndroid Build Coastguard Worker want := map[string]example.Color{ 1592*890232f2SAndroid Build Coastguard Worker "Red": example.ColorRed, 1593*890232f2SAndroid Build Coastguard Worker "Green": example.ColorGreen, 1594*890232f2SAndroid Build Coastguard Worker "Blue": example.ColorBlue, 1595*890232f2SAndroid Build Coastguard Worker } 1596*890232f2SAndroid Build Coastguard Worker got := example.EnumValuesColor 1597*890232f2SAndroid Build Coastguard Worker if !reflect.DeepEqual(got, want) { 1598*890232f2SAndroid Build Coastguard Worker fail("enum name is not equal") 1599*890232f2SAndroid Build Coastguard Worker } 1600*890232f2SAndroid Build Coastguard Worker } 1601*890232f2SAndroid Build Coastguard Worker} 1602*890232f2SAndroid Build Coastguard Worker 1603*890232f2SAndroid Build Coastguard Worker// CheckDocExample checks that the code given in FlatBuffers documentation 1604*890232f2SAndroid Build Coastguard Worker// is syntactically correct. 1605*890232f2SAndroid Build Coastguard Workerfunc CheckDocExample(buf []byte, off flatbuffers.UOffsetT, fail func(string, ...interface{})) { 1606*890232f2SAndroid Build Coastguard Worker monster := example.GetRootAsMonster(buf, off) 1607*890232f2SAndroid Build Coastguard Worker _ = monster.Hp() 1608*890232f2SAndroid Build Coastguard Worker _ = monster.Pos(nil) 1609*890232f2SAndroid Build Coastguard Worker for i := 0; i < monster.InventoryLength(); i++ { 1610*890232f2SAndroid Build Coastguard Worker _ = monster.Inventory(i) // do something here 1611*890232f2SAndroid Build Coastguard Worker } 1612*890232f2SAndroid Build Coastguard Worker 1613*890232f2SAndroid Build Coastguard Worker builder := flatbuffers.NewBuilder(0) 1614*890232f2SAndroid Build Coastguard Worker 1615*890232f2SAndroid Build Coastguard Worker example.MonsterStartInventoryVector(builder, 5) 1616*890232f2SAndroid Build Coastguard Worker for i := 4; i >= 0; i-- { 1617*890232f2SAndroid Build Coastguard Worker builder.PrependByte(byte(i)) 1618*890232f2SAndroid Build Coastguard Worker } 1619*890232f2SAndroid Build Coastguard Worker inv := builder.EndVector(5) 1620*890232f2SAndroid Build Coastguard Worker 1621*890232f2SAndroid Build Coastguard Worker str := builder.CreateString("MyMonster") 1622*890232f2SAndroid Build Coastguard Worker example.MonsterStart(builder) 1623*890232f2SAndroid Build Coastguard Worker example.MonsterAddPos(builder, example.CreateVec3(builder, 1.0, 2.0, 3.0, 3.0, example.Color(4), 5, 6)) 1624*890232f2SAndroid Build Coastguard Worker example.MonsterAddHp(builder, 80) 1625*890232f2SAndroid Build Coastguard Worker example.MonsterAddName(builder, str) 1626*890232f2SAndroid Build Coastguard Worker example.MonsterAddInventory(builder, inv) 1627*890232f2SAndroid Build Coastguard Worker example.MonsterAddTestType(builder, 1) 1628*890232f2SAndroid Build Coastguard Worker example.MonsterAddColor(builder, example.ColorRed) 1629*890232f2SAndroid Build Coastguard Worker // example.MonsterAddTest(builder, mon2) 1630*890232f2SAndroid Build Coastguard Worker // example.MonsterAddTest4(builder, test4s) 1631*890232f2SAndroid Build Coastguard Worker _ = example.MonsterEnd(builder) 1632*890232f2SAndroid Build Coastguard Worker} 1633*890232f2SAndroid Build Coastguard Worker 1634*890232f2SAndroid Build Coastguard Workerfunc CheckCreateByteVector(fail func(string, ...interface{})) { 1635*890232f2SAndroid Build Coastguard Worker raw := [30]byte{} 1636*890232f2SAndroid Build Coastguard Worker for i := 0; i < len(raw); i++ { 1637*890232f2SAndroid Build Coastguard Worker raw[i] = byte(i) 1638*890232f2SAndroid Build Coastguard Worker } 1639*890232f2SAndroid Build Coastguard Worker 1640*890232f2SAndroid Build Coastguard Worker for size := 0; size < len(raw); size++ { 1641*890232f2SAndroid Build Coastguard Worker b1 := flatbuffers.NewBuilder(0) 1642*890232f2SAndroid Build Coastguard Worker b2 := flatbuffers.NewBuilder(0) 1643*890232f2SAndroid Build Coastguard Worker b1.StartVector(1, size, 1) 1644*890232f2SAndroid Build Coastguard Worker for i := size - 1; i >= 0; i-- { 1645*890232f2SAndroid Build Coastguard Worker b1.PrependByte(raw[i]) 1646*890232f2SAndroid Build Coastguard Worker } 1647*890232f2SAndroid Build Coastguard Worker b1.EndVector(size) 1648*890232f2SAndroid Build Coastguard Worker b2.CreateByteVector(raw[:size]) 1649*890232f2SAndroid Build Coastguard Worker CheckByteEquality(b1.Bytes, b2.Bytes, fail) 1650*890232f2SAndroid Build Coastguard Worker } 1651*890232f2SAndroid Build Coastguard Worker} 1652*890232f2SAndroid Build Coastguard Worker 1653*890232f2SAndroid Build Coastguard Workerfunc CheckParentNamespace(fail func(string, ...interface{})) { 1654*890232f2SAndroid Build Coastguard Worker var empty, nonempty []byte 1655*890232f2SAndroid Build Coastguard Worker 1656*890232f2SAndroid Build Coastguard Worker // create monster with an empty parent namespace field 1657*890232f2SAndroid Build Coastguard Worker { 1658*890232f2SAndroid Build Coastguard Worker builder := flatbuffers.NewBuilder(0) 1659*890232f2SAndroid Build Coastguard Worker 1660*890232f2SAndroid Build Coastguard Worker example.MonsterStart(builder) 1661*890232f2SAndroid Build Coastguard Worker m := example.MonsterEnd(builder) 1662*890232f2SAndroid Build Coastguard Worker builder.Finish(m) 1663*890232f2SAndroid Build Coastguard Worker 1664*890232f2SAndroid Build Coastguard Worker empty = make([]byte, len(builder.FinishedBytes())) 1665*890232f2SAndroid Build Coastguard Worker copy(empty, builder.FinishedBytes()) 1666*890232f2SAndroid Build Coastguard Worker } 1667*890232f2SAndroid Build Coastguard Worker 1668*890232f2SAndroid Build Coastguard Worker // create monster with a non-empty parent namespace field 1669*890232f2SAndroid Build Coastguard Worker { 1670*890232f2SAndroid Build Coastguard Worker builder := flatbuffers.NewBuilder(0) 1671*890232f2SAndroid Build Coastguard Worker mygame.InParentNamespaceStart(builder) 1672*890232f2SAndroid Build Coastguard Worker pn := mygame.InParentNamespaceEnd(builder) 1673*890232f2SAndroid Build Coastguard Worker 1674*890232f2SAndroid Build Coastguard Worker example.MonsterStart(builder) 1675*890232f2SAndroid Build Coastguard Worker example.MonsterAddParentNamespaceTest(builder, pn) 1676*890232f2SAndroid Build Coastguard Worker m := example.MonsterEnd(builder) 1677*890232f2SAndroid Build Coastguard Worker 1678*890232f2SAndroid Build Coastguard Worker builder.Finish(m) 1679*890232f2SAndroid Build Coastguard Worker 1680*890232f2SAndroid Build Coastguard Worker nonempty = make([]byte, len(builder.FinishedBytes())) 1681*890232f2SAndroid Build Coastguard Worker copy(nonempty, builder.FinishedBytes()) 1682*890232f2SAndroid Build Coastguard Worker } 1683*890232f2SAndroid Build Coastguard Worker 1684*890232f2SAndroid Build Coastguard Worker // read monster with empty parent namespace field 1685*890232f2SAndroid Build Coastguard Worker { 1686*890232f2SAndroid Build Coastguard Worker m := example.GetRootAsMonster(empty, 0) 1687*890232f2SAndroid Build Coastguard Worker if m.ParentNamespaceTest(nil) != nil { 1688*890232f2SAndroid Build Coastguard Worker fail("expected nil ParentNamespaceTest for empty field") 1689*890232f2SAndroid Build Coastguard Worker } 1690*890232f2SAndroid Build Coastguard Worker } 1691*890232f2SAndroid Build Coastguard Worker 1692*890232f2SAndroid Build Coastguard Worker // read monster with non-empty parent namespace field 1693*890232f2SAndroid Build Coastguard Worker { 1694*890232f2SAndroid Build Coastguard Worker m := example.GetRootAsMonster(nonempty, 0) 1695*890232f2SAndroid Build Coastguard Worker if m.ParentNamespaceTest(nil) == nil { 1696*890232f2SAndroid Build Coastguard Worker fail("expected non-nil ParentNamespaceTest for non-empty field") 1697*890232f2SAndroid Build Coastguard Worker } 1698*890232f2SAndroid Build Coastguard Worker } 1699*890232f2SAndroid Build Coastguard Worker} 1700*890232f2SAndroid Build Coastguard Worker 1701*890232f2SAndroid Build Coastguard Workerfunc CheckSizePrefixedBuffer(fail func(string, ...interface{})) { 1702*890232f2SAndroid Build Coastguard Worker // Generate a size-prefixed flatbuffer 1703*890232f2SAndroid Build Coastguard Worker generated, off := CheckGeneratedBuild(true, fail) 1704*890232f2SAndroid Build Coastguard Worker 1705*890232f2SAndroid Build Coastguard Worker // Check that the size prefix is the size of monsterdata_go_wire.mon minus 4 1706*890232f2SAndroid Build Coastguard Worker size := flatbuffers.GetSizePrefix(generated, off) 1707*890232f2SAndroid Build Coastguard Worker if size != 220 { 1708*890232f2SAndroid Build Coastguard Worker fail("mismatch between size prefix and expected size") 1709*890232f2SAndroid Build Coastguard Worker } 1710*890232f2SAndroid Build Coastguard Worker 1711*890232f2SAndroid Build Coastguard Worker // Check that the buffer can be used as expected 1712*890232f2SAndroid Build Coastguard Worker CheckReadBuffer(generated, off, true, fail) 1713*890232f2SAndroid Build Coastguard Worker CheckMutateBuffer(generated, off, true, fail) 1714*890232f2SAndroid Build Coastguard Worker CheckObjectAPI(generated, off, true, fail) 1715*890232f2SAndroid Build Coastguard Worker 1716*890232f2SAndroid Build Coastguard Worker // Write generated bfufer out to a file 1717*890232f2SAndroid Build Coastguard Worker if err := os.WriteFile(outData+".sp", generated[off:], os.FileMode(0644)); err != nil { 1718*890232f2SAndroid Build Coastguard Worker fail("failed to write file: %s", err) 1719*890232f2SAndroid Build Coastguard Worker } 1720*890232f2SAndroid Build Coastguard Worker} 1721*890232f2SAndroid Build Coastguard Worker 1722*890232f2SAndroid Build Coastguard Worker// Include simple random number generator to ensure results will be the 1723*890232f2SAndroid Build Coastguard Worker// same cross platform. 1724*890232f2SAndroid Build Coastguard Worker// http://en.wikipedia.org/wiki/Park%E2%80%93Miller_random_number_generator 1725*890232f2SAndroid Build Coastguard Workertype LCG uint32 1726*890232f2SAndroid Build Coastguard Worker 1727*890232f2SAndroid Build Coastguard Workerconst InitialLCGSeed = 48271 1728*890232f2SAndroid Build Coastguard Worker 1729*890232f2SAndroid Build Coastguard Workerfunc NewLCG() *LCG { 1730*890232f2SAndroid Build Coastguard Worker n := uint32(InitialLCGSeed) 1731*890232f2SAndroid Build Coastguard Worker l := LCG(n) 1732*890232f2SAndroid Build Coastguard Worker return &l 1733*890232f2SAndroid Build Coastguard Worker} 1734*890232f2SAndroid Build Coastguard Worker 1735*890232f2SAndroid Build Coastguard Workerfunc (lcg *LCG) Reset() { 1736*890232f2SAndroid Build Coastguard Worker *lcg = InitialLCGSeed 1737*890232f2SAndroid Build Coastguard Worker} 1738*890232f2SAndroid Build Coastguard Worker 1739*890232f2SAndroid Build Coastguard Workerfunc (lcg *LCG) Next() uint32 { 1740*890232f2SAndroid Build Coastguard Worker n := uint32((uint64(*lcg) * uint64(279470273)) % uint64(4294967291)) 1741*890232f2SAndroid Build Coastguard Worker *lcg = LCG(n) 1742*890232f2SAndroid Build Coastguard Worker return n 1743*890232f2SAndroid Build Coastguard Worker} 1744*890232f2SAndroid Build Coastguard Worker 1745*890232f2SAndroid Build Coastguard Worker// CheckByteEquality verifies that two byte buffers are the same. 1746*890232f2SAndroid Build Coastguard Workerfunc CheckByteEquality(a, b []byte, fail func(string, ...interface{})) { 1747*890232f2SAndroid Build Coastguard Worker if !bytes.Equal(a, b) { 1748*890232f2SAndroid Build Coastguard Worker fail("objects are not byte-wise equal") 1749*890232f2SAndroid Build Coastguard Worker } 1750*890232f2SAndroid Build Coastguard Worker} 1751*890232f2SAndroid Build Coastguard Worker 1752*890232f2SAndroid Build Coastguard Worker// CheckMutateMethods checks all mutate methods one by one 1753*890232f2SAndroid Build Coastguard Workerfunc CheckMutateMethods(fail func(string, ...interface{})) { 1754*890232f2SAndroid Build Coastguard Worker b := flatbuffers.NewBuilder(0) 1755*890232f2SAndroid Build Coastguard Worker b.StartObject(15) 1756*890232f2SAndroid Build Coastguard Worker b.PrependBoolSlot(0, true, false) 1757*890232f2SAndroid Build Coastguard Worker b.PrependByteSlot(1, 1, 0) 1758*890232f2SAndroid Build Coastguard Worker b.PrependUint8Slot(2, 2, 0) 1759*890232f2SAndroid Build Coastguard Worker b.PrependUint16Slot(3, 3, 0) 1760*890232f2SAndroid Build Coastguard Worker b.PrependUint32Slot(4, 4, 0) 1761*890232f2SAndroid Build Coastguard Worker b.PrependUint64Slot(5, 5, 0) 1762*890232f2SAndroid Build Coastguard Worker b.PrependInt8Slot(6, 6, 0) 1763*890232f2SAndroid Build Coastguard Worker b.PrependInt16Slot(7, 7, 0) 1764*890232f2SAndroid Build Coastguard Worker b.PrependInt32Slot(8, 8, 0) 1765*890232f2SAndroid Build Coastguard Worker b.PrependInt64Slot(9, 9, 0) 1766*890232f2SAndroid Build Coastguard Worker b.PrependFloat32Slot(10, 10, 0) 1767*890232f2SAndroid Build Coastguard Worker b.PrependFloat64Slot(11, 11, 0) 1768*890232f2SAndroid Build Coastguard Worker 1769*890232f2SAndroid Build Coastguard Worker b.PrependUOffsetTSlot(12, 12, 0) 1770*890232f2SAndroid Build Coastguard Worker uoVal := b.Offset() - 12 1771*890232f2SAndroid Build Coastguard Worker 1772*890232f2SAndroid Build Coastguard Worker b.PrependVOffsetT(13) 1773*890232f2SAndroid Build Coastguard Worker b.Slot(13) 1774*890232f2SAndroid Build Coastguard Worker 1775*890232f2SAndroid Build Coastguard Worker b.PrependSOffsetT(14) 1776*890232f2SAndroid Build Coastguard Worker b.Slot(14) 1777*890232f2SAndroid Build Coastguard Worker soVal := flatbuffers.SOffsetT(b.Offset() - 14) 1778*890232f2SAndroid Build Coastguard Worker 1779*890232f2SAndroid Build Coastguard Worker offset := b.EndObject() 1780*890232f2SAndroid Build Coastguard Worker 1781*890232f2SAndroid Build Coastguard Worker t := &flatbuffers.Table{ 1782*890232f2SAndroid Build Coastguard Worker Bytes: b.Bytes, 1783*890232f2SAndroid Build Coastguard Worker Pos: flatbuffers.UOffsetT(len(b.Bytes)) - offset, 1784*890232f2SAndroid Build Coastguard Worker } 1785*890232f2SAndroid Build Coastguard Worker 1786*890232f2SAndroid Build Coastguard Worker calcVOffsetT := func(slot int) (vtableOffset flatbuffers.VOffsetT) { 1787*890232f2SAndroid Build Coastguard Worker return flatbuffers.VOffsetT((flatbuffers.VtableMetadataFields + slot) * flatbuffers.SizeVOffsetT) 1788*890232f2SAndroid Build Coastguard Worker } 1789*890232f2SAndroid Build Coastguard Worker calcUOffsetT := func(vtableOffset flatbuffers.VOffsetT) (valueOffset flatbuffers.UOffsetT) { 1790*890232f2SAndroid Build Coastguard Worker return t.Pos + flatbuffers.UOffsetT(t.Offset(vtableOffset)) 1791*890232f2SAndroid Build Coastguard Worker } 1792*890232f2SAndroid Build Coastguard Worker 1793*890232f2SAndroid Build Coastguard Worker type testcase struct { 1794*890232f2SAndroid Build Coastguard Worker field string 1795*890232f2SAndroid Build Coastguard Worker testfn func() bool 1796*890232f2SAndroid Build Coastguard Worker } 1797*890232f2SAndroid Build Coastguard Worker 1798*890232f2SAndroid Build Coastguard Worker testForOriginalValues := []testcase{ 1799*890232f2SAndroid Build Coastguard Worker testcase{"BoolSlot", func() bool { return t.GetBoolSlot(calcVOffsetT(0), true) == true }}, 1800*890232f2SAndroid Build Coastguard Worker testcase{"ByteSlot", func() bool { return t.GetByteSlot(calcVOffsetT(1), 1) == 1 }}, 1801*890232f2SAndroid Build Coastguard Worker testcase{"Uint8Slot", func() bool { return t.GetUint8Slot(calcVOffsetT(2), 2) == 2 }}, 1802*890232f2SAndroid Build Coastguard Worker testcase{"Uint16Slot", func() bool { return t.GetUint16Slot(calcVOffsetT(3), 3) == 3 }}, 1803*890232f2SAndroid Build Coastguard Worker testcase{"Uint32Slot", func() bool { return t.GetUint32Slot(calcVOffsetT(4), 4) == 4 }}, 1804*890232f2SAndroid Build Coastguard Worker testcase{"Uint64Slot", func() bool { return t.GetUint64Slot(calcVOffsetT(5), 5) == 5 }}, 1805*890232f2SAndroid Build Coastguard Worker testcase{"Int8Slot", func() bool { return t.GetInt8Slot(calcVOffsetT(6), 6) == 6 }}, 1806*890232f2SAndroid Build Coastguard Worker testcase{"Int16Slot", func() bool { return t.GetInt16Slot(calcVOffsetT(7), 7) == 7 }}, 1807*890232f2SAndroid Build Coastguard Worker testcase{"Int32Slot", func() bool { return t.GetInt32Slot(calcVOffsetT(8), 8) == 8 }}, 1808*890232f2SAndroid Build Coastguard Worker testcase{"Int64Slot", func() bool { return t.GetInt64Slot(calcVOffsetT(9), 9) == 9 }}, 1809*890232f2SAndroid Build Coastguard Worker testcase{"Float32Slot", func() bool { return t.GetFloat32Slot(calcVOffsetT(10), 10) == 10 }}, 1810*890232f2SAndroid Build Coastguard Worker testcase{"Float64Slot", func() bool { return t.GetFloat64Slot(calcVOffsetT(11), 11) == 11 }}, 1811*890232f2SAndroid Build Coastguard Worker testcase{"UOffsetTSlot", func() bool { return t.GetUOffsetT(calcUOffsetT(calcVOffsetT(12))) == uoVal }}, 1812*890232f2SAndroid Build Coastguard Worker testcase{"VOffsetTSlot", func() bool { return t.GetVOffsetT(calcUOffsetT(calcVOffsetT(13))) == 13 }}, 1813*890232f2SAndroid Build Coastguard Worker testcase{"SOffsetTSlot", func() bool { return t.GetSOffsetT(calcUOffsetT(calcVOffsetT(14))) == soVal }}, 1814*890232f2SAndroid Build Coastguard Worker } 1815*890232f2SAndroid Build Coastguard Worker 1816*890232f2SAndroid Build Coastguard Worker testMutability := []testcase{ 1817*890232f2SAndroid Build Coastguard Worker testcase{"BoolSlot", func() bool { return t.MutateBoolSlot(calcVOffsetT(0), false) }}, 1818*890232f2SAndroid Build Coastguard Worker testcase{"ByteSlot", func() bool { return t.MutateByteSlot(calcVOffsetT(1), 2) }}, 1819*890232f2SAndroid Build Coastguard Worker testcase{"Uint8Slot", func() bool { return t.MutateUint8Slot(calcVOffsetT(2), 4) }}, 1820*890232f2SAndroid Build Coastguard Worker testcase{"Uint16Slot", func() bool { return t.MutateUint16Slot(calcVOffsetT(3), 6) }}, 1821*890232f2SAndroid Build Coastguard Worker testcase{"Uint32Slot", func() bool { return t.MutateUint32Slot(calcVOffsetT(4), 8) }}, 1822*890232f2SAndroid Build Coastguard Worker testcase{"Uint64Slot", func() bool { return t.MutateUint64Slot(calcVOffsetT(5), 10) }}, 1823*890232f2SAndroid Build Coastguard Worker testcase{"Int8Slot", func() bool { return t.MutateInt8Slot(calcVOffsetT(6), 12) }}, 1824*890232f2SAndroid Build Coastguard Worker testcase{"Int16Slot", func() bool { return t.MutateInt16Slot(calcVOffsetT(7), 14) }}, 1825*890232f2SAndroid Build Coastguard Worker testcase{"Int32Slot", func() bool { return t.MutateInt32Slot(calcVOffsetT(8), 16) }}, 1826*890232f2SAndroid Build Coastguard Worker testcase{"Int64Slot", func() bool { return t.MutateInt64Slot(calcVOffsetT(9), 18) }}, 1827*890232f2SAndroid Build Coastguard Worker testcase{"Float32Slot", func() bool { return t.MutateFloat32Slot(calcVOffsetT(10), 20) }}, 1828*890232f2SAndroid Build Coastguard Worker testcase{"Float64Slot", func() bool { return t.MutateFloat64Slot(calcVOffsetT(11), 22) }}, 1829*890232f2SAndroid Build Coastguard Worker testcase{"UOffsetTSlot", func() bool { return t.MutateUOffsetT(calcUOffsetT(calcVOffsetT(12)), 24) }}, 1830*890232f2SAndroid Build Coastguard Worker testcase{"VOffsetTSlot", func() bool { return t.MutateVOffsetT(calcUOffsetT(calcVOffsetT(13)), 26) }}, 1831*890232f2SAndroid Build Coastguard Worker testcase{"SOffsetTSlot", func() bool { return t.MutateSOffsetT(calcUOffsetT(calcVOffsetT(14)), 28) }}, 1832*890232f2SAndroid Build Coastguard Worker } 1833*890232f2SAndroid Build Coastguard Worker 1834*890232f2SAndroid Build Coastguard Worker testMutabilityWithoutSlot := []testcase{ 1835*890232f2SAndroid Build Coastguard Worker testcase{"BoolSlot", func() bool { return t.MutateBoolSlot(calcVOffsetT(16), false) }}, 1836*890232f2SAndroid Build Coastguard Worker testcase{"ByteSlot", func() bool { return t.MutateByteSlot(calcVOffsetT(16), 2) }}, 1837*890232f2SAndroid Build Coastguard Worker testcase{"Uint8Slot", func() bool { return t.MutateUint8Slot(calcVOffsetT(16), 2) }}, 1838*890232f2SAndroid Build Coastguard Worker testcase{"Uint16Slot", func() bool { return t.MutateUint16Slot(calcVOffsetT(16), 2) }}, 1839*890232f2SAndroid Build Coastguard Worker testcase{"Uint32Slot", func() bool { return t.MutateUint32Slot(calcVOffsetT(16), 2) }}, 1840*890232f2SAndroid Build Coastguard Worker testcase{"Uint64Slot", func() bool { return t.MutateUint64Slot(calcVOffsetT(16), 2) }}, 1841*890232f2SAndroid Build Coastguard Worker testcase{"Int8Slot", func() bool { return t.MutateInt8Slot(calcVOffsetT(16), 2) }}, 1842*890232f2SAndroid Build Coastguard Worker testcase{"Int16Slot", func() bool { return t.MutateInt16Slot(calcVOffsetT(16), 2) }}, 1843*890232f2SAndroid Build Coastguard Worker testcase{"Int32Slot", func() bool { return t.MutateInt32Slot(calcVOffsetT(16), 2) }}, 1844*890232f2SAndroid Build Coastguard Worker testcase{"Int64Slot", func() bool { return t.MutateInt64Slot(calcVOffsetT(16), 2) }}, 1845*890232f2SAndroid Build Coastguard Worker testcase{"Float32Slot", func() bool { return t.MutateFloat32Slot(calcVOffsetT(16), 2) }}, 1846*890232f2SAndroid Build Coastguard Worker testcase{"Float64Slot", func() bool { return t.MutateFloat64Slot(calcVOffsetT(16), 2) }}, 1847*890232f2SAndroid Build Coastguard Worker } 1848*890232f2SAndroid Build Coastguard Worker 1849*890232f2SAndroid Build Coastguard Worker testForMutatedValues := []testcase{ 1850*890232f2SAndroid Build Coastguard Worker testcase{"BoolSlot", func() bool { return t.GetBoolSlot(calcVOffsetT(0), true) == false }}, 1851*890232f2SAndroid Build Coastguard Worker testcase{"ByteSlot", func() bool { return t.GetByteSlot(calcVOffsetT(1), 1) == 2 }}, 1852*890232f2SAndroid Build Coastguard Worker testcase{"Uint8Slot", func() bool { return t.GetUint8Slot(calcVOffsetT(2), 1) == 4 }}, 1853*890232f2SAndroid Build Coastguard Worker testcase{"Uint16Slot", func() bool { return t.GetUint16Slot(calcVOffsetT(3), 1) == 6 }}, 1854*890232f2SAndroid Build Coastguard Worker testcase{"Uint32Slot", func() bool { return t.GetUint32Slot(calcVOffsetT(4), 1) == 8 }}, 1855*890232f2SAndroid Build Coastguard Worker testcase{"Uint64Slot", func() bool { return t.GetUint64Slot(calcVOffsetT(5), 1) == 10 }}, 1856*890232f2SAndroid Build Coastguard Worker testcase{"Int8Slot", func() bool { return t.GetInt8Slot(calcVOffsetT(6), 1) == 12 }}, 1857*890232f2SAndroid Build Coastguard Worker testcase{"Int16Slot", func() bool { return t.GetInt16Slot(calcVOffsetT(7), 1) == 14 }}, 1858*890232f2SAndroid Build Coastguard Worker testcase{"Int32Slot", func() bool { return t.GetInt32Slot(calcVOffsetT(8), 1) == 16 }}, 1859*890232f2SAndroid Build Coastguard Worker testcase{"Int64Slot", func() bool { return t.GetInt64Slot(calcVOffsetT(9), 1) == 18 }}, 1860*890232f2SAndroid Build Coastguard Worker testcase{"Float32Slot", func() bool { return t.GetFloat32Slot(calcVOffsetT(10), 1) == 20 }}, 1861*890232f2SAndroid Build Coastguard Worker testcase{"Float64Slot", func() bool { return t.GetFloat64Slot(calcVOffsetT(11), 1) == 22 }}, 1862*890232f2SAndroid Build Coastguard Worker testcase{"UOffsetTSlot", func() bool { return t.GetUOffsetT(calcUOffsetT(calcVOffsetT(12))) == 24 }}, 1863*890232f2SAndroid Build Coastguard Worker testcase{"VOffsetTSlot", func() bool { return t.GetVOffsetT(calcUOffsetT(calcVOffsetT(13))) == 26 }}, 1864*890232f2SAndroid Build Coastguard Worker testcase{"SOffsetTSlot", func() bool { return t.GetSOffsetT(calcUOffsetT(calcVOffsetT(14))) == 28 }}, 1865*890232f2SAndroid Build Coastguard Worker } 1866*890232f2SAndroid Build Coastguard Worker 1867*890232f2SAndroid Build Coastguard Worker // make sure original values are okay 1868*890232f2SAndroid Build Coastguard Worker for _, t := range testForOriginalValues { 1869*890232f2SAndroid Build Coastguard Worker if !t.testfn() { 1870*890232f2SAndroid Build Coastguard Worker fail(t.field + "' field doesn't have the expected original value") 1871*890232f2SAndroid Build Coastguard Worker } 1872*890232f2SAndroid Build Coastguard Worker } 1873*890232f2SAndroid Build Coastguard Worker 1874*890232f2SAndroid Build Coastguard Worker // try to mutate fields and check mutability 1875*890232f2SAndroid Build Coastguard Worker for _, t := range testMutability { 1876*890232f2SAndroid Build Coastguard Worker if !t.testfn() { 1877*890232f2SAndroid Build Coastguard Worker fail(FailString(t.field+"' field failed mutability test", "passed", "failed")) 1878*890232f2SAndroid Build Coastguard Worker } 1879*890232f2SAndroid Build Coastguard Worker } 1880*890232f2SAndroid Build Coastguard Worker 1881*890232f2SAndroid Build Coastguard Worker // try to mutate fields and check mutability 1882*890232f2SAndroid Build Coastguard Worker // these have wrong slots so should fail 1883*890232f2SAndroid Build Coastguard Worker for _, t := range testMutabilityWithoutSlot { 1884*890232f2SAndroid Build Coastguard Worker if t.testfn() { 1885*890232f2SAndroid Build Coastguard Worker fail(FailString(t.field+"' field failed no slot mutability test", "failed", "passed")) 1886*890232f2SAndroid Build Coastguard Worker } 1887*890232f2SAndroid Build Coastguard Worker } 1888*890232f2SAndroid Build Coastguard Worker 1889*890232f2SAndroid Build Coastguard Worker // test whether values have changed 1890*890232f2SAndroid Build Coastguard Worker for _, t := range testForMutatedValues { 1891*890232f2SAndroid Build Coastguard Worker if !t.testfn() { 1892*890232f2SAndroid Build Coastguard Worker fail(t.field + "' field doesn't have the expected mutated value") 1893*890232f2SAndroid Build Coastguard Worker } 1894*890232f2SAndroid Build Coastguard Worker } 1895*890232f2SAndroid Build Coastguard Worker} 1896*890232f2SAndroid Build Coastguard Worker 1897*890232f2SAndroid Build Coastguard Worker// CheckOptionalScalars verifies against the ScalarStuff schema. 1898*890232f2SAndroid Build Coastguard Workerfunc CheckOptionalScalars(fail func(string, ...interface{})) { 1899*890232f2SAndroid Build Coastguard Worker type testCase struct { 1900*890232f2SAndroid Build Coastguard Worker what string 1901*890232f2SAndroid Build Coastguard Worker result, expect interface{} 1902*890232f2SAndroid Build Coastguard Worker } 1903*890232f2SAndroid Build Coastguard Worker 1904*890232f2SAndroid Build Coastguard Worker makeDefaultTestCases := func(s *optional_scalars.ScalarStuff) []testCase { 1905*890232f2SAndroid Build Coastguard Worker return []testCase{ 1906*890232f2SAndroid Build Coastguard Worker {"justI8", s.JustI8(), int8(0)}, 1907*890232f2SAndroid Build Coastguard Worker {"maybeI8", s.MaybeI8(), (*int8)(nil)}, 1908*890232f2SAndroid Build Coastguard Worker {"defaultI8", s.DefaultI8(), int8(42)}, 1909*890232f2SAndroid Build Coastguard Worker {"justU8", s.JustU8(), byte(0)}, 1910*890232f2SAndroid Build Coastguard Worker {"maybeU8", s.MaybeU8(), (*byte)(nil)}, 1911*890232f2SAndroid Build Coastguard Worker {"defaultU8", s.DefaultU8(), byte(42)}, 1912*890232f2SAndroid Build Coastguard Worker {"justI16", s.JustI16(), int16(0)}, 1913*890232f2SAndroid Build Coastguard Worker {"maybeI16", s.MaybeI16(), (*int16)(nil)}, 1914*890232f2SAndroid Build Coastguard Worker {"defaultI16", s.DefaultI16(), int16(42)}, 1915*890232f2SAndroid Build Coastguard Worker {"justU16", s.JustU16(), uint16(0)}, 1916*890232f2SAndroid Build Coastguard Worker {"maybeU16", s.MaybeU16(), (*uint16)(nil)}, 1917*890232f2SAndroid Build Coastguard Worker {"defaultU16", s.DefaultU16(), uint16(42)}, 1918*890232f2SAndroid Build Coastguard Worker {"justI32", s.JustI32(), int32(0)}, 1919*890232f2SAndroid Build Coastguard Worker {"maybeI32", s.MaybeI32(), (*int32)(nil)}, 1920*890232f2SAndroid Build Coastguard Worker {"defaultI32", s.DefaultI32(), int32(42)}, 1921*890232f2SAndroid Build Coastguard Worker {"justU32", s.JustU32(), uint32(0)}, 1922*890232f2SAndroid Build Coastguard Worker {"maybeU32", s.MaybeU32(), (*uint32)(nil)}, 1923*890232f2SAndroid Build Coastguard Worker {"defaultU32", s.DefaultU32(), uint32(42)}, 1924*890232f2SAndroid Build Coastguard Worker {"justI64", s.JustI64(), int64(0)}, 1925*890232f2SAndroid Build Coastguard Worker {"maybeI64", s.MaybeI64(), (*int64)(nil)}, 1926*890232f2SAndroid Build Coastguard Worker {"defaultI64", s.DefaultI64(), int64(42)}, 1927*890232f2SAndroid Build Coastguard Worker {"justU64", s.JustU64(), uint64(0)}, 1928*890232f2SAndroid Build Coastguard Worker {"maybeU64", s.MaybeU64(), (*uint64)(nil)}, 1929*890232f2SAndroid Build Coastguard Worker {"defaultU64", s.DefaultU64(), uint64(42)}, 1930*890232f2SAndroid Build Coastguard Worker {"justF32", s.JustF32(), float32(0)}, 1931*890232f2SAndroid Build Coastguard Worker {"maybeF32", s.MaybeF32(), (*float32)(nil)}, 1932*890232f2SAndroid Build Coastguard Worker {"defaultF32", s.DefaultF32(), float32(42)}, 1933*890232f2SAndroid Build Coastguard Worker {"justF64", s.JustF64(), float64(0)}, 1934*890232f2SAndroid Build Coastguard Worker {"maybeF64", s.MaybeF64(), (*float64)(nil)}, 1935*890232f2SAndroid Build Coastguard Worker {"defaultF64", s.DefaultF64(), float64(42)}, 1936*890232f2SAndroid Build Coastguard Worker {"justBool", s.JustBool(), false}, 1937*890232f2SAndroid Build Coastguard Worker {"maybeBool", s.MaybeBool(), (*bool)(nil)}, 1938*890232f2SAndroid Build Coastguard Worker {"defaultBool", s.DefaultBool(), true}, 1939*890232f2SAndroid Build Coastguard Worker {"justEnum", s.JustEnum(), optional_scalars.OptionalByte(0)}, 1940*890232f2SAndroid Build Coastguard Worker {"maybeEnum", s.MaybeEnum(), (*optional_scalars.OptionalByte)(nil)}, 1941*890232f2SAndroid Build Coastguard Worker {"defaultEnum", s.DefaultEnum(), optional_scalars.OptionalByteOne}, 1942*890232f2SAndroid Build Coastguard Worker } 1943*890232f2SAndroid Build Coastguard Worker } 1944*890232f2SAndroid Build Coastguard Worker 1945*890232f2SAndroid Build Coastguard Worker makeAssignedTestCases := func(s *optional_scalars.ScalarStuff) []testCase { 1946*890232f2SAndroid Build Coastguard Worker return []testCase{ 1947*890232f2SAndroid Build Coastguard Worker {"justI8", s.JustI8(), int8(5)}, 1948*890232f2SAndroid Build Coastguard Worker {"maybeI8", s.MaybeI8(), int8(5)}, 1949*890232f2SAndroid Build Coastguard Worker {"defaultI8", s.DefaultI8(), int8(5)}, 1950*890232f2SAndroid Build Coastguard Worker {"justU8", s.JustU8(), byte(6)}, 1951*890232f2SAndroid Build Coastguard Worker {"maybeU8", s.MaybeU8(), byte(6)}, 1952*890232f2SAndroid Build Coastguard Worker {"defaultU8", s.DefaultU8(), byte(6)}, 1953*890232f2SAndroid Build Coastguard Worker {"justI16", s.JustI16(), int16(7)}, 1954*890232f2SAndroid Build Coastguard Worker {"maybeI16", s.MaybeI16(), int16(7)}, 1955*890232f2SAndroid Build Coastguard Worker {"defaultI16", s.DefaultI16(), int16(7)}, 1956*890232f2SAndroid Build Coastguard Worker {"justU16", s.JustU16(), uint16(8)}, 1957*890232f2SAndroid Build Coastguard Worker {"maybeU16", s.MaybeU16(), uint16(8)}, 1958*890232f2SAndroid Build Coastguard Worker {"defaultU16", s.DefaultU16(), uint16(8)}, 1959*890232f2SAndroid Build Coastguard Worker {"justI32", s.JustI32(), int32(9)}, 1960*890232f2SAndroid Build Coastguard Worker {"maybeI32", s.MaybeI32(), int32(9)}, 1961*890232f2SAndroid Build Coastguard Worker {"defaultI32", s.DefaultI32(), int32(9)}, 1962*890232f2SAndroid Build Coastguard Worker {"justU32", s.JustU32(), uint32(10)}, 1963*890232f2SAndroid Build Coastguard Worker {"maybeU32", s.MaybeU32(), uint32(10)}, 1964*890232f2SAndroid Build Coastguard Worker {"defaultU32", s.DefaultU32(), uint32(10)}, 1965*890232f2SAndroid Build Coastguard Worker {"justI64", s.JustI64(), int64(11)}, 1966*890232f2SAndroid Build Coastguard Worker {"maybeI64", s.MaybeI64(), int64(11)}, 1967*890232f2SAndroid Build Coastguard Worker {"defaultI64", s.DefaultI64(), int64(11)}, 1968*890232f2SAndroid Build Coastguard Worker {"justU64", s.JustU64(), uint64(12)}, 1969*890232f2SAndroid Build Coastguard Worker {"maybeU64", s.MaybeU64(), uint64(12)}, 1970*890232f2SAndroid Build Coastguard Worker {"defaultU64", s.DefaultU64(), uint64(12)}, 1971*890232f2SAndroid Build Coastguard Worker {"justF32", s.JustF32(), float32(13)}, 1972*890232f2SAndroid Build Coastguard Worker {"maybeF32", s.MaybeF32(), float32(13)}, 1973*890232f2SAndroid Build Coastguard Worker {"defaultF32", s.DefaultF32(), float32(13)}, 1974*890232f2SAndroid Build Coastguard Worker {"justF64", s.JustF64(), float64(14)}, 1975*890232f2SAndroid Build Coastguard Worker {"maybeF64", s.MaybeF64(), float64(14)}, 1976*890232f2SAndroid Build Coastguard Worker {"defaultF64", s.DefaultF64(), float64(14)}, 1977*890232f2SAndroid Build Coastguard Worker {"justBool", s.JustBool(), true}, 1978*890232f2SAndroid Build Coastguard Worker {"maybeBool", s.MaybeBool(), true}, 1979*890232f2SAndroid Build Coastguard Worker {"defaultBool", s.DefaultBool(), false}, 1980*890232f2SAndroid Build Coastguard Worker {"justEnum", s.JustEnum(), optional_scalars.OptionalByteTwo}, 1981*890232f2SAndroid Build Coastguard Worker {"maybeEnum", s.MaybeEnum(), optional_scalars.OptionalByteTwo}, 1982*890232f2SAndroid Build Coastguard Worker {"defaultEnum", s.DefaultEnum(), optional_scalars.OptionalByteTwo}, 1983*890232f2SAndroid Build Coastguard Worker } 1984*890232f2SAndroid Build Coastguard Worker } 1985*890232f2SAndroid Build Coastguard Worker 1986*890232f2SAndroid Build Coastguard Worker resolvePointer := func(v interface{}) interface{} { 1987*890232f2SAndroid Build Coastguard Worker switch v := v.(type) { 1988*890232f2SAndroid Build Coastguard Worker case *int8: 1989*890232f2SAndroid Build Coastguard Worker return *v 1990*890232f2SAndroid Build Coastguard Worker case *byte: 1991*890232f2SAndroid Build Coastguard Worker return *v 1992*890232f2SAndroid Build Coastguard Worker case *int16: 1993*890232f2SAndroid Build Coastguard Worker return *v 1994*890232f2SAndroid Build Coastguard Worker case *uint16: 1995*890232f2SAndroid Build Coastguard Worker return *v 1996*890232f2SAndroid Build Coastguard Worker case *int32: 1997*890232f2SAndroid Build Coastguard Worker return *v 1998*890232f2SAndroid Build Coastguard Worker case *uint32: 1999*890232f2SAndroid Build Coastguard Worker return *v 2000*890232f2SAndroid Build Coastguard Worker case *int64: 2001*890232f2SAndroid Build Coastguard Worker return *v 2002*890232f2SAndroid Build Coastguard Worker case *uint64: 2003*890232f2SAndroid Build Coastguard Worker return *v 2004*890232f2SAndroid Build Coastguard Worker case *float32: 2005*890232f2SAndroid Build Coastguard Worker return *v 2006*890232f2SAndroid Build Coastguard Worker case *float64: 2007*890232f2SAndroid Build Coastguard Worker return *v 2008*890232f2SAndroid Build Coastguard Worker case *bool: 2009*890232f2SAndroid Build Coastguard Worker return *v 2010*890232f2SAndroid Build Coastguard Worker case *optional_scalars.OptionalByte: 2011*890232f2SAndroid Build Coastguard Worker return *v 2012*890232f2SAndroid Build Coastguard Worker default: 2013*890232f2SAndroid Build Coastguard Worker return v 2014*890232f2SAndroid Build Coastguard Worker } 2015*890232f2SAndroid Build Coastguard Worker } 2016*890232f2SAndroid Build Coastguard Worker 2017*890232f2SAndroid Build Coastguard Worker buildAssignedTable := func(b *flatbuffers.Builder) *optional_scalars.ScalarStuff { 2018*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffStart(b) 2019*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddJustI8(b, int8(5)) 2020*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddMaybeI8(b, int8(5)) 2021*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddDefaultI8(b, int8(5)) 2022*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddJustU8(b, byte(6)) 2023*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddMaybeU8(b, byte(6)) 2024*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddDefaultU8(b, byte(6)) 2025*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddJustI16(b, int16(7)) 2026*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddMaybeI16(b, int16(7)) 2027*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddDefaultI16(b, int16(7)) 2028*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddJustU16(b, uint16(8)) 2029*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddMaybeU16(b, uint16(8)) 2030*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddDefaultU16(b, uint16(8)) 2031*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddJustI32(b, int32(9)) 2032*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddMaybeI32(b, int32(9)) 2033*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddDefaultI32(b, int32(9)) 2034*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddJustU32(b, uint32(10)) 2035*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddMaybeU32(b, uint32(10)) 2036*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddDefaultU32(b, uint32(10)) 2037*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddJustI64(b, int64(11)) 2038*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddMaybeI64(b, int64(11)) 2039*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddDefaultI64(b, int64(11)) 2040*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddJustU64(b, uint64(12)) 2041*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddMaybeU64(b, uint64(12)) 2042*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddDefaultU64(b, uint64(12)) 2043*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddJustF32(b, float32(13)) 2044*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddMaybeF32(b, float32(13)) 2045*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddDefaultF32(b, float32(13)) 2046*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddJustF64(b, float64(14)) 2047*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddMaybeF64(b, float64(14)) 2048*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddDefaultF64(b, float64(14)) 2049*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddJustBool(b, true) 2050*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddMaybeBool(b, true) 2051*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddDefaultBool(b, false) 2052*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddJustEnum(b, optional_scalars.OptionalByteTwo) 2053*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddMaybeEnum(b, optional_scalars.OptionalByteTwo) 2054*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffAddDefaultEnum(b, optional_scalars.OptionalByteTwo) 2055*890232f2SAndroid Build Coastguard Worker b.Finish(optional_scalars.ScalarStuffEnd(b)) 2056*890232f2SAndroid Build Coastguard Worker return optional_scalars.GetRootAsScalarStuff(b.FinishedBytes(), 0) 2057*890232f2SAndroid Build Coastguard Worker } 2058*890232f2SAndroid Build Coastguard Worker 2059*890232f2SAndroid Build Coastguard Worker // test default values 2060*890232f2SAndroid Build Coastguard Worker 2061*890232f2SAndroid Build Coastguard Worker fbb := flatbuffers.NewBuilder(1) 2062*890232f2SAndroid Build Coastguard Worker optional_scalars.ScalarStuffStart(fbb) 2063*890232f2SAndroid Build Coastguard Worker fbb.Finish(optional_scalars.ScalarStuffEnd(fbb)) 2064*890232f2SAndroid Build Coastguard Worker ss := optional_scalars.GetRootAsScalarStuff(fbb.FinishedBytes(), 0) 2065*890232f2SAndroid Build Coastguard Worker for _, tc := range makeDefaultTestCases(ss) { 2066*890232f2SAndroid Build Coastguard Worker if tc.result != tc.expect { 2067*890232f2SAndroid Build Coastguard Worker fail(FailString("Default ScalarStuff: "+tc.what, tc.expect, tc.result)) 2068*890232f2SAndroid Build Coastguard Worker } 2069*890232f2SAndroid Build Coastguard Worker } 2070*890232f2SAndroid Build Coastguard Worker 2071*890232f2SAndroid Build Coastguard Worker // test assigned values 2072*890232f2SAndroid Build Coastguard Worker fbb.Reset() 2073*890232f2SAndroid Build Coastguard Worker ss = buildAssignedTable(fbb) 2074*890232f2SAndroid Build Coastguard Worker for _, tc := range makeAssignedTestCases(ss) { 2075*890232f2SAndroid Build Coastguard Worker if resolvePointer(tc.result) != tc.expect { 2076*890232f2SAndroid Build Coastguard Worker fail(FailString("Assigned ScalarStuff: "+tc.what, tc.expect, tc.result)) 2077*890232f2SAndroid Build Coastguard Worker } 2078*890232f2SAndroid Build Coastguard Worker } 2079*890232f2SAndroid Build Coastguard Worker 2080*890232f2SAndroid Build Coastguard Worker // test native object pack 2081*890232f2SAndroid Build Coastguard Worker fbb.Reset() 2082*890232f2SAndroid Build Coastguard Worker i8 := int8(5) 2083*890232f2SAndroid Build Coastguard Worker u8 := byte(6) 2084*890232f2SAndroid Build Coastguard Worker i16 := int16(7) 2085*890232f2SAndroid Build Coastguard Worker u16 := uint16(8) 2086*890232f2SAndroid Build Coastguard Worker i32 := int32(9) 2087*890232f2SAndroid Build Coastguard Worker u32 := uint32(10) 2088*890232f2SAndroid Build Coastguard Worker i64 := int64(11) 2089*890232f2SAndroid Build Coastguard Worker u64 := uint64(12) 2090*890232f2SAndroid Build Coastguard Worker f32 := float32(13) 2091*890232f2SAndroid Build Coastguard Worker f64 := float64(14) 2092*890232f2SAndroid Build Coastguard Worker b := true 2093*890232f2SAndroid Build Coastguard Worker enum := optional_scalars.OptionalByteTwo 2094*890232f2SAndroid Build Coastguard Worker obj := optional_scalars.ScalarStuffT{ 2095*890232f2SAndroid Build Coastguard Worker JustI8: 5, 2096*890232f2SAndroid Build Coastguard Worker MaybeI8: &i8, 2097*890232f2SAndroid Build Coastguard Worker DefaultI8: 5, 2098*890232f2SAndroid Build Coastguard Worker JustU8: 6, 2099*890232f2SAndroid Build Coastguard Worker MaybeU8: &u8, 2100*890232f2SAndroid Build Coastguard Worker DefaultU8: 6, 2101*890232f2SAndroid Build Coastguard Worker JustI16: 7, 2102*890232f2SAndroid Build Coastguard Worker MaybeI16: &i16, 2103*890232f2SAndroid Build Coastguard Worker DefaultI16: 7, 2104*890232f2SAndroid Build Coastguard Worker JustU16: 8, 2105*890232f2SAndroid Build Coastguard Worker MaybeU16: &u16, 2106*890232f2SAndroid Build Coastguard Worker DefaultU16: 8, 2107*890232f2SAndroid Build Coastguard Worker JustI32: 9, 2108*890232f2SAndroid Build Coastguard Worker MaybeI32: &i32, 2109*890232f2SAndroid Build Coastguard Worker DefaultI32: 9, 2110*890232f2SAndroid Build Coastguard Worker JustU32: 10, 2111*890232f2SAndroid Build Coastguard Worker MaybeU32: &u32, 2112*890232f2SAndroid Build Coastguard Worker DefaultU32: 10, 2113*890232f2SAndroid Build Coastguard Worker JustI64: 11, 2114*890232f2SAndroid Build Coastguard Worker MaybeI64: &i64, 2115*890232f2SAndroid Build Coastguard Worker DefaultI64: 11, 2116*890232f2SAndroid Build Coastguard Worker JustU64: 12, 2117*890232f2SAndroid Build Coastguard Worker MaybeU64: &u64, 2118*890232f2SAndroid Build Coastguard Worker DefaultU64: 12, 2119*890232f2SAndroid Build Coastguard Worker JustF32: 13, 2120*890232f2SAndroid Build Coastguard Worker MaybeF32: &f32, 2121*890232f2SAndroid Build Coastguard Worker DefaultF32: 13, 2122*890232f2SAndroid Build Coastguard Worker JustF64: 14, 2123*890232f2SAndroid Build Coastguard Worker MaybeF64: &f64, 2124*890232f2SAndroid Build Coastguard Worker DefaultF64: 14, 2125*890232f2SAndroid Build Coastguard Worker JustBool: true, 2126*890232f2SAndroid Build Coastguard Worker MaybeBool: &b, 2127*890232f2SAndroid Build Coastguard Worker DefaultBool: false, 2128*890232f2SAndroid Build Coastguard Worker JustEnum: optional_scalars.OptionalByteTwo, 2129*890232f2SAndroid Build Coastguard Worker MaybeEnum: &enum, 2130*890232f2SAndroid Build Coastguard Worker DefaultEnum: optional_scalars.OptionalByteTwo, 2131*890232f2SAndroid Build Coastguard Worker } 2132*890232f2SAndroid Build Coastguard Worker fbb.Finish(obj.Pack(fbb)) 2133*890232f2SAndroid Build Coastguard Worker ss = optional_scalars.GetRootAsScalarStuff(fbb.FinishedBytes(), 0) 2134*890232f2SAndroid Build Coastguard Worker for _, tc := range makeAssignedTestCases(ss) { 2135*890232f2SAndroid Build Coastguard Worker if resolvePointer(tc.result) != tc.expect { 2136*890232f2SAndroid Build Coastguard Worker fail(FailString("Native Object ScalarStuff: "+tc.what, tc.expect, tc.result)) 2137*890232f2SAndroid Build Coastguard Worker } 2138*890232f2SAndroid Build Coastguard Worker } 2139*890232f2SAndroid Build Coastguard Worker 2140*890232f2SAndroid Build Coastguard Worker // test native object unpack 2141*890232f2SAndroid Build Coastguard Worker fbb.Reset() 2142*890232f2SAndroid Build Coastguard Worker ss = buildAssignedTable(fbb) 2143*890232f2SAndroid Build Coastguard Worker ss.UnPackTo(&obj) 2144*890232f2SAndroid Build Coastguard Worker expectEq := func(what string, a, b interface{}) { 2145*890232f2SAndroid Build Coastguard Worker if resolvePointer(a) != b { 2146*890232f2SAndroid Build Coastguard Worker fail(FailString("Native Object Unpack ScalarStuff: "+what, b, a)) 2147*890232f2SAndroid Build Coastguard Worker } 2148*890232f2SAndroid Build Coastguard Worker } 2149*890232f2SAndroid Build Coastguard Worker expectEq("justI8", obj.JustI8, int8(5)) 2150*890232f2SAndroid Build Coastguard Worker expectEq("maybeI8", obj.MaybeI8, int8(5)) 2151*890232f2SAndroid Build Coastguard Worker expectEq("defaultI8", obj.DefaultI8, int8(5)) 2152*890232f2SAndroid Build Coastguard Worker expectEq("justU8", obj.JustU8, byte(6)) 2153*890232f2SAndroid Build Coastguard Worker expectEq("maybeU8", obj.MaybeU8, byte(6)) 2154*890232f2SAndroid Build Coastguard Worker expectEq("defaultU8", obj.DefaultU8, byte(6)) 2155*890232f2SAndroid Build Coastguard Worker expectEq("justI16", obj.JustI16, int16(7)) 2156*890232f2SAndroid Build Coastguard Worker expectEq("maybeI16", obj.MaybeI16, int16(7)) 2157*890232f2SAndroid Build Coastguard Worker expectEq("defaultI16", obj.DefaultI16, int16(7)) 2158*890232f2SAndroid Build Coastguard Worker expectEq("justU16", obj.JustU16, uint16(8)) 2159*890232f2SAndroid Build Coastguard Worker expectEq("maybeU16", obj.MaybeU16, uint16(8)) 2160*890232f2SAndroid Build Coastguard Worker expectEq("defaultU16", obj.DefaultU16, uint16(8)) 2161*890232f2SAndroid Build Coastguard Worker expectEq("justI32", obj.JustI32, int32(9)) 2162*890232f2SAndroid Build Coastguard Worker expectEq("maybeI32", obj.MaybeI32, int32(9)) 2163*890232f2SAndroid Build Coastguard Worker expectEq("defaultI32", obj.DefaultI32, int32(9)) 2164*890232f2SAndroid Build Coastguard Worker expectEq("justU32", obj.JustU32, uint32(10)) 2165*890232f2SAndroid Build Coastguard Worker expectEq("maybeU32", obj.MaybeU32, uint32(10)) 2166*890232f2SAndroid Build Coastguard Worker expectEq("defaultU32", obj.DefaultU32, uint32(10)) 2167*890232f2SAndroid Build Coastguard Worker expectEq("justI64", obj.JustI64, int64(11)) 2168*890232f2SAndroid Build Coastguard Worker expectEq("maybeI64", obj.MaybeI64, int64(11)) 2169*890232f2SAndroid Build Coastguard Worker expectEq("defaultI64", obj.DefaultI64, int64(11)) 2170*890232f2SAndroid Build Coastguard Worker expectEq("justU64", obj.JustU64, uint64(12)) 2171*890232f2SAndroid Build Coastguard Worker expectEq("maybeU64", obj.MaybeU64, uint64(12)) 2172*890232f2SAndroid Build Coastguard Worker expectEq("defaultU64", obj.DefaultU64, uint64(12)) 2173*890232f2SAndroid Build Coastguard Worker expectEq("justF32", obj.JustF32, float32(13)) 2174*890232f2SAndroid Build Coastguard Worker expectEq("maybeF32", obj.MaybeF32, float32(13)) 2175*890232f2SAndroid Build Coastguard Worker expectEq("defaultF32", obj.DefaultF32, float32(13)) 2176*890232f2SAndroid Build Coastguard Worker expectEq("justF64", obj.JustF64, float64(14)) 2177*890232f2SAndroid Build Coastguard Worker expectEq("maybeF64", obj.MaybeF64, float64(14)) 2178*890232f2SAndroid Build Coastguard Worker expectEq("defaultF64", obj.DefaultF64, float64(14)) 2179*890232f2SAndroid Build Coastguard Worker expectEq("justBool", obj.JustBool, true) 2180*890232f2SAndroid Build Coastguard Worker expectEq("maybeBool", obj.MaybeBool, true) 2181*890232f2SAndroid Build Coastguard Worker expectEq("defaultBool", obj.DefaultBool, false) 2182*890232f2SAndroid Build Coastguard Worker expectEq("justEnum", obj.JustEnum, optional_scalars.OptionalByteTwo) 2183*890232f2SAndroid Build Coastguard Worker expectEq("maybeEnum", obj.MaybeEnum, optional_scalars.OptionalByteTwo) 2184*890232f2SAndroid Build Coastguard Worker expectEq("defaultEnum", obj.DefaultEnum, optional_scalars.OptionalByteTwo) 2185*890232f2SAndroid Build Coastguard Worker} 2186*890232f2SAndroid Build Coastguard Worker 2187*890232f2SAndroid Build Coastguard Worker// BenchmarkVtableDeduplication measures the speed of vtable deduplication 2188*890232f2SAndroid Build Coastguard Worker// by creating prePop vtables, then populating b.N objects with a 2189*890232f2SAndroid Build Coastguard Worker// different single vtable. 2190*890232f2SAndroid Build Coastguard Worker// 2191*890232f2SAndroid Build Coastguard Worker// When b.N is large (as in long benchmarks), memory usage may be high. 2192*890232f2SAndroid Build Coastguard Workerfunc BenchmarkVtableDeduplication(b *testing.B) { 2193*890232f2SAndroid Build Coastguard Worker prePop := 10 2194*890232f2SAndroid Build Coastguard Worker builder := flatbuffers.NewBuilder(0) 2195*890232f2SAndroid Build Coastguard Worker 2196*890232f2SAndroid Build Coastguard Worker // pre-populate some vtables: 2197*890232f2SAndroid Build Coastguard Worker for i := 0; i < prePop; i++ { 2198*890232f2SAndroid Build Coastguard Worker builder.StartObject(i) 2199*890232f2SAndroid Build Coastguard Worker for j := 0; j < i; j++ { 2200*890232f2SAndroid Build Coastguard Worker builder.PrependInt16Slot(j, int16(j), 0) 2201*890232f2SAndroid Build Coastguard Worker } 2202*890232f2SAndroid Build Coastguard Worker builder.EndObject() 2203*890232f2SAndroid Build Coastguard Worker } 2204*890232f2SAndroid Build Coastguard Worker 2205*890232f2SAndroid Build Coastguard Worker // benchmark deduplication of a new vtable: 2206*890232f2SAndroid Build Coastguard Worker b.ResetTimer() 2207*890232f2SAndroid Build Coastguard Worker for i := 0; i < b.N; i++ { 2208*890232f2SAndroid Build Coastguard Worker lim := prePop 2209*890232f2SAndroid Build Coastguard Worker 2210*890232f2SAndroid Build Coastguard Worker builder.StartObject(lim) 2211*890232f2SAndroid Build Coastguard Worker for j := 0; j < lim; j++ { 2212*890232f2SAndroid Build Coastguard Worker builder.PrependInt16Slot(j, int16(j), 0) 2213*890232f2SAndroid Build Coastguard Worker } 2214*890232f2SAndroid Build Coastguard Worker builder.EndObject() 2215*890232f2SAndroid Build Coastguard Worker } 2216*890232f2SAndroid Build Coastguard Worker} 2217*890232f2SAndroid Build Coastguard Worker 2218*890232f2SAndroid Build Coastguard Worker// BenchmarkParseGold measures the speed of parsing the 'gold' data 2219*890232f2SAndroid Build Coastguard Worker// used throughout this test suite. 2220*890232f2SAndroid Build Coastguard Workerfunc BenchmarkParseGold(b *testing.B) { 2221*890232f2SAndroid Build Coastguard Worker buf, offset := CheckGeneratedBuild(false, b.Fatalf) 2222*890232f2SAndroid Build Coastguard Worker monster := example.GetRootAsMonster(buf, offset) 2223*890232f2SAndroid Build Coastguard Worker 2224*890232f2SAndroid Build Coastguard Worker // use these to prevent allocations: 2225*890232f2SAndroid Build Coastguard Worker reuse_pos := example.Vec3{} 2226*890232f2SAndroid Build Coastguard Worker reuse_test3 := example.Test{} 2227*890232f2SAndroid Build Coastguard Worker reuse_table2 := flatbuffers.Table{} 2228*890232f2SAndroid Build Coastguard Worker reuse_monster2 := example.Monster{} 2229*890232f2SAndroid Build Coastguard Worker reuse_test4_0 := example.Test{} 2230*890232f2SAndroid Build Coastguard Worker reuse_test4_1 := example.Test{} 2231*890232f2SAndroid Build Coastguard Worker 2232*890232f2SAndroid Build Coastguard Worker b.SetBytes(int64(len(buf[offset:]))) 2233*890232f2SAndroid Build Coastguard Worker b.ReportAllocs() 2234*890232f2SAndroid Build Coastguard Worker b.ResetTimer() 2235*890232f2SAndroid Build Coastguard Worker for i := 0; i < b.N; i++ { 2236*890232f2SAndroid Build Coastguard Worker monster.Hp() 2237*890232f2SAndroid Build Coastguard Worker monster.Mana() 2238*890232f2SAndroid Build Coastguard Worker name := monster.Name() 2239*890232f2SAndroid Build Coastguard Worker _ = name[0] 2240*890232f2SAndroid Build Coastguard Worker _ = name[len(name)-1] 2241*890232f2SAndroid Build Coastguard Worker 2242*890232f2SAndroid Build Coastguard Worker monster.Pos(&reuse_pos) 2243*890232f2SAndroid Build Coastguard Worker reuse_pos.X() 2244*890232f2SAndroid Build Coastguard Worker reuse_pos.Y() 2245*890232f2SAndroid Build Coastguard Worker reuse_pos.Z() 2246*890232f2SAndroid Build Coastguard Worker reuse_pos.Test1() 2247*890232f2SAndroid Build Coastguard Worker reuse_pos.Test2() 2248*890232f2SAndroid Build Coastguard Worker reuse_pos.Test3(&reuse_test3) 2249*890232f2SAndroid Build Coastguard Worker reuse_test3.A() 2250*890232f2SAndroid Build Coastguard Worker reuse_test3.B() 2251*890232f2SAndroid Build Coastguard Worker monster.TestType() 2252*890232f2SAndroid Build Coastguard Worker monster.Test(&reuse_table2) 2253*890232f2SAndroid Build Coastguard Worker reuse_monster2.Init(reuse_table2.Bytes, reuse_table2.Pos) 2254*890232f2SAndroid Build Coastguard Worker name2 := reuse_monster2.Name() 2255*890232f2SAndroid Build Coastguard Worker _ = name2[0] 2256*890232f2SAndroid Build Coastguard Worker _ = name2[len(name2)-1] 2257*890232f2SAndroid Build Coastguard Worker monster.InventoryLength() 2258*890232f2SAndroid Build Coastguard Worker l := monster.InventoryLength() 2259*890232f2SAndroid Build Coastguard Worker for i := 0; i < l; i++ { 2260*890232f2SAndroid Build Coastguard Worker monster.Inventory(i) 2261*890232f2SAndroid Build Coastguard Worker } 2262*890232f2SAndroid Build Coastguard Worker monster.Test4Length() 2263*890232f2SAndroid Build Coastguard Worker monster.Test4(&reuse_test4_0, 0) 2264*890232f2SAndroid Build Coastguard Worker monster.Test4(&reuse_test4_1, 1) 2265*890232f2SAndroid Build Coastguard Worker 2266*890232f2SAndroid Build Coastguard Worker reuse_test4_0.A() 2267*890232f2SAndroid Build Coastguard Worker reuse_test4_0.B() 2268*890232f2SAndroid Build Coastguard Worker reuse_test4_1.A() 2269*890232f2SAndroid Build Coastguard Worker reuse_test4_1.B() 2270*890232f2SAndroid Build Coastguard Worker 2271*890232f2SAndroid Build Coastguard Worker monster.TestarrayofstringLength() 2272*890232f2SAndroid Build Coastguard Worker str0 := monster.Testarrayofstring(0) 2273*890232f2SAndroid Build Coastguard Worker _ = str0[0] 2274*890232f2SAndroid Build Coastguard Worker _ = str0[len(str0)-1] 2275*890232f2SAndroid Build Coastguard Worker str1 := monster.Testarrayofstring(1) 2276*890232f2SAndroid Build Coastguard Worker _ = str1[0] 2277*890232f2SAndroid Build Coastguard Worker _ = str1[len(str1)-1] 2278*890232f2SAndroid Build Coastguard Worker } 2279*890232f2SAndroid Build Coastguard Worker} 2280*890232f2SAndroid Build Coastguard Worker 2281*890232f2SAndroid Build Coastguard Worker// BenchmarkBuildGold uses generated code to build the example Monster. 2282*890232f2SAndroid Build Coastguard Workerfunc BenchmarkBuildGold(b *testing.B) { 2283*890232f2SAndroid Build Coastguard Worker buf, offset := CheckGeneratedBuild(false, b.Fatalf) 2284*890232f2SAndroid Build Coastguard Worker bytes_length := int64(len(buf[offset:])) 2285*890232f2SAndroid Build Coastguard Worker 2286*890232f2SAndroid Build Coastguard Worker reuse_str := "MyMonster" 2287*890232f2SAndroid Build Coastguard Worker reuse_test1 := "test1" 2288*890232f2SAndroid Build Coastguard Worker reuse_test2 := "test2" 2289*890232f2SAndroid Build Coastguard Worker reuse_fred := "Fred" 2290*890232f2SAndroid Build Coastguard Worker 2291*890232f2SAndroid Build Coastguard Worker b.SetBytes(bytes_length) 2292*890232f2SAndroid Build Coastguard Worker bldr := flatbuffers.NewBuilder(0) 2293*890232f2SAndroid Build Coastguard Worker b.ResetTimer() 2294*890232f2SAndroid Build Coastguard Worker b.ReportAllocs() 2295*890232f2SAndroid Build Coastguard Worker for i := 0; i < b.N; i++ { 2296*890232f2SAndroid Build Coastguard Worker bldr.Reset() 2297*890232f2SAndroid Build Coastguard Worker 2298*890232f2SAndroid Build Coastguard Worker str := bldr.CreateString(reuse_str) 2299*890232f2SAndroid Build Coastguard Worker test1 := bldr.CreateString(reuse_test1) 2300*890232f2SAndroid Build Coastguard Worker test2 := bldr.CreateString(reuse_test2) 2301*890232f2SAndroid Build Coastguard Worker fred := bldr.CreateString(reuse_fred) 2302*890232f2SAndroid Build Coastguard Worker 2303*890232f2SAndroid Build Coastguard Worker example.MonsterStartInventoryVector(bldr, 5) 2304*890232f2SAndroid Build Coastguard Worker bldr.PrependByte(4) 2305*890232f2SAndroid Build Coastguard Worker bldr.PrependByte(3) 2306*890232f2SAndroid Build Coastguard Worker bldr.PrependByte(2) 2307*890232f2SAndroid Build Coastguard Worker bldr.PrependByte(1) 2308*890232f2SAndroid Build Coastguard Worker bldr.PrependByte(0) 2309*890232f2SAndroid Build Coastguard Worker inv := bldr.EndVector(5) 2310*890232f2SAndroid Build Coastguard Worker 2311*890232f2SAndroid Build Coastguard Worker example.MonsterStart(bldr) 2312*890232f2SAndroid Build Coastguard Worker example.MonsterAddName(bldr, fred) 2313*890232f2SAndroid Build Coastguard Worker mon2 := example.MonsterEnd(bldr) 2314*890232f2SAndroid Build Coastguard Worker 2315*890232f2SAndroid Build Coastguard Worker example.MonsterStartTest4Vector(bldr, 2) 2316*890232f2SAndroid Build Coastguard Worker example.CreateTest(bldr, 10, 20) 2317*890232f2SAndroid Build Coastguard Worker example.CreateTest(bldr, 30, 40) 2318*890232f2SAndroid Build Coastguard Worker test4 := bldr.EndVector(2) 2319*890232f2SAndroid Build Coastguard Worker 2320*890232f2SAndroid Build Coastguard Worker example.MonsterStartTestarrayofstringVector(bldr, 2) 2321*890232f2SAndroid Build Coastguard Worker bldr.PrependUOffsetT(test2) 2322*890232f2SAndroid Build Coastguard Worker bldr.PrependUOffsetT(test1) 2323*890232f2SAndroid Build Coastguard Worker testArrayOfString := bldr.EndVector(2) 2324*890232f2SAndroid Build Coastguard Worker 2325*890232f2SAndroid Build Coastguard Worker example.MonsterStart(bldr) 2326*890232f2SAndroid Build Coastguard Worker 2327*890232f2SAndroid Build Coastguard Worker pos := example.CreateVec3(bldr, 1.0, 2.0, 3.0, 3.0, example.ColorGreen, 5, 6) 2328*890232f2SAndroid Build Coastguard Worker example.MonsterAddPos(bldr, pos) 2329*890232f2SAndroid Build Coastguard Worker 2330*890232f2SAndroid Build Coastguard Worker example.MonsterAddHp(bldr, 80) 2331*890232f2SAndroid Build Coastguard Worker example.MonsterAddName(bldr, str) 2332*890232f2SAndroid Build Coastguard Worker example.MonsterAddInventory(bldr, inv) 2333*890232f2SAndroid Build Coastguard Worker example.MonsterAddTestType(bldr, 1) 2334*890232f2SAndroid Build Coastguard Worker example.MonsterAddTest(bldr, mon2) 2335*890232f2SAndroid Build Coastguard Worker example.MonsterAddTest4(bldr, test4) 2336*890232f2SAndroid Build Coastguard Worker example.MonsterAddTestarrayofstring(bldr, testArrayOfString) 2337*890232f2SAndroid Build Coastguard Worker mon := example.MonsterEnd(bldr) 2338*890232f2SAndroid Build Coastguard Worker 2339*890232f2SAndroid Build Coastguard Worker bldr.Finish(mon) 2340*890232f2SAndroid Build Coastguard Worker } 2341*890232f2SAndroid Build Coastguard Worker} 2342