Home | History | Annotate | Download | only in tests
      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, false);
     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(), false);
    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