xref: /aosp_15_r20/external/flatbuffers/tests/go_test.go (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Worker/*
2*890232f2SAndroid Build Coastguard Worker * Copyright 2014 Google Inc. All rights reserved.
3*890232f2SAndroid Build Coastguard Worker *
4*890232f2SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*890232f2SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*890232f2SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*890232f2SAndroid Build Coastguard Worker *
8*890232f2SAndroid Build Coastguard Worker *     http://www.apache.org/licenses/LICENSE-2.0
9*890232f2SAndroid Build Coastguard Worker *
10*890232f2SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*890232f2SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*890232f2SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*890232f2SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*890232f2SAndroid Build Coastguard Worker * limitations under the License.
15*890232f2SAndroid Build Coastguard Worker */
16*890232f2SAndroid Build Coastguard Worker
17*890232f2SAndroid Build Coastguard 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