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