1*890232f2SAndroid Build Coastguard Worker// Run this using JavaScriptTest.sh 2*890232f2SAndroid Build Coastguard Workerimport assert from 'assert' 3*890232f2SAndroid Build Coastguard Workerimport fs from 'fs' 4*890232f2SAndroid Build Coastguard Workerimport * as flatbuffers from 'flatbuffers' 5*890232f2SAndroid Build Coastguard Worker 6*890232f2SAndroid Build Coastguard Workerimport { Monster, MonsterT } from './my-game/example/monster' 7*890232f2SAndroid Build Coastguard Workerimport { Test, TestT } from './my-game/example/test' 8*890232f2SAndroid Build Coastguard Workerimport { Stat } from './my-game/example/stat' 9*890232f2SAndroid Build Coastguard Workerimport { Vec3 } from './my-game/example/vec3' 10*890232f2SAndroid Build Coastguard Workerimport { Color } from './my-game/example/color'; 11*890232f2SAndroid Build Coastguard Workerimport { Any } from './my-game/example/any'; 12*890232f2SAndroid Build Coastguard Worker 13*890232f2SAndroid Build Coastguard Workerfunction main() { 14*890232f2SAndroid Build Coastguard Worker 15*890232f2SAndroid Build Coastguard Worker // First, let's test reading a FlatBuffer generated by C++ code: 16*890232f2SAndroid Build Coastguard Worker // This file was generated from monsterdata_test.json 17*890232f2SAndroid Build Coastguard Worker var data = new Uint8Array(fs.readFileSync('monsterdata_test.mon')); 18*890232f2SAndroid Build Coastguard Worker 19*890232f2SAndroid Build Coastguard Worker // Now test it: 20*890232f2SAndroid Build Coastguard Worker 21*890232f2SAndroid Build Coastguard Worker var bb = new flatbuffers.ByteBuffer(data); 22*890232f2SAndroid Build Coastguard Worker testBuffer(bb); 23*890232f2SAndroid Build Coastguard Worker 24*890232f2SAndroid Build Coastguard Worker // Second, let's create a FlatBuffer from scratch in JavaScript, and test it also. 25*890232f2SAndroid Build Coastguard Worker // We use an initial size of 1 to exercise the reallocation algorithm, 26*890232f2SAndroid Build Coastguard Worker // normally a size larger than the typical FlatBuffer you generate would be 27*890232f2SAndroid Build Coastguard Worker // better for performance. 28*890232f2SAndroid Build Coastguard Worker var fbb = new flatbuffers.Builder(1); 29*890232f2SAndroid Build Coastguard Worker createMonster(fbb); 30*890232f2SAndroid Build Coastguard Worker serializeAndTest(fbb); 31*890232f2SAndroid Build Coastguard Worker testObjApiPack(fbb); 32*890232f2SAndroid Build Coastguard Worker 33*890232f2SAndroid Build Coastguard Worker // clear the builder, repeat tests 34*890232f2SAndroid Build Coastguard Worker var clearIterations = 100; 35*890232f2SAndroid Build Coastguard Worker var startingCapacity = fbb.bb.capacity(); 36*890232f2SAndroid Build Coastguard Worker for (var i = 0; i < clearIterations; i++) { 37*890232f2SAndroid Build Coastguard Worker fbb.clear(); 38*890232f2SAndroid Build Coastguard Worker createMonster(fbb); 39*890232f2SAndroid Build Coastguard Worker serializeAndTest(fbb); 40*890232f2SAndroid Build Coastguard Worker testObjApiPack(fbb); 41*890232f2SAndroid Build Coastguard Worker } 42*890232f2SAndroid Build Coastguard Worker // the capacity of our buffer shouldn't increase with the same size payload 43*890232f2SAndroid Build Coastguard Worker assert.strictEqual(fbb.bb.capacity(), startingCapacity); 44*890232f2SAndroid Build Coastguard Worker 45*890232f2SAndroid Build Coastguard Worker test64bit(); 46*890232f2SAndroid Build Coastguard Worker testUnicode(); 47*890232f2SAndroid Build Coastguard Worker fuzzTest1(); 48*890232f2SAndroid Build Coastguard Worker testNullStrings(); 49*890232f2SAndroid Build Coastguard Worker testSharedStrings(); 50*890232f2SAndroid Build Coastguard Worker testVectorOfStructs(); 51*890232f2SAndroid Build Coastguard Worker 52*890232f2SAndroid Build Coastguard Worker console.log('FlatBuffers test: completed successfully'); 53*890232f2SAndroid Build Coastguard Worker} 54*890232f2SAndroid Build Coastguard Worker 55*890232f2SAndroid Build Coastguard Workerfunction createMonster(fbb) { 56*890232f2SAndroid Build Coastguard Worker // We set up the same values as monsterdata.json: 57*890232f2SAndroid Build Coastguard Worker 58*890232f2SAndroid Build Coastguard Worker var str = fbb.createString('MyMonster'); 59*890232f2SAndroid Build Coastguard Worker 60*890232f2SAndroid Build Coastguard Worker var inv = Monster.createInventoryVector(fbb, [0, 1, 2, 3, 4]); 61*890232f2SAndroid Build Coastguard Worker 62*890232f2SAndroid Build Coastguard Worker var fred = fbb.createString('Fred'); 63*890232f2SAndroid Build Coastguard Worker Monster.startMonster(fbb); 64*890232f2SAndroid Build Coastguard Worker Monster.addName(fbb, fred); 65*890232f2SAndroid Build Coastguard Worker var mon2 = Monster.endMonster(fbb); 66*890232f2SAndroid Build Coastguard Worker 67*890232f2SAndroid Build Coastguard Worker Monster.startTest4Vector(fbb, 2); 68*890232f2SAndroid Build Coastguard Worker Test.createTest(fbb, 10, 20); 69*890232f2SAndroid Build Coastguard Worker Test.createTest(fbb, 30, 40); 70*890232f2SAndroid Build Coastguard Worker var test4 = fbb.endVector(); 71*890232f2SAndroid Build Coastguard Worker 72*890232f2SAndroid Build Coastguard Worker var testArrayOfString = Monster.createTestarrayofstringVector(fbb, [ 73*890232f2SAndroid Build Coastguard Worker fbb.createString('test1'), 74*890232f2SAndroid Build Coastguard Worker fbb.createString('test2') 75*890232f2SAndroid Build Coastguard Worker ]); 76*890232f2SAndroid Build Coastguard Worker 77*890232f2SAndroid Build Coastguard Worker var testVectorOfLongs = Monster.createVectorOfLongsVector(fbb, [ 78*890232f2SAndroid Build Coastguard Worker 1n, 79*890232f2SAndroid Build Coastguard Worker 101010100n 80*890232f2SAndroid Build Coastguard Worker ]); 81*890232f2SAndroid Build Coastguard Worker 82*890232f2SAndroid Build Coastguard Worker Monster.startMonster(fbb); 83*890232f2SAndroid Build Coastguard Worker Monster.addPos(fbb, Vec3.createVec3(fbb, 1, 2, 3, 3, Color.Green, 5, 6)); 84*890232f2SAndroid Build Coastguard Worker Monster.addHp(fbb, 80); 85*890232f2SAndroid Build Coastguard Worker Monster.addName(fbb, str); 86*890232f2SAndroid Build Coastguard Worker Monster.addInventory(fbb, inv); 87*890232f2SAndroid Build Coastguard Worker Monster.addTestType(fbb, Any.Monster); 88*890232f2SAndroid Build Coastguard Worker Monster.addTest(fbb, mon2); 89*890232f2SAndroid Build Coastguard Worker Monster.addTest4(fbb, test4); 90*890232f2SAndroid Build Coastguard Worker Monster.addTestarrayofstring(fbb, testArrayOfString); 91*890232f2SAndroid Build Coastguard Worker Monster.addVectorOfLongs(fbb, testVectorOfLongs); 92*890232f2SAndroid Build Coastguard Worker Monster.addTestbool(fbb, true); 93*890232f2SAndroid Build Coastguard Worker var mon = Monster.endMonster(fbb); 94*890232f2SAndroid Build Coastguard Worker 95*890232f2SAndroid Build Coastguard Worker Monster.finishMonsterBuffer(fbb, mon); 96*890232f2SAndroid Build Coastguard Worker} 97*890232f2SAndroid Build Coastguard Worker 98*890232f2SAndroid Build Coastguard Workerfunction serializeAndTest(fbb) { 99*890232f2SAndroid Build Coastguard Worker // Write the result to a file for debugging purposes: 100*890232f2SAndroid Build Coastguard Worker // Note that the binaries are not necessarily identical, since the JSON 101*890232f2SAndroid Build Coastguard Worker // parser may serialize in a slightly different order than the above 102*890232f2SAndroid Build Coastguard Worker // JavaScript code. They are functionally equivalent though. 103*890232f2SAndroid Build Coastguard Worker 104*890232f2SAndroid Build Coastguard Worker fs.writeFileSync('monsterdata_javascript_wire.mon', Buffer.from(fbb.asUint8Array())); 105*890232f2SAndroid Build Coastguard Worker 106*890232f2SAndroid Build Coastguard Worker // Tests mutation first. This will verify that we did not trample any other 107*890232f2SAndroid Build Coastguard Worker // part of the byte buffer. 108*890232f2SAndroid Build Coastguard Worker testMutation(fbb.dataBuffer()); 109*890232f2SAndroid Build Coastguard Worker 110*890232f2SAndroid Build Coastguard Worker testBuffer(fbb.dataBuffer()); 111*890232f2SAndroid Build Coastguard Worker} 112*890232f2SAndroid Build Coastguard Worker 113*890232f2SAndroid Build Coastguard Workerfunction testMutation(bb) { 114*890232f2SAndroid Build Coastguard Worker var monster = Monster.getRootAsMonster(bb); 115*890232f2SAndroid Build Coastguard Worker 116*890232f2SAndroid Build Coastguard Worker monster.mutate_hp(120); 117*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.hp(), 120); 118*890232f2SAndroid Build Coastguard Worker 119*890232f2SAndroid Build Coastguard Worker monster.mutate_hp(80); 120*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.hp(), 80); 121*890232f2SAndroid Build Coastguard Worker 122*890232f2SAndroid Build Coastguard Worker var manaRes = monster.mutate_mana(10); 123*890232f2SAndroid Build Coastguard Worker assert.strictEqual(manaRes, false); // Field was NOT present, because default value. 124*890232f2SAndroid Build Coastguard Worker 125*890232f2SAndroid Build Coastguard Worker // TODO: There is not the availability to mutate structs or vectors. 126*890232f2SAndroid Build Coastguard Worker} 127*890232f2SAndroid Build Coastguard Worker 128*890232f2SAndroid Build Coastguard Workerfunction testObjApiPack(fbb) { 129*890232f2SAndroid Build Coastguard Worker fbb.clear(); 130*890232f2SAndroid Build Coastguard Worker createMonster(fbb); 131*890232f2SAndroid Build Coastguard Worker let monster_t = Monster.getRootAsMonster(fbb.dataBuffer()).unpack(); 132*890232f2SAndroid Build Coastguard Worker fbb.clear(); 133*890232f2SAndroid Build Coastguard Worker Monster.finishMonsterBuffer(fbb, monster_t.pack(fbb)); 134*890232f2SAndroid Build Coastguard Worker serializeAndTest(fbb); 135*890232f2SAndroid Build Coastguard Worker} 136*890232f2SAndroid Build Coastguard Worker 137*890232f2SAndroid Build Coastguard Workerfunction testObjApiUnpack(monster) { 138*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.hp, 80); 139*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.mana, 150); // default 140*890232f2SAndroid Build Coastguard Worker 141*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.name, 'MyMonster'); 142*890232f2SAndroid Build Coastguard Worker 143*890232f2SAndroid Build Coastguard Worker let pos = monster.pos; 144*890232f2SAndroid Build Coastguard Worker assert.strictEqual(pos.x, 1); 145*890232f2SAndroid Build Coastguard Worker assert.strictEqual(pos.y, 2); 146*890232f2SAndroid Build Coastguard Worker assert.strictEqual(pos.z, 3); 147*890232f2SAndroid Build Coastguard Worker assert.strictEqual(pos.test1, 3); 148*890232f2SAndroid Build Coastguard Worker assert.strictEqual(pos.test2, Color.Green); 149*890232f2SAndroid Build Coastguard Worker let test3 = pos.test3; 150*890232f2SAndroid Build Coastguard Worker assert.strictEqual(test3.a, 5); 151*890232f2SAndroid Build Coastguard Worker assert.strictEqual(test3.b, 6); 152*890232f2SAndroid Build Coastguard Worker 153*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.testType, Any.Monster); 154*890232f2SAndroid Build Coastguard Worker let monster2 = monster.test; 155*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster2 != null, true); 156*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster2 instanceof MonsterT, true); 157*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster2.name, 'Fred'); 158*890232f2SAndroid Build Coastguard Worker 159*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.inventory.length, 5); 160*890232f2SAndroid Build Coastguard Worker let invsum = 0; 161*890232f2SAndroid Build Coastguard Worker for (let i = 0; i < monster.inventory.length; i++) { 162*890232f2SAndroid Build Coastguard Worker invsum += monster.inventory[i]; 163*890232f2SAndroid Build Coastguard Worker } 164*890232f2SAndroid Build Coastguard Worker assert.strictEqual(invsum, 10); 165*890232f2SAndroid Build Coastguard Worker 166*890232f2SAndroid Build Coastguard Worker let test_0 = monster.test4[0]; 167*890232f2SAndroid Build Coastguard Worker let test_1 = monster.test4[1]; 168*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.test4.length, 2); 169*890232f2SAndroid Build Coastguard Worker assert.strictEqual(test_0.a + test_0.b + test_1.a + test_1.b, 100); 170*890232f2SAndroid Build Coastguard Worker 171*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.testarrayofstring.length, 2); 172*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.testarrayofstring[0], 'test1'); 173*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.testarrayofstring[1], 'test2'); 174*890232f2SAndroid Build Coastguard Worker 175*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.testbool, true); 176*890232f2SAndroid Build Coastguard Worker} 177*890232f2SAndroid Build Coastguard Worker 178*890232f2SAndroid Build Coastguard Workerfunction testBuffer(bb) { 179*890232f2SAndroid Build Coastguard Worker assert.ok(Monster.bufferHasIdentifier(bb)); 180*890232f2SAndroid Build Coastguard Worker 181*890232f2SAndroid Build Coastguard Worker var monster = Monster.getRootAsMonster(bb); 182*890232f2SAndroid Build Coastguard Worker 183*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.hp(), 80); 184*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.mana(), 150); // default 185*890232f2SAndroid Build Coastguard Worker 186*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.name(), 'MyMonster'); 187*890232f2SAndroid Build Coastguard Worker 188*890232f2SAndroid Build Coastguard Worker var pos = monster.pos(); 189*890232f2SAndroid Build Coastguard Worker assert.strictEqual(pos.x(), 1); 190*890232f2SAndroid Build Coastguard Worker assert.strictEqual(pos.y(), 2); 191*890232f2SAndroid Build Coastguard Worker assert.strictEqual(pos.z(), 3); 192*890232f2SAndroid Build Coastguard Worker assert.strictEqual(pos.test1(), 3); 193*890232f2SAndroid Build Coastguard Worker assert.strictEqual(pos.test2(), Color.Green); 194*890232f2SAndroid Build Coastguard Worker var t = pos.test3(); 195*890232f2SAndroid Build Coastguard Worker assert.strictEqual(t.a(), 5); 196*890232f2SAndroid Build Coastguard Worker assert.strictEqual(t.b(), 6); 197*890232f2SAndroid Build Coastguard Worker 198*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.testType(), Any.Monster); 199*890232f2SAndroid Build Coastguard Worker var monster2 = new Monster(); 200*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.test(monster2) != null, true); 201*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster2.name(), 'Fred'); 202*890232f2SAndroid Build Coastguard Worker 203*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.inventoryLength(), 5); 204*890232f2SAndroid Build Coastguard Worker var invsum = 0; 205*890232f2SAndroid Build Coastguard Worker for (var i = 0; i < monster.inventoryLength(); i++) { 206*890232f2SAndroid Build Coastguard Worker invsum += monster.inventory(i); 207*890232f2SAndroid Build Coastguard Worker } 208*890232f2SAndroid Build Coastguard Worker assert.strictEqual(invsum, 10); 209*890232f2SAndroid Build Coastguard Worker 210*890232f2SAndroid Build Coastguard Worker var invsum2 = 0; 211*890232f2SAndroid Build Coastguard Worker var invArr = monster.inventoryArray(); 212*890232f2SAndroid Build Coastguard Worker for (var i = 0; i < invArr.length; i++) { 213*890232f2SAndroid Build Coastguard Worker invsum2 += invArr[i]; 214*890232f2SAndroid Build Coastguard Worker } 215*890232f2SAndroid Build Coastguard Worker assert.strictEqual(invsum2, 10); 216*890232f2SAndroid Build Coastguard Worker 217*890232f2SAndroid Build Coastguard Worker let longSum = 0n; 218*890232f2SAndroid Build Coastguard Worker for (let idx = 0; idx < monster.vectorOfLongsLength(); ++idx) { 219*890232f2SAndroid Build Coastguard Worker longSum += monster.vectorOfLongs(idx); 220*890232f2SAndroid Build Coastguard Worker } 221*890232f2SAndroid Build Coastguard Worker assert.strictEqual(longSum, 101010101n); 222*890232f2SAndroid Build Coastguard Worker 223*890232f2SAndroid Build Coastguard Worker var test_0 = monster.test4(0); 224*890232f2SAndroid Build Coastguard Worker var test_1 = monster.test4(1); 225*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.test4Length(), 2); 226*890232f2SAndroid Build Coastguard Worker assert.strictEqual(test_0.a() + test_0.b() + test_1.a() + test_1.b(), 100); 227*890232f2SAndroid Build Coastguard Worker 228*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.testarrayofstringLength(), 2); 229*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.testarrayofstring(0), 'test1'); 230*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.testarrayofstring(1), 'test2'); 231*890232f2SAndroid Build Coastguard Worker 232*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.testbool(), true); 233*890232f2SAndroid Build Coastguard Worker 234*890232f2SAndroid Build Coastguard Worker let monster_t = monster.unpack(); 235*890232f2SAndroid Build Coastguard Worker testObjApiUnpack(monster_t); 236*890232f2SAndroid Build Coastguard Worker 237*890232f2SAndroid Build Coastguard Worker let monster2_t = new MonsterT(); 238*890232f2SAndroid Build Coastguard Worker monster.unpackTo(monster2_t); 239*890232f2SAndroid Build Coastguard Worker testObjApiUnpack(monster2_t); 240*890232f2SAndroid Build Coastguard Worker} 241*890232f2SAndroid Build Coastguard Worker 242*890232f2SAndroid Build Coastguard Workerfunction test64bit() { 243*890232f2SAndroid Build Coastguard Worker var fbb = new flatbuffers.Builder(); 244*890232f2SAndroid Build Coastguard Worker var required = fbb.createString('required'); 245*890232f2SAndroid Build Coastguard Worker 246*890232f2SAndroid Build Coastguard Worker Stat.startStat(fbb); 247*890232f2SAndroid Build Coastguard Worker var stat2 = Stat.endStat(fbb); 248*890232f2SAndroid Build Coastguard Worker 249*890232f2SAndroid Build Coastguard Worker Monster.startMonster(fbb); 250*890232f2SAndroid Build Coastguard Worker Monster.addName(fbb, required); 251*890232f2SAndroid Build Coastguard Worker Monster.addTestempty(fbb, stat2); 252*890232f2SAndroid Build Coastguard Worker var mon2 = Monster.endMonster(fbb); 253*890232f2SAndroid Build Coastguard Worker 254*890232f2SAndroid Build Coastguard Worker Stat.startStat(fbb); 255*890232f2SAndroid Build Coastguard Worker // 2541551405100253985 = 0x2345678987654321 256*890232f2SAndroid Build Coastguard Worker Stat.addVal(fbb, 0x2345678987654321n); 257*890232f2SAndroid Build Coastguard Worker var stat = Stat.endStat(fbb); 258*890232f2SAndroid Build Coastguard Worker 259*890232f2SAndroid Build Coastguard Worker Monster.startMonster(fbb); 260*890232f2SAndroid Build Coastguard Worker Monster.addName(fbb, required); 261*890232f2SAndroid Build Coastguard Worker Monster.addEnemy(fbb, mon2); 262*890232f2SAndroid Build Coastguard Worker Monster.addTestempty(fbb, stat); 263*890232f2SAndroid Build Coastguard Worker var mon = Monster.endMonster(fbb); 264*890232f2SAndroid Build Coastguard Worker 265*890232f2SAndroid Build Coastguard Worker Monster.finishMonsterBuffer(fbb, mon); 266*890232f2SAndroid Build Coastguard Worker var bytes = fbb.asUint8Array(); 267*890232f2SAndroid Build Coastguard Worker 268*890232f2SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////// 269*890232f2SAndroid Build Coastguard Worker 270*890232f2SAndroid Build Coastguard Worker var bb = new flatbuffers.ByteBuffer(bytes); 271*890232f2SAndroid Build Coastguard Worker assert.ok(Monster.bufferHasIdentifier(bb)); 272*890232f2SAndroid Build Coastguard Worker var mon = Monster.getRootAsMonster(bb); 273*890232f2SAndroid Build Coastguard Worker 274*890232f2SAndroid Build Coastguard Worker var stat = mon.testempty(); 275*890232f2SAndroid Build Coastguard Worker assert.strictEqual(stat != null, true); 276*890232f2SAndroid Build Coastguard Worker assert.strictEqual(stat.val() != null, true); 277*890232f2SAndroid Build Coastguard Worker assert.strictEqual(stat.val(), 2541551405100253985n); 278*890232f2SAndroid Build Coastguard Worker 279*890232f2SAndroid Build Coastguard Worker var mon2 = mon.enemy(); 280*890232f2SAndroid Build Coastguard Worker assert.strictEqual(mon2 != null, true); 281*890232f2SAndroid Build Coastguard Worker stat = mon2.testempty(); 282*890232f2SAndroid Build Coastguard Worker assert.strictEqual(stat != null, true); 283*890232f2SAndroid Build Coastguard Worker assert.strictEqual(stat.val() != null, true); 284*890232f2SAndroid Build Coastguard Worker assert.strictEqual(stat.val(), 0n); // default value 285*890232f2SAndroid Build Coastguard Worker} 286*890232f2SAndroid Build Coastguard Worker 287*890232f2SAndroid Build Coastguard Workerfunction testUnicode() { 288*890232f2SAndroid Build Coastguard Worker var correct = fs.readFileSync('unicode_test.mon'); 289*890232f2SAndroid Build Coastguard Worker var json = JSON.parse(fs.readFileSync('unicode_test.json', 'utf8')); 290*890232f2SAndroid Build Coastguard Worker 291*890232f2SAndroid Build Coastguard Worker // Test reading 292*890232f2SAndroid Build Coastguard Worker function testReadingUnicode(bb) { 293*890232f2SAndroid Build Coastguard Worker var monster = Monster.getRootAsMonster(bb); 294*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.name(), json.name); 295*890232f2SAndroid Build Coastguard Worker assert.deepEqual(Buffer.from(monster.name(flatbuffers.Encoding.UTF8_BYTES)), Buffer.from(json.name)); 296*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.testarrayoftablesLength(), json.testarrayoftables.length); 297*890232f2SAndroid Build Coastguard Worker json.testarrayoftables.forEach(function(table, i) { 298*890232f2SAndroid Build Coastguard Worker var value = monster.testarrayoftables(i); 299*890232f2SAndroid Build Coastguard Worker assert.strictEqual(value.name(), table.name); 300*890232f2SAndroid Build Coastguard Worker assert.deepEqual(Buffer.from(value.name(flatbuffers.Encoding.UTF8_BYTES)), Buffer.from(table.name)); 301*890232f2SAndroid Build Coastguard Worker }); 302*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.testarrayofstringLength(), json.testarrayofstring.length); 303*890232f2SAndroid Build Coastguard Worker json.testarrayofstring.forEach(function(string, i) { 304*890232f2SAndroid Build Coastguard Worker assert.strictEqual(monster.testarrayofstring(i), string); 305*890232f2SAndroid Build Coastguard Worker assert.deepEqual(Buffer.from(monster.testarrayofstring(i, flatbuffers.Encoding.UTF8_BYTES)), Buffer.from(string)); 306*890232f2SAndroid Build Coastguard Worker }); 307*890232f2SAndroid Build Coastguard Worker } 308*890232f2SAndroid Build Coastguard Worker testReadingUnicode(new flatbuffers.ByteBuffer(new Uint8Array(correct))); 309*890232f2SAndroid Build Coastguard Worker 310*890232f2SAndroid Build Coastguard Worker // Test writing 311*890232f2SAndroid Build Coastguard Worker var fbb = new flatbuffers.Builder(); 312*890232f2SAndroid Build Coastguard Worker var name = fbb.createString(json.name); 313*890232f2SAndroid Build Coastguard Worker var testarrayoftablesOffsets = json.testarrayoftables.map(function(table) { 314*890232f2SAndroid Build Coastguard Worker var name = fbb.createString(new Uint8Array(Buffer.from(table.name))); 315*890232f2SAndroid Build Coastguard Worker Monster.startMonster(fbb); 316*890232f2SAndroid Build Coastguard Worker Monster.addName(fbb, name); 317*890232f2SAndroid Build Coastguard Worker return Monster.endMonster(fbb); 318*890232f2SAndroid Build Coastguard Worker }); 319*890232f2SAndroid Build Coastguard Worker var testarrayoftablesOffset = Monster.createTestarrayoftablesVector(fbb, 320*890232f2SAndroid Build Coastguard Worker testarrayoftablesOffsets); 321*890232f2SAndroid Build Coastguard Worker var testarrayofstringOffset = Monster.createTestarrayofstringVector(fbb, 322*890232f2SAndroid Build Coastguard Worker json.testarrayofstring.map(function(string) { return fbb.createString(string); })); 323*890232f2SAndroid Build Coastguard Worker Monster.startMonster(fbb); 324*890232f2SAndroid Build Coastguard Worker Monster.addTestarrayofstring(fbb, testarrayofstringOffset); 325*890232f2SAndroid Build Coastguard Worker Monster.addTestarrayoftables(fbb, testarrayoftablesOffset); 326*890232f2SAndroid Build Coastguard Worker Monster.addName(fbb, name); 327*890232f2SAndroid Build Coastguard Worker Monster.finishSizePrefixedMonsterBuffer(fbb, Monster.endMonster(fbb)); 328*890232f2SAndroid Build Coastguard Worker var bb = new flatbuffers.ByteBuffer(fbb.asUint8Array()) 329*890232f2SAndroid Build Coastguard Worker bb.setPosition(4); 330*890232f2SAndroid Build Coastguard Worker testReadingUnicode(bb); 331*890232f2SAndroid Build Coastguard Worker} 332*890232f2SAndroid Build Coastguard Worker 333*890232f2SAndroid Build Coastguard Workervar __imul = Math.imul ? Math.imul : function(a, b) { 334*890232f2SAndroid Build Coastguard Worker var ah = a >> 16 & 65535; 335*890232f2SAndroid Build Coastguard Worker var bh = b >> 16 & 65535; 336*890232f2SAndroid Build Coastguard Worker var al = a & 65535; 337*890232f2SAndroid Build Coastguard Worker var bl = b & 65535; 338*890232f2SAndroid Build Coastguard Worker return al * bl + (ah * bl + al * bh << 16) | 0; 339*890232f2SAndroid Build Coastguard Worker}; 340*890232f2SAndroid Build Coastguard Worker 341*890232f2SAndroid Build Coastguard Worker// Include simple random number generator to ensure results will be the 342*890232f2SAndroid Build Coastguard Worker// same cross platform. 343*890232f2SAndroid Build Coastguard Worker// http://en.wikipedia.org/wiki/Park%E2%80%93Miller_random_number_generator 344*890232f2SAndroid Build Coastguard Workervar lcg_seed = 48271; 345*890232f2SAndroid Build Coastguard Worker 346*890232f2SAndroid Build Coastguard Workerfunction lcg_rand() { 347*890232f2SAndroid Build Coastguard Worker return lcg_seed = (__imul(lcg_seed, 279470273) >>> 0) % 4294967291; 348*890232f2SAndroid Build Coastguard Worker} 349*890232f2SAndroid Build Coastguard Worker 350*890232f2SAndroid Build Coastguard Workerfunction lcg_reset() { 351*890232f2SAndroid Build Coastguard Worker lcg_seed = 48271; 352*890232f2SAndroid Build Coastguard Worker} 353*890232f2SAndroid Build Coastguard Worker 354*890232f2SAndroid Build Coastguard Worker// Converts a Field ID to a virtual table offset. 355*890232f2SAndroid Build Coastguard Workerfunction fieldIndexToOffset(field_id) { 356*890232f2SAndroid Build Coastguard Worker // Should correspond to what EndTable() below builds up. 357*890232f2SAndroid Build Coastguard Worker var fixed_fields = 2; // Vtable size and Object Size. 358*890232f2SAndroid Build Coastguard Worker return (field_id + fixed_fields) * 2; 359*890232f2SAndroid Build Coastguard Worker} 360*890232f2SAndroid Build Coastguard Worker 361*890232f2SAndroid Build Coastguard Worker// Low level stress/fuzz test: serialize/deserialize a variety of 362*890232f2SAndroid Build Coastguard Worker// different kinds of data in different combinations 363*890232f2SAndroid Build Coastguard Workerfunction fuzzTest1() { 364*890232f2SAndroid Build Coastguard Worker 365*890232f2SAndroid Build Coastguard Worker // Values we're testing against: chosen to ensure no bits get chopped 366*890232f2SAndroid Build Coastguard Worker // off anywhere, and also be different from eachother. 367*890232f2SAndroid Build Coastguard Worker var bool_val = true; 368*890232f2SAndroid Build Coastguard Worker var char_val = -127; // 0x81 369*890232f2SAndroid Build Coastguard Worker var uchar_val = 0xFF; 370*890232f2SAndroid Build Coastguard Worker var short_val = -32222; // 0x8222; 371*890232f2SAndroid Build Coastguard Worker var ushort_val = 0xFEEE; 372*890232f2SAndroid Build Coastguard Worker var int_val = 0x83333333 | 0; 373*890232f2SAndroid Build Coastguard Worker var uint_val = 0xFDDDDDDD; 374*890232f2SAndroid Build Coastguard Worker var long_val = BigInt.asIntN(64, 0x8444444444444444n); 375*890232f2SAndroid Build Coastguard Worker var ulong_val = BigInt.asUintN(64, 0xFCCCCCCCCCCCCCCCn); 376*890232f2SAndroid Build Coastguard Worker var float_val = new Float32Array([3.14159])[0]; 377*890232f2SAndroid Build Coastguard Worker var double_val = 3.14159265359; 378*890232f2SAndroid Build Coastguard Worker 379*890232f2SAndroid Build Coastguard Worker var test_values_max = 11; 380*890232f2SAndroid Build Coastguard Worker var fields_per_object = 4; 381*890232f2SAndroid Build Coastguard Worker var num_fuzz_objects = 10000; // The higher, the more thorough :) 382*890232f2SAndroid Build Coastguard Worker 383*890232f2SAndroid Build Coastguard Worker var builder = new flatbuffers.Builder(); 384*890232f2SAndroid Build Coastguard Worker 385*890232f2SAndroid Build Coastguard Worker lcg_reset(); // Keep it deterministic. 386*890232f2SAndroid Build Coastguard Worker 387*890232f2SAndroid Build Coastguard Worker var objects = []; 388*890232f2SAndroid Build Coastguard Worker 389*890232f2SAndroid Build Coastguard Worker // Generate num_fuzz_objects random objects each consisting of 390*890232f2SAndroid Build Coastguard Worker // fields_per_object fields, each of a random type. 391*890232f2SAndroid Build Coastguard Worker for (var i = 0; i < num_fuzz_objects; i++) { 392*890232f2SAndroid Build Coastguard Worker builder.startObject(fields_per_object); 393*890232f2SAndroid Build Coastguard Worker for (var f = 0; f < fields_per_object; f++) { 394*890232f2SAndroid Build Coastguard Worker var choice = lcg_rand() % test_values_max; 395*890232f2SAndroid Build Coastguard Worker switch (choice) { 396*890232f2SAndroid Build Coastguard Worker case 0: builder.addFieldInt8(f, bool_val, 0); break; 397*890232f2SAndroid Build Coastguard Worker case 1: builder.addFieldInt8(f, char_val, 0); break; 398*890232f2SAndroid Build Coastguard Worker case 2: builder.addFieldInt8(f, uchar_val, 0); break; 399*890232f2SAndroid Build Coastguard Worker case 3: builder.addFieldInt16(f, short_val, 0); break; 400*890232f2SAndroid Build Coastguard Worker case 4: builder.addFieldInt16(f, ushort_val, 0); break; 401*890232f2SAndroid Build Coastguard Worker case 5: builder.addFieldInt32(f, int_val, 0); break; 402*890232f2SAndroid Build Coastguard Worker case 6: builder.addFieldInt32(f, uint_val, 0); break; 403*890232f2SAndroid Build Coastguard Worker case 7: builder.addFieldInt64(f, long_val, 0n); break; 404*890232f2SAndroid Build Coastguard Worker case 8: builder.addFieldInt64(f, ulong_val, 0n); break; 405*890232f2SAndroid Build Coastguard Worker case 9: builder.addFieldFloat32(f, float_val, 0); break; 406*890232f2SAndroid Build Coastguard Worker case 10: builder.addFieldFloat64(f, double_val, 0); break; 407*890232f2SAndroid Build Coastguard Worker } 408*890232f2SAndroid Build Coastguard Worker } 409*890232f2SAndroid Build Coastguard Worker objects.push(builder.endObject()); 410*890232f2SAndroid Build Coastguard Worker } 411*890232f2SAndroid Build Coastguard Worker builder.prep(8, 0); // Align whole buffer. 412*890232f2SAndroid Build Coastguard Worker 413*890232f2SAndroid Build Coastguard Worker lcg_reset(); // Reset. 414*890232f2SAndroid Build Coastguard Worker 415*890232f2SAndroid Build Coastguard Worker builder.finish(objects[objects.length - 1]); 416*890232f2SAndroid Build Coastguard Worker var bytes = new Uint8Array(builder.asUint8Array()); 417*890232f2SAndroid Build Coastguard Worker var view = new DataView(bytes.buffer); 418*890232f2SAndroid Build Coastguard Worker 419*890232f2SAndroid Build Coastguard Worker // Test that all objects we generated are readable and return the 420*890232f2SAndroid Build Coastguard Worker // expected values. We generate random objects in the same order 421*890232f2SAndroid Build Coastguard Worker // so this is deterministic. 422*890232f2SAndroid Build Coastguard Worker for (var i = 0; i < num_fuzz_objects; i++) { 423*890232f2SAndroid Build Coastguard Worker var offset = bytes.length - objects[i]; 424*890232f2SAndroid Build Coastguard Worker for (var f = 0; f < fields_per_object; f++) { 425*890232f2SAndroid Build Coastguard Worker var choice = lcg_rand() % test_values_max; 426*890232f2SAndroid Build Coastguard Worker var vtable_offset = fieldIndexToOffset(f); 427*890232f2SAndroid Build Coastguard Worker var vtable = offset - view.getInt32(offset, true); 428*890232f2SAndroid Build Coastguard Worker assert.ok(vtable_offset < view.getInt16(vtable, true)); 429*890232f2SAndroid Build Coastguard Worker var field_offset = offset + view.getInt16(vtable + vtable_offset, true); 430*890232f2SAndroid Build Coastguard Worker switch (choice) { 431*890232f2SAndroid Build Coastguard Worker case 0: assert.strictEqual(!!view.getInt8(field_offset), bool_val); break; 432*890232f2SAndroid Build Coastguard Worker case 1: assert.strictEqual(view.getInt8(field_offset), char_val); break; 433*890232f2SAndroid Build Coastguard Worker case 2: assert.strictEqual(view.getUint8(field_offset), uchar_val); break; 434*890232f2SAndroid Build Coastguard Worker case 3: assert.strictEqual(view.getInt16(field_offset, true), short_val); break; 435*890232f2SAndroid Build Coastguard Worker case 4: assert.strictEqual(view.getUint16(field_offset, true), ushort_val); break; 436*890232f2SAndroid Build Coastguard Worker case 5: assert.strictEqual(view.getInt32(field_offset, true), int_val); break; 437*890232f2SAndroid Build Coastguard Worker case 6: assert.strictEqual(view.getUint32(field_offset, true), uint_val); break; 438*890232f2SAndroid Build Coastguard Worker case 7: assert.strictEqual(view.getBigInt64(field_offset, true), long_val); break; 439*890232f2SAndroid Build Coastguard Worker case 8: assert.strictEqual(view.getBigUint64(field_offset, true), ulong_val); break; 440*890232f2SAndroid Build Coastguard Worker case 9: assert.strictEqual(view.getFloat32(field_offset, true), float_val); break; 441*890232f2SAndroid Build Coastguard Worker case 10: assert.strictEqual(view.getFloat64(field_offset, true), double_val); break; 442*890232f2SAndroid Build Coastguard Worker } 443*890232f2SAndroid Build Coastguard Worker } 444*890232f2SAndroid Build Coastguard Worker } 445*890232f2SAndroid Build Coastguard Worker} 446*890232f2SAndroid Build Coastguard Worker 447*890232f2SAndroid Build Coastguard Workerfunction testSharedStrings() { 448*890232f2SAndroid Build Coastguard Worker var shared_string = "Hello world"; 449*890232f2SAndroid Build Coastguard Worker var builder = new flatbuffers.Builder(); 450*890232f2SAndroid Build Coastguard Worker let mainOffset = builder.createSharedString(shared_string); 451*890232f2SAndroid Build Coastguard Worker assert.strictEqual(builder.createSharedString(shared_string), mainOffset); 452*890232f2SAndroid Build Coastguard Worker} 453*890232f2SAndroid Build Coastguard Worker 454*890232f2SAndroid Build Coastguard Workerfunction testNullStrings() { 455*890232f2SAndroid Build Coastguard Worker var builder = new flatbuffers.Builder(); 456*890232f2SAndroid Build Coastguard Worker assert.strictEqual(builder.createString(null), 0); 457*890232f2SAndroid Build Coastguard Worker assert.strictEqual(builder.createSharedString(null), 0); 458*890232f2SAndroid Build Coastguard Worker assert.strictEqual(builder.createString(undefined), 0); 459*890232f2SAndroid Build Coastguard Worker assert.strictEqual(builder.createSharedString(undefined), 0); 460*890232f2SAndroid Build Coastguard Worker} 461*890232f2SAndroid Build Coastguard Worker 462*890232f2SAndroid Build Coastguard Workerfunction testVectorOfStructs() { 463*890232f2SAndroid Build Coastguard Worker let monster = new MonsterT(); 464*890232f2SAndroid Build Coastguard Worker monster.name = 'testVectorOfStructs'; 465*890232f2SAndroid Build Coastguard Worker monster.test4 = [ 466*890232f2SAndroid Build Coastguard Worker new TestT(1, 2), 467*890232f2SAndroid Build Coastguard Worker new TestT(3, 4) 468*890232f2SAndroid Build Coastguard Worker ]; 469*890232f2SAndroid Build Coastguard Worker 470*890232f2SAndroid Build Coastguard Worker let builder = new flatbuffers.Builder(); 471*890232f2SAndroid Build Coastguard Worker builder.finish(monster.pack(builder)); 472*890232f2SAndroid Build Coastguard Worker 473*890232f2SAndroid Build Coastguard Worker let decodedMonster = Monster.getRootAsMonster(builder.dataBuffer()).unpack(); 474*890232f2SAndroid Build Coastguard Worker assert.strictEqual(decodedMonster.test4[0].a, 1); 475*890232f2SAndroid Build Coastguard Worker assert.strictEqual(decodedMonster.test4[0].b, 2); 476*890232f2SAndroid Build Coastguard Worker assert.strictEqual(decodedMonster.test4[1].a, 3); 477*890232f2SAndroid Build Coastguard Worker assert.strictEqual(decodedMonster.test4[1].b, 4); 478*890232f2SAndroid Build Coastguard Worker} 479*890232f2SAndroid Build Coastguard Worker 480*890232f2SAndroid Build Coastguard Workermain(); 481