...

Text file src/github.com/google/flatbuffers/tests/phpTest.php

Documentation: github.com/google/flatbuffers/tests

     1<?php
     2// manual load for testing. please use PSR style autoloader when you use flatbuffers.
     3require join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), "php", "Constants.php"));
     4require join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), "php", "ByteBuffer.php"));
     5require join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), "php", "FlatbufferBuilder.php"));
     6require join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), "php", "Table.php"));
     7require join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), "php", "Struct.php"));
     8foreach (glob(join(DIRECTORY_SEPARATOR, array(dirname(__FILE__), "MyGame", "Example", "*.php"))) as $file) {
     9    require $file;
    10}
    11
    12function 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
    85try {
    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
    97function 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
   195function 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
   327function 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
   333function 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, 2); // 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, 2); // 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, 2); // 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
   601class 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) . ". throws " . get_class($e) . ": {$e->getMessage()}");
   629            }
   630        }
   631    }
   632}

View as plain text