xref: /aosp_15_r20/external/flatbuffers/tests/py_test.py (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Worker# coding=utf-8
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 Workerimport os.path
17*890232f2SAndroid Build Coastguard Workerimport sys
18*890232f2SAndroid Build Coastguard Workerimport imp
19*890232f2SAndroid Build Coastguard WorkerPY_VERSION = sys.version_info[:2]
20*890232f2SAndroid Build Coastguard Worker
21*890232f2SAndroid Build Coastguard Workerimport ctypes
22*890232f2SAndroid Build Coastguard Workerfrom collections import defaultdict
23*890232f2SAndroid Build Coastguard Workerimport math
24*890232f2SAndroid Build Coastguard Workerimport random
25*890232f2SAndroid Build Coastguard Workerimport timeit
26*890232f2SAndroid Build Coastguard Workerimport unittest
27*890232f2SAndroid Build Coastguard Worker
28*890232f2SAndroid Build Coastguard Workerfrom flatbuffers import compat
29*890232f2SAndroid Build Coastguard Workerfrom flatbuffers import util
30*890232f2SAndroid Build Coastguard Workerfrom flatbuffers.compat import range_func as compat_range
31*890232f2SAndroid Build Coastguard Workerfrom flatbuffers.compat import NumpyRequiredForThisFeature
32*890232f2SAndroid Build Coastguard Worker
33*890232f2SAndroid Build Coastguard Workerimport flatbuffers
34*890232f2SAndroid Build Coastguard Workerfrom flatbuffers import number_types as N
35*890232f2SAndroid Build Coastguard Worker
36*890232f2SAndroid Build Coastguard Workerimport MyGame  # refers to generated code
37*890232f2SAndroid Build Coastguard Workerimport MyGame.Example  # refers to generated code
38*890232f2SAndroid Build Coastguard Workerimport MyGame.Example.Any  # refers to generated code
39*890232f2SAndroid Build Coastguard Workerimport MyGame.Example.Color  # refers to generated code
40*890232f2SAndroid Build Coastguard Workerimport MyGame.Example.Monster  # refers to generated code
41*890232f2SAndroid Build Coastguard Workerimport MyGame.Example.Test  # refers to generated code
42*890232f2SAndroid Build Coastguard Workerimport MyGame.Example.Stat  # refers to generated code
43*890232f2SAndroid Build Coastguard Workerimport MyGame.Example.Vec3  # refers to generated code
44*890232f2SAndroid Build Coastguard Workerimport MyGame.MonsterExtra  # refers to generated code
45*890232f2SAndroid Build Coastguard Workerimport MyGame.InParentNamespace  # refers to generated code
46*890232f2SAndroid Build Coastguard Workerimport MyGame.Example.ArrayTable  # refers to generated code
47*890232f2SAndroid Build Coastguard Workerimport MyGame.Example.ArrayStruct  # refers to generated code
48*890232f2SAndroid Build Coastguard Workerimport MyGame.Example.NestedStruct  # refers to generated code
49*890232f2SAndroid Build Coastguard Workerimport MyGame.Example.TestEnum  # refers to generated code
50*890232f2SAndroid Build Coastguard Workerimport monster_test_generated  # the one-file version
51*890232f2SAndroid Build Coastguard Workerimport optional_scalars
52*890232f2SAndroid Build Coastguard Workerimport optional_scalars.ScalarStuff
53*890232f2SAndroid Build Coastguard Worker
54*890232f2SAndroid Build Coastguard Worker
55*890232f2SAndroid Build Coastguard Workerdef create_namespace_shortcut(is_onefile):
56*890232f2SAndroid Build Coastguard Worker  # Create shortcut from either the one-file format or the multi-file format
57*890232f2SAndroid Build Coastguard Worker  global _ANY
58*890232f2SAndroid Build Coastguard Worker  global _COLOR
59*890232f2SAndroid Build Coastguard Worker  global _MONSTER
60*890232f2SAndroid Build Coastguard Worker  global _TEST
61*890232f2SAndroid Build Coastguard Worker  global _STAT
62*890232f2SAndroid Build Coastguard Worker  global _VEC3
63*890232f2SAndroid Build Coastguard Worker  global _IN_PARENT_NAMESPACE
64*890232f2SAndroid Build Coastguard Worker  if is_onefile:
65*890232f2SAndroid Build Coastguard Worker    print('Testing with the one-file generated code')
66*890232f2SAndroid Build Coastguard Worker    _ANY = monster_test_generated
67*890232f2SAndroid Build Coastguard Worker    _COLOR = monster_test_generated
68*890232f2SAndroid Build Coastguard Worker    _MONSTER = monster_test_generated
69*890232f2SAndroid Build Coastguard Worker    _TEST = monster_test_generated
70*890232f2SAndroid Build Coastguard Worker    _STAT = monster_test_generated
71*890232f2SAndroid Build Coastguard Worker    _VEC3 = monster_test_generated
72*890232f2SAndroid Build Coastguard Worker    _IN_PARENT_NAMESPACE = monster_test_generated
73*890232f2SAndroid Build Coastguard Worker  else:
74*890232f2SAndroid Build Coastguard Worker    print('Testing with multi-file generated code')
75*890232f2SAndroid Build Coastguard Worker    _ANY = MyGame.Example.Any
76*890232f2SAndroid Build Coastguard Worker    _COLOR = MyGame.Example.Color
77*890232f2SAndroid Build Coastguard Worker    _MONSTER = MyGame.Example.Monster
78*890232f2SAndroid Build Coastguard Worker    _TEST = MyGame.Example.Test
79*890232f2SAndroid Build Coastguard Worker    _STAT = MyGame.Example.Stat
80*890232f2SAndroid Build Coastguard Worker    _VEC3 = MyGame.Example.Vec3
81*890232f2SAndroid Build Coastguard Worker    _IN_PARENT_NAMESPACE = MyGame.InParentNamespace
82*890232f2SAndroid Build Coastguard Worker
83*890232f2SAndroid Build Coastguard Worker
84*890232f2SAndroid Build Coastguard Workerdef assertRaises(test_case, fn, exception_class):
85*890232f2SAndroid Build Coastguard Worker  """ Backwards-compatible assertion for exceptions raised. """
86*890232f2SAndroid Build Coastguard Worker
87*890232f2SAndroid Build Coastguard Worker  exc = None
88*890232f2SAndroid Build Coastguard Worker  try:
89*890232f2SAndroid Build Coastguard Worker    fn()
90*890232f2SAndroid Build Coastguard Worker  except Exception as e:
91*890232f2SAndroid Build Coastguard Worker    exc = e
92*890232f2SAndroid Build Coastguard Worker  test_case.assertTrue(exc is not None)
93*890232f2SAndroid Build Coastguard Worker  test_case.assertTrue(isinstance(exc, exception_class))
94*890232f2SAndroid Build Coastguard Worker
95*890232f2SAndroid Build Coastguard Worker
96*890232f2SAndroid Build Coastguard Workerclass TestWireFormat(unittest.TestCase):
97*890232f2SAndroid Build Coastguard Worker
98*890232f2SAndroid Build Coastguard Worker  def test_wire_format(self):
99*890232f2SAndroid Build Coastguard Worker    # Verify that using the generated Python code builds a buffer without
100*890232f2SAndroid Build Coastguard Worker    # returning errors, and is interpreted correctly, for size prefixed
101*890232f2SAndroid Build Coastguard Worker    # representation and regular:
102*890232f2SAndroid Build Coastguard Worker    for sizePrefix in [True, False]:
103*890232f2SAndroid Build Coastguard Worker      for file_identifier in [None, b'MONS']:
104*890232f2SAndroid Build Coastguard Worker        gen_buf, gen_off = make_monster_from_generated_code(
105*890232f2SAndroid Build Coastguard Worker            sizePrefix=sizePrefix, file_identifier=file_identifier)
106*890232f2SAndroid Build Coastguard Worker        CheckReadBuffer(
107*890232f2SAndroid Build Coastguard Worker            gen_buf,
108*890232f2SAndroid Build Coastguard Worker            gen_off,
109*890232f2SAndroid Build Coastguard Worker            sizePrefix=sizePrefix,
110*890232f2SAndroid Build Coastguard Worker            file_identifier=file_identifier)
111*890232f2SAndroid Build Coastguard Worker
112*890232f2SAndroid Build Coastguard Worker    # Verify that the canonical flatbuffer file is readable by the
113*890232f2SAndroid Build Coastguard Worker    # generated Python code. Note that context managers are not part of
114*890232f2SAndroid Build Coastguard Worker    # Python 2.5, so we use the simpler open/close methods here:
115*890232f2SAndroid Build Coastguard Worker    f = open('monsterdata_test.mon', 'rb')
116*890232f2SAndroid Build Coastguard Worker    canonicalWireData = f.read()
117*890232f2SAndroid Build Coastguard Worker    f.close()
118*890232f2SAndroid Build Coastguard Worker    CheckReadBuffer(bytearray(canonicalWireData), 0, file_identifier=b'MONS')
119*890232f2SAndroid Build Coastguard Worker
120*890232f2SAndroid Build Coastguard Worker    # Write the generated buffer out to a file:
121*890232f2SAndroid Build Coastguard Worker    f = open('monsterdata_python_wire.mon', 'wb')
122*890232f2SAndroid Build Coastguard Worker    f.write(gen_buf[gen_off:])
123*890232f2SAndroid Build Coastguard Worker    f.close()
124*890232f2SAndroid Build Coastguard Worker
125*890232f2SAndroid Build Coastguard Worker
126*890232f2SAndroid Build Coastguard Workerclass TestObjectBasedAPI(unittest.TestCase):
127*890232f2SAndroid Build Coastguard Worker  """ Tests the generated object based API."""
128*890232f2SAndroid Build Coastguard Worker
129*890232f2SAndroid Build Coastguard Worker  def test_consistenty_with_repeated_pack_and_unpack(self):
130*890232f2SAndroid Build Coastguard Worker    """ Checks the serialization and deserialization between a buffer and
131*890232f2SAndroid Build Coastguard Worker
132*890232f2SAndroid Build Coastguard Worker        its python object. It tests in the same way as the C++ object API test,
133*890232f2SAndroid Build Coastguard Worker        ObjectFlatBuffersTest in test.cpp.
134*890232f2SAndroid Build Coastguard Worker    """
135*890232f2SAndroid Build Coastguard Worker
136*890232f2SAndroid Build Coastguard Worker    buf, off = make_monster_from_generated_code()
137*890232f2SAndroid Build Coastguard Worker
138*890232f2SAndroid Build Coastguard Worker    # Turns a buffer into Python object (T class).
139*890232f2SAndroid Build Coastguard Worker    monster1 = _MONSTER.Monster.GetRootAs(buf, off)
140*890232f2SAndroid Build Coastguard Worker    monsterT1 = _MONSTER.MonsterT.InitFromObj(monster1)
141*890232f2SAndroid Build Coastguard Worker
142*890232f2SAndroid Build Coastguard Worker    for sizePrefix in [True, False]:
143*890232f2SAndroid Build Coastguard Worker      # Re-serialize the data into a buffer.
144*890232f2SAndroid Build Coastguard Worker      b1 = flatbuffers.Builder(0)
145*890232f2SAndroid Build Coastguard Worker      if sizePrefix:
146*890232f2SAndroid Build Coastguard Worker        b1.FinishSizePrefixed(monsterT1.Pack(b1))
147*890232f2SAndroid Build Coastguard Worker      else:
148*890232f2SAndroid Build Coastguard Worker        b1.Finish(monsterT1.Pack(b1))
149*890232f2SAndroid Build Coastguard Worker      CheckReadBuffer(b1.Bytes, b1.Head(), sizePrefix)
150*890232f2SAndroid Build Coastguard Worker
151*890232f2SAndroid Build Coastguard Worker    # Deserializes the buffer into Python object again.
152*890232f2SAndroid Build Coastguard Worker    monster2 = _MONSTER.Monster.GetRootAs(b1.Bytes, b1.Head())
153*890232f2SAndroid Build Coastguard Worker    # Re-serializes the data into a buffer for one more time.
154*890232f2SAndroid Build Coastguard Worker    monsterT2 = _MONSTER.MonsterT.InitFromObj(monster2)
155*890232f2SAndroid Build Coastguard Worker    for sizePrefix in [True, False]:
156*890232f2SAndroid Build Coastguard Worker      # Re-serializes the data into a buffer
157*890232f2SAndroid Build Coastguard Worker      b2 = flatbuffers.Builder(0)
158*890232f2SAndroid Build Coastguard Worker      if sizePrefix:
159*890232f2SAndroid Build Coastguard Worker        b2.FinishSizePrefixed(monsterT2.Pack(b2))
160*890232f2SAndroid Build Coastguard Worker      else:
161*890232f2SAndroid Build Coastguard Worker        b2.Finish(monsterT2.Pack(b2))
162*890232f2SAndroid Build Coastguard Worker      CheckReadBuffer(b2.Bytes, b2.Head(), sizePrefix)
163*890232f2SAndroid Build Coastguard Worker
164*890232f2SAndroid Build Coastguard Worker  def test_default_values_with_pack_and_unpack(self):
165*890232f2SAndroid Build Coastguard Worker    """ Serializes and deserializes between a buffer with default values (no
166*890232f2SAndroid Build Coastguard Worker
167*890232f2SAndroid Build Coastguard Worker        specific values are filled when the buffer is created) and its python
168*890232f2SAndroid Build Coastguard Worker        object.
169*890232f2SAndroid Build Coastguard Worker    """
170*890232f2SAndroid Build Coastguard Worker    # Creates a flatbuffer with default values.
171*890232f2SAndroid Build Coastguard Worker    b1 = flatbuffers.Builder(0)
172*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b1)
173*890232f2SAndroid Build Coastguard Worker    gen_mon = _MONSTER.MonsterEnd(b1)
174*890232f2SAndroid Build Coastguard Worker    b1.Finish(gen_mon)
175*890232f2SAndroid Build Coastguard Worker
176*890232f2SAndroid Build Coastguard Worker    # Converts the flatbuffer into the object class.
177*890232f2SAndroid Build Coastguard Worker    monster1 = _MONSTER.Monster.GetRootAs(b1.Bytes, b1.Head())
178*890232f2SAndroid Build Coastguard Worker    monsterT1 = _MONSTER.MonsterT.InitFromObj(monster1)
179*890232f2SAndroid Build Coastguard Worker
180*890232f2SAndroid Build Coastguard Worker    # Packs the object class into another flatbuffer.
181*890232f2SAndroid Build Coastguard Worker    b2 = flatbuffers.Builder(0)
182*890232f2SAndroid Build Coastguard Worker    b2.Finish(monsterT1.Pack(b2))
183*890232f2SAndroid Build Coastguard Worker    monster2 = _MONSTER.Monster.GetRootAs(b2.Bytes, b2.Head())
184*890232f2SAndroid Build Coastguard Worker    # Checks the default values.
185*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.Pos() is None)
186*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Mana(), 150)
187*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Hp(), 100)
188*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.Name() is None)
189*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Inventory(0), 0)
190*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.InventoryAsNumpy(), 0)
191*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.InventoryLength(), 0)
192*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.InventoryIsNone())
193*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.Color() is 8)
194*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.TestType(), 0)
195*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.Test() is None)
196*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.Test4(0) is None)
197*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Test4Length(), 0)
198*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.Test4IsNone())
199*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.Testarrayofstring(0) is '')
200*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.TestarrayofstringLength(), 0)
201*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.TestarrayofstringIsNone())
202*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.Testarrayoftables(0) is None)
203*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.TestarrayoftablesLength(), 0)
204*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.TestarrayoftablesIsNone())
205*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.Enemy() is None)
206*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Testnestedflatbuffer(0), 0)
207*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.TestnestedflatbufferAsNumpy(), 0)
208*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.TestnestedflatbufferLength(), 0)
209*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.TestnestedflatbufferIsNone())
210*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.Testempty() is None)
211*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.Testbool() is False)
212*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Testhashs32Fnv1(), 0)
213*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Testhashu32Fnv1(), 0)
214*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Testhashs64Fnv1(), 0)
215*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Testhashu64Fnv1(), 0)
216*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Testhashs32Fnv1a(), 0)
217*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Testhashu32Fnv1a(), 0)
218*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Testhashs64Fnv1a(), 0)
219*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Testhashu64Fnv1a(), 0)
220*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Testarrayofbools(0), 0)
221*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.TestarrayofboolsAsNumpy(), 0)
222*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.TestarrayofboolsLength(), 0)
223*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.TestarrayofboolsIsNone())
224*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Testf(), 3.14159)
225*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Testf2(), 3.0)
226*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Testf3(), 0.0)
227*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.Testarrayofstring2(0) is '')
228*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Testarrayofstring2Length(), 0)
229*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.Testarrayofstring2IsNone())
230*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.Testarrayofsortedstruct(0) is None)
231*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.TestarrayofsortedstructLength(), 0)
232*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.TestarrayofsortedstructIsNone())
233*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Flex(0), 0)
234*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.FlexAsNumpy(), 0)
235*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.FlexLength(), 0)
236*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.FlexIsNone())
237*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.Test5(0) is None)
238*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.Test5Length(), 0)
239*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.Test5IsNone())
240*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfLongs(0), 0)
241*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfLongsAsNumpy(), 0)
242*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfLongsLength(), 0)
243*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.VectorOfLongsIsNone())
244*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfDoubles(0), 0)
245*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfDoublesAsNumpy(), 0)
246*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfDoublesLength(), 0)
247*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.VectorOfDoublesIsNone())
248*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.ParentNamespaceTest() is None)
249*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.VectorOfReferrables(0) is None)
250*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfReferrablesLength(), 0)
251*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.VectorOfReferrablesIsNone())
252*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.SingleWeakReference(), 0)
253*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfWeakReferences(0), 0)
254*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfWeakReferencesAsNumpy(), 0)
255*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfWeakReferencesLength(), 0)
256*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.VectorOfWeakReferencesIsNone())
257*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.VectorOfStrongReferrables(0) is None)
258*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfStrongReferrablesLength(), 0)
259*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.VectorOfStrongReferrablesIsNone())
260*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.CoOwningReference(), 0)
261*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfCoOwningReferences(0), 0)
262*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfCoOwningReferencesAsNumpy(), 0)
263*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfCoOwningReferencesLength(), 0)
264*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.VectorOfCoOwningReferencesIsNone())
265*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.NonOwningReference(), 0)
266*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfNonOwningReferences(0), 0)
267*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfNonOwningReferencesAsNumpy(), 0)
268*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfNonOwningReferencesLength(), 0)
269*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.VectorOfNonOwningReferencesIsNone())
270*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.AnyUniqueType(), 0)
271*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.AnyUnique() is None)
272*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.AnyAmbiguousType(), 0)
273*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.AnyAmbiguous() is None)
274*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfEnums(0), 0)
275*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfEnumsAsNumpy(), 0)
276*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster2.VectorOfEnumsLength(), 0)
277*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster2.VectorOfEnumsIsNone())
278*890232f2SAndroid Build Coastguard Worker
279*890232f2SAndroid Build Coastguard Worker  def test_optional_scalars_with_pack_and_unpack(self):
280*890232f2SAndroid Build Coastguard Worker    """ Serializes and deserializes between a buffer with optional values (no
281*890232f2SAndroid Build Coastguard Worker        specific values are filled when the buffer is created) and its python
282*890232f2SAndroid Build Coastguard Worker        object.
283*890232f2SAndroid Build Coastguard Worker    """
284*890232f2SAndroid Build Coastguard Worker    # Creates a flatbuffer with optional values.
285*890232f2SAndroid Build Coastguard Worker    b1 = flatbuffers.Builder(0)
286*890232f2SAndroid Build Coastguard Worker    optional_scalars.ScalarStuff.ScalarStuffStart(b1)
287*890232f2SAndroid Build Coastguard Worker    gen_opt = optional_scalars.ScalarStuff.ScalarStuffEnd(b1)
288*890232f2SAndroid Build Coastguard Worker    b1.Finish(gen_opt)
289*890232f2SAndroid Build Coastguard Worker
290*890232f2SAndroid Build Coastguard Worker    # Converts the flatbuffer into the object class.
291*890232f2SAndroid Build Coastguard Worker    opts1 = optional_scalars.ScalarStuff.ScalarStuff.GetRootAs(b1.Bytes, b1.Head())
292*890232f2SAndroid Build Coastguard Worker    optsT1 = optional_scalars.ScalarStuff.ScalarStuffT.InitFromObj(opts1)
293*890232f2SAndroid Build Coastguard Worker
294*890232f2SAndroid Build Coastguard Worker    # Packs the object class into another flatbuffer.
295*890232f2SAndroid Build Coastguard Worker    b2 = flatbuffers.Builder(0)
296*890232f2SAndroid Build Coastguard Worker    b2.Finish(optsT1.Pack(b2))
297*890232f2SAndroid Build Coastguard Worker    opts2 = optional_scalars.ScalarStuff.ScalarStuff.GetRootAs(b2.Bytes, b2.Head())
298*890232f2SAndroid Build Coastguard Worker    optsT2 = optional_scalars.ScalarStuff.ScalarStuffT.InitFromObj(opts2)
299*890232f2SAndroid Build Coastguard Worker    # Checks the default values.
300*890232f2SAndroid Build Coastguard Worker    self.assertTrue(opts2.JustI8() == 0)
301*890232f2SAndroid Build Coastguard Worker    self.assertTrue(opts2.MaybeF32() is None)
302*890232f2SAndroid Build Coastguard Worker    self.assertTrue(opts2.DefaultBool() is True)
303*890232f2SAndroid Build Coastguard Worker    self.assertTrue(optsT2.justU16 == 0)
304*890232f2SAndroid Build Coastguard Worker    self.assertTrue(optsT2.maybeEnum is None)
305*890232f2SAndroid Build Coastguard Worker    self.assertTrue(optsT2.defaultU64 == 42)
306*890232f2SAndroid Build Coastguard Worker
307*890232f2SAndroid Build Coastguard Worker
308*890232f2SAndroid Build Coastguard Worker
309*890232f2SAndroid Build Coastguard Workerclass TestAllMutableCodePathsOfExampleSchema(unittest.TestCase):
310*890232f2SAndroid Build Coastguard Worker  """ Tests the object API generated for monster_test.fbs for mutation
311*890232f2SAndroid Build Coastguard Worker
312*890232f2SAndroid Build Coastguard Worker        purposes. In each test, the default values will be changed through the
313*890232f2SAndroid Build Coastguard Worker        object API. We'll then pack the object class into the buf class and read
314*890232f2SAndroid Build Coastguard Worker        the updated values out from it to validate if the values are mutated as
315*890232f2SAndroid Build Coastguard Worker        expected.
316*890232f2SAndroid Build Coastguard Worker  """
317*890232f2SAndroid Build Coastguard Worker
318*890232f2SAndroid Build Coastguard Worker  def setUp(self, *args, **kwargs):
319*890232f2SAndroid Build Coastguard Worker    super(TestAllMutableCodePathsOfExampleSchema, self).setUp(*args, **kwargs)
320*890232f2SAndroid Build Coastguard Worker    # Creates an empty monster flatbuffer, and loads it into the object
321*890232f2SAndroid Build Coastguard Worker    # class for future tests.
322*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
323*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b)
324*890232f2SAndroid Build Coastguard Worker    self.monsterT = self._create_and_load_object_class(b)
325*890232f2SAndroid Build Coastguard Worker
326*890232f2SAndroid Build Coastguard Worker  def _pack_and_load_buf_class(self, monsterT):
327*890232f2SAndroid Build Coastguard Worker    """ Packs the object class into a flatbuffer and loads it into a buf
328*890232f2SAndroid Build Coastguard Worker
329*890232f2SAndroid Build Coastguard Worker        class.
330*890232f2SAndroid Build Coastguard Worker    """
331*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
332*890232f2SAndroid Build Coastguard Worker    b.Finish(monsterT.Pack(b))
333*890232f2SAndroid Build Coastguard Worker    monster = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())
334*890232f2SAndroid Build Coastguard Worker    return monster
335*890232f2SAndroid Build Coastguard Worker
336*890232f2SAndroid Build Coastguard Worker  def _create_and_load_object_class(self, b):
337*890232f2SAndroid Build Coastguard Worker    """ Finishs the creation of a monster flatbuffer and loads it into an
338*890232f2SAndroid Build Coastguard Worker
339*890232f2SAndroid Build Coastguard Worker        object class.
340*890232f2SAndroid Build Coastguard Worker    """
341*890232f2SAndroid Build Coastguard Worker    gen_mon = _MONSTER.MonsterEnd(b)
342*890232f2SAndroid Build Coastguard Worker    b.Finish(gen_mon)
343*890232f2SAndroid Build Coastguard Worker    monster = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())
344*890232f2SAndroid Build Coastguard Worker    monsterT = _MONSTER.MonsterT()
345*890232f2SAndroid Build Coastguard Worker    monsterT.InitFromObj(monster)
346*890232f2SAndroid Build Coastguard Worker    return monsterT
347*890232f2SAndroid Build Coastguard Worker
348*890232f2SAndroid Build Coastguard Worker  def test_mutate_pos(self):
349*890232f2SAndroid Build Coastguard Worker    posT = _VEC3.Vec3T()
350*890232f2SAndroid Build Coastguard Worker    posT.x = 4.0
351*890232f2SAndroid Build Coastguard Worker    posT.y = 5.0
352*890232f2SAndroid Build Coastguard Worker    posT.z = 6.0
353*890232f2SAndroid Build Coastguard Worker    posT.test1 = 6.0
354*890232f2SAndroid Build Coastguard Worker    posT.test2 = 7
355*890232f2SAndroid Build Coastguard Worker    test3T = _TEST.TestT()
356*890232f2SAndroid Build Coastguard Worker    test3T.a = 8
357*890232f2SAndroid Build Coastguard Worker    test3T.b = 9
358*890232f2SAndroid Build Coastguard Worker    posT.test3 = test3T
359*890232f2SAndroid Build Coastguard Worker    self.monsterT.pos = posT
360*890232f2SAndroid Build Coastguard Worker
361*890232f2SAndroid Build Coastguard Worker    # Packs the updated values.
362*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
363*890232f2SAndroid Build Coastguard Worker
364*890232f2SAndroid Build Coastguard Worker    # Checks if values are loaded correctly into the object class.
365*890232f2SAndroid Build Coastguard Worker    pos = monster.Pos()
366*890232f2SAndroid Build Coastguard Worker
367*890232f2SAndroid Build Coastguard Worker    # Verifies the properties of the Vec3.
368*890232f2SAndroid Build Coastguard Worker    self.assertEqual(pos.X(), 4.0)
369*890232f2SAndroid Build Coastguard Worker    self.assertEqual(pos.Y(), 5.0)
370*890232f2SAndroid Build Coastguard Worker    self.assertEqual(pos.Z(), 6.0)
371*890232f2SAndroid Build Coastguard Worker    self.assertEqual(pos.Test1(), 6.0)
372*890232f2SAndroid Build Coastguard Worker    self.assertEqual(pos.Test2(), 7)
373*890232f2SAndroid Build Coastguard Worker    t3 = _TEST.Test()
374*890232f2SAndroid Build Coastguard Worker    t3 = pos.Test3(t3)
375*890232f2SAndroid Build Coastguard Worker    self.assertEqual(t3.A(), 8)
376*890232f2SAndroid Build Coastguard Worker    self.assertEqual(t3.B(), 9)
377*890232f2SAndroid Build Coastguard Worker
378*890232f2SAndroid Build Coastguard Worker  def test_mutate_mana(self):
379*890232f2SAndroid Build Coastguard Worker    self.monsterT.mana = 200
380*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
381*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Mana(), 200)
382*890232f2SAndroid Build Coastguard Worker
383*890232f2SAndroid Build Coastguard Worker  def test_mutate_hp(self):
384*890232f2SAndroid Build Coastguard Worker    self.monsterT.hp = 200
385*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
386*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Hp(), 200)
387*890232f2SAndroid Build Coastguard Worker
388*890232f2SAndroid Build Coastguard Worker  def test_mutate_name(self):
389*890232f2SAndroid Build Coastguard Worker    self.monsterT.name = 'MyMonster'
390*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
391*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Name(), b'MyMonster')
392*890232f2SAndroid Build Coastguard Worker
393*890232f2SAndroid Build Coastguard Worker  def test_mutate_inventory(self):
394*890232f2SAndroid Build Coastguard Worker    self.monsterT.inventory = [1, 7, 8]
395*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
396*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Inventory(0), 1)
397*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Inventory(1), 7)
398*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Inventory(2), 8)
399*890232f2SAndroid Build Coastguard Worker
400*890232f2SAndroid Build Coastguard Worker  def test_empty_inventory(self):
401*890232f2SAndroid Build Coastguard Worker    self.monsterT.inventory = []
402*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
403*890232f2SAndroid Build Coastguard Worker    self.assertFalse(monster.InventoryIsNone())
404*890232f2SAndroid Build Coastguard Worker
405*890232f2SAndroid Build Coastguard Worker  def test_mutate_color(self):
406*890232f2SAndroid Build Coastguard Worker    self.monsterT.color = _COLOR.Color.Red
407*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
408*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Color(), _COLOR.Color.Red)
409*890232f2SAndroid Build Coastguard Worker
410*890232f2SAndroid Build Coastguard Worker  def test_mutate_testtype(self):
411*890232f2SAndroid Build Coastguard Worker    self.monsterT.testType = _ANY.Any.Monster
412*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
413*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.TestType(), _ANY.Any.Monster)
414*890232f2SAndroid Build Coastguard Worker
415*890232f2SAndroid Build Coastguard Worker  def test_mutate_test(self):
416*890232f2SAndroid Build Coastguard Worker    testT = _MONSTER.MonsterT()
417*890232f2SAndroid Build Coastguard Worker    testT.hp = 200
418*890232f2SAndroid Build Coastguard Worker    self.monsterT.test = testT
419*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
420*890232f2SAndroid Build Coastguard Worker    # Initializes a Table from a union field Test(...).
421*890232f2SAndroid Build Coastguard Worker    table = monster.Test()
422*890232f2SAndroid Build Coastguard Worker
423*890232f2SAndroid Build Coastguard Worker    # Initializes a Monster from the Table from the union.
424*890232f2SAndroid Build Coastguard Worker    test_monster = _MONSTER.Monster()
425*890232f2SAndroid Build Coastguard Worker    test_monster.Init(table.Bytes, table.Pos)
426*890232f2SAndroid Build Coastguard Worker    self.assertEqual(test_monster.Hp(), 200)
427*890232f2SAndroid Build Coastguard Worker
428*890232f2SAndroid Build Coastguard Worker  def test_mutate_test4(self):
429*890232f2SAndroid Build Coastguard Worker    test0T = _TEST.TestT()
430*890232f2SAndroid Build Coastguard Worker    test0T.a = 10
431*890232f2SAndroid Build Coastguard Worker    test0T.b = 20
432*890232f2SAndroid Build Coastguard Worker    test1T = _TEST.TestT()
433*890232f2SAndroid Build Coastguard Worker    test1T.a = 30
434*890232f2SAndroid Build Coastguard Worker    test1T.b = 40
435*890232f2SAndroid Build Coastguard Worker    self.monsterT.test4 = [test0T, test1T]
436*890232f2SAndroid Build Coastguard Worker
437*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
438*890232f2SAndroid Build Coastguard Worker    test0 = monster.Test4(0)
439*890232f2SAndroid Build Coastguard Worker    self.assertEqual(test0.A(), 10)
440*890232f2SAndroid Build Coastguard Worker    self.assertEqual(test0.B(), 20)
441*890232f2SAndroid Build Coastguard Worker    test1 = monster.Test4(1)
442*890232f2SAndroid Build Coastguard Worker    self.assertEqual(test1.A(), 30)
443*890232f2SAndroid Build Coastguard Worker    self.assertEqual(test1.B(), 40)
444*890232f2SAndroid Build Coastguard Worker
445*890232f2SAndroid Build Coastguard Worker  def test_empty_test4(self):
446*890232f2SAndroid Build Coastguard Worker    self.monsterT.test4 = []
447*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
448*890232f2SAndroid Build Coastguard Worker    self.assertFalse(monster.Test4IsNone())
449*890232f2SAndroid Build Coastguard Worker
450*890232f2SAndroid Build Coastguard Worker  def test_mutate_testarrayofstring(self):
451*890232f2SAndroid Build Coastguard Worker    self.monsterT.testarrayofstring = []
452*890232f2SAndroid Build Coastguard Worker    self.monsterT.testarrayofstring.append('test1')
453*890232f2SAndroid Build Coastguard Worker    self.monsterT.testarrayofstring.append('test2')
454*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
455*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Testarrayofstring(0), b'test1')
456*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Testarrayofstring(1), b'test2')
457*890232f2SAndroid Build Coastguard Worker
458*890232f2SAndroid Build Coastguard Worker  def test_empty_testarrayofstring(self):
459*890232f2SAndroid Build Coastguard Worker    self.monsterT.testarrayofstring = []
460*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
461*890232f2SAndroid Build Coastguard Worker    self.assertFalse(monster.TestarrayofstringIsNone())
462*890232f2SAndroid Build Coastguard Worker
463*890232f2SAndroid Build Coastguard Worker  def test_mutate_testarrayoftables(self):
464*890232f2SAndroid Build Coastguard Worker    monsterT0 = _MONSTER.MonsterT()
465*890232f2SAndroid Build Coastguard Worker    monsterT0.hp = 200
466*890232f2SAndroid Build Coastguard Worker    monsterT1 = _MONSTER.MonsterT()
467*890232f2SAndroid Build Coastguard Worker    monsterT1.hp = 400
468*890232f2SAndroid Build Coastguard Worker    self.monsterT.testarrayoftables = []
469*890232f2SAndroid Build Coastguard Worker    self.monsterT.testarrayoftables.append(monsterT0)
470*890232f2SAndroid Build Coastguard Worker    self.monsterT.testarrayoftables.append(monsterT1)
471*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
472*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Testarrayoftables(0).Hp(), 200)
473*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Testarrayoftables(1).Hp(), 400)
474*890232f2SAndroid Build Coastguard Worker
475*890232f2SAndroid Build Coastguard Worker  def test_empty_testarrayoftables(self):
476*890232f2SAndroid Build Coastguard Worker    self.monsterT.testarrayoftables = []
477*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
478*890232f2SAndroid Build Coastguard Worker    self.assertFalse(monster.TestarrayoftablesIsNone())
479*890232f2SAndroid Build Coastguard Worker
480*890232f2SAndroid Build Coastguard Worker  def test_mutate_enemy(self):
481*890232f2SAndroid Build Coastguard Worker    monsterT = _MONSTER.MonsterT()
482*890232f2SAndroid Build Coastguard Worker    monsterT.hp = 200
483*890232f2SAndroid Build Coastguard Worker    self.monsterT.enemy = monsterT
484*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
485*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Enemy().Hp(), 200)
486*890232f2SAndroid Build Coastguard Worker
487*890232f2SAndroid Build Coastguard Worker  def test_mutate_testnestedflatbuffer(self):
488*890232f2SAndroid Build Coastguard Worker    self.monsterT.testnestedflatbuffer = [8, 2, 4]
489*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
490*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Testnestedflatbuffer(0), 8)
491*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Testnestedflatbuffer(1), 2)
492*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Testnestedflatbuffer(2), 4)
493*890232f2SAndroid Build Coastguard Worker
494*890232f2SAndroid Build Coastguard Worker  def test_empty_testnestedflatbuffer(self):
495*890232f2SAndroid Build Coastguard Worker    self.monsterT.testnestedflatbuffer = []
496*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
497*890232f2SAndroid Build Coastguard Worker    self.assertFalse(monster.TestnestedflatbufferIsNone())
498*890232f2SAndroid Build Coastguard Worker
499*890232f2SAndroid Build Coastguard Worker  def test_mutate_testbool(self):
500*890232f2SAndroid Build Coastguard Worker    self.monsterT.testbool = True
501*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
502*890232f2SAndroid Build Coastguard Worker    self.assertTrue(monster.Testbool())
503*890232f2SAndroid Build Coastguard Worker
504*890232f2SAndroid Build Coastguard Worker  def test_mutate_testhashes(self):
505*890232f2SAndroid Build Coastguard Worker    self.monsterT.testhashs32Fnv1 = 1
506*890232f2SAndroid Build Coastguard Worker    self.monsterT.testhashu32Fnv1 = 2
507*890232f2SAndroid Build Coastguard Worker    self.monsterT.testhashs64Fnv1 = 3
508*890232f2SAndroid Build Coastguard Worker    self.monsterT.testhashu64Fnv1 = 4
509*890232f2SAndroid Build Coastguard Worker    self.monsterT.testhashs32Fnv1a = 5
510*890232f2SAndroid Build Coastguard Worker    self.monsterT.testhashu32Fnv1a = 6
511*890232f2SAndroid Build Coastguard Worker    self.monsterT.testhashs64Fnv1a = 7
512*890232f2SAndroid Build Coastguard Worker    self.monsterT.testhashu64Fnv1a = 8
513*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
514*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Testhashs32Fnv1(), 1)
515*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Testhashu32Fnv1(), 2)
516*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Testhashs64Fnv1(), 3)
517*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Testhashu64Fnv1(), 4)
518*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Testhashs32Fnv1a(), 5)
519*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Testhashu32Fnv1a(), 6)
520*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Testhashs64Fnv1a(), 7)
521*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Testhashu64Fnv1a(), 8)
522*890232f2SAndroid Build Coastguard Worker
523*890232f2SAndroid Build Coastguard Worker  def test_mutate_testarrayofbools(self):
524*890232f2SAndroid Build Coastguard Worker    self.monsterT.testarrayofbools = []
525*890232f2SAndroid Build Coastguard Worker    self.monsterT.testarrayofbools.append(True)
526*890232f2SAndroid Build Coastguard Worker    self.monsterT.testarrayofbools.append(True)
527*890232f2SAndroid Build Coastguard Worker    self.monsterT.testarrayofbools.append(False)
528*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
529*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Testarrayofbools(0), True)
530*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Testarrayofbools(1), True)
531*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Testarrayofbools(2), False)
532*890232f2SAndroid Build Coastguard Worker
533*890232f2SAndroid Build Coastguard Worker  def test_empty_testarrayofbools(self):
534*890232f2SAndroid Build Coastguard Worker    self.monsterT.testarrayofbools = []
535*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
536*890232f2SAndroid Build Coastguard Worker    self.assertFalse(monster.TestarrayofboolsIsNone())
537*890232f2SAndroid Build Coastguard Worker
538*890232f2SAndroid Build Coastguard Worker  def test_mutate_testf(self):
539*890232f2SAndroid Build Coastguard Worker    self.monsterT.testf = 2.0
540*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
541*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.Testf(), 2.0)
542*890232f2SAndroid Build Coastguard Worker
543*890232f2SAndroid Build Coastguard Worker  def test_mutate_vectoroflongs(self):
544*890232f2SAndroid Build Coastguard Worker    self.monsterT.vectorOfLongs = []
545*890232f2SAndroid Build Coastguard Worker    self.monsterT.vectorOfLongs.append(1)
546*890232f2SAndroid Build Coastguard Worker    self.monsterT.vectorOfLongs.append(100)
547*890232f2SAndroid Build Coastguard Worker    self.monsterT.vectorOfLongs.append(10000)
548*890232f2SAndroid Build Coastguard Worker    self.monsterT.vectorOfLongs.append(1000000)
549*890232f2SAndroid Build Coastguard Worker    self.monsterT.vectorOfLongs.append(100000000)
550*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
551*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.VectorOfLongs(0), 1)
552*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.VectorOfLongs(1), 100)
553*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.VectorOfLongs(2), 10000)
554*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.VectorOfLongs(3), 1000000)
555*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.VectorOfLongs(4), 100000000)
556*890232f2SAndroid Build Coastguard Worker
557*890232f2SAndroid Build Coastguard Worker  def test_empty_vectoroflongs(self):
558*890232f2SAndroid Build Coastguard Worker    self.monsterT.vectorOfLongs = []
559*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
560*890232f2SAndroid Build Coastguard Worker    self.assertFalse(monster.VectorOfLongsIsNone())
561*890232f2SAndroid Build Coastguard Worker
562*890232f2SAndroid Build Coastguard Worker  def test_mutate_vectorofdoubles(self):
563*890232f2SAndroid Build Coastguard Worker    self.monsterT.vectorOfDoubles = []
564*890232f2SAndroid Build Coastguard Worker    self.monsterT.vectorOfDoubles.append(-1.7976931348623157e+308)
565*890232f2SAndroid Build Coastguard Worker    self.monsterT.vectorOfDoubles.append(0)
566*890232f2SAndroid Build Coastguard Worker    self.monsterT.vectorOfDoubles.append(1.7976931348623157e+308)
567*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
568*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.VectorOfDoubles(0), -1.7976931348623157e+308)
569*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.VectorOfDoubles(1), 0)
570*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.VectorOfDoubles(2), 1.7976931348623157e+308)
571*890232f2SAndroid Build Coastguard Worker
572*890232f2SAndroid Build Coastguard Worker  def test_empty_vectorofdoubles(self):
573*890232f2SAndroid Build Coastguard Worker    self.monsterT.vectorOfDoubles = []
574*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
575*890232f2SAndroid Build Coastguard Worker    self.assertFalse(monster.VectorOfDoublesIsNone())
576*890232f2SAndroid Build Coastguard Worker
577*890232f2SAndroid Build Coastguard Worker  def test_mutate_parentnamespacetest(self):
578*890232f2SAndroid Build Coastguard Worker    self.monsterT.parentNamespaceTest = _IN_PARENT_NAMESPACE.InParentNamespaceT(
579*890232f2SAndroid Build Coastguard Worker    )
580*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
581*890232f2SAndroid Build Coastguard Worker    self.assertTrue(
582*890232f2SAndroid Build Coastguard Worker        isinstance(monster.ParentNamespaceTest(),
583*890232f2SAndroid Build Coastguard Worker                   _IN_PARENT_NAMESPACE.InParentNamespace))
584*890232f2SAndroid Build Coastguard Worker
585*890232f2SAndroid Build Coastguard Worker  def test_mutate_vectorofEnums(self):
586*890232f2SAndroid Build Coastguard Worker    self.monsterT.vectorOfEnums = []
587*890232f2SAndroid Build Coastguard Worker    self.monsterT.vectorOfEnums.append(_COLOR.Color.Red)
588*890232f2SAndroid Build Coastguard Worker    self.monsterT.vectorOfEnums.append(_COLOR.Color.Blue)
589*890232f2SAndroid Build Coastguard Worker    self.monsterT.vectorOfEnums.append(_COLOR.Color.Red)
590*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
591*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.VectorOfEnums(0), _COLOR.Color.Red)
592*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.VectorOfEnums(1), _COLOR.Color.Blue)
593*890232f2SAndroid Build Coastguard Worker    self.assertEqual(monster.VectorOfEnums(2), _COLOR.Color.Red)
594*890232f2SAndroid Build Coastguard Worker
595*890232f2SAndroid Build Coastguard Worker  def test_empty_vectorofEnums(self):
596*890232f2SAndroid Build Coastguard Worker    self.monsterT.vectorOfEnums = []
597*890232f2SAndroid Build Coastguard Worker    monster = self._pack_and_load_buf_class(self.monsterT)
598*890232f2SAndroid Build Coastguard Worker    self.assertFalse(monster.VectorOfEnumsIsNone())
599*890232f2SAndroid Build Coastguard Worker
600*890232f2SAndroid Build Coastguard Worker
601*890232f2SAndroid Build Coastguard Workerdef CheckReadBuffer(buf, offset, sizePrefix=False, file_identifier=None):
602*890232f2SAndroid Build Coastguard Worker  """ CheckReadBuffer checks that the given buffer is evaluated correctly
603*890232f2SAndroid Build Coastguard Worker
604*890232f2SAndroid Build Coastguard Worker        as the example Monster.
605*890232f2SAndroid Build Coastguard Worker  """
606*890232f2SAndroid Build Coastguard Worker
607*890232f2SAndroid Build Coastguard Worker  def asserter(stmt):
608*890232f2SAndroid Build Coastguard Worker    """ An assertion helper that is separated from TestCase classes. """
609*890232f2SAndroid Build Coastguard Worker    if not stmt:
610*890232f2SAndroid Build Coastguard Worker      raise AssertionError('CheckReadBuffer case failed')
611*890232f2SAndroid Build Coastguard Worker
612*890232f2SAndroid Build Coastguard Worker  if file_identifier:
613*890232f2SAndroid Build Coastguard Worker    # test prior to removal of size_prefix
614*890232f2SAndroid Build Coastguard Worker    asserter(
615*890232f2SAndroid Build Coastguard Worker        util.GetBufferIdentifier(buf, offset, size_prefixed=sizePrefix) ==
616*890232f2SAndroid Build Coastguard Worker        file_identifier)
617*890232f2SAndroid Build Coastguard Worker    asserter(
618*890232f2SAndroid Build Coastguard Worker        util.BufferHasIdentifier(
619*890232f2SAndroid Build Coastguard Worker            buf,
620*890232f2SAndroid Build Coastguard Worker            offset,
621*890232f2SAndroid Build Coastguard Worker            file_identifier=file_identifier,
622*890232f2SAndroid Build Coastguard Worker            size_prefixed=sizePrefix))
623*890232f2SAndroid Build Coastguard Worker    asserter(
624*890232f2SAndroid Build Coastguard Worker        _MONSTER.Monster.MonsterBufferHasIdentifier(
625*890232f2SAndroid Build Coastguard Worker            buf, offset, size_prefixed=sizePrefix))
626*890232f2SAndroid Build Coastguard Worker  if sizePrefix:
627*890232f2SAndroid Build Coastguard Worker    size = util.GetSizePrefix(buf, offset)
628*890232f2SAndroid Build Coastguard Worker    asserter(size == len(buf[offset:]) - 4)
629*890232f2SAndroid Build Coastguard Worker    buf, offset = util.RemoveSizePrefix(buf, offset)
630*890232f2SAndroid Build Coastguard Worker  if file_identifier:
631*890232f2SAndroid Build Coastguard Worker    asserter(_MONSTER.Monster.MonsterBufferHasIdentifier(buf, offset))
632*890232f2SAndroid Build Coastguard Worker  else:
633*890232f2SAndroid Build Coastguard Worker    asserter(not _MONSTER.Monster.MonsterBufferHasIdentifier(buf, offset))
634*890232f2SAndroid Build Coastguard Worker  monster = _MONSTER.Monster.GetRootAs(buf, offset)
635*890232f2SAndroid Build Coastguard Worker
636*890232f2SAndroid Build Coastguard Worker  asserter(monster.Hp() == 80)
637*890232f2SAndroid Build Coastguard Worker  asserter(monster.Mana() == 150)
638*890232f2SAndroid Build Coastguard Worker  asserter(monster.Name() == b'MyMonster')
639*890232f2SAndroid Build Coastguard Worker
640*890232f2SAndroid Build Coastguard Worker  # initialize a Vec3 from Pos()
641*890232f2SAndroid Build Coastguard Worker  vec = monster.Pos()
642*890232f2SAndroid Build Coastguard Worker  asserter(vec is not None)
643*890232f2SAndroid Build Coastguard Worker
644*890232f2SAndroid Build Coastguard Worker  # verify the properties of the Vec3
645*890232f2SAndroid Build Coastguard Worker  asserter(vec.X() == 1.0)
646*890232f2SAndroid Build Coastguard Worker  asserter(vec.Y() == 2.0)
647*890232f2SAndroid Build Coastguard Worker  asserter(vec.Z() == 3.0)
648*890232f2SAndroid Build Coastguard Worker  asserter(vec.Test1() == 3.0)
649*890232f2SAndroid Build Coastguard Worker  asserter(vec.Test2() == 2)
650*890232f2SAndroid Build Coastguard Worker
651*890232f2SAndroid Build Coastguard Worker  # initialize a Test from Test3(...)
652*890232f2SAndroid Build Coastguard Worker  t = _TEST.Test()
653*890232f2SAndroid Build Coastguard Worker  t = vec.Test3(t)
654*890232f2SAndroid Build Coastguard Worker  asserter(t is not None)
655*890232f2SAndroid Build Coastguard Worker
656*890232f2SAndroid Build Coastguard Worker  # verify the properties of the Test
657*890232f2SAndroid Build Coastguard Worker  asserter(t.A() == 5)
658*890232f2SAndroid Build Coastguard Worker  asserter(t.B() == 6)
659*890232f2SAndroid Build Coastguard Worker
660*890232f2SAndroid Build Coastguard Worker  # verify that the enum code matches the enum declaration:
661*890232f2SAndroid Build Coastguard Worker  union_type = _ANY.Any
662*890232f2SAndroid Build Coastguard Worker  asserter(monster.TestType() == union_type.Monster)
663*890232f2SAndroid Build Coastguard Worker
664*890232f2SAndroid Build Coastguard Worker  # initialize a Table from a union field Test(...)
665*890232f2SAndroid Build Coastguard Worker  table2 = monster.Test()
666*890232f2SAndroid Build Coastguard Worker  asserter(type(table2) is flatbuffers.table.Table)
667*890232f2SAndroid Build Coastguard Worker
668*890232f2SAndroid Build Coastguard Worker  # initialize a Monster from the Table from the union
669*890232f2SAndroid Build Coastguard Worker  monster2 = _MONSTER.Monster()
670*890232f2SAndroid Build Coastguard Worker  monster2.Init(table2.Bytes, table2.Pos)
671*890232f2SAndroid Build Coastguard Worker
672*890232f2SAndroid Build Coastguard Worker  asserter(monster2.Name() == b'Fred')
673*890232f2SAndroid Build Coastguard Worker
674*890232f2SAndroid Build Coastguard Worker  # iterate through the first monster's inventory:
675*890232f2SAndroid Build Coastguard Worker  asserter(monster.InventoryLength() == 5)
676*890232f2SAndroid Build Coastguard Worker  asserter(not monster.InventoryIsNone())
677*890232f2SAndroid Build Coastguard Worker
678*890232f2SAndroid Build Coastguard Worker  invsum = 0
679*890232f2SAndroid Build Coastguard Worker  for i in compat_range(monster.InventoryLength()):
680*890232f2SAndroid Build Coastguard Worker    v = monster.Inventory(i)
681*890232f2SAndroid Build Coastguard Worker    invsum += int(v)
682*890232f2SAndroid Build Coastguard Worker  asserter(invsum == 10)
683*890232f2SAndroid Build Coastguard Worker
684*890232f2SAndroid Build Coastguard Worker  for i in range(5):
685*890232f2SAndroid Build Coastguard Worker    asserter(monster.VectorOfLongs(i) == 10**(i * 2))
686*890232f2SAndroid Build Coastguard Worker
687*890232f2SAndroid Build Coastguard Worker  asserter(not monster.VectorOfDoublesIsNone())
688*890232f2SAndroid Build Coastguard Worker  asserter(([-1.7976931348623157e+308, 0, 1.7976931348623157e+308] == [
689*890232f2SAndroid Build Coastguard Worker      monster.VectorOfDoubles(i) for i in range(monster.VectorOfDoublesLength())
690*890232f2SAndroid Build Coastguard Worker  ]))
691*890232f2SAndroid Build Coastguard Worker
692*890232f2SAndroid Build Coastguard Worker  try:
693*890232f2SAndroid Build Coastguard Worker    imp.find_module('numpy')
694*890232f2SAndroid Build Coastguard Worker    # if numpy exists, then we should be able to get the
695*890232f2SAndroid Build Coastguard Worker    # vector as a numpy array
696*890232f2SAndroid Build Coastguard Worker    import numpy as np
697*890232f2SAndroid Build Coastguard Worker
698*890232f2SAndroid Build Coastguard Worker    asserter(monster.InventoryAsNumpy().sum() == 10)
699*890232f2SAndroid Build Coastguard Worker    asserter(monster.InventoryAsNumpy().dtype == np.dtype('uint8'))
700*890232f2SAndroid Build Coastguard Worker
701*890232f2SAndroid Build Coastguard Worker    VectorOfLongs = monster.VectorOfLongsAsNumpy()
702*890232f2SAndroid Build Coastguard Worker    asserter(VectorOfLongs.dtype == np.dtype('int64'))
703*890232f2SAndroid Build Coastguard Worker    for i in range(5):
704*890232f2SAndroid Build Coastguard Worker      asserter(VectorOfLongs[i] == 10**(i * 2))
705*890232f2SAndroid Build Coastguard Worker
706*890232f2SAndroid Build Coastguard Worker    VectorOfDoubles = monster.VectorOfDoublesAsNumpy()
707*890232f2SAndroid Build Coastguard Worker    asserter(VectorOfDoubles.dtype == np.dtype('float64'))
708*890232f2SAndroid Build Coastguard Worker    asserter(VectorOfDoubles[0] == np.finfo('float64').min)
709*890232f2SAndroid Build Coastguard Worker    asserter(VectorOfDoubles[1] == 0.0)
710*890232f2SAndroid Build Coastguard Worker    asserter(VectorOfDoubles[2] == np.finfo('float64').max)
711*890232f2SAndroid Build Coastguard Worker
712*890232f2SAndroid Build Coastguard Worker  except ImportError:
713*890232f2SAndroid Build Coastguard Worker    # If numpy does not exist, trying to get vector as numpy
714*890232f2SAndroid Build Coastguard Worker    # array should raise NumpyRequiredForThisFeature. The way
715*890232f2SAndroid Build Coastguard Worker    # assertRaises has been implemented prevents us from
716*890232f2SAndroid Build Coastguard Worker    # asserting this error is raised outside of a test case.
717*890232f2SAndroid Build Coastguard Worker    pass
718*890232f2SAndroid Build Coastguard Worker
719*890232f2SAndroid Build Coastguard Worker  asserter(monster.Test4Length() == 2)
720*890232f2SAndroid Build Coastguard Worker  asserter(not monster.Test4IsNone())
721*890232f2SAndroid Build Coastguard Worker
722*890232f2SAndroid Build Coastguard Worker  # create a 'Test' object and populate it:
723*890232f2SAndroid Build Coastguard Worker  test0 = monster.Test4(0)
724*890232f2SAndroid Build Coastguard Worker  asserter(type(test0) is _TEST.Test)
725*890232f2SAndroid Build Coastguard Worker
726*890232f2SAndroid Build Coastguard Worker  test1 = monster.Test4(1)
727*890232f2SAndroid Build Coastguard Worker  asserter(type(test1) is _TEST.Test)
728*890232f2SAndroid Build Coastguard Worker
729*890232f2SAndroid Build Coastguard Worker  # the position of test0 and test1 are swapped in monsterdata_java_wire
730*890232f2SAndroid Build Coastguard Worker  # and monsterdata_test_wire, so ignore ordering
731*890232f2SAndroid Build Coastguard Worker  v0 = test0.A()
732*890232f2SAndroid Build Coastguard Worker  v1 = test0.B()
733*890232f2SAndroid Build Coastguard Worker  v2 = test1.A()
734*890232f2SAndroid Build Coastguard Worker  v3 = test1.B()
735*890232f2SAndroid Build Coastguard Worker  sumtest12 = int(v0) + int(v1) + int(v2) + int(v3)
736*890232f2SAndroid Build Coastguard Worker
737*890232f2SAndroid Build Coastguard Worker  asserter(sumtest12 == 100)
738*890232f2SAndroid Build Coastguard Worker
739*890232f2SAndroid Build Coastguard Worker  asserter(not monster.TestarrayofstringIsNone())
740*890232f2SAndroid Build Coastguard Worker  asserter(monster.TestarrayofstringLength() == 2)
741*890232f2SAndroid Build Coastguard Worker  asserter(monster.Testarrayofstring(0) == b'test1')
742*890232f2SAndroid Build Coastguard Worker  asserter(monster.Testarrayofstring(1) == b'test2')
743*890232f2SAndroid Build Coastguard Worker
744*890232f2SAndroid Build Coastguard Worker  asserter(monster.TestarrayoftablesIsNone())
745*890232f2SAndroid Build Coastguard Worker  asserter(monster.TestarrayoftablesLength() == 0)
746*890232f2SAndroid Build Coastguard Worker  asserter(monster.TestnestedflatbufferIsNone())
747*890232f2SAndroid Build Coastguard Worker  asserter(monster.TestnestedflatbufferLength() == 0)
748*890232f2SAndroid Build Coastguard Worker  asserter(monster.Testempty() is None)
749*890232f2SAndroid Build Coastguard Worker
750*890232f2SAndroid Build Coastguard Worker
751*890232f2SAndroid Build Coastguard Workerclass TestFuzz(unittest.TestCase):
752*890232f2SAndroid Build Coastguard Worker  """ Low level stress/fuzz test: serialize/deserialize a variety of
753*890232f2SAndroid Build Coastguard Worker
754*890232f2SAndroid Build Coastguard Worker        different kinds of data in different combinations
755*890232f2SAndroid Build Coastguard Worker  """
756*890232f2SAndroid Build Coastguard Worker
757*890232f2SAndroid Build Coastguard Worker  binary_type = compat.binary_types[0]  # this will always exist
758*890232f2SAndroid Build Coastguard Worker  ofInt32Bytes = binary_type([0x83, 0x33, 0x33, 0x33])
759*890232f2SAndroid Build Coastguard Worker  ofInt64Bytes = binary_type([0x84, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44])
760*890232f2SAndroid Build Coastguard Worker  overflowingInt32Val = flatbuffers.encode.Get(flatbuffers.packer.int32,
761*890232f2SAndroid Build Coastguard Worker                                               ofInt32Bytes, 0)
762*890232f2SAndroid Build Coastguard Worker  overflowingInt64Val = flatbuffers.encode.Get(flatbuffers.packer.int64,
763*890232f2SAndroid Build Coastguard Worker                                               ofInt64Bytes, 0)
764*890232f2SAndroid Build Coastguard Worker
765*890232f2SAndroid Build Coastguard Worker  # Values we're testing against: chosen to ensure no bits get chopped
766*890232f2SAndroid Build Coastguard Worker  # off anywhere, and also be different from eachother.
767*890232f2SAndroid Build Coastguard Worker  boolVal = True
768*890232f2SAndroid Build Coastguard Worker  int8Val = N.Int8Flags.py_type(-127)  # 0x81
769*890232f2SAndroid Build Coastguard Worker  uint8Val = N.Uint8Flags.py_type(0xFF)
770*890232f2SAndroid Build Coastguard Worker  int16Val = N.Int16Flags.py_type(-32222)  # 0x8222
771*890232f2SAndroid Build Coastguard Worker  uint16Val = N.Uint16Flags.py_type(0xFEEE)
772*890232f2SAndroid Build Coastguard Worker  int32Val = N.Int32Flags.py_type(overflowingInt32Val)
773*890232f2SAndroid Build Coastguard Worker  uint32Val = N.Uint32Flags.py_type(0xFDDDDDDD)
774*890232f2SAndroid Build Coastguard Worker  int64Val = N.Int64Flags.py_type(overflowingInt64Val)
775*890232f2SAndroid Build Coastguard Worker  uint64Val = N.Uint64Flags.py_type(0xFCCCCCCCCCCCCCCC)
776*890232f2SAndroid Build Coastguard Worker  # Python uses doubles, so force it here
777*890232f2SAndroid Build Coastguard Worker  float32Val = N.Float32Flags.py_type(ctypes.c_float(3.14159).value)
778*890232f2SAndroid Build Coastguard Worker  float64Val = N.Float64Flags.py_type(3.14159265359)
779*890232f2SAndroid Build Coastguard Worker
780*890232f2SAndroid Build Coastguard Worker  def test_fuzz(self):
781*890232f2SAndroid Build Coastguard Worker    return self.check_once(11, 100)
782*890232f2SAndroid Build Coastguard Worker
783*890232f2SAndroid Build Coastguard Worker  def check_once(self, fuzzFields, fuzzObjects):
784*890232f2SAndroid Build Coastguard Worker    testValuesMax = 11  # hardcoded to the number of scalar types
785*890232f2SAndroid Build Coastguard Worker
786*890232f2SAndroid Build Coastguard Worker    builder = flatbuffers.Builder(0)
787*890232f2SAndroid Build Coastguard Worker    l = LCG()
788*890232f2SAndroid Build Coastguard Worker
789*890232f2SAndroid Build Coastguard Worker    objects = [0 for _ in compat_range(fuzzObjects)]
790*890232f2SAndroid Build Coastguard Worker
791*890232f2SAndroid Build Coastguard Worker    # Generate fuzzObjects random objects each consisting of
792*890232f2SAndroid Build Coastguard Worker    # fuzzFields fields, each of a random type.
793*890232f2SAndroid Build Coastguard Worker    for i in compat_range(fuzzObjects):
794*890232f2SAndroid Build Coastguard Worker      builder.StartObject(fuzzFields)
795*890232f2SAndroid Build Coastguard Worker
796*890232f2SAndroid Build Coastguard Worker      for j in compat_range(fuzzFields):
797*890232f2SAndroid Build Coastguard Worker        choice = int(l.Next()) % testValuesMax
798*890232f2SAndroid Build Coastguard Worker        if choice == 0:
799*890232f2SAndroid Build Coastguard Worker          builder.PrependBoolSlot(int(j), self.boolVal, False)
800*890232f2SAndroid Build Coastguard Worker        elif choice == 1:
801*890232f2SAndroid Build Coastguard Worker          builder.PrependInt8Slot(int(j), self.int8Val, 0)
802*890232f2SAndroid Build Coastguard Worker        elif choice == 2:
803*890232f2SAndroid Build Coastguard Worker          builder.PrependUint8Slot(int(j), self.uint8Val, 0)
804*890232f2SAndroid Build Coastguard Worker        elif choice == 3:
805*890232f2SAndroid Build Coastguard Worker          builder.PrependInt16Slot(int(j), self.int16Val, 0)
806*890232f2SAndroid Build Coastguard Worker        elif choice == 4:
807*890232f2SAndroid Build Coastguard Worker          builder.PrependUint16Slot(int(j), self.uint16Val, 0)
808*890232f2SAndroid Build Coastguard Worker        elif choice == 5:
809*890232f2SAndroid Build Coastguard Worker          builder.PrependInt32Slot(int(j), self.int32Val, 0)
810*890232f2SAndroid Build Coastguard Worker        elif choice == 6:
811*890232f2SAndroid Build Coastguard Worker          builder.PrependUint32Slot(int(j), self.uint32Val, 0)
812*890232f2SAndroid Build Coastguard Worker        elif choice == 7:
813*890232f2SAndroid Build Coastguard Worker          builder.PrependInt64Slot(int(j), self.int64Val, 0)
814*890232f2SAndroid Build Coastguard Worker        elif choice == 8:
815*890232f2SAndroid Build Coastguard Worker          builder.PrependUint64Slot(int(j), self.uint64Val, 0)
816*890232f2SAndroid Build Coastguard Worker        elif choice == 9:
817*890232f2SAndroid Build Coastguard Worker          builder.PrependFloat32Slot(int(j), self.float32Val, 0)
818*890232f2SAndroid Build Coastguard Worker        elif choice == 10:
819*890232f2SAndroid Build Coastguard Worker          builder.PrependFloat64Slot(int(j), self.float64Val, 0)
820*890232f2SAndroid Build Coastguard Worker        else:
821*890232f2SAndroid Build Coastguard Worker          raise RuntimeError('unreachable')
822*890232f2SAndroid Build Coastguard Worker
823*890232f2SAndroid Build Coastguard Worker      off = builder.EndObject()
824*890232f2SAndroid Build Coastguard Worker
825*890232f2SAndroid Build Coastguard Worker      # store the offset from the end of the builder buffer,
826*890232f2SAndroid Build Coastguard Worker      # since it will keep growing:
827*890232f2SAndroid Build Coastguard Worker      objects[i] = off
828*890232f2SAndroid Build Coastguard Worker
829*890232f2SAndroid Build Coastguard Worker    # Do some bookkeeping to generate stats on fuzzes:
830*890232f2SAndroid Build Coastguard Worker    stats = defaultdict(int)
831*890232f2SAndroid Build Coastguard Worker
832*890232f2SAndroid Build Coastguard Worker    def check(table, desc, want, got):
833*890232f2SAndroid Build Coastguard Worker      stats[desc] += 1
834*890232f2SAndroid Build Coastguard Worker      self.assertEqual(want, got, '%s != %s, %s' % (want, got, desc))
835*890232f2SAndroid Build Coastguard Worker
836*890232f2SAndroid Build Coastguard Worker    l = LCG()  # Reset.
837*890232f2SAndroid Build Coastguard Worker
838*890232f2SAndroid Build Coastguard Worker    # Test that all objects we generated are readable and return the
839*890232f2SAndroid Build Coastguard Worker    # expected values. We generate random objects in the same order
840*890232f2SAndroid Build Coastguard Worker    # so this is deterministic.
841*890232f2SAndroid Build Coastguard Worker    for i in compat_range(fuzzObjects):
842*890232f2SAndroid Build Coastguard Worker
843*890232f2SAndroid Build Coastguard Worker      table = flatbuffers.table.Table(builder.Bytes,
844*890232f2SAndroid Build Coastguard Worker                                      len(builder.Bytes) - objects[i])
845*890232f2SAndroid Build Coastguard Worker
846*890232f2SAndroid Build Coastguard Worker      for j in compat_range(fuzzFields):
847*890232f2SAndroid Build Coastguard Worker        field_count = flatbuffers.builder.VtableMetadataFields + j
848*890232f2SAndroid Build Coastguard Worker        f = N.VOffsetTFlags.py_type(field_count * N.VOffsetTFlags.bytewidth)
849*890232f2SAndroid Build Coastguard Worker        choice = int(l.Next()) % testValuesMax
850*890232f2SAndroid Build Coastguard Worker
851*890232f2SAndroid Build Coastguard Worker        if choice == 0:
852*890232f2SAndroid Build Coastguard Worker          check(table, 'bool', self.boolVal,
853*890232f2SAndroid Build Coastguard Worker                table.GetSlot(f, False, N.BoolFlags))
854*890232f2SAndroid Build Coastguard Worker        elif choice == 1:
855*890232f2SAndroid Build Coastguard Worker          check(table, 'int8', self.int8Val, table.GetSlot(f, 0, N.Int8Flags))
856*890232f2SAndroid Build Coastguard Worker        elif choice == 2:
857*890232f2SAndroid Build Coastguard Worker          check(table, 'uint8', self.uint8Val,
858*890232f2SAndroid Build Coastguard Worker                table.GetSlot(f, 0, N.Uint8Flags))
859*890232f2SAndroid Build Coastguard Worker        elif choice == 3:
860*890232f2SAndroid Build Coastguard Worker          check(table, 'int16', self.int16Val,
861*890232f2SAndroid Build Coastguard Worker                table.GetSlot(f, 0, N.Int16Flags))
862*890232f2SAndroid Build Coastguard Worker        elif choice == 4:
863*890232f2SAndroid Build Coastguard Worker          check(table, 'uint16', self.uint16Val,
864*890232f2SAndroid Build Coastguard Worker                table.GetSlot(f, 0, N.Uint16Flags))
865*890232f2SAndroid Build Coastguard Worker        elif choice == 5:
866*890232f2SAndroid Build Coastguard Worker          check(table, 'int32', self.int32Val,
867*890232f2SAndroid Build Coastguard Worker                table.GetSlot(f, 0, N.Int32Flags))
868*890232f2SAndroid Build Coastguard Worker        elif choice == 6:
869*890232f2SAndroid Build Coastguard Worker          check(table, 'uint32', self.uint32Val,
870*890232f2SAndroid Build Coastguard Worker                table.GetSlot(f, 0, N.Uint32Flags))
871*890232f2SAndroid Build Coastguard Worker        elif choice == 7:
872*890232f2SAndroid Build Coastguard Worker          check(table, 'int64', self.int64Val,
873*890232f2SAndroid Build Coastguard Worker                table.GetSlot(f, 0, N.Int64Flags))
874*890232f2SAndroid Build Coastguard Worker        elif choice == 8:
875*890232f2SAndroid Build Coastguard Worker          check(table, 'uint64', self.uint64Val,
876*890232f2SAndroid Build Coastguard Worker                table.GetSlot(f, 0, N.Uint64Flags))
877*890232f2SAndroid Build Coastguard Worker        elif choice == 9:
878*890232f2SAndroid Build Coastguard Worker          check(table, 'float32', self.float32Val,
879*890232f2SAndroid Build Coastguard Worker                table.GetSlot(f, 0, N.Float32Flags))
880*890232f2SAndroid Build Coastguard Worker        elif choice == 10:
881*890232f2SAndroid Build Coastguard Worker          check(table, 'float64', self.float64Val,
882*890232f2SAndroid Build Coastguard Worker                table.GetSlot(f, 0, N.Float64Flags))
883*890232f2SAndroid Build Coastguard Worker        else:
884*890232f2SAndroid Build Coastguard Worker          raise RuntimeError('unreachable')
885*890232f2SAndroid Build Coastguard Worker
886*890232f2SAndroid Build Coastguard Worker    # If enough checks were made, verify that all scalar types were used:
887*890232f2SAndroid Build Coastguard Worker    self.assertEqual(testValuesMax, len(stats),
888*890232f2SAndroid Build Coastguard Worker                     'fuzzing failed to test all scalar types: %s' % stats)
889*890232f2SAndroid Build Coastguard Worker
890*890232f2SAndroid Build Coastguard Worker
891*890232f2SAndroid Build Coastguard Workerclass TestByteLayout(unittest.TestCase):
892*890232f2SAndroid Build Coastguard Worker  """ TestByteLayout checks the bytes of a Builder in various scenarios. """
893*890232f2SAndroid Build Coastguard Worker
894*890232f2SAndroid Build Coastguard Worker  def assertBuilderEquals(self, builder, want_chars_or_ints):
895*890232f2SAndroid Build Coastguard Worker
896*890232f2SAndroid Build Coastguard Worker    def integerize(x):
897*890232f2SAndroid Build Coastguard Worker      if isinstance(x, compat.string_types):
898*890232f2SAndroid Build Coastguard Worker        return ord(x)
899*890232f2SAndroid Build Coastguard Worker      return x
900*890232f2SAndroid Build Coastguard Worker
901*890232f2SAndroid Build Coastguard Worker    want_ints = list(map(integerize, want_chars_or_ints))
902*890232f2SAndroid Build Coastguard Worker    want = bytearray(want_ints)
903*890232f2SAndroid Build Coastguard Worker    got = builder.Bytes[builder.Head():]  # use the buffer directly
904*890232f2SAndroid Build Coastguard Worker    self.assertEqual(want, got)
905*890232f2SAndroid Build Coastguard Worker
906*890232f2SAndroid Build Coastguard Worker  def test_numbers(self):
907*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
908*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [])
909*890232f2SAndroid Build Coastguard Worker    b.PrependBool(True)
910*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [1])
911*890232f2SAndroid Build Coastguard Worker    b.PrependInt8(-127)
912*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [129, 1])
913*890232f2SAndroid Build Coastguard Worker    b.PrependUint8(255)
914*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [255, 129, 1])
915*890232f2SAndroid Build Coastguard Worker    b.PrependInt16(-32222)
916*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [0x22, 0x82, 0, 255, 129, 1])  # first pad
917*890232f2SAndroid Build Coastguard Worker    b.PrependUint16(0xFEEE)
918*890232f2SAndroid Build Coastguard Worker    # no pad this time:
919*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [0xEE, 0xFE, 0x22, 0x82, 0, 255, 129, 1])
920*890232f2SAndroid Build Coastguard Worker    b.PrependInt32(-53687092)
921*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(
922*890232f2SAndroid Build Coastguard Worker        b, [204, 204, 204, 252, 0xEE, 0xFE, 0x22, 0x82, 0, 255, 129, 1])
923*890232f2SAndroid Build Coastguard Worker    b.PrependUint32(0x98765432)
924*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [
925*890232f2SAndroid Build Coastguard Worker        0x32, 0x54, 0x76, 0x98, 204, 204, 204, 252, 0xEE, 0xFE, 0x22, 0x82, 0,
926*890232f2SAndroid Build Coastguard Worker        255, 129, 1
927*890232f2SAndroid Build Coastguard Worker    ])
928*890232f2SAndroid Build Coastguard Worker
929*890232f2SAndroid Build Coastguard Worker  def test_numbers64(self):
930*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
931*890232f2SAndroid Build Coastguard Worker    b.PrependUint64(0x1122334455667788)
932*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b,
933*890232f2SAndroid Build Coastguard Worker                             [0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11])
934*890232f2SAndroid Build Coastguard Worker
935*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
936*890232f2SAndroid Build Coastguard Worker    b.PrependInt64(0x1122334455667788)
937*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b,
938*890232f2SAndroid Build Coastguard Worker                             [0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11])
939*890232f2SAndroid Build Coastguard Worker
940*890232f2SAndroid Build Coastguard Worker  def test_1xbyte_vector(self):
941*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
942*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [])
943*890232f2SAndroid Build Coastguard Worker    b.StartVector(flatbuffers.number_types.Uint8Flags.bytewidth, 1, 1)
944*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [0, 0, 0])  # align to 4bytes
945*890232f2SAndroid Build Coastguard Worker    b.PrependByte(1)
946*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [1, 0, 0, 0])
947*890232f2SAndroid Build Coastguard Worker    b.EndVector()
948*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [1, 0, 0, 0, 1, 0, 0, 0])  # padding
949*890232f2SAndroid Build Coastguard Worker
950*890232f2SAndroid Build Coastguard Worker  def test_2xbyte_vector(self):
951*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
952*890232f2SAndroid Build Coastguard Worker    b.StartVector(flatbuffers.number_types.Uint8Flags.bytewidth, 2, 1)
953*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [0, 0])  # align to 4bytes
954*890232f2SAndroid Build Coastguard Worker    b.PrependByte(1)
955*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [1, 0, 0])
956*890232f2SAndroid Build Coastguard Worker    b.PrependByte(2)
957*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [2, 1, 0, 0])
958*890232f2SAndroid Build Coastguard Worker    b.EndVector()
959*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [2, 0, 0, 0, 2, 1, 0, 0])  # padding
960*890232f2SAndroid Build Coastguard Worker
961*890232f2SAndroid Build Coastguard Worker  def test_1xuint16_vector(self):
962*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
963*890232f2SAndroid Build Coastguard Worker    b.StartVector(flatbuffers.number_types.Uint16Flags.bytewidth, 1, 1)
964*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [0, 0])  # align to 4bytes
965*890232f2SAndroid Build Coastguard Worker    b.PrependUint16(1)
966*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [1, 0, 0, 0])
967*890232f2SAndroid Build Coastguard Worker    b.EndVector()
968*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [1, 0, 0, 0, 1, 0, 0, 0])  # padding
969*890232f2SAndroid Build Coastguard Worker
970*890232f2SAndroid Build Coastguard Worker  def test_2xuint16_vector(self):
971*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
972*890232f2SAndroid Build Coastguard Worker    b.StartVector(flatbuffers.number_types.Uint16Flags.bytewidth, 2, 1)
973*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [])  # align to 4bytes
974*890232f2SAndroid Build Coastguard Worker    b.PrependUint16(0xABCD)
975*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [0xCD, 0xAB])
976*890232f2SAndroid Build Coastguard Worker    b.PrependUint16(0xDCBA)
977*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [0xBA, 0xDC, 0xCD, 0xAB])
978*890232f2SAndroid Build Coastguard Worker    b.EndVector()
979*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [2, 0, 0, 0, 0xBA, 0xDC, 0xCD, 0xAB])
980*890232f2SAndroid Build Coastguard Worker
981*890232f2SAndroid Build Coastguard Worker  def test_create_ascii_string(self):
982*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
983*890232f2SAndroid Build Coastguard Worker    b.CreateString(u'foo', encoding='ascii')
984*890232f2SAndroid Build Coastguard Worker
985*890232f2SAndroid Build Coastguard Worker    # 0-terminated, no pad:
986*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [3, 0, 0, 0, 'f', 'o', 'o', 0])
987*890232f2SAndroid Build Coastguard Worker    b.CreateString(u'moop', encoding='ascii')
988*890232f2SAndroid Build Coastguard Worker    # 0-terminated, 3-byte pad:
989*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [
990*890232f2SAndroid Build Coastguard Worker        4, 0, 0, 0, 'm', 'o', 'o', 'p', 0, 0, 0, 0, 3, 0, 0, 0, 'f', 'o', 'o', 0
991*890232f2SAndroid Build Coastguard Worker    ])
992*890232f2SAndroid Build Coastguard Worker
993*890232f2SAndroid Build Coastguard Worker  def test_create_utf8_string(self):
994*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
995*890232f2SAndroid Build Coastguard Worker    b.CreateString(u'Цлїςσδε')
996*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, '\x0e\x00\x00\x00\xd0\xa6\xd0\xbb\xd1\x97' \
997*890232f2SAndroid Build Coastguard Worker        '\xcf\x82\xcf\x83\xce\xb4\xce\xb5\x00\x00')
998*890232f2SAndroid Build Coastguard Worker
999*890232f2SAndroid Build Coastguard Worker    b.CreateString(u'フムアムカモケモ')
1000*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, '\x18\x00\x00\x00\xef\xbe\x8c\xef\xbe\x91' \
1001*890232f2SAndroid Build Coastguard Worker        '\xef\xbd\xb1\xef\xbe\x91\xef\xbd\xb6\xef\xbe\x93\xef\xbd\xb9\xef' \
1002*890232f2SAndroid Build Coastguard Worker        '\xbe\x93\x00\x00\x00\x00\x0e\x00\x00\x00\xd0\xa6\xd0\xbb\xd1\x97' \
1003*890232f2SAndroid Build Coastguard Worker        '\xcf\x82\xcf\x83\xce\xb4\xce\xb5\x00\x00')
1004*890232f2SAndroid Build Coastguard Worker
1005*890232f2SAndroid Build Coastguard Worker  def test_create_arbitrary_string(self):
1006*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
1007*890232f2SAndroid Build Coastguard Worker    s = '\x01\x02\x03'
1008*890232f2SAndroid Build Coastguard Worker    b.CreateString(s)  # Default encoding is utf-8.
1009*890232f2SAndroid Build Coastguard Worker    # 0-terminated, no pad:
1010*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [3, 0, 0, 0, 1, 2, 3, 0])
1011*890232f2SAndroid Build Coastguard Worker    s2 = '\x04\x05\x06\x07'
1012*890232f2SAndroid Build Coastguard Worker    b.CreateString(s2)  # Default encoding is utf-8.
1013*890232f2SAndroid Build Coastguard Worker    # 0-terminated, 3-byte pad:
1014*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(
1015*890232f2SAndroid Build Coastguard Worker        b, [4, 0, 0, 0, 4, 5, 6, 7, 0, 0, 0, 0, 3, 0, 0, 0, 1, 2, 3, 0])
1016*890232f2SAndroid Build Coastguard Worker
1017*890232f2SAndroid Build Coastguard Worker  def test_create_byte_vector(self):
1018*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
1019*890232f2SAndroid Build Coastguard Worker    b.CreateByteVector(b'')
1020*890232f2SAndroid Build Coastguard Worker    # 0-byte pad:
1021*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [0, 0, 0, 0])
1022*890232f2SAndroid Build Coastguard Worker
1023*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
1024*890232f2SAndroid Build Coastguard Worker    b.CreateByteVector(b'\x01\x02\x03')
1025*890232f2SAndroid Build Coastguard Worker    # 1-byte pad:
1026*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [3, 0, 0, 0, 1, 2, 3, 0])
1027*890232f2SAndroid Build Coastguard Worker
1028*890232f2SAndroid Build Coastguard Worker  def test_create_numpy_vector_int8(self):
1029*890232f2SAndroid Build Coastguard Worker    try:
1030*890232f2SAndroid Build Coastguard Worker      imp.find_module('numpy')
1031*890232f2SAndroid Build Coastguard Worker      # if numpy exists, then we should be able to get the
1032*890232f2SAndroid Build Coastguard Worker      # vector as a numpy array
1033*890232f2SAndroid Build Coastguard Worker      import numpy as np
1034*890232f2SAndroid Build Coastguard Worker
1035*890232f2SAndroid Build Coastguard Worker      # Systems endian:
1036*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1037*890232f2SAndroid Build Coastguard Worker      x = np.array([1, 2, -3], dtype=np.int8)
1038*890232f2SAndroid Build Coastguard Worker      b.CreateNumpyVector(x)
1039*890232f2SAndroid Build Coastguard Worker      self.assertBuilderEquals(
1040*890232f2SAndroid Build Coastguard Worker          b,
1041*890232f2SAndroid Build Coastguard Worker          [
1042*890232f2SAndroid Build Coastguard Worker              3,
1043*890232f2SAndroid Build Coastguard Worker              0,
1044*890232f2SAndroid Build Coastguard Worker              0,
1045*890232f2SAndroid Build Coastguard Worker              0,  # vector length
1046*890232f2SAndroid Build Coastguard Worker              1,
1047*890232f2SAndroid Build Coastguard Worker              2,
1048*890232f2SAndroid Build Coastguard Worker              256 - 3,
1049*890232f2SAndroid Build Coastguard Worker              0  # vector value + padding
1050*890232f2SAndroid Build Coastguard Worker          ])
1051*890232f2SAndroid Build Coastguard Worker
1052*890232f2SAndroid Build Coastguard Worker      # Reverse endian:
1053*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1054*890232f2SAndroid Build Coastguard Worker      x_other_endian = x.byteswap().newbyteorder()
1055*890232f2SAndroid Build Coastguard Worker      b.CreateNumpyVector(x_other_endian)
1056*890232f2SAndroid Build Coastguard Worker      self.assertBuilderEquals(
1057*890232f2SAndroid Build Coastguard Worker          b,
1058*890232f2SAndroid Build Coastguard Worker          [
1059*890232f2SAndroid Build Coastguard Worker              3,
1060*890232f2SAndroid Build Coastguard Worker              0,
1061*890232f2SAndroid Build Coastguard Worker              0,
1062*890232f2SAndroid Build Coastguard Worker              0,  # vector length
1063*890232f2SAndroid Build Coastguard Worker              1,
1064*890232f2SAndroid Build Coastguard Worker              2,
1065*890232f2SAndroid Build Coastguard Worker              256 - 3,
1066*890232f2SAndroid Build Coastguard Worker              0  # vector value + padding
1067*890232f2SAndroid Build Coastguard Worker          ])
1068*890232f2SAndroid Build Coastguard Worker    except ImportError:
1069*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1070*890232f2SAndroid Build Coastguard Worker      x = 0
1071*890232f2SAndroid Build Coastguard Worker      assertRaises(self, lambda: b.CreateNumpyVector(x),
1072*890232f2SAndroid Build Coastguard Worker                   NumpyRequiredForThisFeature)
1073*890232f2SAndroid Build Coastguard Worker
1074*890232f2SAndroid Build Coastguard Worker  def test_create_numpy_vector_uint16(self):
1075*890232f2SAndroid Build Coastguard Worker    try:
1076*890232f2SAndroid Build Coastguard Worker      imp.find_module('numpy')
1077*890232f2SAndroid Build Coastguard Worker      # if numpy exists, then we should be able to get the
1078*890232f2SAndroid Build Coastguard Worker      # vector as a numpy array
1079*890232f2SAndroid Build Coastguard Worker      import numpy as np
1080*890232f2SAndroid Build Coastguard Worker
1081*890232f2SAndroid Build Coastguard Worker      # Systems endian:
1082*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1083*890232f2SAndroid Build Coastguard Worker      x = np.array([1, 2, 312], dtype=np.uint16)
1084*890232f2SAndroid Build Coastguard Worker      b.CreateNumpyVector(x)
1085*890232f2SAndroid Build Coastguard Worker      self.assertBuilderEquals(
1086*890232f2SAndroid Build Coastguard Worker          b,
1087*890232f2SAndroid Build Coastguard Worker          [
1088*890232f2SAndroid Build Coastguard Worker              3,
1089*890232f2SAndroid Build Coastguard Worker              0,
1090*890232f2SAndroid Build Coastguard Worker              0,
1091*890232f2SAndroid Build Coastguard Worker              0,  # vector length
1092*890232f2SAndroid Build Coastguard Worker              1,
1093*890232f2SAndroid Build Coastguard Worker              0,  # 1
1094*890232f2SAndroid Build Coastguard Worker              2,
1095*890232f2SAndroid Build Coastguard Worker              0,  # 2
1096*890232f2SAndroid Build Coastguard Worker              312 - 256,
1097*890232f2SAndroid Build Coastguard Worker              1,  # 312
1098*890232f2SAndroid Build Coastguard Worker              0,
1099*890232f2SAndroid Build Coastguard Worker              0  # padding
1100*890232f2SAndroid Build Coastguard Worker          ])
1101*890232f2SAndroid Build Coastguard Worker
1102*890232f2SAndroid Build Coastguard Worker      # Reverse endian:
1103*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1104*890232f2SAndroid Build Coastguard Worker      x_other_endian = x.byteswap().newbyteorder()
1105*890232f2SAndroid Build Coastguard Worker      b.CreateNumpyVector(x_other_endian)
1106*890232f2SAndroid Build Coastguard Worker      self.assertBuilderEquals(
1107*890232f2SAndroid Build Coastguard Worker          b,
1108*890232f2SAndroid Build Coastguard Worker          [
1109*890232f2SAndroid Build Coastguard Worker              3,
1110*890232f2SAndroid Build Coastguard Worker              0,
1111*890232f2SAndroid Build Coastguard Worker              0,
1112*890232f2SAndroid Build Coastguard Worker              0,  # vector length
1113*890232f2SAndroid Build Coastguard Worker              1,
1114*890232f2SAndroid Build Coastguard Worker              0,  # 1
1115*890232f2SAndroid Build Coastguard Worker              2,
1116*890232f2SAndroid Build Coastguard Worker              0,  # 2
1117*890232f2SAndroid Build Coastguard Worker              312 - 256,
1118*890232f2SAndroid Build Coastguard Worker              1,  # 312
1119*890232f2SAndroid Build Coastguard Worker              0,
1120*890232f2SAndroid Build Coastguard Worker              0  # padding
1121*890232f2SAndroid Build Coastguard Worker          ])
1122*890232f2SAndroid Build Coastguard Worker    except ImportError:
1123*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1124*890232f2SAndroid Build Coastguard Worker      x = 0
1125*890232f2SAndroid Build Coastguard Worker      assertRaises(self, lambda: b.CreateNumpyVector(x),
1126*890232f2SAndroid Build Coastguard Worker                   NumpyRequiredForThisFeature)
1127*890232f2SAndroid Build Coastguard Worker
1128*890232f2SAndroid Build Coastguard Worker  def test_create_numpy_vector_int64(self):
1129*890232f2SAndroid Build Coastguard Worker    try:
1130*890232f2SAndroid Build Coastguard Worker      imp.find_module('numpy')
1131*890232f2SAndroid Build Coastguard Worker      # if numpy exists, then we should be able to get the
1132*890232f2SAndroid Build Coastguard Worker      # vector as a numpy array
1133*890232f2SAndroid Build Coastguard Worker      import numpy as np
1134*890232f2SAndroid Build Coastguard Worker
1135*890232f2SAndroid Build Coastguard Worker      # Systems endian:
1136*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1137*890232f2SAndroid Build Coastguard Worker      x = np.array([1, 2, -12], dtype=np.int64)
1138*890232f2SAndroid Build Coastguard Worker      b.CreateNumpyVector(x)
1139*890232f2SAndroid Build Coastguard Worker      self.assertBuilderEquals(
1140*890232f2SAndroid Build Coastguard Worker          b,
1141*890232f2SAndroid Build Coastguard Worker          [
1142*890232f2SAndroid Build Coastguard Worker              3,
1143*890232f2SAndroid Build Coastguard Worker              0,
1144*890232f2SAndroid Build Coastguard Worker              0,
1145*890232f2SAndroid Build Coastguard Worker              0,  # vector length
1146*890232f2SAndroid Build Coastguard Worker              1,
1147*890232f2SAndroid Build Coastguard Worker              0,
1148*890232f2SAndroid Build Coastguard Worker              0,
1149*890232f2SAndroid Build Coastguard Worker              0,
1150*890232f2SAndroid Build Coastguard Worker              0,
1151*890232f2SAndroid Build Coastguard Worker              0,
1152*890232f2SAndroid Build Coastguard Worker              0,
1153*890232f2SAndroid Build Coastguard Worker              0,  # 1
1154*890232f2SAndroid Build Coastguard Worker              2,
1155*890232f2SAndroid Build Coastguard Worker              0,
1156*890232f2SAndroid Build Coastguard Worker              0,
1157*890232f2SAndroid Build Coastguard Worker              0,
1158*890232f2SAndroid Build Coastguard Worker              0,
1159*890232f2SAndroid Build Coastguard Worker              0,
1160*890232f2SAndroid Build Coastguard Worker              0,
1161*890232f2SAndroid Build Coastguard Worker              0,  # 2
1162*890232f2SAndroid Build Coastguard Worker              256 - 12,
1163*890232f2SAndroid Build Coastguard Worker              255,
1164*890232f2SAndroid Build Coastguard Worker              255,
1165*890232f2SAndroid Build Coastguard Worker              255,
1166*890232f2SAndroid Build Coastguard Worker              255,
1167*890232f2SAndroid Build Coastguard Worker              255,
1168*890232f2SAndroid Build Coastguard Worker              255,
1169*890232f2SAndroid Build Coastguard Worker              255  # -12
1170*890232f2SAndroid Build Coastguard Worker          ])
1171*890232f2SAndroid Build Coastguard Worker
1172*890232f2SAndroid Build Coastguard Worker      # Reverse endian:
1173*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1174*890232f2SAndroid Build Coastguard Worker      x_other_endian = x.byteswap().newbyteorder()
1175*890232f2SAndroid Build Coastguard Worker      b.CreateNumpyVector(x_other_endian)
1176*890232f2SAndroid Build Coastguard Worker      self.assertBuilderEquals(
1177*890232f2SAndroid Build Coastguard Worker          b,
1178*890232f2SAndroid Build Coastguard Worker          [
1179*890232f2SAndroid Build Coastguard Worker              3,
1180*890232f2SAndroid Build Coastguard Worker              0,
1181*890232f2SAndroid Build Coastguard Worker              0,
1182*890232f2SAndroid Build Coastguard Worker              0,  # vector length
1183*890232f2SAndroid Build Coastguard Worker              1,
1184*890232f2SAndroid Build Coastguard Worker              0,
1185*890232f2SAndroid Build Coastguard Worker              0,
1186*890232f2SAndroid Build Coastguard Worker              0,
1187*890232f2SAndroid Build Coastguard Worker              0,
1188*890232f2SAndroid Build Coastguard Worker              0,
1189*890232f2SAndroid Build Coastguard Worker              0,
1190*890232f2SAndroid Build Coastguard Worker              0,  # 1
1191*890232f2SAndroid Build Coastguard Worker              2,
1192*890232f2SAndroid Build Coastguard Worker              0,
1193*890232f2SAndroid Build Coastguard Worker              0,
1194*890232f2SAndroid Build Coastguard Worker              0,
1195*890232f2SAndroid Build Coastguard Worker              0,
1196*890232f2SAndroid Build Coastguard Worker              0,
1197*890232f2SAndroid Build Coastguard Worker              0,
1198*890232f2SAndroid Build Coastguard Worker              0,  # 2
1199*890232f2SAndroid Build Coastguard Worker              256 - 12,
1200*890232f2SAndroid Build Coastguard Worker              255,
1201*890232f2SAndroid Build Coastguard Worker              255,
1202*890232f2SAndroid Build Coastguard Worker              255,
1203*890232f2SAndroid Build Coastguard Worker              255,
1204*890232f2SAndroid Build Coastguard Worker              255,
1205*890232f2SAndroid Build Coastguard Worker              255,
1206*890232f2SAndroid Build Coastguard Worker              255  # -12
1207*890232f2SAndroid Build Coastguard Worker          ])
1208*890232f2SAndroid Build Coastguard Worker
1209*890232f2SAndroid Build Coastguard Worker    except ImportError:
1210*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1211*890232f2SAndroid Build Coastguard Worker      x = 0
1212*890232f2SAndroid Build Coastguard Worker      assertRaises(self, lambda: b.CreateNumpyVector(x),
1213*890232f2SAndroid Build Coastguard Worker                   NumpyRequiredForThisFeature)
1214*890232f2SAndroid Build Coastguard Worker
1215*890232f2SAndroid Build Coastguard Worker  def test_create_numpy_vector_float32(self):
1216*890232f2SAndroid Build Coastguard Worker    try:
1217*890232f2SAndroid Build Coastguard Worker      imp.find_module('numpy')
1218*890232f2SAndroid Build Coastguard Worker      # if numpy exists, then we should be able to get the
1219*890232f2SAndroid Build Coastguard Worker      # vector as a numpy array
1220*890232f2SAndroid Build Coastguard Worker      import numpy as np
1221*890232f2SAndroid Build Coastguard Worker
1222*890232f2SAndroid Build Coastguard Worker      # Systems endian:
1223*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1224*890232f2SAndroid Build Coastguard Worker      x = np.array([1, 2, -12], dtype=np.float32)
1225*890232f2SAndroid Build Coastguard Worker      b.CreateNumpyVector(x)
1226*890232f2SAndroid Build Coastguard Worker      self.assertBuilderEquals(
1227*890232f2SAndroid Build Coastguard Worker          b,
1228*890232f2SAndroid Build Coastguard Worker          [
1229*890232f2SAndroid Build Coastguard Worker              3,
1230*890232f2SAndroid Build Coastguard Worker              0,
1231*890232f2SAndroid Build Coastguard Worker              0,
1232*890232f2SAndroid Build Coastguard Worker              0,  # vector length
1233*890232f2SAndroid Build Coastguard Worker              0,
1234*890232f2SAndroid Build Coastguard Worker              0,
1235*890232f2SAndroid Build Coastguard Worker              128,
1236*890232f2SAndroid Build Coastguard Worker              63,  # 1
1237*890232f2SAndroid Build Coastguard Worker              0,
1238*890232f2SAndroid Build Coastguard Worker              0,
1239*890232f2SAndroid Build Coastguard Worker              0,
1240*890232f2SAndroid Build Coastguard Worker              64,  # 2
1241*890232f2SAndroid Build Coastguard Worker              0,
1242*890232f2SAndroid Build Coastguard Worker              0,
1243*890232f2SAndroid Build Coastguard Worker              64,
1244*890232f2SAndroid Build Coastguard Worker              193  # -12
1245*890232f2SAndroid Build Coastguard Worker          ])
1246*890232f2SAndroid Build Coastguard Worker
1247*890232f2SAndroid Build Coastguard Worker      # Reverse endian:
1248*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1249*890232f2SAndroid Build Coastguard Worker      x_other_endian = x.byteswap().newbyteorder()
1250*890232f2SAndroid Build Coastguard Worker      b.CreateNumpyVector(x_other_endian)
1251*890232f2SAndroid Build Coastguard Worker      self.assertBuilderEquals(
1252*890232f2SAndroid Build Coastguard Worker          b,
1253*890232f2SAndroid Build Coastguard Worker          [
1254*890232f2SAndroid Build Coastguard Worker              3,
1255*890232f2SAndroid Build Coastguard Worker              0,
1256*890232f2SAndroid Build Coastguard Worker              0,
1257*890232f2SAndroid Build Coastguard Worker              0,  # vector length
1258*890232f2SAndroid Build Coastguard Worker              0,
1259*890232f2SAndroid Build Coastguard Worker              0,
1260*890232f2SAndroid Build Coastguard Worker              128,
1261*890232f2SAndroid Build Coastguard Worker              63,  # 1
1262*890232f2SAndroid Build Coastguard Worker              0,
1263*890232f2SAndroid Build Coastguard Worker              0,
1264*890232f2SAndroid Build Coastguard Worker              0,
1265*890232f2SAndroid Build Coastguard Worker              64,  # 2
1266*890232f2SAndroid Build Coastguard Worker              0,
1267*890232f2SAndroid Build Coastguard Worker              0,
1268*890232f2SAndroid Build Coastguard Worker              64,
1269*890232f2SAndroid Build Coastguard Worker              193  # -12
1270*890232f2SAndroid Build Coastguard Worker          ])
1271*890232f2SAndroid Build Coastguard Worker
1272*890232f2SAndroid Build Coastguard Worker    except ImportError:
1273*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1274*890232f2SAndroid Build Coastguard Worker      x = 0
1275*890232f2SAndroid Build Coastguard Worker      assertRaises(self, lambda: b.CreateNumpyVector(x),
1276*890232f2SAndroid Build Coastguard Worker                   NumpyRequiredForThisFeature)
1277*890232f2SAndroid Build Coastguard Worker
1278*890232f2SAndroid Build Coastguard Worker  def test_create_numpy_vector_float64(self):
1279*890232f2SAndroid Build Coastguard Worker    try:
1280*890232f2SAndroid Build Coastguard Worker      imp.find_module('numpy')
1281*890232f2SAndroid Build Coastguard Worker      # if numpy exists, then we should be able to get the
1282*890232f2SAndroid Build Coastguard Worker      # vector as a numpy array
1283*890232f2SAndroid Build Coastguard Worker      import numpy as np
1284*890232f2SAndroid Build Coastguard Worker
1285*890232f2SAndroid Build Coastguard Worker      # Systems endian:
1286*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1287*890232f2SAndroid Build Coastguard Worker      x = np.array([1, 2, -12], dtype=np.float64)
1288*890232f2SAndroid Build Coastguard Worker      b.CreateNumpyVector(x)
1289*890232f2SAndroid Build Coastguard Worker      self.assertBuilderEquals(
1290*890232f2SAndroid Build Coastguard Worker          b,
1291*890232f2SAndroid Build Coastguard Worker          [
1292*890232f2SAndroid Build Coastguard Worker              3,
1293*890232f2SAndroid Build Coastguard Worker              0,
1294*890232f2SAndroid Build Coastguard Worker              0,
1295*890232f2SAndroid Build Coastguard Worker              0,  # vector length
1296*890232f2SAndroid Build Coastguard Worker              0,
1297*890232f2SAndroid Build Coastguard Worker              0,
1298*890232f2SAndroid Build Coastguard Worker              0,
1299*890232f2SAndroid Build Coastguard Worker              0,
1300*890232f2SAndroid Build Coastguard Worker              0,
1301*890232f2SAndroid Build Coastguard Worker              0,
1302*890232f2SAndroid Build Coastguard Worker              240,
1303*890232f2SAndroid Build Coastguard Worker              63,  # 1
1304*890232f2SAndroid Build Coastguard Worker              0,
1305*890232f2SAndroid Build Coastguard Worker              0,
1306*890232f2SAndroid Build Coastguard Worker              0,
1307*890232f2SAndroid Build Coastguard Worker              0,
1308*890232f2SAndroid Build Coastguard Worker              0,
1309*890232f2SAndroid Build Coastguard Worker              0,
1310*890232f2SAndroid Build Coastguard Worker              0,
1311*890232f2SAndroid Build Coastguard Worker              64,  # 2
1312*890232f2SAndroid Build Coastguard Worker              0,
1313*890232f2SAndroid Build Coastguard Worker              0,
1314*890232f2SAndroid Build Coastguard Worker              0,
1315*890232f2SAndroid Build Coastguard Worker              0,
1316*890232f2SAndroid Build Coastguard Worker              0,
1317*890232f2SAndroid Build Coastguard Worker              0,
1318*890232f2SAndroid Build Coastguard Worker              40,
1319*890232f2SAndroid Build Coastguard Worker              192  # -12
1320*890232f2SAndroid Build Coastguard Worker          ])
1321*890232f2SAndroid Build Coastguard Worker
1322*890232f2SAndroid Build Coastguard Worker      # Reverse endian:
1323*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1324*890232f2SAndroid Build Coastguard Worker      x_other_endian = x.byteswap().newbyteorder()
1325*890232f2SAndroid Build Coastguard Worker      b.CreateNumpyVector(x_other_endian)
1326*890232f2SAndroid Build Coastguard Worker      self.assertBuilderEquals(
1327*890232f2SAndroid Build Coastguard Worker          b,
1328*890232f2SAndroid Build Coastguard Worker          [
1329*890232f2SAndroid Build Coastguard Worker              3,
1330*890232f2SAndroid Build Coastguard Worker              0,
1331*890232f2SAndroid Build Coastguard Worker              0,
1332*890232f2SAndroid Build Coastguard Worker              0,  # vector length
1333*890232f2SAndroid Build Coastguard Worker              0,
1334*890232f2SAndroid Build Coastguard Worker              0,
1335*890232f2SAndroid Build Coastguard Worker              0,
1336*890232f2SAndroid Build Coastguard Worker              0,
1337*890232f2SAndroid Build Coastguard Worker              0,
1338*890232f2SAndroid Build Coastguard Worker              0,
1339*890232f2SAndroid Build Coastguard Worker              240,
1340*890232f2SAndroid Build Coastguard Worker              63,  # 1
1341*890232f2SAndroid Build Coastguard Worker              0,
1342*890232f2SAndroid Build Coastguard Worker              0,
1343*890232f2SAndroid Build Coastguard Worker              0,
1344*890232f2SAndroid Build Coastguard Worker              0,
1345*890232f2SAndroid Build Coastguard Worker              0,
1346*890232f2SAndroid Build Coastguard Worker              0,
1347*890232f2SAndroid Build Coastguard Worker              0,
1348*890232f2SAndroid Build Coastguard Worker              64,  # 2
1349*890232f2SAndroid Build Coastguard Worker              0,
1350*890232f2SAndroid Build Coastguard Worker              0,
1351*890232f2SAndroid Build Coastguard Worker              0,
1352*890232f2SAndroid Build Coastguard Worker              0,
1353*890232f2SAndroid Build Coastguard Worker              0,
1354*890232f2SAndroid Build Coastguard Worker              0,
1355*890232f2SAndroid Build Coastguard Worker              40,
1356*890232f2SAndroid Build Coastguard Worker              192  # -12
1357*890232f2SAndroid Build Coastguard Worker          ])
1358*890232f2SAndroid Build Coastguard Worker
1359*890232f2SAndroid Build Coastguard Worker    except ImportError:
1360*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1361*890232f2SAndroid Build Coastguard Worker      x = 0
1362*890232f2SAndroid Build Coastguard Worker      assertRaises(self, lambda: b.CreateNumpyVector(x),
1363*890232f2SAndroid Build Coastguard Worker                   NumpyRequiredForThisFeature)
1364*890232f2SAndroid Build Coastguard Worker
1365*890232f2SAndroid Build Coastguard Worker  def test_create_numpy_vector_bool(self):
1366*890232f2SAndroid Build Coastguard Worker    try:
1367*890232f2SAndroid Build Coastguard Worker      imp.find_module('numpy')
1368*890232f2SAndroid Build Coastguard Worker      # if numpy exists, then we should be able to get the
1369*890232f2SAndroid Build Coastguard Worker      # vector as a numpy array
1370*890232f2SAndroid Build Coastguard Worker      import numpy as np
1371*890232f2SAndroid Build Coastguard Worker
1372*890232f2SAndroid Build Coastguard Worker      # Systems endian:
1373*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1374*890232f2SAndroid Build Coastguard Worker      x = np.array([True, False, True], dtype=np.bool)
1375*890232f2SAndroid Build Coastguard Worker      b.CreateNumpyVector(x)
1376*890232f2SAndroid Build Coastguard Worker      self.assertBuilderEquals(
1377*890232f2SAndroid Build Coastguard Worker          b,
1378*890232f2SAndroid Build Coastguard Worker          [
1379*890232f2SAndroid Build Coastguard Worker              3,
1380*890232f2SAndroid Build Coastguard Worker              0,
1381*890232f2SAndroid Build Coastguard Worker              0,
1382*890232f2SAndroid Build Coastguard Worker              0,  # vector length
1383*890232f2SAndroid Build Coastguard Worker              1,
1384*890232f2SAndroid Build Coastguard Worker              0,
1385*890232f2SAndroid Build Coastguard Worker              1,
1386*890232f2SAndroid Build Coastguard Worker              0  # vector values + padding
1387*890232f2SAndroid Build Coastguard Worker          ])
1388*890232f2SAndroid Build Coastguard Worker
1389*890232f2SAndroid Build Coastguard Worker      # Reverse endian:
1390*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1391*890232f2SAndroid Build Coastguard Worker      x_other_endian = x.byteswap().newbyteorder()
1392*890232f2SAndroid Build Coastguard Worker      b.CreateNumpyVector(x_other_endian)
1393*890232f2SAndroid Build Coastguard Worker      self.assertBuilderEquals(
1394*890232f2SAndroid Build Coastguard Worker          b,
1395*890232f2SAndroid Build Coastguard Worker          [
1396*890232f2SAndroid Build Coastguard Worker              3,
1397*890232f2SAndroid Build Coastguard Worker              0,
1398*890232f2SAndroid Build Coastguard Worker              0,
1399*890232f2SAndroid Build Coastguard Worker              0,  # vector length
1400*890232f2SAndroid Build Coastguard Worker              1,
1401*890232f2SAndroid Build Coastguard Worker              0,
1402*890232f2SAndroid Build Coastguard Worker              1,
1403*890232f2SAndroid Build Coastguard Worker              0  # vector values + padding
1404*890232f2SAndroid Build Coastguard Worker          ])
1405*890232f2SAndroid Build Coastguard Worker
1406*890232f2SAndroid Build Coastguard Worker    except ImportError:
1407*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1408*890232f2SAndroid Build Coastguard Worker      x = 0
1409*890232f2SAndroid Build Coastguard Worker      assertRaises(self, lambda: b.CreateNumpyVector(x),
1410*890232f2SAndroid Build Coastguard Worker                   NumpyRequiredForThisFeature)
1411*890232f2SAndroid Build Coastguard Worker
1412*890232f2SAndroid Build Coastguard Worker  def test_create_numpy_vector_reject_strings(self):
1413*890232f2SAndroid Build Coastguard Worker    try:
1414*890232f2SAndroid Build Coastguard Worker      imp.find_module('numpy')
1415*890232f2SAndroid Build Coastguard Worker      # if numpy exists, then we should be able to get the
1416*890232f2SAndroid Build Coastguard Worker      # vector as a numpy array
1417*890232f2SAndroid Build Coastguard Worker      import numpy as np
1418*890232f2SAndroid Build Coastguard Worker
1419*890232f2SAndroid Build Coastguard Worker      # Create String array
1420*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1421*890232f2SAndroid Build Coastguard Worker      x = np.array(['hello', 'fb', 'testing'])
1422*890232f2SAndroid Build Coastguard Worker      assertRaises(self, lambda: b.CreateNumpyVector(x), TypeError)
1423*890232f2SAndroid Build Coastguard Worker
1424*890232f2SAndroid Build Coastguard Worker    except ImportError:
1425*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1426*890232f2SAndroid Build Coastguard Worker      x = 0
1427*890232f2SAndroid Build Coastguard Worker      assertRaises(self, lambda: b.CreateNumpyVector(x),
1428*890232f2SAndroid Build Coastguard Worker                   NumpyRequiredForThisFeature)
1429*890232f2SAndroid Build Coastguard Worker
1430*890232f2SAndroid Build Coastguard Worker  def test_create_numpy_vector_reject_object(self):
1431*890232f2SAndroid Build Coastguard Worker    try:
1432*890232f2SAndroid Build Coastguard Worker      imp.find_module('numpy')
1433*890232f2SAndroid Build Coastguard Worker      # if numpy exists, then we should be able to get the
1434*890232f2SAndroid Build Coastguard Worker      # vector as a numpy array
1435*890232f2SAndroid Build Coastguard Worker      import numpy as np
1436*890232f2SAndroid Build Coastguard Worker
1437*890232f2SAndroid Build Coastguard Worker      # Create String array
1438*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1439*890232f2SAndroid Build Coastguard Worker      x = np.array([{'m': 0}, {'as': -2.1, 'c': 'c'}])
1440*890232f2SAndroid Build Coastguard Worker      assertRaises(self, lambda: b.CreateNumpyVector(x), TypeError)
1441*890232f2SAndroid Build Coastguard Worker
1442*890232f2SAndroid Build Coastguard Worker    except ImportError:
1443*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
1444*890232f2SAndroid Build Coastguard Worker      x = 0
1445*890232f2SAndroid Build Coastguard Worker      assertRaises(self, lambda: b.CreateNumpyVector(x),
1446*890232f2SAndroid Build Coastguard Worker                   NumpyRequiredForThisFeature)
1447*890232f2SAndroid Build Coastguard Worker
1448*890232f2SAndroid Build Coastguard Worker  def test_empty_vtable(self):
1449*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
1450*890232f2SAndroid Build Coastguard Worker    b.StartObject(0)
1451*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [])
1452*890232f2SAndroid Build Coastguard Worker    b.EndObject()
1453*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [4, 0, 4, 0, 4, 0, 0, 0])
1454*890232f2SAndroid Build Coastguard Worker
1455*890232f2SAndroid Build Coastguard Worker  def test_vtable_with_one_true_bool(self):
1456*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
1457*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [])
1458*890232f2SAndroid Build Coastguard Worker    b.StartObject(1)
1459*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [])
1460*890232f2SAndroid Build Coastguard Worker    b.PrependBoolSlot(0, True, False)
1461*890232f2SAndroid Build Coastguard Worker    b.EndObject()
1462*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(
1463*890232f2SAndroid Build Coastguard Worker        b,
1464*890232f2SAndroid Build Coastguard Worker        [
1465*890232f2SAndroid Build Coastguard Worker            6,
1466*890232f2SAndroid Build Coastguard Worker            0,  # vtable bytes
1467*890232f2SAndroid Build Coastguard Worker            8,
1468*890232f2SAndroid Build Coastguard Worker            0,  # length of object including vtable offset
1469*890232f2SAndroid Build Coastguard Worker            7,
1470*890232f2SAndroid Build Coastguard Worker            0,  # start of bool value
1471*890232f2SAndroid Build Coastguard Worker            6,
1472*890232f2SAndroid Build Coastguard Worker            0,
1473*890232f2SAndroid Build Coastguard Worker            0,
1474*890232f2SAndroid Build Coastguard Worker            0,  # offset for start of vtable (int32)
1475*890232f2SAndroid Build Coastguard Worker            0,
1476*890232f2SAndroid Build Coastguard Worker            0,
1477*890232f2SAndroid Build Coastguard Worker            0,  # padded to 4 bytes
1478*890232f2SAndroid Build Coastguard Worker            1,  # bool value
1479*890232f2SAndroid Build Coastguard Worker        ])
1480*890232f2SAndroid Build Coastguard Worker
1481*890232f2SAndroid Build Coastguard Worker  def test_vtable_with_one_default_bool(self):
1482*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
1483*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [])
1484*890232f2SAndroid Build Coastguard Worker    b.StartObject(1)
1485*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(b, [])
1486*890232f2SAndroid Build Coastguard Worker    b.PrependBoolSlot(0, False, False)
1487*890232f2SAndroid Build Coastguard Worker    b.EndObject()
1488*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(
1489*890232f2SAndroid Build Coastguard Worker        b,
1490*890232f2SAndroid Build Coastguard Worker        [
1491*890232f2SAndroid Build Coastguard Worker            4,
1492*890232f2SAndroid Build Coastguard Worker            0,  # vtable bytes
1493*890232f2SAndroid Build Coastguard Worker            4,
1494*890232f2SAndroid Build Coastguard Worker            0,  # end of object from here
1495*890232f2SAndroid Build Coastguard Worker            # entry 1 is zero and not stored
1496*890232f2SAndroid Build Coastguard Worker            4,
1497*890232f2SAndroid Build Coastguard Worker            0,
1498*890232f2SAndroid Build Coastguard Worker            0,
1499*890232f2SAndroid Build Coastguard Worker            0,  # offset for start of vtable (int32)
1500*890232f2SAndroid Build Coastguard Worker        ])
1501*890232f2SAndroid Build Coastguard Worker
1502*890232f2SAndroid Build Coastguard Worker  def test_vtable_with_one_int16(self):
1503*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
1504*890232f2SAndroid Build Coastguard Worker    b.StartObject(1)
1505*890232f2SAndroid Build Coastguard Worker    b.PrependInt16Slot(0, 0x789A, 0)
1506*890232f2SAndroid Build Coastguard Worker    b.EndObject()
1507*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(
1508*890232f2SAndroid Build Coastguard Worker        b,
1509*890232f2SAndroid Build Coastguard Worker        [
1510*890232f2SAndroid Build Coastguard Worker            6,
1511*890232f2SAndroid Build Coastguard Worker            0,  # vtable bytes
1512*890232f2SAndroid Build Coastguard Worker            8,
1513*890232f2SAndroid Build Coastguard Worker            0,  # end of object from here
1514*890232f2SAndroid Build Coastguard Worker            6,
1515*890232f2SAndroid Build Coastguard Worker            0,  # offset to value
1516*890232f2SAndroid Build Coastguard Worker            6,
1517*890232f2SAndroid Build Coastguard Worker            0,
1518*890232f2SAndroid Build Coastguard Worker            0,
1519*890232f2SAndroid Build Coastguard Worker            0,  # offset for start of vtable (int32)
1520*890232f2SAndroid Build Coastguard Worker            0,
1521*890232f2SAndroid Build Coastguard Worker            0,  # padding to 4 bytes
1522*890232f2SAndroid Build Coastguard Worker            0x9A,
1523*890232f2SAndroid Build Coastguard Worker            0x78,
1524*890232f2SAndroid Build Coastguard Worker        ])
1525*890232f2SAndroid Build Coastguard Worker
1526*890232f2SAndroid Build Coastguard Worker  def test_vtable_with_two_int16(self):
1527*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
1528*890232f2SAndroid Build Coastguard Worker    b.StartObject(2)
1529*890232f2SAndroid Build Coastguard Worker    b.PrependInt16Slot(0, 0x3456, 0)
1530*890232f2SAndroid Build Coastguard Worker    b.PrependInt16Slot(1, 0x789A, 0)
1531*890232f2SAndroid Build Coastguard Worker    b.EndObject()
1532*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(
1533*890232f2SAndroid Build Coastguard Worker        b,
1534*890232f2SAndroid Build Coastguard Worker        [
1535*890232f2SAndroid Build Coastguard Worker            8,
1536*890232f2SAndroid Build Coastguard Worker            0,  # vtable bytes
1537*890232f2SAndroid Build Coastguard Worker            8,
1538*890232f2SAndroid Build Coastguard Worker            0,  # end of object from here
1539*890232f2SAndroid Build Coastguard Worker            6,
1540*890232f2SAndroid Build Coastguard Worker            0,  # offset to value 0
1541*890232f2SAndroid Build Coastguard Worker            4,
1542*890232f2SAndroid Build Coastguard Worker            0,  # offset to value 1
1543*890232f2SAndroid Build Coastguard Worker            8,
1544*890232f2SAndroid Build Coastguard Worker            0,
1545*890232f2SAndroid Build Coastguard Worker            0,
1546*890232f2SAndroid Build Coastguard Worker            0,  # offset for start of vtable (int32)
1547*890232f2SAndroid Build Coastguard Worker            0x9A,
1548*890232f2SAndroid Build Coastguard Worker            0x78,  # value 1
1549*890232f2SAndroid Build Coastguard Worker            0x56,
1550*890232f2SAndroid Build Coastguard Worker            0x34,  # value 0
1551*890232f2SAndroid Build Coastguard Worker        ])
1552*890232f2SAndroid Build Coastguard Worker
1553*890232f2SAndroid Build Coastguard Worker  def test_vtable_with_int16_and_bool(self):
1554*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
1555*890232f2SAndroid Build Coastguard Worker    b.StartObject(2)
1556*890232f2SAndroid Build Coastguard Worker    b.PrependInt16Slot(0, 0x3456, 0)
1557*890232f2SAndroid Build Coastguard Worker    b.PrependBoolSlot(1, True, False)
1558*890232f2SAndroid Build Coastguard Worker    b.EndObject()
1559*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(
1560*890232f2SAndroid Build Coastguard Worker        b,
1561*890232f2SAndroid Build Coastguard Worker        [
1562*890232f2SAndroid Build Coastguard Worker            8,
1563*890232f2SAndroid Build Coastguard Worker            0,  # vtable bytes
1564*890232f2SAndroid Build Coastguard Worker            8,
1565*890232f2SAndroid Build Coastguard Worker            0,  # end of object from here
1566*890232f2SAndroid Build Coastguard Worker            6,
1567*890232f2SAndroid Build Coastguard Worker            0,  # offset to value 0
1568*890232f2SAndroid Build Coastguard Worker            5,
1569*890232f2SAndroid Build Coastguard Worker            0,  # offset to value 1
1570*890232f2SAndroid Build Coastguard Worker            8,
1571*890232f2SAndroid Build Coastguard Worker            0,
1572*890232f2SAndroid Build Coastguard Worker            0,
1573*890232f2SAndroid Build Coastguard Worker            0,  # offset for start of vtable (int32)
1574*890232f2SAndroid Build Coastguard Worker            0,  # padding
1575*890232f2SAndroid Build Coastguard Worker            1,  # value 1
1576*890232f2SAndroid Build Coastguard Worker            0x56,
1577*890232f2SAndroid Build Coastguard Worker            0x34,  # value 0
1578*890232f2SAndroid Build Coastguard Worker        ])
1579*890232f2SAndroid Build Coastguard Worker
1580*890232f2SAndroid Build Coastguard Worker  def test_vtable_with_empty_vector(self):
1581*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
1582*890232f2SAndroid Build Coastguard Worker    b.StartVector(flatbuffers.number_types.Uint8Flags.bytewidth, 0, 1)
1583*890232f2SAndroid Build Coastguard Worker    vecend = b.EndVector()
1584*890232f2SAndroid Build Coastguard Worker    b.StartObject(1)
1585*890232f2SAndroid Build Coastguard Worker    b.PrependUOffsetTRelativeSlot(0, vecend, 0)
1586*890232f2SAndroid Build Coastguard Worker    b.EndObject()
1587*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(
1588*890232f2SAndroid Build Coastguard Worker        b,
1589*890232f2SAndroid Build Coastguard Worker        [
1590*890232f2SAndroid Build Coastguard Worker            6,
1591*890232f2SAndroid Build Coastguard Worker            0,  # vtable bytes
1592*890232f2SAndroid Build Coastguard Worker            8,
1593*890232f2SAndroid Build Coastguard Worker            0,
1594*890232f2SAndroid Build Coastguard Worker            4,
1595*890232f2SAndroid Build Coastguard Worker            0,  # offset to vector offset
1596*890232f2SAndroid Build Coastguard Worker            6,
1597*890232f2SAndroid Build Coastguard Worker            0,
1598*890232f2SAndroid Build Coastguard Worker            0,
1599*890232f2SAndroid Build Coastguard Worker            0,  # offset for start of vtable (int32)
1600*890232f2SAndroid Build Coastguard Worker            4,
1601*890232f2SAndroid Build Coastguard Worker            0,
1602*890232f2SAndroid Build Coastguard Worker            0,
1603*890232f2SAndroid Build Coastguard Worker            0,
1604*890232f2SAndroid Build Coastguard Worker            0,
1605*890232f2SAndroid Build Coastguard Worker            0,
1606*890232f2SAndroid Build Coastguard Worker            0,
1607*890232f2SAndroid Build Coastguard Worker            0,  # length of vector (not in struct)
1608*890232f2SAndroid Build Coastguard Worker        ])
1609*890232f2SAndroid Build Coastguard Worker
1610*890232f2SAndroid Build Coastguard Worker  def test_vtable_with_empty_vector_of_byte_and_some_scalars(self):
1611*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
1612*890232f2SAndroid Build Coastguard Worker    b.StartVector(flatbuffers.number_types.Uint8Flags.bytewidth, 0, 1)
1613*890232f2SAndroid Build Coastguard Worker    vecend = b.EndVector()
1614*890232f2SAndroid Build Coastguard Worker    b.StartObject(2)
1615*890232f2SAndroid Build Coastguard Worker    b.PrependInt16Slot(0, 55, 0)
1616*890232f2SAndroid Build Coastguard Worker    b.PrependUOffsetTRelativeSlot(1, vecend, 0)
1617*890232f2SAndroid Build Coastguard Worker    b.EndObject()
1618*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(
1619*890232f2SAndroid Build Coastguard Worker        b,
1620*890232f2SAndroid Build Coastguard Worker        [
1621*890232f2SAndroid Build Coastguard Worker            8,
1622*890232f2SAndroid Build Coastguard Worker            0,  # vtable bytes
1623*890232f2SAndroid Build Coastguard Worker            12,
1624*890232f2SAndroid Build Coastguard Worker            0,
1625*890232f2SAndroid Build Coastguard Worker            10,
1626*890232f2SAndroid Build Coastguard Worker            0,  # offset to value 0
1627*890232f2SAndroid Build Coastguard Worker            4,
1628*890232f2SAndroid Build Coastguard Worker            0,  # offset to vector offset
1629*890232f2SAndroid Build Coastguard Worker            8,
1630*890232f2SAndroid Build Coastguard Worker            0,
1631*890232f2SAndroid Build Coastguard Worker            0,
1632*890232f2SAndroid Build Coastguard Worker            0,  # vtable loc
1633*890232f2SAndroid Build Coastguard Worker            8,
1634*890232f2SAndroid Build Coastguard Worker            0,
1635*890232f2SAndroid Build Coastguard Worker            0,
1636*890232f2SAndroid Build Coastguard Worker            0,  # value 1
1637*890232f2SAndroid Build Coastguard Worker            0,
1638*890232f2SAndroid Build Coastguard Worker            0,
1639*890232f2SAndroid Build Coastguard Worker            55,
1640*890232f2SAndroid Build Coastguard Worker            0,  # value 0
1641*890232f2SAndroid Build Coastguard Worker            0,
1642*890232f2SAndroid Build Coastguard Worker            0,
1643*890232f2SAndroid Build Coastguard Worker            0,
1644*890232f2SAndroid Build Coastguard Worker            0,  # length of vector (not in struct)
1645*890232f2SAndroid Build Coastguard Worker        ])
1646*890232f2SAndroid Build Coastguard Worker
1647*890232f2SAndroid Build Coastguard Worker  def test_vtable_with_1_int16_and_2vector_of_int16(self):
1648*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
1649*890232f2SAndroid Build Coastguard Worker    b.StartVector(flatbuffers.number_types.Int16Flags.bytewidth, 2, 1)
1650*890232f2SAndroid Build Coastguard Worker    b.PrependInt16(0x1234)
1651*890232f2SAndroid Build Coastguard Worker    b.PrependInt16(0x5678)
1652*890232f2SAndroid Build Coastguard Worker    vecend = b.EndVector()
1653*890232f2SAndroid Build Coastguard Worker    b.StartObject(2)
1654*890232f2SAndroid Build Coastguard Worker    b.PrependUOffsetTRelativeSlot(1, vecend, 0)
1655*890232f2SAndroid Build Coastguard Worker    b.PrependInt16Slot(0, 55, 0)
1656*890232f2SAndroid Build Coastguard Worker    b.EndObject()
1657*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(
1658*890232f2SAndroid Build Coastguard Worker        b,
1659*890232f2SAndroid Build Coastguard Worker        [
1660*890232f2SAndroid Build Coastguard Worker            8,
1661*890232f2SAndroid Build Coastguard Worker            0,  # vtable bytes
1662*890232f2SAndroid Build Coastguard Worker            12,
1663*890232f2SAndroid Build Coastguard Worker            0,  # length of object
1664*890232f2SAndroid Build Coastguard Worker            6,
1665*890232f2SAndroid Build Coastguard Worker            0,  # start of value 0 from end of vtable
1666*890232f2SAndroid Build Coastguard Worker            8,
1667*890232f2SAndroid Build Coastguard Worker            0,  # start of value 1 from end of buffer
1668*890232f2SAndroid Build Coastguard Worker            8,
1669*890232f2SAndroid Build Coastguard Worker            0,
1670*890232f2SAndroid Build Coastguard Worker            0,
1671*890232f2SAndroid Build Coastguard Worker            0,  # offset for start of vtable (int32)
1672*890232f2SAndroid Build Coastguard Worker            0,
1673*890232f2SAndroid Build Coastguard Worker            0,  # padding
1674*890232f2SAndroid Build Coastguard Worker            55,
1675*890232f2SAndroid Build Coastguard Worker            0,  # value 0
1676*890232f2SAndroid Build Coastguard Worker            4,
1677*890232f2SAndroid Build Coastguard Worker            0,
1678*890232f2SAndroid Build Coastguard Worker            0,
1679*890232f2SAndroid Build Coastguard Worker            0,  # vector position from here
1680*890232f2SAndroid Build Coastguard Worker            2,
1681*890232f2SAndroid Build Coastguard Worker            0,
1682*890232f2SAndroid Build Coastguard Worker            0,
1683*890232f2SAndroid Build Coastguard Worker            0,  # length of vector (uint32)
1684*890232f2SAndroid Build Coastguard Worker            0x78,
1685*890232f2SAndroid Build Coastguard Worker            0x56,  # vector value 1
1686*890232f2SAndroid Build Coastguard Worker            0x34,
1687*890232f2SAndroid Build Coastguard Worker            0x12,  # vector value 0
1688*890232f2SAndroid Build Coastguard Worker        ])
1689*890232f2SAndroid Build Coastguard Worker
1690*890232f2SAndroid Build Coastguard Worker  def test_vtable_with_1_struct_of_1_int8__1_int16__1_int32(self):
1691*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
1692*890232f2SAndroid Build Coastguard Worker    b.StartObject(1)
1693*890232f2SAndroid Build Coastguard Worker    b.Prep(4 + 4 + 4, 0)
1694*890232f2SAndroid Build Coastguard Worker    b.PrependInt8(55)
1695*890232f2SAndroid Build Coastguard Worker    b.Pad(3)
1696*890232f2SAndroid Build Coastguard Worker    b.PrependInt16(0x1234)
1697*890232f2SAndroid Build Coastguard Worker    b.Pad(2)
1698*890232f2SAndroid Build Coastguard Worker    b.PrependInt32(0x12345678)
1699*890232f2SAndroid Build Coastguard Worker    structStart = b.Offset()
1700*890232f2SAndroid Build Coastguard Worker    b.PrependStructSlot(0, structStart, 0)
1701*890232f2SAndroid Build Coastguard Worker    b.EndObject()
1702*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(
1703*890232f2SAndroid Build Coastguard Worker        b,
1704*890232f2SAndroid Build Coastguard Worker        [
1705*890232f2SAndroid Build Coastguard Worker            6,
1706*890232f2SAndroid Build Coastguard Worker            0,  # vtable bytes
1707*890232f2SAndroid Build Coastguard Worker            16,
1708*890232f2SAndroid Build Coastguard Worker            0,  # end of object from here
1709*890232f2SAndroid Build Coastguard Worker            4,
1710*890232f2SAndroid Build Coastguard Worker            0,  # start of struct from here
1711*890232f2SAndroid Build Coastguard Worker            6,
1712*890232f2SAndroid Build Coastguard Worker            0,
1713*890232f2SAndroid Build Coastguard Worker            0,
1714*890232f2SAndroid Build Coastguard Worker            0,  # offset for start of vtable (int32)
1715*890232f2SAndroid Build Coastguard Worker            0x78,
1716*890232f2SAndroid Build Coastguard Worker            0x56,
1717*890232f2SAndroid Build Coastguard Worker            0x34,
1718*890232f2SAndroid Build Coastguard Worker            0x12,  # value 2
1719*890232f2SAndroid Build Coastguard Worker            0,
1720*890232f2SAndroid Build Coastguard Worker            0,  # padding
1721*890232f2SAndroid Build Coastguard Worker            0x34,
1722*890232f2SAndroid Build Coastguard Worker            0x12,  # value 1
1723*890232f2SAndroid Build Coastguard Worker            0,
1724*890232f2SAndroid Build Coastguard Worker            0,
1725*890232f2SAndroid Build Coastguard Worker            0,  # padding
1726*890232f2SAndroid Build Coastguard Worker            55,  # value 0
1727*890232f2SAndroid Build Coastguard Worker        ])
1728*890232f2SAndroid Build Coastguard Worker
1729*890232f2SAndroid Build Coastguard Worker  def test_vtable_with_1_vector_of_2_struct_of_2_int8(self):
1730*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
1731*890232f2SAndroid Build Coastguard Worker    b.StartVector(flatbuffers.number_types.Int8Flags.bytewidth * 2, 2, 1)
1732*890232f2SAndroid Build Coastguard Worker    b.PrependInt8(33)
1733*890232f2SAndroid Build Coastguard Worker    b.PrependInt8(44)
1734*890232f2SAndroid Build Coastguard Worker    b.PrependInt8(55)
1735*890232f2SAndroid Build Coastguard Worker    b.PrependInt8(66)
1736*890232f2SAndroid Build Coastguard Worker    vecend = b.EndVector()
1737*890232f2SAndroid Build Coastguard Worker    b.StartObject(1)
1738*890232f2SAndroid Build Coastguard Worker    b.PrependUOffsetTRelativeSlot(0, vecend, 0)
1739*890232f2SAndroid Build Coastguard Worker    b.EndObject()
1740*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(
1741*890232f2SAndroid Build Coastguard Worker        b,
1742*890232f2SAndroid Build Coastguard Worker        [
1743*890232f2SAndroid Build Coastguard Worker            6,
1744*890232f2SAndroid Build Coastguard Worker            0,  # vtable bytes
1745*890232f2SAndroid Build Coastguard Worker            8,
1746*890232f2SAndroid Build Coastguard Worker            0,
1747*890232f2SAndroid Build Coastguard Worker            4,
1748*890232f2SAndroid Build Coastguard Worker            0,  # offset of vector offset
1749*890232f2SAndroid Build Coastguard Worker            6,
1750*890232f2SAndroid Build Coastguard Worker            0,
1751*890232f2SAndroid Build Coastguard Worker            0,
1752*890232f2SAndroid Build Coastguard Worker            0,  # offset for start of vtable (int32)
1753*890232f2SAndroid Build Coastguard Worker            4,
1754*890232f2SAndroid Build Coastguard Worker            0,
1755*890232f2SAndroid Build Coastguard Worker            0,
1756*890232f2SAndroid Build Coastguard Worker            0,  # vector start offset
1757*890232f2SAndroid Build Coastguard Worker            2,
1758*890232f2SAndroid Build Coastguard Worker            0,
1759*890232f2SAndroid Build Coastguard Worker            0,
1760*890232f2SAndroid Build Coastguard Worker            0,  # vector length
1761*890232f2SAndroid Build Coastguard Worker            66,  # vector value 1,1
1762*890232f2SAndroid Build Coastguard Worker            55,  # vector value 1,0
1763*890232f2SAndroid Build Coastguard Worker            44,  # vector value 0,1
1764*890232f2SAndroid Build Coastguard Worker            33,  # vector value 0,0
1765*890232f2SAndroid Build Coastguard Worker        ])
1766*890232f2SAndroid Build Coastguard Worker
1767*890232f2SAndroid Build Coastguard Worker  def test_table_with_some_elements(self):
1768*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
1769*890232f2SAndroid Build Coastguard Worker    b.StartObject(2)
1770*890232f2SAndroid Build Coastguard Worker    b.PrependInt8Slot(0, 33, 0)
1771*890232f2SAndroid Build Coastguard Worker    b.PrependInt16Slot(1, 66, 0)
1772*890232f2SAndroid Build Coastguard Worker    off = b.EndObject()
1773*890232f2SAndroid Build Coastguard Worker    b.Finish(off)
1774*890232f2SAndroid Build Coastguard Worker
1775*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(
1776*890232f2SAndroid Build Coastguard Worker        b,
1777*890232f2SAndroid Build Coastguard Worker        [
1778*890232f2SAndroid Build Coastguard Worker            12,
1779*890232f2SAndroid Build Coastguard Worker            0,
1780*890232f2SAndroid Build Coastguard Worker            0,
1781*890232f2SAndroid Build Coastguard Worker            0,  # root of table: points to vtable offset
1782*890232f2SAndroid Build Coastguard Worker            8,
1783*890232f2SAndroid Build Coastguard Worker            0,  # vtable bytes
1784*890232f2SAndroid Build Coastguard Worker            8,
1785*890232f2SAndroid Build Coastguard Worker            0,  # end of object from here
1786*890232f2SAndroid Build Coastguard Worker            7,
1787*890232f2SAndroid Build Coastguard Worker            0,  # start of value 0
1788*890232f2SAndroid Build Coastguard Worker            4,
1789*890232f2SAndroid Build Coastguard Worker            0,  # start of value 1
1790*890232f2SAndroid Build Coastguard Worker            8,
1791*890232f2SAndroid Build Coastguard Worker            0,
1792*890232f2SAndroid Build Coastguard Worker            0,
1793*890232f2SAndroid Build Coastguard Worker            0,  # offset for start of vtable (int32)
1794*890232f2SAndroid Build Coastguard Worker            66,
1795*890232f2SAndroid Build Coastguard Worker            0,  # value 1
1796*890232f2SAndroid Build Coastguard Worker            0,  # padding
1797*890232f2SAndroid Build Coastguard Worker            33,  # value 0
1798*890232f2SAndroid Build Coastguard Worker        ])
1799*890232f2SAndroid Build Coastguard Worker
1800*890232f2SAndroid Build Coastguard Worker  def test__one_unfinished_table_and_one_finished_table(self):
1801*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
1802*890232f2SAndroid Build Coastguard Worker    b.StartObject(2)
1803*890232f2SAndroid Build Coastguard Worker    b.PrependInt8Slot(0, 33, 0)
1804*890232f2SAndroid Build Coastguard Worker    b.PrependInt8Slot(1, 44, 0)
1805*890232f2SAndroid Build Coastguard Worker    off = b.EndObject()
1806*890232f2SAndroid Build Coastguard Worker    b.Finish(off)
1807*890232f2SAndroid Build Coastguard Worker
1808*890232f2SAndroid Build Coastguard Worker    b.StartObject(3)
1809*890232f2SAndroid Build Coastguard Worker    b.PrependInt8Slot(0, 55, 0)
1810*890232f2SAndroid Build Coastguard Worker    b.PrependInt8Slot(1, 66, 0)
1811*890232f2SAndroid Build Coastguard Worker    b.PrependInt8Slot(2, 77, 0)
1812*890232f2SAndroid Build Coastguard Worker    off = b.EndObject()
1813*890232f2SAndroid Build Coastguard Worker    b.Finish(off)
1814*890232f2SAndroid Build Coastguard Worker
1815*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(
1816*890232f2SAndroid Build Coastguard Worker        b,
1817*890232f2SAndroid Build Coastguard Worker        [
1818*890232f2SAndroid Build Coastguard Worker            16,
1819*890232f2SAndroid Build Coastguard Worker            0,
1820*890232f2SAndroid Build Coastguard Worker            0,
1821*890232f2SAndroid Build Coastguard Worker            0,  # root of table: points to object
1822*890232f2SAndroid Build Coastguard Worker            0,
1823*890232f2SAndroid Build Coastguard Worker            0,  # padding
1824*890232f2SAndroid Build Coastguard Worker            10,
1825*890232f2SAndroid Build Coastguard Worker            0,  # vtable bytes
1826*890232f2SAndroid Build Coastguard Worker            8,
1827*890232f2SAndroid Build Coastguard Worker            0,  # size of object
1828*890232f2SAndroid Build Coastguard Worker            7,
1829*890232f2SAndroid Build Coastguard Worker            0,  # start of value 0
1830*890232f2SAndroid Build Coastguard Worker            6,
1831*890232f2SAndroid Build Coastguard Worker            0,  # start of value 1
1832*890232f2SAndroid Build Coastguard Worker            5,
1833*890232f2SAndroid Build Coastguard Worker            0,  # start of value 2
1834*890232f2SAndroid Build Coastguard Worker            10,
1835*890232f2SAndroid Build Coastguard Worker            0,
1836*890232f2SAndroid Build Coastguard Worker            0,
1837*890232f2SAndroid Build Coastguard Worker            0,  # offset for start of vtable (int32)
1838*890232f2SAndroid Build Coastguard Worker            0,  # padding
1839*890232f2SAndroid Build Coastguard Worker            77,  # value 2
1840*890232f2SAndroid Build Coastguard Worker            66,  # value 1
1841*890232f2SAndroid Build Coastguard Worker            55,  # value 0
1842*890232f2SAndroid Build Coastguard Worker            12,
1843*890232f2SAndroid Build Coastguard Worker            0,
1844*890232f2SAndroid Build Coastguard Worker            0,
1845*890232f2SAndroid Build Coastguard Worker            0,  # root of table: points to object
1846*890232f2SAndroid Build Coastguard Worker            8,
1847*890232f2SAndroid Build Coastguard Worker            0,  # vtable bytes
1848*890232f2SAndroid Build Coastguard Worker            8,
1849*890232f2SAndroid Build Coastguard Worker            0,  # size of object
1850*890232f2SAndroid Build Coastguard Worker            7,
1851*890232f2SAndroid Build Coastguard Worker            0,  # start of value 0
1852*890232f2SAndroid Build Coastguard Worker            6,
1853*890232f2SAndroid Build Coastguard Worker            0,  # start of value 1
1854*890232f2SAndroid Build Coastguard Worker            8,
1855*890232f2SAndroid Build Coastguard Worker            0,
1856*890232f2SAndroid Build Coastguard Worker            0,
1857*890232f2SAndroid Build Coastguard Worker            0,  # offset for start of vtable (int32)
1858*890232f2SAndroid Build Coastguard Worker            0,
1859*890232f2SAndroid Build Coastguard Worker            0,  # padding
1860*890232f2SAndroid Build Coastguard Worker            44,  # value 1
1861*890232f2SAndroid Build Coastguard Worker            33,  # value 0
1862*890232f2SAndroid Build Coastguard Worker        ])
1863*890232f2SAndroid Build Coastguard Worker
1864*890232f2SAndroid Build Coastguard Worker  def test_a_bunch_of_bools(self):
1865*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
1866*890232f2SAndroid Build Coastguard Worker    b.StartObject(8)
1867*890232f2SAndroid Build Coastguard Worker    b.PrependBoolSlot(0, True, False)
1868*890232f2SAndroid Build Coastguard Worker    b.PrependBoolSlot(1, True, False)
1869*890232f2SAndroid Build Coastguard Worker    b.PrependBoolSlot(2, True, False)
1870*890232f2SAndroid Build Coastguard Worker    b.PrependBoolSlot(3, True, False)
1871*890232f2SAndroid Build Coastguard Worker    b.PrependBoolSlot(4, True, False)
1872*890232f2SAndroid Build Coastguard Worker    b.PrependBoolSlot(5, True, False)
1873*890232f2SAndroid Build Coastguard Worker    b.PrependBoolSlot(6, True, False)
1874*890232f2SAndroid Build Coastguard Worker    b.PrependBoolSlot(7, True, False)
1875*890232f2SAndroid Build Coastguard Worker    off = b.EndObject()
1876*890232f2SAndroid Build Coastguard Worker    b.Finish(off)
1877*890232f2SAndroid Build Coastguard Worker
1878*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(
1879*890232f2SAndroid Build Coastguard Worker        b,
1880*890232f2SAndroid Build Coastguard Worker        [
1881*890232f2SAndroid Build Coastguard Worker            24,
1882*890232f2SAndroid Build Coastguard Worker            0,
1883*890232f2SAndroid Build Coastguard Worker            0,
1884*890232f2SAndroid Build Coastguard Worker            0,  # root of table: points to vtable offset
1885*890232f2SAndroid Build Coastguard Worker            20,
1886*890232f2SAndroid Build Coastguard Worker            0,  # vtable bytes
1887*890232f2SAndroid Build Coastguard Worker            12,
1888*890232f2SAndroid Build Coastguard Worker            0,  # size of object
1889*890232f2SAndroid Build Coastguard Worker            11,
1890*890232f2SAndroid Build Coastguard Worker            0,  # start of value 0
1891*890232f2SAndroid Build Coastguard Worker            10,
1892*890232f2SAndroid Build Coastguard Worker            0,  # start of value 1
1893*890232f2SAndroid Build Coastguard Worker            9,
1894*890232f2SAndroid Build Coastguard Worker            0,  # start of value 2
1895*890232f2SAndroid Build Coastguard Worker            8,
1896*890232f2SAndroid Build Coastguard Worker            0,  # start of value 3
1897*890232f2SAndroid Build Coastguard Worker            7,
1898*890232f2SAndroid Build Coastguard Worker            0,  # start of value 4
1899*890232f2SAndroid Build Coastguard Worker            6,
1900*890232f2SAndroid Build Coastguard Worker            0,  # start of value 5
1901*890232f2SAndroid Build Coastguard Worker            5,
1902*890232f2SAndroid Build Coastguard Worker            0,  # start of value 6
1903*890232f2SAndroid Build Coastguard Worker            4,
1904*890232f2SAndroid Build Coastguard Worker            0,  # start of value 7
1905*890232f2SAndroid Build Coastguard Worker            20,
1906*890232f2SAndroid Build Coastguard Worker            0,
1907*890232f2SAndroid Build Coastguard Worker            0,
1908*890232f2SAndroid Build Coastguard Worker            0,  # vtable offset
1909*890232f2SAndroid Build Coastguard Worker            1,  # value 7
1910*890232f2SAndroid Build Coastguard Worker            1,  # value 6
1911*890232f2SAndroid Build Coastguard Worker            1,  # value 5
1912*890232f2SAndroid Build Coastguard Worker            1,  # value 4
1913*890232f2SAndroid Build Coastguard Worker            1,  # value 3
1914*890232f2SAndroid Build Coastguard Worker            1,  # value 2
1915*890232f2SAndroid Build Coastguard Worker            1,  # value 1
1916*890232f2SAndroid Build Coastguard Worker            1,  # value 0
1917*890232f2SAndroid Build Coastguard Worker        ])
1918*890232f2SAndroid Build Coastguard Worker
1919*890232f2SAndroid Build Coastguard Worker  def test_three_bools(self):
1920*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
1921*890232f2SAndroid Build Coastguard Worker    b.StartObject(3)
1922*890232f2SAndroid Build Coastguard Worker    b.PrependBoolSlot(0, True, False)
1923*890232f2SAndroid Build Coastguard Worker    b.PrependBoolSlot(1, True, False)
1924*890232f2SAndroid Build Coastguard Worker    b.PrependBoolSlot(2, True, False)
1925*890232f2SAndroid Build Coastguard Worker    off = b.EndObject()
1926*890232f2SAndroid Build Coastguard Worker    b.Finish(off)
1927*890232f2SAndroid Build Coastguard Worker
1928*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(
1929*890232f2SAndroid Build Coastguard Worker        b,
1930*890232f2SAndroid Build Coastguard Worker        [
1931*890232f2SAndroid Build Coastguard Worker            16,
1932*890232f2SAndroid Build Coastguard Worker            0,
1933*890232f2SAndroid Build Coastguard Worker            0,
1934*890232f2SAndroid Build Coastguard Worker            0,  # root of table: points to vtable offset
1935*890232f2SAndroid Build Coastguard Worker            0,
1936*890232f2SAndroid Build Coastguard Worker            0,  # padding
1937*890232f2SAndroid Build Coastguard Worker            10,
1938*890232f2SAndroid Build Coastguard Worker            0,  # vtable bytes
1939*890232f2SAndroid Build Coastguard Worker            8,
1940*890232f2SAndroid Build Coastguard Worker            0,  # size of object
1941*890232f2SAndroid Build Coastguard Worker            7,
1942*890232f2SAndroid Build Coastguard Worker            0,  # start of value 0
1943*890232f2SAndroid Build Coastguard Worker            6,
1944*890232f2SAndroid Build Coastguard Worker            0,  # start of value 1
1945*890232f2SAndroid Build Coastguard Worker            5,
1946*890232f2SAndroid Build Coastguard Worker            0,  # start of value 2
1947*890232f2SAndroid Build Coastguard Worker            10,
1948*890232f2SAndroid Build Coastguard Worker            0,
1949*890232f2SAndroid Build Coastguard Worker            0,
1950*890232f2SAndroid Build Coastguard Worker            0,  # vtable offset from here
1951*890232f2SAndroid Build Coastguard Worker            0,  # padding
1952*890232f2SAndroid Build Coastguard Worker            1,  # value 2
1953*890232f2SAndroid Build Coastguard Worker            1,  # value 1
1954*890232f2SAndroid Build Coastguard Worker            1,  # value 0
1955*890232f2SAndroid Build Coastguard Worker        ])
1956*890232f2SAndroid Build Coastguard Worker
1957*890232f2SAndroid Build Coastguard Worker  def test_some_floats(self):
1958*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
1959*890232f2SAndroid Build Coastguard Worker    b.StartObject(1)
1960*890232f2SAndroid Build Coastguard Worker    b.PrependFloat32Slot(0, 1.0, 0.0)
1961*890232f2SAndroid Build Coastguard Worker    off = b.EndObject()
1962*890232f2SAndroid Build Coastguard Worker
1963*890232f2SAndroid Build Coastguard Worker    self.assertBuilderEquals(
1964*890232f2SAndroid Build Coastguard Worker        b,
1965*890232f2SAndroid Build Coastguard Worker        [
1966*890232f2SAndroid Build Coastguard Worker            6,
1967*890232f2SAndroid Build Coastguard Worker            0,  # vtable bytes
1968*890232f2SAndroid Build Coastguard Worker            8,
1969*890232f2SAndroid Build Coastguard Worker            0,  # size of object
1970*890232f2SAndroid Build Coastguard Worker            4,
1971*890232f2SAndroid Build Coastguard Worker            0,  # start of value 0
1972*890232f2SAndroid Build Coastguard Worker            6,
1973*890232f2SAndroid Build Coastguard Worker            0,
1974*890232f2SAndroid Build Coastguard Worker            0,
1975*890232f2SAndroid Build Coastguard Worker            0,  # vtable offset
1976*890232f2SAndroid Build Coastguard Worker            0,
1977*890232f2SAndroid Build Coastguard Worker            0,
1978*890232f2SAndroid Build Coastguard Worker            128,
1979*890232f2SAndroid Build Coastguard Worker            63,  # value 0
1980*890232f2SAndroid Build Coastguard Worker        ])
1981*890232f2SAndroid Build Coastguard Worker
1982*890232f2SAndroid Build Coastguard Worker
1983*890232f2SAndroid Build Coastguard Workerdef make_monster_from_generated_code(sizePrefix=False, file_identifier=None):
1984*890232f2SAndroid Build Coastguard Worker  """ Use generated code to build the example Monster. """
1985*890232f2SAndroid Build Coastguard Worker
1986*890232f2SAndroid Build Coastguard Worker  b = flatbuffers.Builder(0)
1987*890232f2SAndroid Build Coastguard Worker  string = b.CreateString('MyMonster')
1988*890232f2SAndroid Build Coastguard Worker  test1 = b.CreateString('test1')
1989*890232f2SAndroid Build Coastguard Worker  test2 = b.CreateString('test2')
1990*890232f2SAndroid Build Coastguard Worker  fred = b.CreateString('Fred')
1991*890232f2SAndroid Build Coastguard Worker
1992*890232f2SAndroid Build Coastguard Worker  _MONSTER.MonsterStartInventoryVector(b, 5)
1993*890232f2SAndroid Build Coastguard Worker  b.PrependByte(4)
1994*890232f2SAndroid Build Coastguard Worker  b.PrependByte(3)
1995*890232f2SAndroid Build Coastguard Worker  b.PrependByte(2)
1996*890232f2SAndroid Build Coastguard Worker  b.PrependByte(1)
1997*890232f2SAndroid Build Coastguard Worker  b.PrependByte(0)
1998*890232f2SAndroid Build Coastguard Worker  inv = b.EndVector()
1999*890232f2SAndroid Build Coastguard Worker
2000*890232f2SAndroid Build Coastguard Worker  _MONSTER.MonsterStart(b)
2001*890232f2SAndroid Build Coastguard Worker  _MONSTER.MonsterAddName(b, fred)
2002*890232f2SAndroid Build Coastguard Worker  mon2 = _MONSTER.MonsterEnd(b)
2003*890232f2SAndroid Build Coastguard Worker
2004*890232f2SAndroid Build Coastguard Worker  _MONSTER.MonsterStartTest4Vector(b, 2)
2005*890232f2SAndroid Build Coastguard Worker  _TEST.CreateTest(b, 10, 20)
2006*890232f2SAndroid Build Coastguard Worker  _TEST.CreateTest(b, 30, 40)
2007*890232f2SAndroid Build Coastguard Worker  test4 = b.EndVector()
2008*890232f2SAndroid Build Coastguard Worker
2009*890232f2SAndroid Build Coastguard Worker  _MONSTER.MonsterStartTestarrayofstringVector(b, 2)
2010*890232f2SAndroid Build Coastguard Worker  b.PrependUOffsetTRelative(test2)
2011*890232f2SAndroid Build Coastguard Worker  b.PrependUOffsetTRelative(test1)
2012*890232f2SAndroid Build Coastguard Worker  testArrayOfString = b.EndVector()
2013*890232f2SAndroid Build Coastguard Worker
2014*890232f2SAndroid Build Coastguard Worker  _MONSTER.MonsterStartVectorOfLongsVector(b, 5)
2015*890232f2SAndroid Build Coastguard Worker  b.PrependInt64(100000000)
2016*890232f2SAndroid Build Coastguard Worker  b.PrependInt64(1000000)
2017*890232f2SAndroid Build Coastguard Worker  b.PrependInt64(10000)
2018*890232f2SAndroid Build Coastguard Worker  b.PrependInt64(100)
2019*890232f2SAndroid Build Coastguard Worker  b.PrependInt64(1)
2020*890232f2SAndroid Build Coastguard Worker  VectorOfLongs = b.EndVector()
2021*890232f2SAndroid Build Coastguard Worker
2022*890232f2SAndroid Build Coastguard Worker  _MONSTER.MonsterStartVectorOfDoublesVector(b, 3)
2023*890232f2SAndroid Build Coastguard Worker  b.PrependFloat64(1.7976931348623157e+308)
2024*890232f2SAndroid Build Coastguard Worker  b.PrependFloat64(0)
2025*890232f2SAndroid Build Coastguard Worker  b.PrependFloat64(-1.7976931348623157e+308)
2026*890232f2SAndroid Build Coastguard Worker  VectorOfDoubles = b.EndVector()
2027*890232f2SAndroid Build Coastguard Worker
2028*890232f2SAndroid Build Coastguard Worker  _MONSTER.MonsterStart(b)
2029*890232f2SAndroid Build Coastguard Worker
2030*890232f2SAndroid Build Coastguard Worker  pos = _VEC3.CreateVec3(b, 1.0, 2.0, 3.0, 3.0, 2, 5, 6)
2031*890232f2SAndroid Build Coastguard Worker  _MONSTER.MonsterAddPos(b, pos)
2032*890232f2SAndroid Build Coastguard Worker
2033*890232f2SAndroid Build Coastguard Worker  _MONSTER.MonsterAddHp(b, 80)
2034*890232f2SAndroid Build Coastguard Worker  _MONSTER.MonsterAddName(b, string)
2035*890232f2SAndroid Build Coastguard Worker  _MONSTER.MonsterAddInventory(b, inv)
2036*890232f2SAndroid Build Coastguard Worker  _MONSTER.MonsterAddTestType(b, 1)
2037*890232f2SAndroid Build Coastguard Worker  _MONSTER.MonsterAddTest(b, mon2)
2038*890232f2SAndroid Build Coastguard Worker  _MONSTER.MonsterAddTest4(b, test4)
2039*890232f2SAndroid Build Coastguard Worker  _MONSTER.MonsterAddTestarrayofstring(b, testArrayOfString)
2040*890232f2SAndroid Build Coastguard Worker  _MONSTER.MonsterAddVectorOfLongs(b, VectorOfLongs)
2041*890232f2SAndroid Build Coastguard Worker  _MONSTER.MonsterAddVectorOfDoubles(b, VectorOfDoubles)
2042*890232f2SAndroid Build Coastguard Worker  mon = _MONSTER.MonsterEnd(b)
2043*890232f2SAndroid Build Coastguard Worker
2044*890232f2SAndroid Build Coastguard Worker  if sizePrefix:
2045*890232f2SAndroid Build Coastguard Worker    b.FinishSizePrefixed(mon, file_identifier)
2046*890232f2SAndroid Build Coastguard Worker  else:
2047*890232f2SAndroid Build Coastguard Worker    b.Finish(mon, file_identifier)
2048*890232f2SAndroid Build Coastguard Worker
2049*890232f2SAndroid Build Coastguard Worker  return b.Bytes, b.Head()
2050*890232f2SAndroid Build Coastguard Worker
2051*890232f2SAndroid Build Coastguard Worker
2052*890232f2SAndroid Build Coastguard Workerclass TestBuilderForceDefaults(unittest.TestCase):
2053*890232f2SAndroid Build Coastguard Worker  """Verify that the builder adds default values when forced."""
2054*890232f2SAndroid Build Coastguard Worker
2055*890232f2SAndroid Build Coastguard Worker  test_flags = [N.BoolFlags(), N.Uint8Flags(), N.Uint16Flags(), \
2056*890232f2SAndroid Build Coastguard Worker                N.Uint32Flags(), N.Uint64Flags(), N.Int8Flags(), \
2057*890232f2SAndroid Build Coastguard Worker                N.Int16Flags(), N.Int32Flags(), N.Int64Flags(), \
2058*890232f2SAndroid Build Coastguard Worker                N.Float32Flags(), N.Float64Flags(), N.UOffsetTFlags()]
2059*890232f2SAndroid Build Coastguard Worker
2060*890232f2SAndroid Build Coastguard Worker  def test_default_force_defaults(self):
2061*890232f2SAndroid Build Coastguard Worker    for flag in self.test_flags:
2062*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
2063*890232f2SAndroid Build Coastguard Worker      b.StartObject(1)
2064*890232f2SAndroid Build Coastguard Worker      stored_offset = b.Offset()
2065*890232f2SAndroid Build Coastguard Worker      if flag != N.UOffsetTFlags():
2066*890232f2SAndroid Build Coastguard Worker        b.PrependSlot(flag, 0, 0, 0)
2067*890232f2SAndroid Build Coastguard Worker      else:
2068*890232f2SAndroid Build Coastguard Worker        b.PrependUOffsetTRelativeSlot(0, 0, 0)
2069*890232f2SAndroid Build Coastguard Worker      end_offset = b.Offset()
2070*890232f2SAndroid Build Coastguard Worker      b.EndObject()
2071*890232f2SAndroid Build Coastguard Worker      self.assertEqual(0, end_offset - stored_offset)
2072*890232f2SAndroid Build Coastguard Worker
2073*890232f2SAndroid Build Coastguard Worker  def test_force_defaults_true(self):
2074*890232f2SAndroid Build Coastguard Worker    for flag in self.test_flags:
2075*890232f2SAndroid Build Coastguard Worker      b = flatbuffers.Builder(0)
2076*890232f2SAndroid Build Coastguard Worker      b.ForceDefaults(True)
2077*890232f2SAndroid Build Coastguard Worker      b.StartObject(1)
2078*890232f2SAndroid Build Coastguard Worker      stored_offset = b.Offset()
2079*890232f2SAndroid Build Coastguard Worker      if flag != N.UOffsetTFlags():
2080*890232f2SAndroid Build Coastguard Worker        b.PrependSlot(flag, 0, 0, 0)
2081*890232f2SAndroid Build Coastguard Worker      else:
2082*890232f2SAndroid Build Coastguard Worker        b.PrependUOffsetTRelativeSlot(0, 0, 0)
2083*890232f2SAndroid Build Coastguard Worker      end_offset = b.Offset()
2084*890232f2SAndroid Build Coastguard Worker      b.EndObject()
2085*890232f2SAndroid Build Coastguard Worker      self.assertEqual(flag.bytewidth, end_offset - stored_offset)
2086*890232f2SAndroid Build Coastguard Worker
2087*890232f2SAndroid Build Coastguard Worker
2088*890232f2SAndroid Build Coastguard Workerclass TestAllCodePathsOfExampleSchema(unittest.TestCase):
2089*890232f2SAndroid Build Coastguard Worker
2090*890232f2SAndroid Build Coastguard Worker  def setUp(self, *args, **kwargs):
2091*890232f2SAndroid Build Coastguard Worker    super(TestAllCodePathsOfExampleSchema, self).setUp(*args, **kwargs)
2092*890232f2SAndroid Build Coastguard Worker
2093*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2094*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b)
2095*890232f2SAndroid Build Coastguard Worker    gen_mon = _MONSTER.MonsterEnd(b)
2096*890232f2SAndroid Build Coastguard Worker    b.Finish(gen_mon)
2097*890232f2SAndroid Build Coastguard Worker
2098*890232f2SAndroid Build Coastguard Worker    self.mon = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())
2099*890232f2SAndroid Build Coastguard Worker
2100*890232f2SAndroid Build Coastguard Worker  def test_default_monster_pos(self):
2101*890232f2SAndroid Build Coastguard Worker    self.assertTrue(self.mon.Pos() is None)
2102*890232f2SAndroid Build Coastguard Worker
2103*890232f2SAndroid Build Coastguard Worker  def test_nondefault_monster_mana(self):
2104*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2105*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b)
2106*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddMana(b, 50)
2107*890232f2SAndroid Build Coastguard Worker    mon = _MONSTER.MonsterEnd(b)
2108*890232f2SAndroid Build Coastguard Worker    b.Finish(mon)
2109*890232f2SAndroid Build Coastguard Worker
2110*890232f2SAndroid Build Coastguard Worker    got_mon = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())
2111*890232f2SAndroid Build Coastguard Worker    self.assertEqual(50, got_mon.Mana())
2112*890232f2SAndroid Build Coastguard Worker
2113*890232f2SAndroid Build Coastguard Worker  def test_default_monster_hp(self):
2114*890232f2SAndroid Build Coastguard Worker    self.assertEqual(100, self.mon.Hp())
2115*890232f2SAndroid Build Coastguard Worker
2116*890232f2SAndroid Build Coastguard Worker  def test_default_monster_name(self):
2117*890232f2SAndroid Build Coastguard Worker    self.assertEqual(None, self.mon.Name())
2118*890232f2SAndroid Build Coastguard Worker
2119*890232f2SAndroid Build Coastguard Worker  def test_default_monster_inventory_item(self):
2120*890232f2SAndroid Build Coastguard Worker    self.assertEqual(0, self.mon.Inventory(0))
2121*890232f2SAndroid Build Coastguard Worker
2122*890232f2SAndroid Build Coastguard Worker  def test_default_monster_inventory_length(self):
2123*890232f2SAndroid Build Coastguard Worker    self.assertEqual(0, self.mon.InventoryLength())
2124*890232f2SAndroid Build Coastguard Worker    self.assertTrue(self.mon.InventoryIsNone())
2125*890232f2SAndroid Build Coastguard Worker
2126*890232f2SAndroid Build Coastguard Worker  def test_empty_monster_inventory_vector(self):
2127*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2128*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStartInventoryVector(b, 0)
2129*890232f2SAndroid Build Coastguard Worker    inv = b.EndVector()
2130*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b)
2131*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddInventory(b, inv)
2132*890232f2SAndroid Build Coastguard Worker    mon = _MONSTER.MonsterEnd(b)
2133*890232f2SAndroid Build Coastguard Worker    b.Finish(mon)
2134*890232f2SAndroid Build Coastguard Worker    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())
2135*890232f2SAndroid Build Coastguard Worker    self.assertFalse(mon2.InventoryIsNone())
2136*890232f2SAndroid Build Coastguard Worker
2137*890232f2SAndroid Build Coastguard Worker  def test_default_monster_color(self):
2138*890232f2SAndroid Build Coastguard Worker    self.assertEqual(_COLOR.Color.Blue, self.mon.Color())
2139*890232f2SAndroid Build Coastguard Worker
2140*890232f2SAndroid Build Coastguard Worker  def test_nondefault_monster_color(self):
2141*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2142*890232f2SAndroid Build Coastguard Worker    color = _COLOR.Color.Red
2143*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b)
2144*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddColor(b, color)
2145*890232f2SAndroid Build Coastguard Worker    mon = _MONSTER.MonsterEnd(b)
2146*890232f2SAndroid Build Coastguard Worker    b.Finish(mon)
2147*890232f2SAndroid Build Coastguard Worker
2148*890232f2SAndroid Build Coastguard Worker    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())
2149*890232f2SAndroid Build Coastguard Worker    self.assertEqual(_COLOR.Color.Red, mon2.Color())
2150*890232f2SAndroid Build Coastguard Worker
2151*890232f2SAndroid Build Coastguard Worker  def test_default_monster_testtype(self):
2152*890232f2SAndroid Build Coastguard Worker    self.assertEqual(0, self.mon.TestType())
2153*890232f2SAndroid Build Coastguard Worker
2154*890232f2SAndroid Build Coastguard Worker  def test_default_monster_test_field(self):
2155*890232f2SAndroid Build Coastguard Worker    self.assertEqual(None, self.mon.Test())
2156*890232f2SAndroid Build Coastguard Worker
2157*890232f2SAndroid Build Coastguard Worker  def test_default_monster_test4_item(self):
2158*890232f2SAndroid Build Coastguard Worker    self.assertEqual(None, self.mon.Test4(0))
2159*890232f2SAndroid Build Coastguard Worker
2160*890232f2SAndroid Build Coastguard Worker  def test_default_monster_test4_length(self):
2161*890232f2SAndroid Build Coastguard Worker    self.assertEqual(0, self.mon.Test4Length())
2162*890232f2SAndroid Build Coastguard Worker    self.assertTrue(self.mon.Test4IsNone())
2163*890232f2SAndroid Build Coastguard Worker
2164*890232f2SAndroid Build Coastguard Worker  def test_empty_monster_test4_vector(self):
2165*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2166*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStartTest4Vector(b, 0)
2167*890232f2SAndroid Build Coastguard Worker    test4 = b.EndVector()
2168*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b)
2169*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddTest4(b, test4)
2170*890232f2SAndroid Build Coastguard Worker    mon = _MONSTER.MonsterEnd(b)
2171*890232f2SAndroid Build Coastguard Worker    b.Finish(mon)
2172*890232f2SAndroid Build Coastguard Worker    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())
2173*890232f2SAndroid Build Coastguard Worker    self.assertFalse(mon2.Test4IsNone())
2174*890232f2SAndroid Build Coastguard Worker
2175*890232f2SAndroid Build Coastguard Worker  def test_default_monster_testarrayofstring(self):
2176*890232f2SAndroid Build Coastguard Worker    self.assertEqual('', self.mon.Testarrayofstring(0))
2177*890232f2SAndroid Build Coastguard Worker
2178*890232f2SAndroid Build Coastguard Worker  def test_default_monster_testarrayofstring_length(self):
2179*890232f2SAndroid Build Coastguard Worker    self.assertEqual(0, self.mon.TestarrayofstringLength())
2180*890232f2SAndroid Build Coastguard Worker    self.assertTrue(self.mon.TestarrayofstringIsNone())
2181*890232f2SAndroid Build Coastguard Worker
2182*890232f2SAndroid Build Coastguard Worker  def test_empty_monster_testarrayofstring_vector(self):
2183*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2184*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStartTestarrayofstringVector(b, 0)
2185*890232f2SAndroid Build Coastguard Worker    testarrayofstring = b.EndVector()
2186*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b)
2187*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddTestarrayofstring(b, testarrayofstring)
2188*890232f2SAndroid Build Coastguard Worker    mon = _MONSTER.MonsterEnd(b)
2189*890232f2SAndroid Build Coastguard Worker    b.Finish(mon)
2190*890232f2SAndroid Build Coastguard Worker    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())
2191*890232f2SAndroid Build Coastguard Worker    self.assertFalse(mon2.TestarrayofstringIsNone())
2192*890232f2SAndroid Build Coastguard Worker
2193*890232f2SAndroid Build Coastguard Worker  def test_default_monster_testarrayoftables(self):
2194*890232f2SAndroid Build Coastguard Worker    self.assertEqual(None, self.mon.Testarrayoftables(0))
2195*890232f2SAndroid Build Coastguard Worker
2196*890232f2SAndroid Build Coastguard Worker  def test_nondefault_monster_testarrayoftables(self):
2197*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2198*890232f2SAndroid Build Coastguard Worker
2199*890232f2SAndroid Build Coastguard Worker    # make a child Monster within a vector of Monsters:
2200*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b)
2201*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddHp(b, 99)
2202*890232f2SAndroid Build Coastguard Worker    sub_monster = _MONSTER.MonsterEnd(b)
2203*890232f2SAndroid Build Coastguard Worker
2204*890232f2SAndroid Build Coastguard Worker    # build the vector:
2205*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStartTestarrayoftablesVector(b, 1)
2206*890232f2SAndroid Build Coastguard Worker    b.PrependUOffsetTRelative(sub_monster)
2207*890232f2SAndroid Build Coastguard Worker    vec = b.EndVector()
2208*890232f2SAndroid Build Coastguard Worker
2209*890232f2SAndroid Build Coastguard Worker    # make the parent monster and include the vector of Monster:
2210*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b)
2211*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddTestarrayoftables(b, vec)
2212*890232f2SAndroid Build Coastguard Worker    mon = _MONSTER.MonsterEnd(b)
2213*890232f2SAndroid Build Coastguard Worker    b.Finish(mon)
2214*890232f2SAndroid Build Coastguard Worker
2215*890232f2SAndroid Build Coastguard Worker    # inspect the resulting data:
2216*890232f2SAndroid Build Coastguard Worker    mon2 = _MONSTER.Monster.GetRootAs(b.Output(), 0)
2217*890232f2SAndroid Build Coastguard Worker    self.assertEqual(99, mon2.Testarrayoftables(0).Hp())
2218*890232f2SAndroid Build Coastguard Worker    self.assertEqual(1, mon2.TestarrayoftablesLength())
2219*890232f2SAndroid Build Coastguard Worker    self.assertFalse(mon2.TestarrayoftablesIsNone())
2220*890232f2SAndroid Build Coastguard Worker
2221*890232f2SAndroid Build Coastguard Worker  def test_default_monster_testarrayoftables_length(self):
2222*890232f2SAndroid Build Coastguard Worker    self.assertEqual(0, self.mon.TestarrayoftablesLength())
2223*890232f2SAndroid Build Coastguard Worker    self.assertTrue(self.mon.TestarrayoftablesIsNone())
2224*890232f2SAndroid Build Coastguard Worker
2225*890232f2SAndroid Build Coastguard Worker  def test_empty_monster_testarrayoftables_vector(self):
2226*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2227*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStartTestarrayoftablesVector(b, 0)
2228*890232f2SAndroid Build Coastguard Worker    testarrayoftables = b.EndVector()
2229*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b)
2230*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddTestarrayoftables(b, testarrayoftables)
2231*890232f2SAndroid Build Coastguard Worker    mon = _MONSTER.MonsterEnd(b)
2232*890232f2SAndroid Build Coastguard Worker    b.Finish(mon)
2233*890232f2SAndroid Build Coastguard Worker    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())
2234*890232f2SAndroid Build Coastguard Worker    self.assertFalse(mon2.TestarrayoftablesIsNone())
2235*890232f2SAndroid Build Coastguard Worker
2236*890232f2SAndroid Build Coastguard Worker  def test_default_monster_testarrayoftables_length(self):
2237*890232f2SAndroid Build Coastguard Worker    self.assertEqual(0, self.mon.TestarrayoftablesLength())
2238*890232f2SAndroid Build Coastguard Worker
2239*890232f2SAndroid Build Coastguard Worker  def test_nondefault_monster_enemy(self):
2240*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2241*890232f2SAndroid Build Coastguard Worker
2242*890232f2SAndroid Build Coastguard Worker    # make an Enemy object:
2243*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b)
2244*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddHp(b, 88)
2245*890232f2SAndroid Build Coastguard Worker    enemy = _MONSTER.MonsterEnd(b)
2246*890232f2SAndroid Build Coastguard Worker    b.Finish(enemy)
2247*890232f2SAndroid Build Coastguard Worker
2248*890232f2SAndroid Build Coastguard Worker    # make the parent monster and include the vector of Monster:
2249*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b)
2250*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddEnemy(b, enemy)
2251*890232f2SAndroid Build Coastguard Worker    mon = _MONSTER.MonsterEnd(b)
2252*890232f2SAndroid Build Coastguard Worker    b.Finish(mon)
2253*890232f2SAndroid Build Coastguard Worker
2254*890232f2SAndroid Build Coastguard Worker    # inspect the resulting data:
2255*890232f2SAndroid Build Coastguard Worker    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())
2256*890232f2SAndroid Build Coastguard Worker    self.assertEqual(88, mon2.Enemy().Hp())
2257*890232f2SAndroid Build Coastguard Worker
2258*890232f2SAndroid Build Coastguard Worker  def test_default_monster_testnestedflatbuffer(self):
2259*890232f2SAndroid Build Coastguard Worker    self.assertEqual(0, self.mon.Testnestedflatbuffer(0))
2260*890232f2SAndroid Build Coastguard Worker
2261*890232f2SAndroid Build Coastguard Worker  def test_default_monster_testnestedflatbuffer_length(self):
2262*890232f2SAndroid Build Coastguard Worker    self.assertEqual(0, self.mon.TestnestedflatbufferLength())
2263*890232f2SAndroid Build Coastguard Worker    self.assertTrue(self.mon.TestnestedflatbufferIsNone())
2264*890232f2SAndroid Build Coastguard Worker
2265*890232f2SAndroid Build Coastguard Worker  def test_empty_monster_testnestedflatbuffer_vector(self):
2266*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2267*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStartTestnestedflatbufferVector(b, 0)
2268*890232f2SAndroid Build Coastguard Worker    testnestedflatbuffer = b.EndVector()
2269*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b)
2270*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddTestnestedflatbuffer(b, testnestedflatbuffer)
2271*890232f2SAndroid Build Coastguard Worker    mon = _MONSTER.MonsterEnd(b)
2272*890232f2SAndroid Build Coastguard Worker    b.Finish(mon)
2273*890232f2SAndroid Build Coastguard Worker    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())
2274*890232f2SAndroid Build Coastguard Worker    self.assertFalse(mon2.TestnestedflatbufferIsNone())
2275*890232f2SAndroid Build Coastguard Worker
2276*890232f2SAndroid Build Coastguard Worker  def test_nondefault_monster_testnestedflatbuffer(self):
2277*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2278*890232f2SAndroid Build Coastguard Worker
2279*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStartTestnestedflatbufferVector(b, 3)
2280*890232f2SAndroid Build Coastguard Worker    b.PrependByte(4)
2281*890232f2SAndroid Build Coastguard Worker    b.PrependByte(2)
2282*890232f2SAndroid Build Coastguard Worker    b.PrependByte(0)
2283*890232f2SAndroid Build Coastguard Worker    sub_buf = b.EndVector()
2284*890232f2SAndroid Build Coastguard Worker
2285*890232f2SAndroid Build Coastguard Worker    # make the parent monster and include the vector of Monster:
2286*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b)
2287*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddTestnestedflatbuffer(b, sub_buf)
2288*890232f2SAndroid Build Coastguard Worker    mon = _MONSTER.MonsterEnd(b)
2289*890232f2SAndroid Build Coastguard Worker    b.Finish(mon)
2290*890232f2SAndroid Build Coastguard Worker
2291*890232f2SAndroid Build Coastguard Worker    # inspect the resulting data:
2292*890232f2SAndroid Build Coastguard Worker    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())
2293*890232f2SAndroid Build Coastguard Worker    self.assertEqual(3, mon2.TestnestedflatbufferLength())
2294*890232f2SAndroid Build Coastguard Worker    self.assertFalse(mon2.TestnestedflatbufferIsNone())
2295*890232f2SAndroid Build Coastguard Worker    self.assertEqual(0, mon2.Testnestedflatbuffer(0))
2296*890232f2SAndroid Build Coastguard Worker    self.assertEqual(2, mon2.Testnestedflatbuffer(1))
2297*890232f2SAndroid Build Coastguard Worker    self.assertEqual(4, mon2.Testnestedflatbuffer(2))
2298*890232f2SAndroid Build Coastguard Worker    try:
2299*890232f2SAndroid Build Coastguard Worker      imp.find_module('numpy')
2300*890232f2SAndroid Build Coastguard Worker      # if numpy exists, then we should be able to get the
2301*890232f2SAndroid Build Coastguard Worker      # vector as a numpy array
2302*890232f2SAndroid Build Coastguard Worker      self.assertEqual([0, 2, 4], mon2.TestnestedflatbufferAsNumpy().tolist())
2303*890232f2SAndroid Build Coastguard Worker    except ImportError:
2304*890232f2SAndroid Build Coastguard Worker      assertRaises(self, lambda: mon2.TestnestedflatbufferAsNumpy(),
2305*890232f2SAndroid Build Coastguard Worker                   NumpyRequiredForThisFeature)
2306*890232f2SAndroid Build Coastguard Worker
2307*890232f2SAndroid Build Coastguard Worker  def test_nested_monster_testnestedflatbuffer(self):
2308*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2309*890232f2SAndroid Build Coastguard Worker
2310*890232f2SAndroid Build Coastguard Worker    # build another monster to nest inside testnestedflatbuffer
2311*890232f2SAndroid Build Coastguard Worker    nestedB = flatbuffers.Builder(0)
2312*890232f2SAndroid Build Coastguard Worker    nameStr = nestedB.CreateString('Nested Monster')
2313*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(nestedB)
2314*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddHp(nestedB, 30)
2315*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddName(nestedB, nameStr)
2316*890232f2SAndroid Build Coastguard Worker    nestedMon = _MONSTER.MonsterEnd(nestedB)
2317*890232f2SAndroid Build Coastguard Worker    nestedB.Finish(nestedMon)
2318*890232f2SAndroid Build Coastguard Worker
2319*890232f2SAndroid Build Coastguard Worker    # write the nested FB bytes
2320*890232f2SAndroid Build Coastguard Worker    sub_buf = _MONSTER.MonsterMakeTestnestedflatbufferVectorFromBytes(
2321*890232f2SAndroid Build Coastguard Worker        b, nestedB.Output())
2322*890232f2SAndroid Build Coastguard Worker
2323*890232f2SAndroid Build Coastguard Worker    # make the parent monster and include the bytes of the nested monster
2324*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b)
2325*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddTestnestedflatbuffer(b, sub_buf)
2326*890232f2SAndroid Build Coastguard Worker    mon = _MONSTER.MonsterEnd(b)
2327*890232f2SAndroid Build Coastguard Worker    b.Finish(mon)
2328*890232f2SAndroid Build Coastguard Worker
2329*890232f2SAndroid Build Coastguard Worker    # inspect the resulting data:
2330*890232f2SAndroid Build Coastguard Worker    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())
2331*890232f2SAndroid Build Coastguard Worker    nestedMon2 = mon2.TestnestedflatbufferNestedRoot()
2332*890232f2SAndroid Build Coastguard Worker    self.assertEqual(b'Nested Monster', nestedMon2.Name())
2333*890232f2SAndroid Build Coastguard Worker    self.assertEqual(30, nestedMon2.Hp())
2334*890232f2SAndroid Build Coastguard Worker
2335*890232f2SAndroid Build Coastguard Worker  def test_nondefault_monster_testempty(self):
2336*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2337*890232f2SAndroid Build Coastguard Worker
2338*890232f2SAndroid Build Coastguard Worker    # make a Stat object:
2339*890232f2SAndroid Build Coastguard Worker    _STAT.StatStart(b)
2340*890232f2SAndroid Build Coastguard Worker    _STAT.StatAddVal(b, 123)
2341*890232f2SAndroid Build Coastguard Worker    my_stat = _STAT.StatEnd(b)
2342*890232f2SAndroid Build Coastguard Worker    b.Finish(my_stat)
2343*890232f2SAndroid Build Coastguard Worker
2344*890232f2SAndroid Build Coastguard Worker    # include the stat object in a monster:
2345*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b)
2346*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddTestempty(b, my_stat)
2347*890232f2SAndroid Build Coastguard Worker    mon = _MONSTER.MonsterEnd(b)
2348*890232f2SAndroid Build Coastguard Worker    b.Finish(mon)
2349*890232f2SAndroid Build Coastguard Worker
2350*890232f2SAndroid Build Coastguard Worker    # inspect the resulting data:
2351*890232f2SAndroid Build Coastguard Worker    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())
2352*890232f2SAndroid Build Coastguard Worker    self.assertEqual(123, mon2.Testempty().Val())
2353*890232f2SAndroid Build Coastguard Worker
2354*890232f2SAndroid Build Coastguard Worker  def test_default_monster_testbool(self):
2355*890232f2SAndroid Build Coastguard Worker    self.assertFalse(self.mon.Testbool())
2356*890232f2SAndroid Build Coastguard Worker
2357*890232f2SAndroid Build Coastguard Worker  def test_nondefault_monster_testbool(self):
2358*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2359*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b)
2360*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddTestbool(b, True)
2361*890232f2SAndroid Build Coastguard Worker    mon = _MONSTER.MonsterEnd(b)
2362*890232f2SAndroid Build Coastguard Worker    b.Finish(mon)
2363*890232f2SAndroid Build Coastguard Worker
2364*890232f2SAndroid Build Coastguard Worker    # inspect the resulting data:
2365*890232f2SAndroid Build Coastguard Worker    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())
2366*890232f2SAndroid Build Coastguard Worker    self.assertTrue(mon2.Testbool())
2367*890232f2SAndroid Build Coastguard Worker
2368*890232f2SAndroid Build Coastguard Worker  def test_default_monster_testhashes(self):
2369*890232f2SAndroid Build Coastguard Worker    self.assertEqual(0, self.mon.Testhashs32Fnv1())
2370*890232f2SAndroid Build Coastguard Worker    self.assertEqual(0, self.mon.Testhashu32Fnv1())
2371*890232f2SAndroid Build Coastguard Worker    self.assertEqual(0, self.mon.Testhashs64Fnv1())
2372*890232f2SAndroid Build Coastguard Worker    self.assertEqual(0, self.mon.Testhashu64Fnv1())
2373*890232f2SAndroid Build Coastguard Worker    self.assertEqual(0, self.mon.Testhashs32Fnv1a())
2374*890232f2SAndroid Build Coastguard Worker    self.assertEqual(0, self.mon.Testhashu32Fnv1a())
2375*890232f2SAndroid Build Coastguard Worker    self.assertEqual(0, self.mon.Testhashs64Fnv1a())
2376*890232f2SAndroid Build Coastguard Worker    self.assertEqual(0, self.mon.Testhashu64Fnv1a())
2377*890232f2SAndroid Build Coastguard Worker
2378*890232f2SAndroid Build Coastguard Worker  def test_nondefault_monster_testhashes(self):
2379*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2380*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b)
2381*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddTesthashs32Fnv1(b, 1)
2382*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddTesthashu32Fnv1(b, 2)
2383*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddTesthashs64Fnv1(b, 3)
2384*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddTesthashu64Fnv1(b, 4)
2385*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddTesthashs32Fnv1a(b, 5)
2386*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddTesthashu32Fnv1a(b, 6)
2387*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddTesthashs64Fnv1a(b, 7)
2388*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddTesthashu64Fnv1a(b, 8)
2389*890232f2SAndroid Build Coastguard Worker    mon = _MONSTER.MonsterEnd(b)
2390*890232f2SAndroid Build Coastguard Worker    b.Finish(mon)
2391*890232f2SAndroid Build Coastguard Worker
2392*890232f2SAndroid Build Coastguard Worker    # inspect the resulting data:
2393*890232f2SAndroid Build Coastguard Worker    mon2 = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())
2394*890232f2SAndroid Build Coastguard Worker    self.assertEqual(1, mon2.Testhashs32Fnv1())
2395*890232f2SAndroid Build Coastguard Worker    self.assertEqual(2, mon2.Testhashu32Fnv1())
2396*890232f2SAndroid Build Coastguard Worker    self.assertEqual(3, mon2.Testhashs64Fnv1())
2397*890232f2SAndroid Build Coastguard Worker    self.assertEqual(4, mon2.Testhashu64Fnv1())
2398*890232f2SAndroid Build Coastguard Worker    self.assertEqual(5, mon2.Testhashs32Fnv1a())
2399*890232f2SAndroid Build Coastguard Worker    self.assertEqual(6, mon2.Testhashu32Fnv1a())
2400*890232f2SAndroid Build Coastguard Worker    self.assertEqual(7, mon2.Testhashs64Fnv1a())
2401*890232f2SAndroid Build Coastguard Worker    self.assertEqual(8, mon2.Testhashu64Fnv1a())
2402*890232f2SAndroid Build Coastguard Worker
2403*890232f2SAndroid Build Coastguard Worker  def test_default_monster_parent_namespace_test(self):
2404*890232f2SAndroid Build Coastguard Worker    self.assertEqual(None, self.mon.ParentNamespaceTest())
2405*890232f2SAndroid Build Coastguard Worker
2406*890232f2SAndroid Build Coastguard Worker  def test_nondefault_monster_parent_namespace_test(self):
2407*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2408*890232f2SAndroid Build Coastguard Worker    _IN_PARENT_NAMESPACE.InParentNamespaceStart(b)
2409*890232f2SAndroid Build Coastguard Worker    parent = _IN_PARENT_NAMESPACE.InParentNamespaceEnd(b)
2410*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterStart(b)
2411*890232f2SAndroid Build Coastguard Worker    _MONSTER.MonsterAddParentNamespaceTest(b, parent)
2412*890232f2SAndroid Build Coastguard Worker    mon = _MONSTER.MonsterEnd(b)
2413*890232f2SAndroid Build Coastguard Worker    b.Finish(mon)
2414*890232f2SAndroid Build Coastguard Worker
2415*890232f2SAndroid Build Coastguard Worker    # Inspect the resulting data.
2416*890232f2SAndroid Build Coastguard Worker    monster = _MONSTER.Monster.GetRootAs(b.Bytes, b.Head())
2417*890232f2SAndroid Build Coastguard Worker    self.assertTrue(
2418*890232f2SAndroid Build Coastguard Worker        isinstance(monster.ParentNamespaceTest(),
2419*890232f2SAndroid Build Coastguard Worker                   _IN_PARENT_NAMESPACE.InParentNamespace))
2420*890232f2SAndroid Build Coastguard Worker
2421*890232f2SAndroid Build Coastguard Worker  def test_getrootas_for_nonroot_table(self):
2422*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2423*890232f2SAndroid Build Coastguard Worker    string = b.CreateString('MyStat')
2424*890232f2SAndroid Build Coastguard Worker
2425*890232f2SAndroid Build Coastguard Worker    _STAT.StatStart(b)
2426*890232f2SAndroid Build Coastguard Worker    _STAT.StatAddId(b, string)
2427*890232f2SAndroid Build Coastguard Worker    _STAT.StatAddVal(b, 12345678)
2428*890232f2SAndroid Build Coastguard Worker    _STAT.StatAddCount(b, 12345)
2429*890232f2SAndroid Build Coastguard Worker    stat = _STAT.StatEnd(b)
2430*890232f2SAndroid Build Coastguard Worker    b.Finish(stat)
2431*890232f2SAndroid Build Coastguard Worker
2432*890232f2SAndroid Build Coastguard Worker    stat2 = _STAT.Stat.GetRootAs(b.Bytes, b.Head())
2433*890232f2SAndroid Build Coastguard Worker
2434*890232f2SAndroid Build Coastguard Worker    self.assertEqual(b'MyStat', stat2.Id())
2435*890232f2SAndroid Build Coastguard Worker    self.assertEqual(12345678, stat2.Val())
2436*890232f2SAndroid Build Coastguard Worker    self.assertEqual(12345, stat2.Count())
2437*890232f2SAndroid Build Coastguard Worker
2438*890232f2SAndroid Build Coastguard Worker
2439*890232f2SAndroid Build Coastguard Workerclass TestAllCodePathsOfMonsterExtraSchema(unittest.TestCase):
2440*890232f2SAndroid Build Coastguard Worker
2441*890232f2SAndroid Build Coastguard Worker  def setUp(self, *args, **kwargs):
2442*890232f2SAndroid Build Coastguard Worker    super(TestAllCodePathsOfMonsterExtraSchema, self).setUp(*args, **kwargs)
2443*890232f2SAndroid Build Coastguard Worker
2444*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2445*890232f2SAndroid Build Coastguard Worker    MyGame.MonsterExtra.Start(b)
2446*890232f2SAndroid Build Coastguard Worker    gen_mon = MyGame.MonsterExtra.End(b)
2447*890232f2SAndroid Build Coastguard Worker    b.Finish(gen_mon)
2448*890232f2SAndroid Build Coastguard Worker
2449*890232f2SAndroid Build Coastguard Worker    self.mon = MyGame.MonsterExtra.MonsterExtra.GetRootAs(b.Bytes, b.Head())
2450*890232f2SAndroid Build Coastguard Worker
2451*890232f2SAndroid Build Coastguard Worker  def test_default_nan_inf(self):
2452*890232f2SAndroid Build Coastguard Worker    self.assertTrue(math.isnan(self.mon.F1()))
2453*890232f2SAndroid Build Coastguard Worker    self.assertEqual(self.mon.F2(), float('inf'))
2454*890232f2SAndroid Build Coastguard Worker    self.assertEqual(self.mon.F3(), float('-inf'))
2455*890232f2SAndroid Build Coastguard Worker
2456*890232f2SAndroid Build Coastguard Worker    self.assertTrue(math.isnan(self.mon.D1()))
2457*890232f2SAndroid Build Coastguard Worker    self.assertEqual(self.mon.D2(), float('inf'))
2458*890232f2SAndroid Build Coastguard Worker    self.assertEqual(self.mon.D3(), float('-inf'))
2459*890232f2SAndroid Build Coastguard Worker
2460*890232f2SAndroid Build Coastguard Worker
2461*890232f2SAndroid Build Coastguard Workerclass TestVtableDeduplication(unittest.TestCase):
2462*890232f2SAndroid Build Coastguard Worker  """ TestVtableDeduplication verifies that vtables are deduplicated. """
2463*890232f2SAndroid Build Coastguard Worker
2464*890232f2SAndroid Build Coastguard Worker  def test_vtable_deduplication(self):
2465*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2466*890232f2SAndroid Build Coastguard Worker
2467*890232f2SAndroid Build Coastguard Worker    b.StartObject(4)
2468*890232f2SAndroid Build Coastguard Worker    b.PrependByteSlot(0, 0, 0)
2469*890232f2SAndroid Build Coastguard Worker    b.PrependByteSlot(1, 11, 0)
2470*890232f2SAndroid Build Coastguard Worker    b.PrependByteSlot(2, 22, 0)
2471*890232f2SAndroid Build Coastguard Worker    b.PrependInt16Slot(3, 33, 0)
2472*890232f2SAndroid Build Coastguard Worker    obj0 = b.EndObject()
2473*890232f2SAndroid Build Coastguard Worker
2474*890232f2SAndroid Build Coastguard Worker    b.StartObject(4)
2475*890232f2SAndroid Build Coastguard Worker    b.PrependByteSlot(0, 0, 0)
2476*890232f2SAndroid Build Coastguard Worker    b.PrependByteSlot(1, 44, 0)
2477*890232f2SAndroid Build Coastguard Worker    b.PrependByteSlot(2, 55, 0)
2478*890232f2SAndroid Build Coastguard Worker    b.PrependInt16Slot(3, 66, 0)
2479*890232f2SAndroid Build Coastguard Worker    obj1 = b.EndObject()
2480*890232f2SAndroid Build Coastguard Worker
2481*890232f2SAndroid Build Coastguard Worker    b.StartObject(4)
2482*890232f2SAndroid Build Coastguard Worker    b.PrependByteSlot(0, 0, 0)
2483*890232f2SAndroid Build Coastguard Worker    b.PrependByteSlot(1, 77, 0)
2484*890232f2SAndroid Build Coastguard Worker    b.PrependByteSlot(2, 88, 0)
2485*890232f2SAndroid Build Coastguard Worker    b.PrependInt16Slot(3, 99, 0)
2486*890232f2SAndroid Build Coastguard Worker    obj2 = b.EndObject()
2487*890232f2SAndroid Build Coastguard Worker
2488*890232f2SAndroid Build Coastguard Worker    got = b.Bytes[b.Head():]
2489*890232f2SAndroid Build Coastguard Worker
2490*890232f2SAndroid Build Coastguard Worker    want = bytearray([
2491*890232f2SAndroid Build Coastguard Worker        240,
2492*890232f2SAndroid Build Coastguard Worker        255,
2493*890232f2SAndroid Build Coastguard Worker        255,
2494*890232f2SAndroid Build Coastguard Worker        255,  # == -12. offset to dedupped vtable.
2495*890232f2SAndroid Build Coastguard Worker        99,
2496*890232f2SAndroid Build Coastguard Worker        0,
2497*890232f2SAndroid Build Coastguard Worker        88,
2498*890232f2SAndroid Build Coastguard Worker        77,
2499*890232f2SAndroid Build Coastguard Worker        248,
2500*890232f2SAndroid Build Coastguard Worker        255,
2501*890232f2SAndroid Build Coastguard Worker        255,
2502*890232f2SAndroid Build Coastguard Worker        255,  # == -8. offset to dedupped vtable.
2503*890232f2SAndroid Build Coastguard Worker        66,
2504*890232f2SAndroid Build Coastguard Worker        0,
2505*890232f2SAndroid Build Coastguard Worker        55,
2506*890232f2SAndroid Build Coastguard Worker        44,
2507*890232f2SAndroid Build Coastguard Worker        12,
2508*890232f2SAndroid Build Coastguard Worker        0,
2509*890232f2SAndroid Build Coastguard Worker        8,
2510*890232f2SAndroid Build Coastguard Worker        0,
2511*890232f2SAndroid Build Coastguard Worker        0,
2512*890232f2SAndroid Build Coastguard Worker        0,
2513*890232f2SAndroid Build Coastguard Worker        7,
2514*890232f2SAndroid Build Coastguard Worker        0,
2515*890232f2SAndroid Build Coastguard Worker        6,
2516*890232f2SAndroid Build Coastguard Worker        0,
2517*890232f2SAndroid Build Coastguard Worker        4,
2518*890232f2SAndroid Build Coastguard Worker        0,
2519*890232f2SAndroid Build Coastguard Worker        12,
2520*890232f2SAndroid Build Coastguard Worker        0,
2521*890232f2SAndroid Build Coastguard Worker        0,
2522*890232f2SAndroid Build Coastguard Worker        0,
2523*890232f2SAndroid Build Coastguard Worker        33,
2524*890232f2SAndroid Build Coastguard Worker        0,
2525*890232f2SAndroid Build Coastguard Worker        22,
2526*890232f2SAndroid Build Coastguard Worker        11,
2527*890232f2SAndroid Build Coastguard Worker    ])
2528*890232f2SAndroid Build Coastguard Worker
2529*890232f2SAndroid Build Coastguard Worker    self.assertEqual((len(want), want), (len(got), got))
2530*890232f2SAndroid Build Coastguard Worker
2531*890232f2SAndroid Build Coastguard Worker    table0 = flatbuffers.table.Table(b.Bytes, len(b.Bytes) - obj0)
2532*890232f2SAndroid Build Coastguard Worker    table1 = flatbuffers.table.Table(b.Bytes, len(b.Bytes) - obj1)
2533*890232f2SAndroid Build Coastguard Worker    table2 = flatbuffers.table.Table(b.Bytes, len(b.Bytes) - obj2)
2534*890232f2SAndroid Build Coastguard Worker
2535*890232f2SAndroid Build Coastguard Worker    def _checkTable(tab, voffsett_value, b, c, d):
2536*890232f2SAndroid Build Coastguard Worker      # vtable size
2537*890232f2SAndroid Build Coastguard Worker      got = tab.GetVOffsetTSlot(0, 0)
2538*890232f2SAndroid Build Coastguard Worker      self.assertEqual(12, got, 'case 0, 0')
2539*890232f2SAndroid Build Coastguard Worker
2540*890232f2SAndroid Build Coastguard Worker      # object size
2541*890232f2SAndroid Build Coastguard Worker      got = tab.GetVOffsetTSlot(2, 0)
2542*890232f2SAndroid Build Coastguard Worker      self.assertEqual(8, got, 'case 2, 0')
2543*890232f2SAndroid Build Coastguard Worker
2544*890232f2SAndroid Build Coastguard Worker      # default value
2545*890232f2SAndroid Build Coastguard Worker      got = tab.GetVOffsetTSlot(4, 0)
2546*890232f2SAndroid Build Coastguard Worker      self.assertEqual(voffsett_value, got, 'case 4, 0')
2547*890232f2SAndroid Build Coastguard Worker
2548*890232f2SAndroid Build Coastguard Worker      got = tab.GetSlot(6, 0, N.Uint8Flags)
2549*890232f2SAndroid Build Coastguard Worker      self.assertEqual(b, got, 'case 6, 0')
2550*890232f2SAndroid Build Coastguard Worker
2551*890232f2SAndroid Build Coastguard Worker      val = tab.GetSlot(8, 0, N.Uint8Flags)
2552*890232f2SAndroid Build Coastguard Worker      self.assertEqual(c, val, 'failed 8, 0')
2553*890232f2SAndroid Build Coastguard Worker
2554*890232f2SAndroid Build Coastguard Worker      got = tab.GetSlot(10, 0, N.Uint8Flags)
2555*890232f2SAndroid Build Coastguard Worker      self.assertEqual(d, got, 'failed 10, 0')
2556*890232f2SAndroid Build Coastguard Worker
2557*890232f2SAndroid Build Coastguard Worker    _checkTable(table0, 0, 11, 22, 33)
2558*890232f2SAndroid Build Coastguard Worker    _checkTable(table1, 0, 44, 55, 66)
2559*890232f2SAndroid Build Coastguard Worker    _checkTable(table2, 0, 77, 88, 99)
2560*890232f2SAndroid Build Coastguard Worker
2561*890232f2SAndroid Build Coastguard Worker
2562*890232f2SAndroid Build Coastguard Workerclass TestExceptions(unittest.TestCase):
2563*890232f2SAndroid Build Coastguard Worker
2564*890232f2SAndroid Build Coastguard Worker  def test_object_is_nested_error(self):
2565*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2566*890232f2SAndroid Build Coastguard Worker    b.StartObject(0)
2567*890232f2SAndroid Build Coastguard Worker    assertRaises(self, lambda: b.StartObject(0),
2568*890232f2SAndroid Build Coastguard Worker                 flatbuffers.builder.IsNestedError)
2569*890232f2SAndroid Build Coastguard Worker
2570*890232f2SAndroid Build Coastguard Worker  def test_object_is_not_nested_error(self):
2571*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2572*890232f2SAndroid Build Coastguard Worker    assertRaises(self, lambda: b.EndObject(),
2573*890232f2SAndroid Build Coastguard Worker                 flatbuffers.builder.IsNotNestedError)
2574*890232f2SAndroid Build Coastguard Worker
2575*890232f2SAndroid Build Coastguard Worker  def test_struct_is_not_inline_error(self):
2576*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2577*890232f2SAndroid Build Coastguard Worker    b.StartObject(0)
2578*890232f2SAndroid Build Coastguard Worker    assertRaises(self, lambda: b.PrependStructSlot(0, 1, 0),
2579*890232f2SAndroid Build Coastguard Worker                 flatbuffers.builder.StructIsNotInlineError)
2580*890232f2SAndroid Build Coastguard Worker
2581*890232f2SAndroid Build Coastguard Worker  def test_unreachable_error(self):
2582*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2583*890232f2SAndroid Build Coastguard Worker    assertRaises(self, lambda: b.PrependUOffsetTRelative(1),
2584*890232f2SAndroid Build Coastguard Worker                 flatbuffers.builder.OffsetArithmeticError)
2585*890232f2SAndroid Build Coastguard Worker
2586*890232f2SAndroid Build Coastguard Worker  def test_create_string_is_nested_error(self):
2587*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2588*890232f2SAndroid Build Coastguard Worker    b.StartObject(0)
2589*890232f2SAndroid Build Coastguard Worker    s = 'test1'
2590*890232f2SAndroid Build Coastguard Worker    assertRaises(self, lambda: b.CreateString(s),
2591*890232f2SAndroid Build Coastguard Worker                 flatbuffers.builder.IsNestedError)
2592*890232f2SAndroid Build Coastguard Worker
2593*890232f2SAndroid Build Coastguard Worker  def test_create_byte_vector_is_nested_error(self):
2594*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2595*890232f2SAndroid Build Coastguard Worker    b.StartObject(0)
2596*890232f2SAndroid Build Coastguard Worker    s = b'test1'
2597*890232f2SAndroid Build Coastguard Worker    assertRaises(self, lambda: b.CreateByteVector(s),
2598*890232f2SAndroid Build Coastguard Worker                 flatbuffers.builder.IsNestedError)
2599*890232f2SAndroid Build Coastguard Worker
2600*890232f2SAndroid Build Coastguard Worker  def test_finished_bytes_error(self):
2601*890232f2SAndroid Build Coastguard Worker    b = flatbuffers.Builder(0)
2602*890232f2SAndroid Build Coastguard Worker    assertRaises(self, lambda: b.Output(),
2603*890232f2SAndroid Build Coastguard Worker                 flatbuffers.builder.BuilderNotFinishedError)
2604*890232f2SAndroid Build Coastguard Worker
2605*890232f2SAndroid Build Coastguard Worker
2606*890232f2SAndroid Build Coastguard Workerclass TestFixedLengthArrays(unittest.TestCase):
2607*890232f2SAndroid Build Coastguard Worker
2608*890232f2SAndroid Build Coastguard Worker  def test_fixed_length_array(self):
2609*890232f2SAndroid Build Coastguard Worker    builder = flatbuffers.Builder(0)
2610*890232f2SAndroid Build Coastguard Worker
2611*890232f2SAndroid Build Coastguard Worker    a = 0.5
2612*890232f2SAndroid Build Coastguard Worker    b = range(0, 15)
2613*890232f2SAndroid Build Coastguard Worker    c = 1
2614*890232f2SAndroid Build Coastguard Worker    d_a = [[1, 2], [3, 4]]
2615*890232f2SAndroid Build Coastguard Worker    d_b = [MyGame.Example.TestEnum.TestEnum.B, \
2616*890232f2SAndroid Build Coastguard Worker            MyGame.Example.TestEnum.TestEnum.C]
2617*890232f2SAndroid Build Coastguard Worker    d_c = [[MyGame.Example.TestEnum.TestEnum.A, \
2618*890232f2SAndroid Build Coastguard Worker            MyGame.Example.TestEnum.TestEnum.B], \
2619*890232f2SAndroid Build Coastguard Worker            [MyGame.Example.TestEnum.TestEnum.C, \
2620*890232f2SAndroid Build Coastguard Worker             MyGame.Example.TestEnum.TestEnum.B]]
2621*890232f2SAndroid Build Coastguard Worker    d_d = [[-1, 1], [-2, 2]]
2622*890232f2SAndroid Build Coastguard Worker    e = 2
2623*890232f2SAndroid Build Coastguard Worker    f = [-1, 1]
2624*890232f2SAndroid Build Coastguard Worker
2625*890232f2SAndroid Build Coastguard Worker    arrayOffset = MyGame.Example.ArrayStruct.CreateArrayStruct(builder, \
2626*890232f2SAndroid Build Coastguard Worker        a, b, c, d_a, d_b, d_c, d_d, e, f)
2627*890232f2SAndroid Build Coastguard Worker
2628*890232f2SAndroid Build Coastguard Worker    # Create a table with the ArrayStruct.
2629*890232f2SAndroid Build Coastguard Worker    MyGame.Example.ArrayTable.Start(builder)
2630*890232f2SAndroid Build Coastguard Worker    MyGame.Example.ArrayTable.AddA(builder, arrayOffset)
2631*890232f2SAndroid Build Coastguard Worker    tableOffset = MyGame.Example.ArrayTable.End(builder)
2632*890232f2SAndroid Build Coastguard Worker
2633*890232f2SAndroid Build Coastguard Worker    builder.Finish(tableOffset)
2634*890232f2SAndroid Build Coastguard Worker
2635*890232f2SAndroid Build Coastguard Worker    buf = builder.Output()
2636*890232f2SAndroid Build Coastguard Worker
2637*890232f2SAndroid Build Coastguard Worker    table = MyGame.Example.ArrayTable.ArrayTable.GetRootAs(buf)
2638*890232f2SAndroid Build Coastguard Worker
2639*890232f2SAndroid Build Coastguard Worker    # Verify structure.
2640*890232f2SAndroid Build Coastguard Worker    nested = MyGame.Example.NestedStruct.NestedStruct()
2641*890232f2SAndroid Build Coastguard Worker    self.assertEqual(table.A().A(), 0.5)
2642*890232f2SAndroid Build Coastguard Worker    self.assertEqual(table.A().B(), \
2643*890232f2SAndroid Build Coastguard Worker        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
2644*890232f2SAndroid Build Coastguard Worker    self.assertEqual(table.A().C(), 1)
2645*890232f2SAndroid Build Coastguard Worker    self.assertEqual(table.A().D(nested, 0).A(), [1, 2])
2646*890232f2SAndroid Build Coastguard Worker    self.assertEqual(table.A().D(nested, 1).A(), [3, 4])
2647*890232f2SAndroid Build Coastguard Worker    self.assertEqual(table.A().D(nested, 0).B(), \
2648*890232f2SAndroid Build Coastguard Worker        MyGame.Example.TestEnum.TestEnum.B)
2649*890232f2SAndroid Build Coastguard Worker    self.assertEqual(table.A().D(nested, 1).B(), \
2650*890232f2SAndroid Build Coastguard Worker        MyGame.Example.TestEnum.TestEnum.C)
2651*890232f2SAndroid Build Coastguard Worker    self.assertEqual(table.A().D(nested, 0).C(), \
2652*890232f2SAndroid Build Coastguard Worker        [MyGame.Example.TestEnum.TestEnum.A, \
2653*890232f2SAndroid Build Coastguard Worker         MyGame.Example.TestEnum.TestEnum.B])
2654*890232f2SAndroid Build Coastguard Worker    self.assertEqual(table.A().D(nested, 1).C(), \
2655*890232f2SAndroid Build Coastguard Worker        [MyGame.Example.TestEnum.TestEnum.C, \
2656*890232f2SAndroid Build Coastguard Worker         MyGame.Example.TestEnum.TestEnum.B])
2657*890232f2SAndroid Build Coastguard Worker    self.assertEqual(table.A().D(nested, 0).D(), [-1, 1])
2658*890232f2SAndroid Build Coastguard Worker    self.assertEqual(table.A().D(nested, 1).D(), [-2, 2])
2659*890232f2SAndroid Build Coastguard Worker    self.assertEqual(table.A().E(), 2)
2660*890232f2SAndroid Build Coastguard Worker    self.assertEqual(table.A().F(), [-1, 1])
2661*890232f2SAndroid Build Coastguard Worker
2662*890232f2SAndroid Build Coastguard Worker
2663*890232f2SAndroid Build Coastguard Workerdef CheckAgainstGoldDataGo():
2664*890232f2SAndroid Build Coastguard Worker  try:
2665*890232f2SAndroid Build Coastguard Worker    gen_buf, gen_off = make_monster_from_generated_code()
2666*890232f2SAndroid Build Coastguard Worker    fn = 'monsterdata_go_wire.mon'
2667*890232f2SAndroid Build Coastguard Worker    if not os.path.exists(fn):
2668*890232f2SAndroid Build Coastguard Worker      print('Go-generated data does not exist, failed.')
2669*890232f2SAndroid Build Coastguard Worker      return False
2670*890232f2SAndroid Build Coastguard Worker
2671*890232f2SAndroid Build Coastguard Worker    # would like to use a context manager here, but it's less
2672*890232f2SAndroid Build Coastguard Worker    # backwards-compatible:
2673*890232f2SAndroid Build Coastguard Worker    f = open(fn, 'rb')
2674*890232f2SAndroid Build Coastguard Worker    go_wire_data = f.read()
2675*890232f2SAndroid Build Coastguard Worker    f.close()
2676*890232f2SAndroid Build Coastguard Worker
2677*890232f2SAndroid Build Coastguard Worker    CheckReadBuffer(bytearray(go_wire_data), 0)
2678*890232f2SAndroid Build Coastguard Worker    if not bytearray(gen_buf[gen_off:]) == bytearray(go_wire_data):
2679*890232f2SAndroid Build Coastguard Worker      raise AssertionError('CheckAgainstGoldDataGo failed')
2680*890232f2SAndroid Build Coastguard Worker  except:
2681*890232f2SAndroid Build Coastguard Worker    print('Failed to test against Go-generated test data.')
2682*890232f2SAndroid Build Coastguard Worker    return False
2683*890232f2SAndroid Build Coastguard Worker
2684*890232f2SAndroid Build Coastguard Worker  print(
2685*890232f2SAndroid Build Coastguard Worker      'Can read Go-generated test data, and Python generates bytewise identical data.'
2686*890232f2SAndroid Build Coastguard Worker  )
2687*890232f2SAndroid Build Coastguard Worker  return True
2688*890232f2SAndroid Build Coastguard Worker
2689*890232f2SAndroid Build Coastguard Worker
2690*890232f2SAndroid Build Coastguard Workerdef CheckAgainstGoldDataJava():
2691*890232f2SAndroid Build Coastguard Worker  try:
2692*890232f2SAndroid Build Coastguard Worker    gen_buf, gen_off = make_monster_from_generated_code()
2693*890232f2SAndroid Build Coastguard Worker    fn = 'monsterdata_java_wire.mon'
2694*890232f2SAndroid Build Coastguard Worker    if not os.path.exists(fn):
2695*890232f2SAndroid Build Coastguard Worker      print('Java-generated data does not exist, failed.')
2696*890232f2SAndroid Build Coastguard Worker      return False
2697*890232f2SAndroid Build Coastguard Worker    f = open(fn, 'rb')
2698*890232f2SAndroid Build Coastguard Worker    java_wire_data = f.read()
2699*890232f2SAndroid Build Coastguard Worker    f.close()
2700*890232f2SAndroid Build Coastguard Worker
2701*890232f2SAndroid Build Coastguard Worker    CheckReadBuffer(bytearray(java_wire_data), 0)
2702*890232f2SAndroid Build Coastguard Worker  except:
2703*890232f2SAndroid Build Coastguard Worker    print('Failed to read Java-generated test data.')
2704*890232f2SAndroid Build Coastguard Worker    return False
2705*890232f2SAndroid Build Coastguard Worker
2706*890232f2SAndroid Build Coastguard Worker  print('Can read Java-generated test data.')
2707*890232f2SAndroid Build Coastguard Worker  return True
2708*890232f2SAndroid Build Coastguard Worker
2709*890232f2SAndroid Build Coastguard Worker
2710*890232f2SAndroid Build Coastguard Workerclass LCG(object):
2711*890232f2SAndroid Build Coastguard Worker  """ Include simple random number generator to ensure results will be the
2712*890232f2SAndroid Build Coastguard Worker
2713*890232f2SAndroid Build Coastguard Worker        same cross platform.
2714*890232f2SAndroid Build Coastguard Worker        http://en.wikipedia.org/wiki/Park%E2%80%93Miller_random_number_generator
2715*890232f2SAndroid Build Coastguard Worker        """
2716*890232f2SAndroid Build Coastguard Worker
2717*890232f2SAndroid Build Coastguard Worker  __slots__ = ['n']
2718*890232f2SAndroid Build Coastguard Worker
2719*890232f2SAndroid Build Coastguard Worker  InitialLCGSeed = 48271
2720*890232f2SAndroid Build Coastguard Worker
2721*890232f2SAndroid Build Coastguard Worker  def __init__(self):
2722*890232f2SAndroid Build Coastguard Worker    self.n = self.InitialLCGSeed
2723*890232f2SAndroid Build Coastguard Worker
2724*890232f2SAndroid Build Coastguard Worker  def Reset(self):
2725*890232f2SAndroid Build Coastguard Worker    self.n = self.InitialLCGSeed
2726*890232f2SAndroid Build Coastguard Worker
2727*890232f2SAndroid Build Coastguard Worker  def Next(self):
2728*890232f2SAndroid Build Coastguard Worker    self.n = ((self.n * 279470273) % 4294967291) & 0xFFFFFFFF
2729*890232f2SAndroid Build Coastguard Worker    return self.n
2730*890232f2SAndroid Build Coastguard Worker
2731*890232f2SAndroid Build Coastguard Worker
2732*890232f2SAndroid Build Coastguard Workerdef BenchmarkVtableDeduplication(count):
2733*890232f2SAndroid Build Coastguard Worker  """
2734*890232f2SAndroid Build Coastguard Worker    BenchmarkVtableDeduplication measures the speed of vtable deduplication
2735*890232f2SAndroid Build Coastguard Worker    by creating `prePop` vtables, then populating `count` objects with a
2736*890232f2SAndroid Build Coastguard Worker    different single vtable.
2737*890232f2SAndroid Build Coastguard Worker
2738*890232f2SAndroid Build Coastguard Worker    When count is large (as in long benchmarks), memory usage may be high.
2739*890232f2SAndroid Build Coastguard Worker    """
2740*890232f2SAndroid Build Coastguard Worker
2741*890232f2SAndroid Build Coastguard Worker  for prePop in (1, 10, 100, 1000):
2742*890232f2SAndroid Build Coastguard Worker    builder = flatbuffers.Builder(0)
2743*890232f2SAndroid Build Coastguard Worker    n = 1 + int(math.log(prePop, 1.5))
2744*890232f2SAndroid Build Coastguard Worker
2745*890232f2SAndroid Build Coastguard Worker    # generate some layouts:
2746*890232f2SAndroid Build Coastguard Worker    layouts = set()
2747*890232f2SAndroid Build Coastguard Worker    r = list(compat_range(n))
2748*890232f2SAndroid Build Coastguard Worker    while len(layouts) < prePop:
2749*890232f2SAndroid Build Coastguard Worker      layouts.add(tuple(sorted(random.sample(r, int(max(1, n / 2))))))
2750*890232f2SAndroid Build Coastguard Worker
2751*890232f2SAndroid Build Coastguard Worker    layouts = list(layouts)
2752*890232f2SAndroid Build Coastguard Worker
2753*890232f2SAndroid Build Coastguard Worker    # pre-populate vtables:
2754*890232f2SAndroid Build Coastguard Worker    for layout in layouts:
2755*890232f2SAndroid Build Coastguard Worker      builder.StartObject(n)
2756*890232f2SAndroid Build Coastguard Worker      for j in layout:
2757*890232f2SAndroid Build Coastguard Worker        builder.PrependInt16Slot(j, j, 0)
2758*890232f2SAndroid Build Coastguard Worker      builder.EndObject()
2759*890232f2SAndroid Build Coastguard Worker
2760*890232f2SAndroid Build Coastguard Worker    # benchmark deduplication of a new vtable:
2761*890232f2SAndroid Build Coastguard Worker    def f():
2762*890232f2SAndroid Build Coastguard Worker      layout = random.choice(layouts)
2763*890232f2SAndroid Build Coastguard Worker      builder.StartObject(n)
2764*890232f2SAndroid Build Coastguard Worker      for j in layout:
2765*890232f2SAndroid Build Coastguard Worker        builder.PrependInt16Slot(j, j, 0)
2766*890232f2SAndroid Build Coastguard Worker      builder.EndObject()
2767*890232f2SAndroid Build Coastguard Worker
2768*890232f2SAndroid Build Coastguard Worker    duration = timeit.timeit(stmt=f, number=count)
2769*890232f2SAndroid Build Coastguard Worker    rate = float(count) / duration
2770*890232f2SAndroid Build Coastguard Worker    print(('vtable deduplication rate (n=%d, vtables=%d): %.2f sec' %
2771*890232f2SAndroid Build Coastguard Worker           (prePop, len(builder.vtables), rate)))
2772*890232f2SAndroid Build Coastguard Worker
2773*890232f2SAndroid Build Coastguard Worker
2774*890232f2SAndroid Build Coastguard Workerdef BenchmarkCheckReadBuffer(count, buf, off):
2775*890232f2SAndroid Build Coastguard Worker  """
2776*890232f2SAndroid Build Coastguard Worker    BenchmarkCheckReadBuffer measures the speed of flatbuffer reading
2777*890232f2SAndroid Build Coastguard Worker    by re-using the CheckReadBuffer function with the gold data.
2778*890232f2SAndroid Build Coastguard Worker    """
2779*890232f2SAndroid Build Coastguard Worker
2780*890232f2SAndroid Build Coastguard Worker  def f():
2781*890232f2SAndroid Build Coastguard Worker    CheckReadBuffer(buf, off)
2782*890232f2SAndroid Build Coastguard Worker
2783*890232f2SAndroid Build Coastguard Worker  duration = timeit.timeit(stmt=f, number=count)
2784*890232f2SAndroid Build Coastguard Worker  rate = float(count) / duration
2785*890232f2SAndroid Build Coastguard Worker  data = float(len(buf) * count) / float(1024 * 1024)
2786*890232f2SAndroid Build Coastguard Worker  data_rate = data / float(duration)
2787*890232f2SAndroid Build Coastguard Worker
2788*890232f2SAndroid Build Coastguard Worker  print(('traversed %d %d-byte flatbuffers in %.2fsec: %.2f/sec, %.2fMB/sec') %
2789*890232f2SAndroid Build Coastguard Worker        (count, len(buf), duration, rate, data_rate))
2790*890232f2SAndroid Build Coastguard Worker
2791*890232f2SAndroid Build Coastguard Worker
2792*890232f2SAndroid Build Coastguard Workerdef BenchmarkMakeMonsterFromGeneratedCode(count, length):
2793*890232f2SAndroid Build Coastguard Worker  """
2794*890232f2SAndroid Build Coastguard Worker    BenchmarkMakeMonsterFromGeneratedCode measures the speed of flatbuffer
2795*890232f2SAndroid Build Coastguard Worker    creation by re-using the make_monster_from_generated_code function for
2796*890232f2SAndroid Build Coastguard Worker    generating gold data examples.
2797*890232f2SAndroid Build Coastguard Worker    """
2798*890232f2SAndroid Build Coastguard Worker
2799*890232f2SAndroid Build Coastguard Worker  duration = timeit.timeit(stmt=make_monster_from_generated_code, number=count)
2800*890232f2SAndroid Build Coastguard Worker  rate = float(count) / duration
2801*890232f2SAndroid Build Coastguard Worker  data = float(length * count) / float(1024 * 1024)
2802*890232f2SAndroid Build Coastguard Worker  data_rate = data / float(duration)
2803*890232f2SAndroid Build Coastguard Worker
2804*890232f2SAndroid Build Coastguard Worker  print(('built %d %d-byte flatbuffers in %.2fsec: %.2f/sec, %.2fMB/sec' % \
2805*890232f2SAndroid Build Coastguard Worker         (count, length, duration, rate, data_rate)))
2806*890232f2SAndroid Build Coastguard Worker
2807*890232f2SAndroid Build Coastguard Worker
2808*890232f2SAndroid Build Coastguard Workerdef backward_compatible_run_tests(**kwargs):
2809*890232f2SAndroid Build Coastguard Worker  if PY_VERSION < (2, 6):
2810*890232f2SAndroid Build Coastguard Worker    sys.stderr.write('Python version less than 2.6 are not supported')
2811*890232f2SAndroid Build Coastguard Worker    sys.stderr.flush()
2812*890232f2SAndroid Build Coastguard Worker    return False
2813*890232f2SAndroid Build Coastguard Worker
2814*890232f2SAndroid Build Coastguard Worker  # python2.6 has a reduced-functionality unittest.main function:
2815*890232f2SAndroid Build Coastguard Worker  if PY_VERSION == (2, 6):
2816*890232f2SAndroid Build Coastguard Worker    try:
2817*890232f2SAndroid Build Coastguard Worker      unittest.main(**kwargs)
2818*890232f2SAndroid Build Coastguard Worker    except SystemExit as e:
2819*890232f2SAndroid Build Coastguard Worker      if not e.code == 0:
2820*890232f2SAndroid Build Coastguard Worker        return False
2821*890232f2SAndroid Build Coastguard Worker    return True
2822*890232f2SAndroid Build Coastguard Worker
2823*890232f2SAndroid Build Coastguard Worker  # python2.7 and above let us not exit once unittest.main is run:
2824*890232f2SAndroid Build Coastguard Worker  kwargs['exit'] = False
2825*890232f2SAndroid Build Coastguard Worker  kwargs['verbosity'] = 0
2826*890232f2SAndroid Build Coastguard Worker  ret = unittest.main(**kwargs)
2827*890232f2SAndroid Build Coastguard Worker  if ret.result.errors or ret.result.failures:
2828*890232f2SAndroid Build Coastguard Worker    return False
2829*890232f2SAndroid Build Coastguard Worker
2830*890232f2SAndroid Build Coastguard Worker  return True
2831*890232f2SAndroid Build Coastguard Worker
2832*890232f2SAndroid Build Coastguard Worker
2833*890232f2SAndroid Build Coastguard Workerdef main():
2834*890232f2SAndroid Build Coastguard Worker  import os
2835*890232f2SAndroid Build Coastguard Worker  import sys
2836*890232f2SAndroid Build Coastguard Worker  if not len(sys.argv) == 5:
2837*890232f2SAndroid Build Coastguard Worker    sys.stderr.write('Usage: %s <benchmark vtable count> '
2838*890232f2SAndroid Build Coastguard Worker                     '<benchmark read count> <benchmark build count> '
2839*890232f2SAndroid Build Coastguard Worker                     '<is_onefile>\n' % sys.argv[0])
2840*890232f2SAndroid Build Coastguard Worker    sys.stderr.write('       Provide COMPARE_GENERATED_TO_GO=1   to check'
2841*890232f2SAndroid Build Coastguard Worker                     'for bytewise comparison to Go data.\n')
2842*890232f2SAndroid Build Coastguard Worker    sys.stderr.write('       Provide COMPARE_GENERATED_TO_JAVA=1 to check'
2843*890232f2SAndroid Build Coastguard Worker                     'for bytewise comparison to Java data.\n')
2844*890232f2SAndroid Build Coastguard Worker    sys.stderr.flush()
2845*890232f2SAndroid Build Coastguard Worker    sys.exit(1)
2846*890232f2SAndroid Build Coastguard Worker
2847*890232f2SAndroid Build Coastguard Worker  kwargs = dict(argv=sys.argv[:-4])
2848*890232f2SAndroid Build Coastguard Worker
2849*890232f2SAndroid Build Coastguard Worker  create_namespace_shortcut(sys.argv[4].lower() == 'true')
2850*890232f2SAndroid Build Coastguard Worker
2851*890232f2SAndroid Build Coastguard Worker  # show whether numpy is present, as it changes the test logic:
2852*890232f2SAndroid Build Coastguard Worker  try:
2853*890232f2SAndroid Build Coastguard Worker    import numpy
2854*890232f2SAndroid Build Coastguard Worker    print('numpy available')
2855*890232f2SAndroid Build Coastguard Worker  except ImportError:
2856*890232f2SAndroid Build Coastguard Worker    print('numpy not available')
2857*890232f2SAndroid Build Coastguard Worker
2858*890232f2SAndroid Build Coastguard Worker  # run tests, and run some language comparison checks if needed:
2859*890232f2SAndroid Build Coastguard Worker  success = backward_compatible_run_tests(**kwargs)
2860*890232f2SAndroid Build Coastguard Worker  if success and os.environ.get('COMPARE_GENERATED_TO_GO', 0) == '1':
2861*890232f2SAndroid Build Coastguard Worker    success = success and CheckAgainstGoldDataGo()
2862*890232f2SAndroid Build Coastguard Worker  if success and os.environ.get('COMPARE_GENERATED_TO_JAVA', 0) == '1':
2863*890232f2SAndroid Build Coastguard Worker    success = success and CheckAgainstGoldDataJava()
2864*890232f2SAndroid Build Coastguard Worker
2865*890232f2SAndroid Build Coastguard Worker  if not success:
2866*890232f2SAndroid Build Coastguard Worker    sys.stderr.write('Tests failed, skipping benchmarks.\n')
2867*890232f2SAndroid Build Coastguard Worker    sys.stderr.flush()
2868*890232f2SAndroid Build Coastguard Worker    sys.exit(1)
2869*890232f2SAndroid Build Coastguard Worker
2870*890232f2SAndroid Build Coastguard Worker  # run benchmarks (if 0, they will be a noop):
2871*890232f2SAndroid Build Coastguard Worker  bench_vtable = int(sys.argv[1])
2872*890232f2SAndroid Build Coastguard Worker  bench_traverse = int(sys.argv[2])
2873*890232f2SAndroid Build Coastguard Worker  bench_build = int(sys.argv[3])
2874*890232f2SAndroid Build Coastguard Worker  if bench_vtable:
2875*890232f2SAndroid Build Coastguard Worker    BenchmarkVtableDeduplication(bench_vtable)
2876*890232f2SAndroid Build Coastguard Worker  if bench_traverse:
2877*890232f2SAndroid Build Coastguard Worker    buf, off = make_monster_from_generated_code()
2878*890232f2SAndroid Build Coastguard Worker    BenchmarkCheckReadBuffer(bench_traverse, buf, off)
2879*890232f2SAndroid Build Coastguard Worker  if bench_build:
2880*890232f2SAndroid Build Coastguard Worker    buf, off = make_monster_from_generated_code()
2881*890232f2SAndroid Build Coastguard Worker    BenchmarkMakeMonsterFromGeneratedCode(bench_build, len(buf))
2882*890232f2SAndroid Build Coastguard Worker
2883*890232f2SAndroid Build Coastguard Worker
2884*890232f2SAndroid Build Coastguard Workerif __name__ == '__main__':
2885*890232f2SAndroid Build Coastguard Worker  main()
2886