| <?php |
| // manual load for testing. please use PSR style autoloader when you use flatbuffers. |
| require join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), "php", "Constants.php")); |
| require join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), "php", "ByteBuffer.php")); |
| require join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), "php", "FlatbufferBuilder.php")); |
| require join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), "php", "Table.php")); |
| require join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), "php", "Struct.php")); |
| foreach (glob(join(DIRECTORY_SEPARATOR, array(dirname(__FILE__), "MyGame", "Example", "*.php"))) as $file) { |
| require $file; |
| } |
| |
| function main() |
| { |
| /// Begin Test |
| $assert = new Assert(); |
| |
| // First, let's test reading a FlatBuffer generated by C++ code: |
| // This file was generated from monsterdata_test.json |
| |
| // Now test it: |
| $data = file_get_contents('monsterdata_test.mon'); |
| $bb = Google\FlatBuffers\ByteBuffer::wrap($data); |
| test_buffer($assert, $bb); |
| |
| // Second, let's create a FlatBuffer from scratch in JavaScript, and test it also. |
| // We use an initial size of 1 to exercise the reallocation algorithm, |
| // normally a size larger than the typical FlatBuffer you generate would be |
| // better for performance. |
| $fbb = new Google\FlatBuffers\FlatBufferBuilder(1); |
| |
| // We set up the same values as monsterdata.json: |
| $str = $fbb->createString("MyMonster"); |
| $name = $fbb->createString('Fred'); |
| \MyGame\Example\Monster::startMonster($fbb); |
| \MyGame\Example\Monster::addName($fbb, $name); |
| $enemy = \MyGame\Example\Monster::endMonster($fbb); |
| |
| $inv = \MyGame\Example\Monster::CreateInventoryVector($fbb, array(0, 1, 2, 3, 4)); |
| |
| $fred = $fbb->createString('Fred'); |
| \MyGame\Example\Monster::StartMonster($fbb); |
| \MyGame\Example\Monster::AddName($fbb, $fred); |
| $mon2 = \MyGame\Example\Monster::EndMonster($fbb); |
| |
| \MyGame\Example\Monster::StartTest4Vector($fbb, 2); |
| \MyGame\Example\Test::CreateTest($fbb, 10, 20); |
| \MyGame\Example\Test::CreateTest($fbb, 30, 40); |
| $test4 = $fbb->endVector(); |
| |
| $testArrayOfString = \MyGame\Example\Monster::CreateTestarrayofstringVector($fbb, array( |
| $fbb->createString('test1'), |
| $fbb->createString('test2') |
| )); |
| |
| \MyGame\Example\Monster::StartMonster($fbb); |
| \MyGame\Example\Monster::AddPos($fbb, \MyGame\Example\Vec3::CreateVec3($fbb, |
| 1.0, 2.0, 3.0, //float |
| 3.0, // double |
| \MyGame\Example\Color::Green, |
| 5, //short |
| 6)); |
| \MyGame\Example\Monster::AddHp($fbb, 80); |
| \MyGame\Example\Monster::AddName($fbb, $str); |
| \MyGame\Example\Monster::AddInventory($fbb, $inv); |
| \MyGame\Example\Monster::AddTestType($fbb, \MyGame\Example\Any::Monster); |
| \MyGame\Example\Monster::AddTest($fbb, $mon2); |
| \MyGame\Example\Monster::AddTest4($fbb, $test4); |
| \MyGame\Example\Monster::AddTestarrayofstring($fbb, $testArrayOfString); |
| \MyGame\Example\Monster::AddEnemy($fbb, $enemy); |
| \MyGame\Example\Monster::AddTestbool($fbb, false); |
| $mon = \MyGame\Example\Monster::EndMonster($fbb); |
| |
| \MyGame\Example\Monster::FinishMonsterBuffer($fbb, $mon); |
| |
| // Test it: |
| test_buffer($assert, $fbb->dataBuffer()); |
| |
| testByteBuffer($assert); |
| fuzzTest1($assert); |
| // testUnicode($assert); |
| |
| echo 'FlatBuffers php test: completed successfully' . PHP_EOL; |
| } |
| |
| try { |
| main(); |
| exit(0); |
| } catch(Exception $e) { |
| printf("Fatal error: Uncaught exception '%s' with message '%s. in %s:%d\n", get_class($e), $e->getMessage(), $e->getFile(), $e->getLine()); |
| printf("Stack trace:\n"); |
| echo $e->getTraceAsString() . PHP_EOL; |
| printf(" thrown in in %s:%d\n", $e->getFile(), $e->getLine()); |
| |
| die(-1); |
| } |
| |
| function test_buffer(Assert $assert, Google\FlatBuffers\ByteBuffer $bb) { |
| |
| $assert->ok(MyGame\Example\Monster::MonsterBufferHasIdentifier($bb)); |
| $monster = \MyGame\Example\Monster::GetRootAsMonster($bb); |
| |
| $assert->strictEqual($monster->GetHp(), 80); |
| $assert->strictEqual($monster->GetMana(), 150); // default |
| |
| $assert->strictEqual($monster->GetName(), 'MyMonster'); |
| |
| $pos = $monster->GetPos(); |
| $assert->strictEqual($pos->GetX(), 1.0); |
| $assert->strictEqual($pos->GetY(), 2.0); |
| $assert->strictEqual($pos->GetZ(), 3.0); |
| |
| $assert->Equal($pos->GetTest1(), 3.0); |
| $assert->strictEqual($pos->GetTest2(), \MyGame\Example\Color::Green); |
| |
| $t = $pos->GetTest3(); |
| $assert->strictEqual($t->GetA(), 5); |
| $assert->strictEqual($t->GetB(), 6); |
| $assert->strictEqual($monster->GetTestType(), \MyGame\Example\Any::Monster); |
| |
| $monster2 = new \MyGame\Example\Monster(); |
| $assert->strictEqual($monster->GetTest($monster2) != null, true); |
| $assert->strictEqual($monster2->GetName(), 'Fred'); |
| |
| $assert->strictEqual($monster->GetInventoryLength(), 5); |
| $invsum = 0; |
| for ($i = 0; $i < $monster->GetInventoryLength(); $i++) { |
| $invsum += $monster->GetInventory($i); |
| } |
| $assert->strictEqual($invsum, 10); |
| |
| $assert->strictEqual(bin2hex($monster->GetInventoryBytes()), "0001020304"); |
| |
| $test_0 = $monster->GetTest4(0); |
| $test_1 = $monster->GetTest4(1); |
| $assert->strictEqual($monster->GetTest4Length(), 2); |
| $assert->strictEqual($test_0->GetA() + $test_0->GetB() + $test_1->GetA() + $test_1->GetB(), 100); |
| |
| $assert->strictEqual($monster->GetTestarrayofstringLength(), 2); |
| $assert->strictEqual($monster->GetTestarrayofstring(0), 'test1'); |
| $assert->strictEqual($monster->GetTestarrayofstring(1), 'test2'); |
| |
| $fred = $monster->getEnemy(); |
| $assert->Equal('Fred', $fred->getName()); |
| |
| $assert->strictEqual($monster->GetTestbool(), false); |
| } |
| |
| //function testUnicode(Assert $assert) { |
| // // missing unicode_test.mon, implemented later |
| // $correct = file_get_contents('unicode_test.mon'); |
| // $json = json_decode(file_get_contents('unicode_test.json')); |
| // |
| // // Test reading |
| // $bb = flatbuffers\ByteBuffer::Wrap($correct); |
| // $monster = \MyGame\Example\Monster::GetRootAsMonster($bb); |
| // $assert->strictEqual($monster->GetName(), $json["name"]); |
| // |
| // //$assert->deepEqual(new Buffer(monster.name(flatbuffers.Encoding.UTF8_BYTES)), new Buffer(json.name)); |
| // //assert.strictEqual(monster.testarrayoftablesLength(), json.testarrayoftables.length); |
| // foreach ($json["testarrayoftables"]as $i => $table) { |
| // $value = $monster->GetTestArrayOfTables($i); |
| // $assert->strictEqual($value->GetName(), $table["name"]); |
| // //assert.deepEqual(new Buffer(value.name(flatbuffers.Encoding.UTF8_BYTES)), new Buffer(table.name)); |
| // } |
| // $assert->strictEqual($monster->GetTestarrayofstringLength(), $json["testarrayofstring"]["length"]); |
| // foreach ($json["testarrayofstring"] as $i => $string) { |
| // $assert->strictEqual($monster->GetTestarrayofstring($i), $string); |
| // //assert.deepEqual(new Buffer(monster.testarrayofstring(i, flatbuffers.Encoding.UTF8_BYTES)), new Buffer(string)); |
| // } |
| // |
| // // Test writing |
| // $fbb = new FlatBuffers\FlatBufferBuilder(1); |
| // $name = $fbb->CreateString($json["name"]); |
| // $testarrayoftablesOffsets = array_map(function($table) use($fbb) { |
| // $name = $fbb->CreateString($table["name"]); |
| // \MyGame\Example\Monster::StartMonster($fbb); |
| // \MyGame\Example\Monster::AddName($fbb, $name); |
| // return \MyGame\Example\Monster::EndMonster($fbb); |
| // }, $json["testarrayoftables"]); |
| // $testarrayoftablesOffset = \MyGame\Example\Monster::CreateTestarrayoftablesVector($fbb, |
| // $testarrayoftablesOffsets); |
| //// $testarrayofstringOffset = \MyGame\Example\Monster::CreateTestarrayofstringVector($fbb, |
| //// $json["testarrayofstring"].map(function(string) { return fbb.createString(string); })); |
| // |
| // \MyGame\Example\Monster::startMonster($fbb); |
| // \MyGame\Example\Monster::addTestarrayofstring($fbb, $testarrayoftablesOffset); |
| // \MyGame\Example\Monster::addTestarrayoftables($fbb, $testarrayoftablesOffset); |
| // \MyGame\Example\Monster::addName($fbb, $name); |
| // \MyGame\Example\Monster::finishMonsterBuffer($fbb, \MyGame\Example\Monster::endMonster($fbb)); |
| // //;assert.deepEqual(new Buffer(fbb.asUint8Array()), correct); |
| //} |
| |
| // Low level stress/fuzz test: serialize/deserialize a variety of |
| // different kinds of data in different combinations |
| function fuzzTest1(Assert $assert) |
| { |
| |
| // Values we're testing against: chosen to ensure no bits get chopped |
| // off anywhere, and also be different from eachother. |
| $bool_val = true; |
| $char_val = -127; // 0x81 |
| $uchar_val = 0xFF; |
| $short_val = -32222; // 0x8222; |
| $ushort_val = 0xFEEE; |
| $int_val = 0x7fffffff | 0; |
| // for now |
| $uint_val = 1; |
| $long_val = 2; |
| $ulong_val = 3; |
| |
| // var uint_val = 0xFDDDDDDD; |
| // var long_val = new flatbuffers.Long(0x44444444, 0x84444444); |
| // var ulong_val = new flatbuffers.Long(0xCCCCCCCC, 0xFCCCCCCC); |
| |
| $float_val = 3.14159; |
| $double_val = 3.14159265359; |
| |
| $test_values_max = 11; |
| $fields_per_object = 4; |
| // current implementation is not good at encoding. |
| $num_fuzz_objects = 1000; |
| $builder = new Google\FlatBuffers\FlatBufferBuilder(1); |
| |
| // can't use same implementation due to PHP_INTMAX overflow issue. |
| // we use mt_rand function to reproduce fuzzy test. |
| mt_srand(48271); |
| $objects = array(); |
| // Generate num_fuzz_objects random objects each consisting of |
| // fields_per_object fields, each of a random type. |
| for ($i = 0; $i < $num_fuzz_objects; $i++) { |
| $builder->startObject($fields_per_object); |
| for ($f = 0; $f < $fields_per_object; $f++) { |
| $choice = mt_rand() % $test_values_max; |
| switch ($choice) { |
| case 0: |
| $builder->addBoolX($f, $bool_val, 0); |
| break; |
| case 1: |
| $builder->addByteX($f, $char_val, 0); |
| break; |
| case 2: |
| $builder->addSbyteX($f, $uchar_val, 0); |
| break; |
| case 3: |
| $builder->addShortX($f, $short_val, 0); |
| break; |
| case 4: |
| $builder->addUshortX($f, $ushort_val, 0); |
| break; |
| case 5: |
| $builder->addIntX($f, $int_val, 0); |
| break; |
| case 6: |
| $builder->addUintX($f, $uint_val, 0); |
| break; |
| case 7: |
| $builder->addLongX($f, $long_val, 0); |
| break; |
| case 8: |
| $builder->addUlongX($f, $ulong_val, 0); |
| break; |
| case 9: |
| $builder->addFloatX($f, $float_val, 0); |
| break; |
| case 10: |
| $builder->addDoubleX($f, $double_val, 0); |
| break; |
| } |
| } |
| $objects[] = $builder->endObject(); |
| } |
| $builder->prep(8, 0); // Align whole buffer. |
| |
| mt_srand(48271); // Reset |
| $builder->finish($objects[count($objects) - 1]); |
| |
| $view = Google\FlatBuffers\ByteBuffer::wrap($builder->sizedByteArray()); |
| for ($i = 0; $i < $num_fuzz_objects; $i++) { |
| $offset = $view->capacity() - $objects[$i]; |
| for ($f = 0; $f < $fields_per_object; $f++) { |
| $choice = mt_rand() % $test_values_max; |
| $vtable_offset = fieldIndexToOffset($f); |
| $vtable = $offset - $view->getInt($offset); |
| $assert->ok($vtable_offset < $view->getShort($vtable)); |
| $field_offset = $offset + $view->getShort($vtable + $vtable_offset); |
| switch ($choice) { |
| case 0: |
| $assert->strictEqual(!!$view->getBool($field_offset), $bool_val); |
| break; |
| case 1: |
| $assert->strictEqual($view->getSbyte($field_offset), $char_val); |
| break; |
| case 2: |
| $assert->strictEqual($view->getByte($field_offset), $uchar_val); |
| break; |
| case 3: |
| $assert->strictEqual($view->getShort($field_offset), $short_val); |
| break; |
| case 4: |
| $assert->strictEqual($view->getUShort($field_offset), $ushort_val); |
| break; |
| case 5: |
| $assert->strictEqual($view->getInt($field_offset), $int_val); |
| break; |
| case 6: |
| $assert->strictEqual($view->getUint($field_offset), $uint_val); |
| break; |
| case 7: |
| if (PHP_INT_SIZE <= 4) break; |
| $assert->strictEqual($view->getLong($field_offset), $long_val); |
| break; |
| case 8: |
| if (PHP_INT_SIZE <= 4) break; |
| $assert->strictEqual($view->getUlong($field_offset), $ulong_val); |
| break; |
| case 9: |
| $assert->strictEqual(floor($view->getFloat($field_offset)), floor($float_val)); |
| break; |
| case 10: |
| $assert->strictEqual($view->getDouble($field_offset), $double_val); |
| break; |
| } |
| } |
| } |
| } |
| |
| function fieldIndexToOffset($field_id) { |
| // Should correspond to what EndTable() below builds up. |
| $fixed_fields = 2; // Vtable size and Object Size. |
| return ($field_id + $fixed_fields) * 2; |
| } |
| |
| function testByteBuffer(Assert $assert) { |
| |
| //Test: ByteBuffer_Length_MatchesBufferLength |
| $buffer = str_repeat("\0", 100); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Equal($uut->capacity(), strlen($buffer)); |
| |
| //Test: ByteBuffer_PutBytePopulatesBufferAtZeroOffset |
| $buffer = "\0"; |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $uut->putByte(0, "\x63"); // 99 |
| $assert->Equal("\x63", $uut->_buffer[0]); // don't share buffer as php user might confuse reference. |
| |
| //Test: ByteBuffer_PutByteCannotPutAtOffsetPastLength |
| $buffer = "\0"; |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Throws(new OutOfRangeException(), function() use ($uut) { |
| $uut->putByte(1, "\x63"); // 99 |
| }); |
| |
| //Test: ByteBuffer_PutShortPopulatesBufferCorrectly |
| $buffer = str_repeat("\0", 2); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $uut->putShort(0, 1); |
| |
| // Ensure Endiannes was written correctly |
| $assert->Equal(chr(0x01), $uut->_buffer[0]); |
| $assert->Equal(chr(0x00), $uut->_buffer[1]); |
| |
| $buffer = str_repeat("\0", 2); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $uut->putShort(0, -32768); |
| |
| // Ensure Endiannes was written correctly |
| $assert->Equal(chr(0x00), $uut->_buffer[0]); |
| $assert->Equal(chr(0x80), $uut->_buffer[1]); |
| |
| //Test: ByteBuffer_PutShortCannotPutAtOffsetPastLength |
| $buffer = "\0"; |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Throws(new OutOfRangeException(), function() use ($uut) { |
| $uut->putShort(2, "\x63"); // 99 |
| }); |
| |
| //Test: ByteBuffer_PutShortChecksLength |
| $buffer = "\0"; |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Throws(new OutOfRangeException(), function() use ($uut) { |
| $uut->putShort(0, "\x63"); // 99 |
| }); |
| |
| //Test: ByteBuffer_PutShortChecksLengthAndOffset |
| $buffer = str_repeat("\0", 2); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Throws(new OutOfRangeException(), function() use ($uut) { |
| $uut->putShort(1, "\x63"); // 99 |
| }); |
| |
| //Test: ByteBuffer_PutIntPopulatesBufferCorrectly |
| $buffer = str_repeat("\0", 4); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $uut->putInt(0, 0x0A0B0C0D); |
| $assert->Equal(chr(0x0D), $uut->_buffer[0]); |
| $assert->Equal(chr(0x0C), $uut->_buffer[1]); |
| $assert->Equal(chr(0x0B), $uut->_buffer[2]); |
| $assert->Equal(chr(0x0A), $uut->_buffer[3]); |
| |
| $buffer = str_repeat("\0", 4); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $uut->putInt(0, -2147483648); |
| $assert->Equal(chr(0x00), $uut->_buffer[0]); |
| $assert->Equal(chr(0x00), $uut->_buffer[1]); |
| $assert->Equal(chr(0x00), $uut->_buffer[2]); |
| $assert->Equal(chr(0x80), $uut->_buffer[3]); |
| |
| //Test: ByteBuffer_PutIntCannotPutAtOffsetPastLength |
| $buffer = str_repeat("\0", 4); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Throws(new OutOfRangeException(), function() use ($uut) { |
| $uut->putInt(2, 0x0A0B0C0D); |
| }); |
| |
| //Test: ByteBuffer_PutIntChecksLength |
| $buffer = str_repeat("\0", 1); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Throws(new OutOfRangeException(), function() use ($uut) { |
| $uut->putInt(0, 0x0A0B0C0D); |
| }); |
| |
| //Test: ByteBuffer_PutIntChecksLengthAndOffset |
| $buffer = str_repeat("\0", 4); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Throws(new OutOfRangeException(), function() use ($uut) { |
| $uut->putInt(2, 0x0A0B0C0D); |
| }); |
| |
| if (PHP_INT_SIZE > 4) { |
| //Test: ByteBuffer_PutLongPopulatesBufferCorrectly |
| $buffer = str_repeat("\0", 8); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $uut->putLong(0, 0x010203040A0B0C0D); |
| $assert->Equal(chr(0x0D), $uut->_buffer[0]); |
| $assert->Equal(chr(0x0C), $uut->_buffer[1]); |
| $assert->Equal(chr(0x0B), $uut->_buffer[2]); |
| $assert->Equal(chr(0x0A), $uut->_buffer[3]); |
| $assert->Equal(chr(0x04), $uut->_buffer[4]); |
| $assert->Equal(chr(0x03), $uut->_buffer[5]); |
| $assert->Equal(chr(0x02), $uut->_buffer[6]); |
| $assert->Equal(chr(0x01), $uut->_buffer[7]); |
| |
| //Test: ByteBuffer_PutLongCannotPutAtOffsetPastLength |
| $buffer = str_repeat("\0", 8); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Throws(new OutOfRangeException(), function() use ($uut) { |
| $uut->putLong(2, 0x010203040A0B0C0D); |
| }); |
| |
| //Test: ByteBuffer_PutLongCannotPutAtOffsetPastLength |
| $buffer = str_repeat("\0", 1); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Throws(new OutOfRangeException(), function() use ($uut) { |
| $uut->putLong(0, 0x010203040A0B0C0D); |
| }); |
| |
| |
| //Test: ByteBuffer_PutLongChecksLengthAndOffset |
| $buffer = str_repeat("\0", 8); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Throws(new OutOfRangeException(), function() use ($uut) { |
| $uut->putLong(2, 0x010203040A0B0C0D); |
| }); |
| } |
| |
| //Test: ByteBuffer_GetByteReturnsCorrectData |
| $buffer = str_repeat("\0", 1); |
| $buffer[0] = "\x63"; |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Equal("\x63", $uut->get(0)); |
| |
| //Test: ByteBuffer_GetByteChecksOffset |
| $buffer = str_repeat("\0", 1); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Throws(new OutOfRangeException(), function() use ($uut) { |
| $uut->get(1); |
| }); |
| |
| //Test: ByteBuffer_GetShortReturnsCorrectData |
| $buffer = str_repeat("\0", 2); |
| $buffer[0] = chr(0x01); |
| $buffer[1] = chr(0x00); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Equal(1, $uut->getShort(0)); |
| |
| //Test: ByteBuffer_GetShortReturnsCorrectData (signed value) |
| $buffer = str_repeat("\0", 2); |
| $buffer[0] = chr(0x00); |
| $buffer[1] = chr(0x80); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Equal(-32768, $uut->getShort(0)); |
| |
| //Test: ByteBuffer_GetShortChecksOffset |
| $buffer = str_repeat("\0", 2); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Throws(new OutOfRangeException(), function() use ($uut) { |
| $uut->getShort(2); |
| }); |
| |
| //Test: ByteBuffer_GetShortChecksLength |
| $buffer = str_repeat("\0", 2); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Throws(new OutOfRangeException(), function() use ($uut) { |
| $uut->getShort(1); |
| }); |
| |
| //Test: ByteBuffer_GetIntReturnsCorrectData |
| $buffer = str_repeat("\0", 4); |
| $buffer[0] = chr(0x0D); |
| $buffer[1] = chr(0x0C); |
| $buffer[2] = chr(0x0B); |
| $buffer[3] = chr(0x0A); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Equal(0x0A0B0C0D, $uut->getInt(0)); |
| |
| $buffer = str_repeat("\0", 4); |
| $buffer[0] = chr(0x00); |
| $buffer[1] = chr(0x00); |
| $buffer[2] = chr(0x00); |
| $buffer[3] = chr(0x80); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Equal(-2147483648, $uut->getInt(0)); |
| |
| //Test: ByteBuffer_GetIntChecksOffset |
| $buffer = str_repeat("\0", 4); |
| |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Throws(new OutOfRangeException(), function() use ($uut) { |
| $uut->getInt(4); |
| }); |
| |
| //Test: ByteBuffer_GetIntChecksLength |
| $buffer = str_repeat("\0", 2); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Throws(new OutOfRangeException(), function() use ($uut) { |
| $uut->getInt(0); |
| }); |
| |
| if (PHP_INT_SIZE > 4) { |
| //Test: ByteBuffer_GetLongReturnsCorrectData |
| $buffer = str_repeat("\0", 8); |
| $buffer[0] = chr(0x0D); |
| $buffer[1] = chr(0x0C); |
| $buffer[2] = chr(0x0B); |
| $buffer[3] = chr(0x0A); |
| $buffer[4] = chr(0x04); |
| $buffer[5] = chr(0x03); |
| $buffer[6] = chr(0x02); |
| $buffer[7] = chr(0x01); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Equal(0x010203040A0B0C0D, $uut->getLong(0)); |
| |
| //Test: Signed Long |
| $buffer = str_repeat("\0", 8); |
| $buffer[0] = chr(0x00); |
| $buffer[1] = chr(0x00); |
| $buffer[2] = chr(0x00); |
| $buffer[3] = chr(0x00); |
| $buffer[4] = chr(0x00); |
| $buffer[5] = chr(0x00); |
| $buffer[6] = chr(0x00); |
| $buffer[7] = chr(0x80); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Equal(-1 << 63, $uut->getLong(0)); |
| } |
| |
| //Test: ByteBuffer_GetLongChecksOffset |
| $buffer = str_repeat("\0", 8); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Throws(new OutOfRangeException(), function() use ($uut) { |
| $uut->getLong(8); |
| }); |
| |
| //Test: ByteBuffer_GetLongChecksLength |
| $buffer = str_repeat("\0", 7); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Throws(new OutOfRangeException(), function() use ($uut) { |
| $uut->getLong(0); |
| }); |
| |
| //Test: big endian |
| $buffer = str_repeat("\0", 2); |
| // 0xFF 0x00 |
| // Little Endian: 255 |
| // Big Endian: 65280 |
| $buffer[0] = chr(0xff); |
| $buffer[1] = chr(0x00); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Equal(65280, $uut->readLittleEndian(0, 2, true)); |
| |
| $buffer = str_repeat("\0", 4); |
| $buffer[0] = chr(0x0D); |
| $buffer[1] = chr(0x0C); |
| $buffer[2] = chr(0x0B); |
| $buffer[3] = chr(0x0A); |
| $uut = Google\FlatBuffers\ByteBuffer::wrap($buffer); |
| $assert->Equal(0x0D0C0B0A, $uut->readLittleEndian(0, 4, true)); |
| |
| } |
| |
| class Assert { |
| public function ok($result, $message = "") { |
| if (!$result){ |
| throw new Exception(!empty($message) ? $message : "{$result} is not true."); |
| } |
| } |
| |
| public function Equal($result, $expected, $message = "") { |
| if ($result != $expected) { |
| throw new Exception(!empty($message) ? $message : "given the result {$result} is not equals as {$expected}"); |
| } |
| } |
| |
| |
| public function strictEqual($result, $expected, $message = "") { |
| if ($result !== $expected) { |
| throw new Exception(!empty($message) ? $message : "given the result {$result} is not strict equals as {$expected}"); |
| } |
| } |
| |
| public function Throws($class, Callable $callback) { |
| try { |
| $callback(); |
| |
| throw new \Exception("passed statement don't throw an exception."); |
| } catch (\Exception $e) { |
| if (get_class($e) != get_class($class)) { |
| throw new Exception("passed statement doesn't throw " . get_class($class) . ". throwws " . get_class($e)); |
| } |
| } |
| } |
| } |