xref: /aosp_15_r20/external/flatbuffers/tests/phpTest.php (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Worker<?php
2*890232f2SAndroid Build Coastguard Worker// manual load for testing. please use PSR style autoloader when you use flatbuffers.
3*890232f2SAndroid Build Coastguard Workerrequire join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), "php", "Constants.php"));
4*890232f2SAndroid Build Coastguard Workerrequire join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), "php", "ByteBuffer.php"));
5*890232f2SAndroid Build Coastguard Workerrequire join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), "php", "FlatbufferBuilder.php"));
6*890232f2SAndroid Build Coastguard Workerrequire join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), "php", "Table.php"));
7*890232f2SAndroid Build Coastguard Workerrequire join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), "php", "Struct.php"));
8*890232f2SAndroid Build Coastguard Workerforeach (glob(join(DIRECTORY_SEPARATOR, array(dirname(__FILE__), "MyGame", "Example", "*.php"))) as $file) {
9*890232f2SAndroid Build Coastguard Worker    require $file;
10*890232f2SAndroid Build Coastguard Worker}
11*890232f2SAndroid Build Coastguard Worker
12*890232f2SAndroid Build Coastguard Workerfunction main()
13*890232f2SAndroid Build Coastguard Worker{
14*890232f2SAndroid Build Coastguard Worker    /// Begin Test
15*890232f2SAndroid Build Coastguard Worker    $assert = new Assert();
16*890232f2SAndroid Build Coastguard Worker
17*890232f2SAndroid Build Coastguard Worker    // First, let's test reading a FlatBuffer generated by C++ code:
18*890232f2SAndroid Build Coastguard Worker    // This file was generated from monsterdata_test.json
19*890232f2SAndroid Build Coastguard Worker
20*890232f2SAndroid Build Coastguard Worker    // Now test it:
21*890232f2SAndroid Build Coastguard Worker    $data = file_get_contents('monsterdata_test.mon');
22*890232f2SAndroid Build Coastguard Worker    $bb = Google\FlatBuffers\ByteBuffer::wrap($data);
23*890232f2SAndroid Build Coastguard Worker    test_buffer($assert, $bb);
24*890232f2SAndroid Build Coastguard Worker
25*890232f2SAndroid Build Coastguard Worker    // Second, let's create a FlatBuffer from scratch in JavaScript, and test it also.
26*890232f2SAndroid Build Coastguard Worker    // We use an initial size of 1 to exercise the reallocation algorithm,
27*890232f2SAndroid Build Coastguard Worker    // normally a size larger than the typical FlatBuffer you generate would be
28*890232f2SAndroid Build Coastguard Worker    // better for performance.
29*890232f2SAndroid Build Coastguard Worker    $fbb = new Google\FlatBuffers\FlatBufferBuilder(1);
30*890232f2SAndroid Build Coastguard Worker
31*890232f2SAndroid Build Coastguard Worker    // We set up the same values as monsterdata.json:
32*890232f2SAndroid Build Coastguard Worker    $str = $fbb->createString("MyMonster");
33*890232f2SAndroid Build Coastguard Worker    $name = $fbb->createString('Fred');
34*890232f2SAndroid Build Coastguard Worker    \MyGame\Example\Monster::startMonster($fbb);
35*890232f2SAndroid Build Coastguard Worker    \MyGame\Example\Monster::addName($fbb, $name);
36*890232f2SAndroid Build Coastguard Worker    $enemy = \MyGame\Example\Monster::endMonster($fbb);
37*890232f2SAndroid Build Coastguard Worker
38*890232f2SAndroid Build Coastguard Worker    $inv = \MyGame\Example\Monster::CreateInventoryVector($fbb, array(0, 1, 2, 3, 4));
39*890232f2SAndroid Build Coastguard Worker
40*890232f2SAndroid Build Coastguard Worker    $fred = $fbb->createString('Fred');
41*890232f2SAndroid Build Coastguard Worker    \MyGame\Example\Monster::StartMonster($fbb);
42*890232f2SAndroid Build Coastguard Worker    \MyGame\Example\Monster::AddName($fbb, $fred);
43*890232f2SAndroid Build Coastguard Worker    $mon2 = \MyGame\Example\Monster::EndMonster($fbb);
44*890232f2SAndroid Build Coastguard Worker
45*890232f2SAndroid Build Coastguard Worker    \MyGame\Example\Monster::StartTest4Vector($fbb, 2);
46*890232f2SAndroid Build Coastguard Worker    \MyGame\Example\Test::CreateTest($fbb, 10, 20);
47*890232f2SAndroid Build Coastguard Worker    \MyGame\Example\Test::CreateTest($fbb, 30, 40);
48*890232f2SAndroid Build Coastguard Worker    $test4 = $fbb->endVector();
49*890232f2SAndroid Build Coastguard Worker
50*890232f2SAndroid Build Coastguard Worker    $testArrayOfString = \MyGame\Example\Monster::CreateTestarrayofstringVector($fbb, array(
51*890232f2SAndroid Build Coastguard Worker        $fbb->createString('test1'),
52*890232f2SAndroid Build Coastguard Worker        $fbb->createString('test2')
53*890232f2SAndroid Build Coastguard Worker    ));
54*890232f2SAndroid Build Coastguard Worker
55*890232f2SAndroid Build Coastguard Worker    \MyGame\Example\Monster::StartMonster($fbb);
56*890232f2SAndroid Build Coastguard Worker    \MyGame\Example\Monster::AddPos($fbb, \MyGame\Example\Vec3::CreateVec3($fbb,
57*890232f2SAndroid Build Coastguard Worker        1.0, 2.0, 3.0, //float
58*890232f2SAndroid Build Coastguard Worker        3.0, // double
59*890232f2SAndroid Build Coastguard Worker        \MyGame\Example\Color::Green,
60*890232f2SAndroid Build Coastguard Worker        5, //short
61*890232f2SAndroid Build Coastguard Worker        6));
62*890232f2SAndroid Build Coastguard Worker    \MyGame\Example\Monster::AddHp($fbb, 80);
63*890232f2SAndroid Build Coastguard Worker    \MyGame\Example\Monster::AddName($fbb, $str);
64*890232f2SAndroid Build Coastguard Worker    \MyGame\Example\Monster::AddInventory($fbb, $inv);
65*890232f2SAndroid Build Coastguard Worker    \MyGame\Example\Monster::AddTestType($fbb, \MyGame\Example\Any::Monster);
66*890232f2SAndroid Build Coastguard Worker    \MyGame\Example\Monster::AddTest($fbb, $mon2);
67*890232f2SAndroid Build Coastguard Worker    \MyGame\Example\Monster::AddTest4($fbb, $test4);
68*890232f2SAndroid Build Coastguard Worker    \MyGame\Example\Monster::AddTestarrayofstring($fbb, $testArrayOfString);
69*890232f2SAndroid Build Coastguard Worker    \MyGame\Example\Monster::AddEnemy($fbb, $enemy);
70*890232f2SAndroid Build Coastguard Worker    \MyGame\Example\Monster::AddTestbool($fbb, true);
71*890232f2SAndroid Build Coastguard Worker    $mon = \MyGame\Example\Monster::EndMonster($fbb);
72*890232f2SAndroid Build Coastguard Worker
73*890232f2SAndroid Build Coastguard Worker    \MyGame\Example\Monster::FinishMonsterBuffer($fbb, $mon);
74*890232f2SAndroid Build Coastguard Worker
75*890232f2SAndroid Build Coastguard Worker    // Test it:
76*890232f2SAndroid Build Coastguard Worker    test_buffer($assert, $fbb->dataBuffer());
77*890232f2SAndroid Build Coastguard Worker
78*890232f2SAndroid Build Coastguard Worker    testByteBuffer($assert);
79*890232f2SAndroid Build Coastguard Worker    fuzzTest1($assert);
80*890232f2SAndroid Build Coastguard Worker//    testUnicode($assert);
81*890232f2SAndroid Build Coastguard Worker
82*890232f2SAndroid Build Coastguard Worker    echo 'FlatBuffers php test: completed successfully' . PHP_EOL;
83*890232f2SAndroid Build Coastguard Worker}
84*890232f2SAndroid Build Coastguard Worker
85*890232f2SAndroid Build Coastguard Workertry {
86*890232f2SAndroid Build Coastguard Worker    main();
87*890232f2SAndroid Build Coastguard Worker    exit(0);
88*890232f2SAndroid Build Coastguard Worker} catch(Exception $e) {
89*890232f2SAndroid Build Coastguard Worker    printf("Fatal error: Uncaught exception '%s' with message '%s. in %s:%d\n", get_class($e), $e->getMessage(), $e->getFile(), $e->getLine());
90*890232f2SAndroid Build Coastguard Worker    printf("Stack trace:\n");
91*890232f2SAndroid Build Coastguard Worker    echo $e->getTraceAsString() . PHP_EOL;
92*890232f2SAndroid Build Coastguard Worker    printf("  thrown in in %s:%d\n", $e->getFile(), $e->getLine());
93*890232f2SAndroid Build Coastguard Worker
94*890232f2SAndroid Build Coastguard Worker    die(-1);
95*890232f2SAndroid Build Coastguard Worker}
96*890232f2SAndroid Build Coastguard Worker
97*890232f2SAndroid Build Coastguard Workerfunction test_buffer(Assert $assert, Google\FlatBuffers\ByteBuffer $bb) {
98*890232f2SAndroid Build Coastguard Worker
99*890232f2SAndroid Build Coastguard Worker    $assert->ok(MyGame\Example\Monster::MonsterBufferHasIdentifier($bb));
100*890232f2SAndroid Build Coastguard Worker    $monster = \MyGame\Example\Monster::GetRootAsMonster($bb);
101*890232f2SAndroid Build Coastguard Worker
102*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($monster->GetHp(), 80);
103*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($monster->GetMana(), 150); // default
104*890232f2SAndroid Build Coastguard Worker
105*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($monster->GetName(), 'MyMonster');
106*890232f2SAndroid Build Coastguard Worker
107*890232f2SAndroid Build Coastguard Worker    $pos = $monster->GetPos();
108*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($pos->GetX(), 1.0);
109*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($pos->GetY(), 2.0);
110*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($pos->GetZ(), 3.0);
111*890232f2SAndroid Build Coastguard Worker
112*890232f2SAndroid Build Coastguard Worker    $assert->Equal($pos->GetTest1(), 3.0);
113*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($pos->GetTest2(), \MyGame\Example\Color::Green);
114*890232f2SAndroid Build Coastguard Worker
115*890232f2SAndroid Build Coastguard Worker    $t = $pos->GetTest3();
116*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($t->GetA(), 5);
117*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($t->GetB(), 6);
118*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($monster->GetTestType(), \MyGame\Example\Any::Monster);
119*890232f2SAndroid Build Coastguard Worker
120*890232f2SAndroid Build Coastguard Worker    $monster2 = new \MyGame\Example\Monster();
121*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($monster->GetTest($monster2) != null, true);
122*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($monster2->GetName(), 'Fred');
123*890232f2SAndroid Build Coastguard Worker
124*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($monster->GetInventoryLength(), 5);
125*890232f2SAndroid Build Coastguard Worker    $invsum = 0;
126*890232f2SAndroid Build Coastguard Worker    for ($i = 0; $i < $monster->GetInventoryLength(); $i++) {
127*890232f2SAndroid Build Coastguard Worker        $invsum += $monster->GetInventory($i);
128*890232f2SAndroid Build Coastguard Worker    }
129*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($invsum, 10);
130*890232f2SAndroid Build Coastguard Worker
131*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual(bin2hex($monster->GetInventoryBytes()), "0001020304");
132*890232f2SAndroid Build Coastguard Worker
133*890232f2SAndroid Build Coastguard Worker    $test_0 = $monster->GetTest4(0);
134*890232f2SAndroid Build Coastguard Worker    $test_1 = $monster->GetTest4(1);
135*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($monster->GetTest4Length(), 2);
136*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($test_0->GetA() + $test_0->GetB() + $test_1->GetA() + $test_1->GetB(), 100);
137*890232f2SAndroid Build Coastguard Worker
138*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($monster->GetTestarrayofstringLength(), 2);
139*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($monster->GetTestarrayofstring(0), 'test1');
140*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($monster->GetTestarrayofstring(1), 'test2');
141*890232f2SAndroid Build Coastguard Worker
142*890232f2SAndroid Build Coastguard Worker    $fred = $monster->getEnemy();
143*890232f2SAndroid Build Coastguard Worker    $assert->Equal('Fred', $fred->getName());
144*890232f2SAndroid Build Coastguard Worker
145*890232f2SAndroid Build Coastguard Worker    $assert->strictEqual($monster->GetTestbool(), true);
146*890232f2SAndroid Build Coastguard Worker}
147*890232f2SAndroid Build Coastguard Worker
148*890232f2SAndroid Build Coastguard Worker//function testUnicode(Assert $assert) {
149*890232f2SAndroid Build Coastguard Worker//    // missing unicode_test.mon, implemented later
150*890232f2SAndroid Build Coastguard Worker//    $correct = file_get_contents('unicode_test.mon');
151*890232f2SAndroid Build Coastguard Worker//    $json = json_decode(file_get_contents('unicode_test.json'));
152*890232f2SAndroid Build Coastguard Worker//
153*890232f2SAndroid Build Coastguard Worker//    // Test reading
154*890232f2SAndroid Build Coastguard Worker//    $bb = flatbuffers\ByteBuffer::Wrap($correct);
155*890232f2SAndroid Build Coastguard Worker//    $monster = \MyGame\Example\Monster::GetRootAsMonster($bb);
156*890232f2SAndroid Build Coastguard Worker//    $assert->strictEqual($monster->GetName(), $json["name"]);
157*890232f2SAndroid Build Coastguard Worker//
158*890232f2SAndroid Build Coastguard Worker//    //$assert->deepEqual(new Buffer(monster.name(flatbuffers.Encoding.UTF8_BYTES)), new Buffer(json.name));
159*890232f2SAndroid Build Coastguard Worker//    //assert.strictEqual(monster.testarrayoftablesLength(), json.testarrayoftables.length);
160*890232f2SAndroid Build Coastguard Worker//    foreach ($json["testarrayoftables"]as $i => $table) {
161*890232f2SAndroid Build Coastguard Worker//        $value = $monster->GetTestArrayOfTables($i);
162*890232f2SAndroid Build Coastguard Worker//        $assert->strictEqual($value->GetName(), $table["name"]);
163*890232f2SAndroid Build Coastguard Worker//        //assert.deepEqual(new Buffer(value.name(flatbuffers.Encoding.UTF8_BYTES)), new Buffer(table.name));
164*890232f2SAndroid Build Coastguard Worker//    }
165*890232f2SAndroid Build Coastguard Worker//    $assert->strictEqual($monster->GetTestarrayofstringLength(), $json["testarrayofstring"]["length"]);
166*890232f2SAndroid Build Coastguard Worker//    foreach ($json["testarrayofstring"] as $i => $string) {
167*890232f2SAndroid Build Coastguard Worker//        $assert->strictEqual($monster->GetTestarrayofstring($i), $string);
168*890232f2SAndroid Build Coastguard Worker//        //assert.deepEqual(new Buffer(monster.testarrayofstring(i, flatbuffers.Encoding.UTF8_BYTES)), new Buffer(string));
169*890232f2SAndroid Build Coastguard Worker//    }
170*890232f2SAndroid Build Coastguard Worker//
171*890232f2SAndroid Build Coastguard Worker//    // Test writing
172*890232f2SAndroid Build Coastguard Worker//    $fbb = new FlatBuffers\FlatBufferBuilder(1);
173*890232f2SAndroid Build Coastguard Worker//    $name = $fbb->CreateString($json["name"]);
174*890232f2SAndroid Build Coastguard Worker//    $testarrayoftablesOffsets = array_map(function($table) use($fbb) {
175*890232f2SAndroid Build Coastguard Worker//        $name = $fbb->CreateString($table["name"]);
176*890232f2SAndroid Build Coastguard Worker//        \MyGame\Example\Monster::StartMonster($fbb);
177*890232f2SAndroid Build Coastguard Worker//        \MyGame\Example\Monster::AddName($fbb, $name);
178*890232f2SAndroid Build Coastguard Worker//        return \MyGame\Example\Monster::EndMonster($fbb);
179*890232f2SAndroid Build Coastguard Worker//    }, $json["testarrayoftables"]);
180*890232f2SAndroid Build Coastguard Worker//    $testarrayoftablesOffset = \MyGame\Example\Monster::CreateTestarrayoftablesVector($fbb,
181*890232f2SAndroid Build Coastguard Worker//            $testarrayoftablesOffsets);
182*890232f2SAndroid Build Coastguard Worker////    $testarrayofstringOffset = \MyGame\Example\Monster::CreateTestarrayofstringVector($fbb,
183*890232f2SAndroid Build Coastguard Worker////            $json["testarrayofstring"].map(function(string) { return fbb.createString(string); }));
184*890232f2SAndroid Build Coastguard Worker//
185*890232f2SAndroid Build Coastguard Worker//    \MyGame\Example\Monster::startMonster($fbb);
186*890232f2SAndroid Build Coastguard Worker//    \MyGame\Example\Monster::addTestarrayofstring($fbb, $testarrayoftablesOffset);
187*890232f2SAndroid Build Coastguard Worker//    \MyGame\Example\Monster::addTestarrayoftables($fbb, $testarrayoftablesOffset);
188*890232f2SAndroid Build Coastguard Worker//    \MyGame\Example\Monster::addName($fbb, $name);
189*890232f2SAndroid Build Coastguard Worker//    \MyGame\Example\Monster::finishMonsterBuffer($fbb, \MyGame\Example\Monster::endMonster($fbb));
190*890232f2SAndroid Build Coastguard Worker//    //;assert.deepEqual(new Buffer(fbb.asUint8Array()), correct);
191*890232f2SAndroid Build Coastguard Worker//}
192*890232f2SAndroid Build Coastguard Worker
193*890232f2SAndroid Build Coastguard Worker// Low level stress/fuzz test: serialize/deserialize a variety of
194*890232f2SAndroid Build Coastguard Worker// different kinds of data in different combinations
195*890232f2SAndroid Build Coastguard Workerfunction fuzzTest1(Assert $assert)
196*890232f2SAndroid Build Coastguard Worker{
197*890232f2SAndroid Build Coastguard Worker
198*890232f2SAndroid Build Coastguard Worker    // Values we're testing against: chosen to ensure no bits get chopped
199*890232f2SAndroid Build Coastguard Worker    // off anywhere, and also be different from eachother.
200*890232f2SAndroid Build Coastguard Worker    $bool_val = true;
201*890232f2SAndroid Build Coastguard Worker    $char_val = -127; // 0x81
202*890232f2SAndroid Build Coastguard Worker    $uchar_val = 0xFF;
203*890232f2SAndroid Build Coastguard Worker    $short_val = -32222; // 0x8222;
204*890232f2SAndroid Build Coastguard Worker    $ushort_val = 0xFEEE;
205*890232f2SAndroid Build Coastguard Worker    $int_val = 0x7fffffff | 0;
206*890232f2SAndroid Build Coastguard Worker    // for now
207*890232f2SAndroid Build Coastguard Worker    $uint_val = 1;
208*890232f2SAndroid Build Coastguard Worker    $long_val = 2;
209*890232f2SAndroid Build Coastguard Worker    $ulong_val = 3;
210*890232f2SAndroid Build Coastguard Worker
211*890232f2SAndroid Build Coastguard Worker//    var uint_val   = 0xFDDDDDDD;
212*890232f2SAndroid Build Coastguard Worker//    var long_val   = new flatbuffers.Long(0x44444444, 0x84444444);
213*890232f2SAndroid Build Coastguard Worker//    var ulong_val  = new flatbuffers.Long(0xCCCCCCCC, 0xFCCCCCCC);
214*890232f2SAndroid Build Coastguard Worker
215*890232f2SAndroid Build Coastguard Worker    $float_val = 3.14159;
216*890232f2SAndroid Build Coastguard Worker    $double_val = 3.14159265359;
217*890232f2SAndroid Build Coastguard Worker
218*890232f2SAndroid Build Coastguard Worker    $test_values_max = 11;
219*890232f2SAndroid Build Coastguard Worker    $fields_per_object = 4;
220*890232f2SAndroid Build Coastguard Worker    // current implementation is not good at encoding.
221*890232f2SAndroid Build Coastguard Worker    $num_fuzz_objects = 1000;
222*890232f2SAndroid Build Coastguard Worker    $builder = new Google\FlatBuffers\FlatBufferBuilder(1);
223*890232f2SAndroid Build Coastguard Worker
224*890232f2SAndroid Build Coastguard Worker    // can't use same implementation due to PHP_INTMAX overflow issue.
225*890232f2SAndroid Build Coastguard Worker    // we use mt_rand function to reproduce fuzzy test.
226*890232f2SAndroid Build Coastguard Worker    mt_srand(48271);
227*890232f2SAndroid Build Coastguard Worker    $objects = array();
228*890232f2SAndroid Build Coastguard Worker    // Generate num_fuzz_objects random objects each consisting of
229*890232f2SAndroid Build Coastguard Worker    // fields_per_object fields, each of a random type.
230*890232f2SAndroid Build Coastguard Worker    for ($i = 0; $i < $num_fuzz_objects; $i++) {
231*890232f2SAndroid Build Coastguard Worker        $builder->startObject($fields_per_object);
232*890232f2SAndroid Build Coastguard Worker        for ($f = 0; $f < $fields_per_object; $f++) {
233*890232f2SAndroid Build Coastguard Worker            $choice = mt_rand() % $test_values_max;
234*890232f2SAndroid Build Coastguard Worker            switch ($choice) {
235*890232f2SAndroid Build Coastguard Worker                case 0:
236*890232f2SAndroid Build Coastguard Worker                    $builder->addBoolX($f, $bool_val, 0);
237*890232f2SAndroid Build Coastguard Worker                    break;
238*890232f2SAndroid Build Coastguard Worker                case 1:
239*890232f2SAndroid Build Coastguard Worker                    $builder->addByteX($f, $char_val, 0);
240*890232f2SAndroid Build Coastguard Worker                    break;
241*890232f2SAndroid Build Coastguard Worker                case 2:
242*890232f2SAndroid Build Coastguard Worker                    $builder->addSbyteX($f, $uchar_val, 0);
243*890232f2SAndroid Build Coastguard Worker                    break;
244*890232f2SAndroid Build Coastguard Worker                case 3:
245*890232f2SAndroid Build Coastguard Worker                    $builder->addShortX($f, $short_val, 0);
246*890232f2SAndroid Build Coastguard Worker                    break;
247*890232f2SAndroid Build Coastguard Worker                case 4:
248*890232f2SAndroid Build Coastguard Worker                    $builder->addUshortX($f, $ushort_val, 0);
249*890232f2SAndroid Build Coastguard Worker                    break;
250*890232f2SAndroid Build Coastguard Worker                case 5:
251*890232f2SAndroid Build Coastguard Worker                    $builder->addIntX($f, $int_val, 0);
252*890232f2SAndroid Build Coastguard Worker                    break;
253*890232f2SAndroid Build Coastguard Worker                case 6:
254*890232f2SAndroid Build Coastguard Worker                    $builder->addUintX($f, $uint_val, 0);
255*890232f2SAndroid Build Coastguard Worker                    break;
256*890232f2SAndroid Build Coastguard Worker                case 7:
257*890232f2SAndroid Build Coastguard Worker                    $builder->addLongX($f, $long_val, 0);
258*890232f2SAndroid Build Coastguard Worker                    break;
259*890232f2SAndroid Build Coastguard Worker                case 8:
260*890232f2SAndroid Build Coastguard Worker                    $builder->addUlongX($f, $ulong_val, 0);
261*890232f2SAndroid Build Coastguard Worker                    break;
262*890232f2SAndroid Build Coastguard Worker                case 9:
263*890232f2SAndroid Build Coastguard Worker                    $builder->addFloatX($f, $float_val, 0);
264*890232f2SAndroid Build Coastguard Worker                    break;
265*890232f2SAndroid Build Coastguard Worker                case 10:
266*890232f2SAndroid Build Coastguard Worker                    $builder->addDoubleX($f, $double_val, 0);
267*890232f2SAndroid Build Coastguard Worker                    break;
268*890232f2SAndroid Build Coastguard Worker            }
269*890232f2SAndroid Build Coastguard Worker        }
270*890232f2SAndroid Build Coastguard Worker        $objects[] = $builder->endObject();
271*890232f2SAndroid Build Coastguard Worker    }
272*890232f2SAndroid Build Coastguard Worker    $builder->prep(8, 0); // Align whole buffer.
273*890232f2SAndroid Build Coastguard Worker
274*890232f2SAndroid Build Coastguard Worker    mt_srand(48271); // Reset
275*890232f2SAndroid Build Coastguard Worker    $builder->finish($objects[count($objects) - 1]);
276*890232f2SAndroid Build Coastguard Worker
277*890232f2SAndroid Build Coastguard Worker    $view = Google\FlatBuffers\ByteBuffer::wrap($builder->sizedByteArray());
278*890232f2SAndroid Build Coastguard Worker    for ($i = 0; $i < $num_fuzz_objects; $i++) {
279*890232f2SAndroid Build Coastguard Worker        $offset = $view->capacity() - $objects[$i];
280*890232f2SAndroid Build Coastguard Worker        for ($f = 0; $f < $fields_per_object; $f++) {
281*890232f2SAndroid Build Coastguard Worker            $choice = mt_rand() % $test_values_max;
282*890232f2SAndroid Build Coastguard Worker            $vtable_offset = fieldIndexToOffset($f);
283*890232f2SAndroid Build Coastguard Worker            $vtable = $offset - $view->getInt($offset);
284*890232f2SAndroid Build Coastguard Worker            $assert->ok($vtable_offset < $view->getShort($vtable));
285*890232f2SAndroid Build Coastguard Worker            $field_offset = $offset + $view->getShort($vtable + $vtable_offset);
286*890232f2SAndroid Build Coastguard Worker            switch ($choice) {
287*890232f2SAndroid Build Coastguard Worker                case 0:
288*890232f2SAndroid Build Coastguard Worker                    $assert->strictEqual(!!$view->getBool($field_offset), $bool_val);
289*890232f2SAndroid Build Coastguard Worker                    break;
290*890232f2SAndroid Build Coastguard Worker                case 1:
291*890232f2SAndroid Build Coastguard Worker                    $assert->strictEqual($view->getSbyte($field_offset), $char_val);
292*890232f2SAndroid Build Coastguard Worker                    break;
293*890232f2SAndroid Build Coastguard Worker                case 2:
294*890232f2SAndroid Build Coastguard Worker                    $assert->strictEqual($view->getByte($field_offset), $uchar_val);
295*890232f2SAndroid Build Coastguard Worker                    break;
296*890232f2SAndroid Build Coastguard Worker                case 3:
297*890232f2SAndroid Build Coastguard Worker                    $assert->strictEqual($view->getShort($field_offset), $short_val);
298*890232f2SAndroid Build Coastguard Worker                    break;
299*890232f2SAndroid Build Coastguard Worker                case 4:
300*890232f2SAndroid Build Coastguard Worker                    $assert->strictEqual($view->getUShort($field_offset), $ushort_val);
301*890232f2SAndroid Build Coastguard Worker                    break;
302*890232f2SAndroid Build Coastguard Worker                case 5:
303*890232f2SAndroid Build Coastguard Worker                    $assert->strictEqual($view->getInt($field_offset), $int_val);
304*890232f2SAndroid Build Coastguard Worker                    break;
305*890232f2SAndroid Build Coastguard Worker                case 6:
306*890232f2SAndroid Build Coastguard Worker                    $assert->strictEqual($view->getUint($field_offset), $uint_val);
307*890232f2SAndroid Build Coastguard Worker                    break;
308*890232f2SAndroid Build Coastguard Worker                case 7:
309*890232f2SAndroid Build Coastguard Worker                    if (PHP_INT_SIZE <= 4) break;
310*890232f2SAndroid Build Coastguard Worker                    $assert->strictEqual($view->getLong($field_offset), $long_val);
311*890232f2SAndroid Build Coastguard Worker                    break;
312*890232f2SAndroid Build Coastguard Worker                case 8:
313*890232f2SAndroid Build Coastguard Worker                    if (PHP_INT_SIZE <= 4) break;
314*890232f2SAndroid Build Coastguard Worker                    $assert->strictEqual($view->getUlong($field_offset), $ulong_val);
315*890232f2SAndroid Build Coastguard Worker                    break;
316*890232f2SAndroid Build Coastguard Worker                case 9:
317*890232f2SAndroid Build Coastguard Worker                    $assert->strictEqual(floor($view->getFloat($field_offset)), floor($float_val));
318*890232f2SAndroid Build Coastguard Worker                    break;
319*890232f2SAndroid Build Coastguard Worker                case 10:
320*890232f2SAndroid Build Coastguard Worker                    $assert->strictEqual($view->getDouble($field_offset), $double_val);
321*890232f2SAndroid Build Coastguard Worker                    break;
322*890232f2SAndroid Build Coastguard Worker            }
323*890232f2SAndroid Build Coastguard Worker        }
324*890232f2SAndroid Build Coastguard Worker    }
325*890232f2SAndroid Build Coastguard Worker}
326*890232f2SAndroid Build Coastguard Worker
327*890232f2SAndroid Build Coastguard Workerfunction fieldIndexToOffset($field_id) {
328*890232f2SAndroid Build Coastguard Worker    // Should correspond to what EndTable() below builds up.
329*890232f2SAndroid Build Coastguard Worker    $fixed_fields = 2;  // Vtable size and Object Size.
330*890232f2SAndroid Build Coastguard Worker    return ($field_id + $fixed_fields) * 2;
331*890232f2SAndroid Build Coastguard Worker}
332*890232f2SAndroid Build Coastguard Worker
333*890232f2SAndroid Build Coastguard Workerfunction testByteBuffer(Assert $assert) {
334*890232f2SAndroid Build Coastguard Worker
335*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_Length_MatchesBufferLength
336*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 100);
337*890232f2SAndroid Build Coastguard Worker    $uut  = Google\FlatBuffers\ByteBuffer::wrap($buffer);
338*890232f2SAndroid Build Coastguard Worker    $assert->Equal($uut->capacity(), strlen($buffer));
339*890232f2SAndroid Build Coastguard Worker
340*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_PutBytePopulatesBufferAtZeroOffset
341*890232f2SAndroid Build Coastguard Worker    $buffer = "\0";
342*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
343*890232f2SAndroid Build Coastguard Worker    $uut->putByte(0, "\x63"); // 99
344*890232f2SAndroid Build Coastguard Worker    $assert->Equal("\x63", $uut->_buffer[0]); // don't share buffer as php user might confuse reference.
345*890232f2SAndroid Build Coastguard Worker
346*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_PutByteCannotPutAtOffsetPastLength
347*890232f2SAndroid Build Coastguard Worker    $buffer = "\0";
348*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
349*890232f2SAndroid Build Coastguard Worker    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {
350*890232f2SAndroid Build Coastguard Worker        $uut->putByte(1, "\x63"); // 99
351*890232f2SAndroid Build Coastguard Worker    });
352*890232f2SAndroid Build Coastguard Worker
353*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_PutShortPopulatesBufferCorrectly
354*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 2);
355*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
356*890232f2SAndroid Build Coastguard Worker    $uut->putShort(0, 1);
357*890232f2SAndroid Build Coastguard Worker
358*890232f2SAndroid Build Coastguard Worker    // Ensure Endiannes was written correctly
359*890232f2SAndroid Build Coastguard Worker    $assert->Equal(chr(0x01), $uut->_buffer[0]);
360*890232f2SAndroid Build Coastguard Worker    $assert->Equal(chr(0x00), $uut->_buffer[1]);
361*890232f2SAndroid Build Coastguard Worker
362*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 2);
363*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
364*890232f2SAndroid Build Coastguard Worker    $uut->putShort(0, -32768);
365*890232f2SAndroid Build Coastguard Worker
366*890232f2SAndroid Build Coastguard Worker    // Ensure Endiannes was written correctly
367*890232f2SAndroid Build Coastguard Worker    $assert->Equal(chr(0x00), $uut->_buffer[0]);
368*890232f2SAndroid Build Coastguard Worker    $assert->Equal(chr(0x80), $uut->_buffer[1]);
369*890232f2SAndroid Build Coastguard Worker
370*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_PutShortCannotPutAtOffsetPastLength
371*890232f2SAndroid Build Coastguard Worker    $buffer = "\0";
372*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
373*890232f2SAndroid Build Coastguard Worker    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {
374*890232f2SAndroid Build Coastguard Worker        $uut->putShort(2, "\x63"); // 99
375*890232f2SAndroid Build Coastguard Worker    });
376*890232f2SAndroid Build Coastguard Worker
377*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_PutShortChecksLength
378*890232f2SAndroid Build Coastguard Worker    $buffer = "\0";
379*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
380*890232f2SAndroid Build Coastguard Worker    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {
381*890232f2SAndroid Build Coastguard Worker        $uut->putShort(0, "\x63"); // 99
382*890232f2SAndroid Build Coastguard Worker    });
383*890232f2SAndroid Build Coastguard Worker
384*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_PutShortChecksLengthAndOffset
385*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 2);
386*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
387*890232f2SAndroid Build Coastguard Worker    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {
388*890232f2SAndroid Build Coastguard Worker        $uut->putShort(1, "\x63"); // 99
389*890232f2SAndroid Build Coastguard Worker    });
390*890232f2SAndroid Build Coastguard Worker
391*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_PutIntPopulatesBufferCorrectly
392*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 4);
393*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
394*890232f2SAndroid Build Coastguard Worker    $uut->putInt(0, 0x0A0B0C0D);
395*890232f2SAndroid Build Coastguard Worker    $assert->Equal(chr(0x0D), $uut->_buffer[0]);
396*890232f2SAndroid Build Coastguard Worker    $assert->Equal(chr(0x0C), $uut->_buffer[1]);
397*890232f2SAndroid Build Coastguard Worker    $assert->Equal(chr(0x0B), $uut->_buffer[2]);
398*890232f2SAndroid Build Coastguard Worker    $assert->Equal(chr(0x0A), $uut->_buffer[3]);
399*890232f2SAndroid Build Coastguard Worker
400*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 4);
401*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
402*890232f2SAndroid Build Coastguard Worker    $uut->putInt(0, -2147483648);
403*890232f2SAndroid Build Coastguard Worker    $assert->Equal(chr(0x00), $uut->_buffer[0]);
404*890232f2SAndroid Build Coastguard Worker    $assert->Equal(chr(0x00), $uut->_buffer[1]);
405*890232f2SAndroid Build Coastguard Worker    $assert->Equal(chr(0x00), $uut->_buffer[2]);
406*890232f2SAndroid Build Coastguard Worker    $assert->Equal(chr(0x80), $uut->_buffer[3]);
407*890232f2SAndroid Build Coastguard Worker
408*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_PutIntCannotPutAtOffsetPastLength
409*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 4);
410*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
411*890232f2SAndroid Build Coastguard Worker    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {
412*890232f2SAndroid Build Coastguard Worker        $uut->putInt(2, 0x0A0B0C0D);
413*890232f2SAndroid Build Coastguard Worker    });
414*890232f2SAndroid Build Coastguard Worker
415*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_PutIntChecksLength
416*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 1);
417*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
418*890232f2SAndroid Build Coastguard Worker    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {
419*890232f2SAndroid Build Coastguard Worker        $uut->putInt(0, 0x0A0B0C0D);
420*890232f2SAndroid Build Coastguard Worker    });
421*890232f2SAndroid Build Coastguard Worker
422*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_PutIntChecksLengthAndOffset
423*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 4);
424*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
425*890232f2SAndroid Build Coastguard Worker    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {
426*890232f2SAndroid Build Coastguard Worker        $uut->putInt(2, 0x0A0B0C0D);
427*890232f2SAndroid Build Coastguard Worker    });
428*890232f2SAndroid Build Coastguard Worker
429*890232f2SAndroid Build Coastguard Worker    if (PHP_INT_SIZE > 4) {
430*890232f2SAndroid Build Coastguard Worker        //Test: ByteBuffer_PutLongPopulatesBufferCorrectly
431*890232f2SAndroid Build Coastguard Worker        $buffer = str_repeat("\0", 8);
432*890232f2SAndroid Build Coastguard Worker        $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
433*890232f2SAndroid Build Coastguard Worker        $uut->putLong(0, 0x010203040A0B0C0D);
434*890232f2SAndroid Build Coastguard Worker        $assert->Equal(chr(0x0D), $uut->_buffer[0]);
435*890232f2SAndroid Build Coastguard Worker        $assert->Equal(chr(0x0C), $uut->_buffer[1]);
436*890232f2SAndroid Build Coastguard Worker        $assert->Equal(chr(0x0B), $uut->_buffer[2]);
437*890232f2SAndroid Build Coastguard Worker        $assert->Equal(chr(0x0A), $uut->_buffer[3]);
438*890232f2SAndroid Build Coastguard Worker        $assert->Equal(chr(0x04), $uut->_buffer[4]);
439*890232f2SAndroid Build Coastguard Worker        $assert->Equal(chr(0x03), $uut->_buffer[5]);
440*890232f2SAndroid Build Coastguard Worker        $assert->Equal(chr(0x02), $uut->_buffer[6]);
441*890232f2SAndroid Build Coastguard Worker        $assert->Equal(chr(0x01), $uut->_buffer[7]);
442*890232f2SAndroid Build Coastguard Worker
443*890232f2SAndroid Build Coastguard Worker        //Test: ByteBuffer_PutLongCannotPutAtOffsetPastLength
444*890232f2SAndroid Build Coastguard Worker        $buffer = str_repeat("\0", 8);
445*890232f2SAndroid Build Coastguard Worker        $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
446*890232f2SAndroid Build Coastguard Worker        $assert->Throws(new OutOfRangeException(), function()  use ($uut) {
447*890232f2SAndroid Build Coastguard Worker            $uut->putLong(2, 0x010203040A0B0C0D);
448*890232f2SAndroid Build Coastguard Worker        });
449*890232f2SAndroid Build Coastguard Worker
450*890232f2SAndroid Build Coastguard Worker        //Test: ByteBuffer_PutLongCannotPutAtOffsetPastLength
451*890232f2SAndroid Build Coastguard Worker        $buffer = str_repeat("\0", 1);
452*890232f2SAndroid Build Coastguard Worker        $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
453*890232f2SAndroid Build Coastguard Worker        $assert->Throws(new OutOfRangeException(), function()  use ($uut) {
454*890232f2SAndroid Build Coastguard Worker            $uut->putLong(0, 0x010203040A0B0C0D);
455*890232f2SAndroid Build Coastguard Worker        });
456*890232f2SAndroid Build Coastguard Worker
457*890232f2SAndroid Build Coastguard Worker
458*890232f2SAndroid Build Coastguard Worker        //Test: ByteBuffer_PutLongChecksLengthAndOffset
459*890232f2SAndroid Build Coastguard Worker        $buffer = str_repeat("\0", 8);
460*890232f2SAndroid Build Coastguard Worker        $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
461*890232f2SAndroid Build Coastguard Worker        $assert->Throws(new OutOfRangeException(), function()  use ($uut) {
462*890232f2SAndroid Build Coastguard Worker            $uut->putLong(2, 0x010203040A0B0C0D);
463*890232f2SAndroid Build Coastguard Worker        });
464*890232f2SAndroid Build Coastguard Worker    }
465*890232f2SAndroid Build Coastguard Worker
466*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_GetByteReturnsCorrectData
467*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 1);
468*890232f2SAndroid Build Coastguard Worker    $buffer[0] = "\x63";
469*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
470*890232f2SAndroid Build Coastguard Worker    $assert->Equal("\x63", $uut->get(0));
471*890232f2SAndroid Build Coastguard Worker
472*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_GetByteChecksOffset
473*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 1);
474*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
475*890232f2SAndroid Build Coastguard Worker    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {
476*890232f2SAndroid Build Coastguard Worker        $uut->get(1);
477*890232f2SAndroid Build Coastguard Worker    });
478*890232f2SAndroid Build Coastguard Worker
479*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_GetShortReturnsCorrectData
480*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 2);
481*890232f2SAndroid Build Coastguard Worker    $buffer[0] = chr(0x01);
482*890232f2SAndroid Build Coastguard Worker    $buffer[1] = chr(0x00);
483*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
484*890232f2SAndroid Build Coastguard Worker    $assert->Equal(1, $uut->getShort(0));
485*890232f2SAndroid Build Coastguard Worker
486*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_GetShortReturnsCorrectData (signed value)
487*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 2);
488*890232f2SAndroid Build Coastguard Worker    $buffer[0] = chr(0x00);
489*890232f2SAndroid Build Coastguard Worker    $buffer[1] = chr(0x80);
490*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
491*890232f2SAndroid Build Coastguard Worker    $assert->Equal(-32768, $uut->getShort(0));
492*890232f2SAndroid Build Coastguard Worker
493*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_GetShortChecksOffset
494*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 2);
495*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
496*890232f2SAndroid Build Coastguard Worker    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {
497*890232f2SAndroid Build Coastguard Worker        $uut->getShort(2);
498*890232f2SAndroid Build Coastguard Worker    });
499*890232f2SAndroid Build Coastguard Worker
500*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_GetShortChecksLength
501*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 2);
502*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
503*890232f2SAndroid Build Coastguard Worker    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {
504*890232f2SAndroid Build Coastguard Worker        $uut->getShort(1);
505*890232f2SAndroid Build Coastguard Worker    });
506*890232f2SAndroid Build Coastguard Worker
507*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_GetIntReturnsCorrectData
508*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 4);
509*890232f2SAndroid Build Coastguard Worker    $buffer[0] = chr(0x0D);
510*890232f2SAndroid Build Coastguard Worker    $buffer[1] = chr(0x0C);
511*890232f2SAndroid Build Coastguard Worker    $buffer[2] = chr(0x0B);
512*890232f2SAndroid Build Coastguard Worker    $buffer[3] = chr(0x0A);
513*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
514*890232f2SAndroid Build Coastguard Worker    $assert->Equal(0x0A0B0C0D, $uut->getInt(0));
515*890232f2SAndroid Build Coastguard Worker
516*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 4);
517*890232f2SAndroid Build Coastguard Worker    $buffer[0] = chr(0x00);
518*890232f2SAndroid Build Coastguard Worker    $buffer[1] = chr(0x00);
519*890232f2SAndroid Build Coastguard Worker    $buffer[2] = chr(0x00);
520*890232f2SAndroid Build Coastguard Worker    $buffer[3] = chr(0x80);
521*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
522*890232f2SAndroid Build Coastguard Worker    $assert->Equal(-2147483648, $uut->getInt(0));
523*890232f2SAndroid Build Coastguard Worker
524*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_GetIntChecksOffset
525*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 4);
526*890232f2SAndroid Build Coastguard Worker
527*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
528*890232f2SAndroid Build Coastguard Worker    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {
529*890232f2SAndroid Build Coastguard Worker        $uut->getInt(4);
530*890232f2SAndroid Build Coastguard Worker    });
531*890232f2SAndroid Build Coastguard Worker
532*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_GetIntChecksLength
533*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 2);
534*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
535*890232f2SAndroid Build Coastguard Worker    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {
536*890232f2SAndroid Build Coastguard Worker        $uut->getInt(0);
537*890232f2SAndroid Build Coastguard Worker    });
538*890232f2SAndroid Build Coastguard Worker
539*890232f2SAndroid Build Coastguard Worker    if (PHP_INT_SIZE > 4) {
540*890232f2SAndroid Build Coastguard Worker        //Test: ByteBuffer_GetLongReturnsCorrectData
541*890232f2SAndroid Build Coastguard Worker        $buffer = str_repeat("\0", 8);
542*890232f2SAndroid Build Coastguard Worker        $buffer[0] = chr(0x0D);
543*890232f2SAndroid Build Coastguard Worker        $buffer[1] = chr(0x0C);
544*890232f2SAndroid Build Coastguard Worker        $buffer[2] = chr(0x0B);
545*890232f2SAndroid Build Coastguard Worker        $buffer[3] = chr(0x0A);
546*890232f2SAndroid Build Coastguard Worker        $buffer[4] = chr(0x04);
547*890232f2SAndroid Build Coastguard Worker        $buffer[5] = chr(0x03);
548*890232f2SAndroid Build Coastguard Worker        $buffer[6] = chr(0x02);
549*890232f2SAndroid Build Coastguard Worker        $buffer[7] = chr(0x01);
550*890232f2SAndroid Build Coastguard Worker        $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
551*890232f2SAndroid Build Coastguard Worker        $assert->Equal(0x010203040A0B0C0D, $uut->getLong(0));
552*890232f2SAndroid Build Coastguard Worker
553*890232f2SAndroid Build Coastguard Worker        //Test: Signed Long
554*890232f2SAndroid Build Coastguard Worker        $buffer = str_repeat("\0", 8);
555*890232f2SAndroid Build Coastguard Worker        $buffer[0] = chr(0x00);
556*890232f2SAndroid Build Coastguard Worker        $buffer[1] = chr(0x00);
557*890232f2SAndroid Build Coastguard Worker        $buffer[2] = chr(0x00);
558*890232f2SAndroid Build Coastguard Worker        $buffer[3] = chr(0x00);
559*890232f2SAndroid Build Coastguard Worker        $buffer[4] = chr(0x00);
560*890232f2SAndroid Build Coastguard Worker        $buffer[5] = chr(0x00);
561*890232f2SAndroid Build Coastguard Worker        $buffer[6] = chr(0x00);
562*890232f2SAndroid Build Coastguard Worker        $buffer[7] = chr(0x80);
563*890232f2SAndroid Build Coastguard Worker        $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
564*890232f2SAndroid Build Coastguard Worker        $assert->Equal(-1 << 63, $uut->getLong(0));
565*890232f2SAndroid Build Coastguard Worker    }
566*890232f2SAndroid Build Coastguard Worker
567*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_GetLongChecksOffset
568*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 8);
569*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
570*890232f2SAndroid Build Coastguard Worker    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {
571*890232f2SAndroid Build Coastguard Worker        $uut->getLong(8);
572*890232f2SAndroid Build Coastguard Worker    });
573*890232f2SAndroid Build Coastguard Worker
574*890232f2SAndroid Build Coastguard Worker    //Test: ByteBuffer_GetLongChecksLength
575*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 7);
576*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
577*890232f2SAndroid Build Coastguard Worker    $assert->Throws(new OutOfRangeException(), function()  use ($uut) {
578*890232f2SAndroid Build Coastguard Worker        $uut->getLong(0);
579*890232f2SAndroid Build Coastguard Worker    });
580*890232f2SAndroid Build Coastguard Worker
581*890232f2SAndroid Build Coastguard Worker    //Test: big endian
582*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 2);
583*890232f2SAndroid Build Coastguard Worker    // 0xFF 0x00
584*890232f2SAndroid Build Coastguard Worker    // Little Endian: 255
585*890232f2SAndroid Build Coastguard Worker    // Big Endian: 65280
586*890232f2SAndroid Build Coastguard Worker    $buffer[0] = chr(0xff);
587*890232f2SAndroid Build Coastguard Worker    $buffer[1] = chr(0x00);
588*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
589*890232f2SAndroid Build Coastguard Worker    $assert->Equal(65280, $uut->readLittleEndian(0, 2, true));
590*890232f2SAndroid Build Coastguard Worker
591*890232f2SAndroid Build Coastguard Worker    $buffer = str_repeat("\0", 4);
592*890232f2SAndroid Build Coastguard Worker    $buffer[0] = chr(0x0D);
593*890232f2SAndroid Build Coastguard Worker    $buffer[1] = chr(0x0C);
594*890232f2SAndroid Build Coastguard Worker    $buffer[2] = chr(0x0B);
595*890232f2SAndroid Build Coastguard Worker    $buffer[3] = chr(0x0A);
596*890232f2SAndroid Build Coastguard Worker    $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer);
597*890232f2SAndroid Build Coastguard Worker    $assert->Equal(0x0D0C0B0A, $uut->readLittleEndian(0, 4, true));
598*890232f2SAndroid Build Coastguard Worker
599*890232f2SAndroid Build Coastguard Worker}
600*890232f2SAndroid Build Coastguard Worker
601*890232f2SAndroid Build Coastguard Workerclass Assert {
602*890232f2SAndroid Build Coastguard Worker    public function ok($result, $message = "") {
603*890232f2SAndroid Build Coastguard Worker        if (!$result){
604*890232f2SAndroid Build Coastguard Worker            throw new Exception(!empty($message) ? $message : "{$result} is not true.");
605*890232f2SAndroid Build Coastguard Worker        }
606*890232f2SAndroid Build Coastguard Worker    }
607*890232f2SAndroid Build Coastguard Worker
608*890232f2SAndroid Build Coastguard Worker    public function Equal($result, $expected, $message = "") {
609*890232f2SAndroid Build Coastguard Worker        if ($result != $expected) {
610*890232f2SAndroid Build Coastguard Worker            throw new Exception(!empty($message) ? $message : "given the result {$result} is not equals as {$expected}");
611*890232f2SAndroid Build Coastguard Worker        }
612*890232f2SAndroid Build Coastguard Worker    }
613*890232f2SAndroid Build Coastguard Worker
614*890232f2SAndroid Build Coastguard Worker
615*890232f2SAndroid Build Coastguard Worker    public function strictEqual($result, $expected, $message = "") {
616*890232f2SAndroid Build Coastguard Worker        if ($result !== $expected) {
617*890232f2SAndroid Build Coastguard Worker            throw new Exception(!empty($message) ? $message : "given the result {$result} is not strict equals as {$expected}");
618*890232f2SAndroid Build Coastguard Worker        }
619*890232f2SAndroid Build Coastguard Worker    }
620*890232f2SAndroid Build Coastguard Worker
621*890232f2SAndroid Build Coastguard Worker    public function Throws($class, Callable $callback) {
622*890232f2SAndroid Build Coastguard Worker        try {
623*890232f2SAndroid Build Coastguard Worker            $callback();
624*890232f2SAndroid Build Coastguard Worker
625*890232f2SAndroid Build Coastguard Worker            throw new \Exception("passed statement don't throw an exception.");
626*890232f2SAndroid Build Coastguard Worker        } catch (\Exception $e) {
627*890232f2SAndroid Build Coastguard Worker            if (get_class($e) != get_class($class)) {
628*890232f2SAndroid Build Coastguard Worker                throw new Exception("passed statement doesn't throw " . get_class($class) . ". throwws " . get_class($e));
629*890232f2SAndroid Build Coastguard Worker            }
630*890232f2SAndroid Build Coastguard Worker        }
631*890232f2SAndroid Build Coastguard Worker    }
632*890232f2SAndroid Build Coastguard Worker}
633