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