xref: /aosp_15_r20/external/flatbuffers/tests/JavaScriptFlexBuffersTest.js (revision 890232f25432b36107d06881e0a25aaa6b473652)
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 flexbuffers from 'flatbuffers/js/flexbuffers'
5*890232f2SAndroid Build Coastguard Worker
6*890232f2SAndroid Build Coastguard Workerfunction main() {
7*890232f2SAndroid Build Coastguard Worker  testSingleValueBuffers();
8*890232f2SAndroid Build Coastguard Worker  testGoldBuffer();
9*890232f2SAndroid Build Coastguard Worker  testEncode();
10*890232f2SAndroid Build Coastguard Worker  testIndirectAdd();
11*890232f2SAndroid Build Coastguard Worker  testIndirectWithCache();
12*890232f2SAndroid Build Coastguard Worker  testMapBuilder();
13*890232f2SAndroid Build Coastguard Worker  testRoundTrip();
14*890232f2SAndroid Build Coastguard Worker  testRoundTripWithBuilder();
15*890232f2SAndroid Build Coastguard Worker  testDeduplicationOff();
16*890232f2SAndroid Build Coastguard Worker  testBugWhereOffestWereStoredAsIntInsteadOfUInt();
17*890232f2SAndroid Build Coastguard Worker
18*890232f2SAndroid Build Coastguard Worker  console.log('FlexBuffers test: completed successfully');
19*890232f2SAndroid Build Coastguard Worker}
20*890232f2SAndroid Build Coastguard Worker
21*890232f2SAndroid Build Coastguard Workerfunction testSingleValueBuffers() {
22*890232f2SAndroid Build Coastguard Worker  {
23*890232f2SAndroid Build Coastguard Worker    const ref = flexbuffers.toReference(new Uint8Array([0, 0, 1]).buffer);
24*890232f2SAndroid Build Coastguard Worker    assert.strictEqual(true, ref.isNull());
25*890232f2SAndroid Build Coastguard Worker  }
26*890232f2SAndroid Build Coastguard Worker
27*890232f2SAndroid Build Coastguard Worker  function _assert(object, buffer) {
28*890232f2SAndroid Build Coastguard Worker    assert.deepStrictEqual(flexbuffers.toObject(new Uint8Array(buffer).buffer), object);
29*890232f2SAndroid Build Coastguard Worker  }
30*890232f2SAndroid Build Coastguard Worker  _assert(true, [1, 104, 1]);
31*890232f2SAndroid Build Coastguard Worker  _assert(false, [0, 104, 1]);
32*890232f2SAndroid Build Coastguard Worker  _assert(25, [25, 4, 1]);
33*890232f2SAndroid Build Coastguard Worker  _assert(-25, [231, 4, 1]);
34*890232f2SAndroid Build Coastguard Worker  _assert(230, [230, 8, 1]);
35*890232f2SAndroid Build Coastguard Worker  _assert(230, [230, 0, 5, 2]);
36*890232f2SAndroid Build Coastguard Worker  _assert(-1025, [255, 251, 5, 2]);
37*890232f2SAndroid Build Coastguard Worker  _assert(1025, [1, 4, 9, 2]);
38*890232f2SAndroid Build Coastguard Worker  _assert(2147483647, [255, 255, 255, 127, 6, 4]);
39*890232f2SAndroid Build Coastguard Worker  _assert(-2147483648, [0, 0, 0, 128, 6, 4]);
40*890232f2SAndroid Build Coastguard Worker  _assert(4294967295n, [255, 255, 255, 255, 0, 0, 0, 0, 7, 8]);
41*890232f2SAndroid Build Coastguard Worker  _assert(9223372036854775807n, [255, 255, 255, 255, 255, 255, 255, 127, 7, 8]);
42*890232f2SAndroid Build Coastguard Worker  _assert(-9223372036854775808n, [0, 0, 0, 0, 0, 0, 0, 128, 7, 8]);
43*890232f2SAndroid Build Coastguard Worker  _assert(18446744073709551615n, [255, 255, 255, 255, 255, 255, 255, 255, 11, 8]);
44*890232f2SAndroid Build Coastguard Worker  _assert(4.5, [0, 0, 144, 64, 14, 4]);
45*890232f2SAndroid Build Coastguard Worker  _assert(0.10000000149011612, [205, 204, 204, 61, 14, 4]);
46*890232f2SAndroid Build Coastguard Worker  _assert(0.1, [154, 153, 153, 153, 153, 153, 185, 63, 15, 8]);
47*890232f2SAndroid Build Coastguard Worker  _assert(-1025, [255, 251, 5, 2]);
48*890232f2SAndroid Build Coastguard Worker  _assert("Maxim", [5, 77, 97, 120, 105, 109, 0, 6, 20, 1]);
49*890232f2SAndroid Build Coastguard Worker  _assert("hello ��", [10, 104, 101, 108, 108, 111, 32, 240, 159, 152, 177, 0, 11, 20, 1]);
50*890232f2SAndroid Build Coastguard Worker  _assert({a:12}, [97, 0, 1, 3, 1, 1, 1, 12, 4, 2, 36, 1]);
51*890232f2SAndroid Build Coastguard Worker  _assert({"":45, "a": 12}, [0, 97, 0, 2, 4, 4, 2, 1, 2, 45, 12, 4, 4, 4, 36, 1]);
52*890232f2SAndroid Build Coastguard Worker}
53*890232f2SAndroid Build Coastguard Worker
54*890232f2SAndroid Build Coastguard Workerfunction testEncode() {
55*890232f2SAndroid Build Coastguard Worker  function _assert(value, buffer) {
56*890232f2SAndroid Build Coastguard Worker    assert.deepStrictEqual(flexbuffers.encode(value), new Uint8Array(buffer));
57*890232f2SAndroid Build Coastguard Worker  }
58*890232f2SAndroid Build Coastguard Worker  _assert(null, [0, 0, 1]);
59*890232f2SAndroid Build Coastguard Worker  _assert(true, [1, 104, 1]);
60*890232f2SAndroid Build Coastguard Worker  _assert(false, [0, 104, 1]);
61*890232f2SAndroid Build Coastguard Worker  _assert(1, [1, 4, 1]);
62*890232f2SAndroid Build Coastguard Worker  _assert(230, [230, 0, 5, 2]);
63*890232f2SAndroid Build Coastguard Worker  _assert(1025, [1, 4, 5, 2]);
64*890232f2SAndroid Build Coastguard Worker  _assert(-1025, [255, 251, 5, 2]);
65*890232f2SAndroid Build Coastguard Worker  _assert(0x100000001, [1, 0, 0, 0, 1, 0, 0, 0, 7, 8]);
66*890232f2SAndroid Build Coastguard Worker  _assert(0.1, [154, 153, 153, 153, 153, 153, 185, 63, 15, 8]);
67*890232f2SAndroid Build Coastguard Worker  _assert(0.5, [0, 0, 0, 63, 14, 4]);
68*890232f2SAndroid Build Coastguard Worker  _assert(new Uint8Array([1, 2, 3]), [3, 1, 2, 3, 3, 100, 1]);
69*890232f2SAndroid Build Coastguard Worker  _assert("Maxim", [5, 77, 97, 120, 105, 109, 0, 6, 20, 1]);
70*890232f2SAndroid Build Coastguard Worker  _assert("hello ��", [10, 104, 101, 108, 108, 111, 32, 240, 159, 152, 177, 0, 11, 20, 1]);
71*890232f2SAndroid Build Coastguard Worker  _assert([1, 2], [1, 2, 2, 64, 1]);
72*890232f2SAndroid Build Coastguard Worker  _assert([-1, 256], [255, 255, 0, 1, 4, 65, 1]);
73*890232f2SAndroid Build Coastguard Worker  _assert([-45, 256000], [211, 255, 255, 255, 0, 232, 3, 0, 8, 66, 1]);
74*890232f2SAndroid Build Coastguard Worker  _assert([1.1, -256.0], [2, 0, 0, 0, 0, 0, 0, 0, 154, 153, 153, 153, 153, 153, 241, 63, 0, 255, 255, 255, 255, 255, 255, 255, 15, 5, 18, 43, 1]);
75*890232f2SAndroid Build Coastguard Worker  _assert([1, 2, 4], [1, 2, 4, 3, 76, 1]);
76*890232f2SAndroid Build Coastguard Worker  _assert([-1, 256, 4], [255, 255, 0, 1, 4, 0, 6, 77, 1]);
77*890232f2SAndroid Build Coastguard Worker  _assert([[61], 64], [1, 61, 2, 2, 64, 44, 4, 4, 40, 1]);
78*890232f2SAndroid Build Coastguard Worker  _assert(["foo", "bar", "baz"], [3, 102, 111, 111, 0, 3, 98, 97, 114, 0, 3, 98, 97, 122, 0, 3, 15, 11, 7, 3, 60, 1]);
79*890232f2SAndroid Build Coastguard Worker  _assert(["foo", "bar", "baz", "foo", "bar", "baz"], [3, 102, 111, 111, 0, 3, 98, 97, 114, 0, 3, 98, 97, 122, 0, 6, 15, 11, 7, 18, 14, 10, 6, 60, 1]);
80*890232f2SAndroid Build Coastguard Worker  _assert([true, false, true], [3, 1, 0, 1, 3, 144, 1]);
81*890232f2SAndroid Build Coastguard Worker  _assert(['foo', 1, -5, 1.3, true], [
82*890232f2SAndroid Build Coastguard Worker    3, 102, 111, 111, 0, 0, 0, 0,
83*890232f2SAndroid Build Coastguard Worker    5, 0, 0, 0, 0, 0, 0, 0,
84*890232f2SAndroid Build Coastguard Worker    15, 0, 0, 0, 0, 0, 0, 0,
85*890232f2SAndroid Build Coastguard Worker    1, 0, 0, 0, 0, 0, 0, 0,
86*890232f2SAndroid Build Coastguard Worker    251, 255, 255, 255, 255, 255, 255, 255,
87*890232f2SAndroid Build Coastguard Worker    205, 204, 204, 204, 204, 204, 244, 63,
88*890232f2SAndroid Build Coastguard Worker    1, 0, 0, 0, 0, 0, 0, 0,
89*890232f2SAndroid Build Coastguard Worker    20, 4, 4, 15, 104, 45, 43, 1
90*890232f2SAndroid Build Coastguard Worker  ]);
91*890232f2SAndroid Build Coastguard Worker  _assert([1, 3.3, 'max', true, null, false], [
92*890232f2SAndroid Build Coastguard Worker    3, 109, 97, 120, 0, 0, 0, 0,
93*890232f2SAndroid Build Coastguard Worker    6, 0, 0, 0, 0, 0, 0, 0,
94*890232f2SAndroid Build Coastguard Worker    1, 0, 0, 0, 0, 0, 0, 0,
95*890232f2SAndroid Build Coastguard Worker    102, 102, 102, 102, 102, 102, 10, 64,
96*890232f2SAndroid Build Coastguard Worker    31, 0, 0, 0, 0, 0, 0, 0,
97*890232f2SAndroid Build Coastguard Worker    1, 0, 0, 0, 0, 0, 0, 0,
98*890232f2SAndroid Build Coastguard Worker    0, 0, 0, 0, 0, 0, 0, 0,
99*890232f2SAndroid Build Coastguard Worker    0, 0, 0, 0, 0, 0, 0, 0,
100*890232f2SAndroid Build Coastguard Worker    4, 15, 20, 104, 0, 104, 54, 43, 1
101*890232f2SAndroid Build Coastguard Worker  ]);
102*890232f2SAndroid Build Coastguard Worker  _assert({"a": 12}, [97, 0, 1, 3, 1, 1, 1, 12, 4, 2, 36, 1]);
103*890232f2SAndroid Build Coastguard Worker  _assert({"a": 12, "":45}, [0, 97, 0, 2, 4, 4, 2, 1, 2, 45, 12, 4, 4, 4, 36, 1]);
104*890232f2SAndroid Build Coastguard Worker  // JS currently does not support key vector offset sharing
105*890232f2SAndroid Build Coastguard Worker  _assert([{'something':12}, {'something': 45}], [
106*890232f2SAndroid Build Coastguard Worker    115, 111, 109, 101, 116, 104, 105, 110, 103, 0,
107*890232f2SAndroid Build Coastguard Worker    1, 11, 1, 1, 1, 12, 4, 6, 1, 1, 45, 4, 2, 8, 4, 36, 36, 4, 40, 1
108*890232f2SAndroid Build Coastguard Worker  ]);
109*890232f2SAndroid Build Coastguard Worker}
110*890232f2SAndroid Build Coastguard Worker
111*890232f2SAndroid Build Coastguard Workerfunction testDeduplicationOff() {
112*890232f2SAndroid Build Coastguard Worker  let buffer = flexbuffers.encode([{'something':12}, {'something': 45}], 1, true, true, false);
113*890232f2SAndroid Build Coastguard Worker  assert.deepStrictEqual(buffer, new Uint8Array([
114*890232f2SAndroid Build Coastguard Worker    115, 111, 109, 101, 116, 104, 105, 110, 103,
115*890232f2SAndroid Build Coastguard Worker    0,   1,  11,   1,   1,   1,  12,   4,   1,
116*890232f2SAndroid Build Coastguard Worker    18,   1,   1,   1,  45,   4,   2,  10,   4,
117*890232f2SAndroid Build Coastguard Worker    36,  36,   4,  40,   1
118*890232f2SAndroid Build Coastguard Worker  ]));
119*890232f2SAndroid Build Coastguard Worker
120*890232f2SAndroid Build Coastguard Worker  buffer = flexbuffers.encode([{'something':12}, {'something': 45}], 1, true, false, false);
121*890232f2SAndroid Build Coastguard Worker  assert.deepStrictEqual(buffer, new Uint8Array([
122*890232f2SAndroid Build Coastguard Worker    115, 111, 109, 101, 116, 104, 105, 110, 103,   0,
123*890232f2SAndroid Build Coastguard Worker    1,  11,   1,   1,   1,  12,   4, 115, 111, 109,
124*890232f2SAndroid Build Coastguard Worker    101, 116, 104, 105, 110, 103,   0,   1,  11,   1,
125*890232f2SAndroid Build Coastguard Worker    1,   1,  45,   4,   2,  20,   4,  36,  36,   4,
126*890232f2SAndroid Build Coastguard Worker    40,   1
127*890232f2SAndroid Build Coastguard Worker  ]));
128*890232f2SAndroid Build Coastguard Worker
129*890232f2SAndroid Build Coastguard Worker  buffer = flexbuffers.encode(['something', 'something', 'dark'], 1, true, false, false);
130*890232f2SAndroid Build Coastguard Worker  assert.deepStrictEqual(buffer, new Uint8Array([
131*890232f2SAndroid Build Coastguard Worker    9, 115, 111, 109, 101, 116, 104,
132*890232f2SAndroid Build Coastguard Worker    105, 110, 103,   0,   4, 100,  97,
133*890232f2SAndroid Build Coastguard Worker    114, 107,   0,   3,  17,  18,   8,
134*890232f2SAndroid Build Coastguard Worker    3,  60,   1
135*890232f2SAndroid Build Coastguard Worker  ]));
136*890232f2SAndroid Build Coastguard Worker
137*890232f2SAndroid Build Coastguard Worker  buffer = flexbuffers.encode(['something', 'something', 'dark'], 1, false, false, false);
138*890232f2SAndroid Build Coastguard Worker  assert.deepStrictEqual(buffer, new Uint8Array([
139*890232f2SAndroid Build Coastguard Worker    9, 115, 111, 109, 101, 116, 104, 105, 110,
140*890232f2SAndroid Build Coastguard Worker    103,   0,   9, 115, 111, 109, 101, 116, 104,
141*890232f2SAndroid Build Coastguard Worker    105, 110, 103,   0,   4, 100,  97, 114, 107,
142*890232f2SAndroid Build Coastguard Worker    0,   3,  28,  18,   8,   3,  60,   1
143*890232f2SAndroid Build Coastguard Worker  ]));
144*890232f2SAndroid Build Coastguard Worker}
145*890232f2SAndroid Build Coastguard Worker
146*890232f2SAndroid Build Coastguard Workerfunction testIndirectAdd() {
147*890232f2SAndroid Build Coastguard Worker  function _assertInt(buffer, value, indirect = false, cache = false) {
148*890232f2SAndroid Build Coastguard Worker    const builder = flexbuffers.builder();
149*890232f2SAndroid Build Coastguard Worker    builder.addInt(value, indirect, cache);
150*890232f2SAndroid Build Coastguard Worker    const data = builder.finish();
151*890232f2SAndroid Build Coastguard Worker    assert.deepStrictEqual(data, new Uint8Array(buffer));
152*890232f2SAndroid Build Coastguard Worker  }
153*890232f2SAndroid Build Coastguard Worker  function _assertUInt(buffer, value, indirect = false, cache = false) {
154*890232f2SAndroid Build Coastguard Worker    const builder = flexbuffers.builder();
155*890232f2SAndroid Build Coastguard Worker    builder.addUInt(value, indirect, cache);
156*890232f2SAndroid Build Coastguard Worker    const data = builder.finish();
157*890232f2SAndroid Build Coastguard Worker    assert.deepStrictEqual(data, new Uint8Array(buffer));
158*890232f2SAndroid Build Coastguard Worker  }
159*890232f2SAndroid Build Coastguard Worker  function _assertFloat(buffer, value, indirect = false, cache = false) {
160*890232f2SAndroid Build Coastguard Worker    const builder = flexbuffers.builder();
161*890232f2SAndroid Build Coastguard Worker    builder.addFloat(value, indirect, cache);
162*890232f2SAndroid Build Coastguard Worker    const data = builder.finish();
163*890232f2SAndroid Build Coastguard Worker    assert.deepStrictEqual(data, new Uint8Array(buffer));
164*890232f2SAndroid Build Coastguard Worker  }
165*890232f2SAndroid Build Coastguard Worker  _assertInt([0, 4, 1], 0);
166*890232f2SAndroid Build Coastguard Worker  _assertInt([0, 1, 24, 1], 0, true);
167*890232f2SAndroid Build Coastguard Worker  _assertInt([255, 0, 5, 2], 255);
168*890232f2SAndroid Build Coastguard Worker
169*890232f2SAndroid Build Coastguard Worker  _assertUInt([0, 8, 1], 0);
170*890232f2SAndroid Build Coastguard Worker  _assertUInt([0, 1, 28, 1], 0, true);
171*890232f2SAndroid Build Coastguard Worker  _assertUInt([255, 8, 1], 255);
172*890232f2SAndroid Build Coastguard Worker
173*890232f2SAndroid Build Coastguard Worker  _assertUInt([185, 115, 175, 118, 250, 84, 8, 0, 11, 8], 2345234523452345);
174*890232f2SAndroid Build Coastguard Worker  _assertUInt([185, 115, 175, 118, 250, 84, 8, 0, 8, 31, 1], 2345234523452345, true);
175*890232f2SAndroid Build Coastguard Worker  _assertInt([185, 115, 175, 118, 250, 84, 8, 0, 7, 8], 2345234523452345);
176*890232f2SAndroid Build Coastguard Worker  _assertInt([185, 115, 175, 118, 250, 84, 8, 0, 8, 27, 1], 2345234523452345, true);
177*890232f2SAndroid Build Coastguard Worker
178*890232f2SAndroid Build Coastguard Worker  _assertFloat([154, 153, 153, 153, 153, 153, 185, 63, 15, 8], 0.1);
179*890232f2SAndroid Build Coastguard Worker  _assertFloat([154, 153, 153, 153, 153, 153, 185, 63, 8, 35, 1], 0.1, true);
180*890232f2SAndroid Build Coastguard Worker  _assertFloat([0, 0, 0, 0, 14, 4], 0);
181*890232f2SAndroid Build Coastguard Worker  _assertFloat([0, 0, 0, 0, 4, 34, 1], 0, true);
182*890232f2SAndroid Build Coastguard Worker}
183*890232f2SAndroid Build Coastguard Worker
184*890232f2SAndroid Build Coastguard Workerfunction testIndirectWithCache() {
185*890232f2SAndroid Build Coastguard Worker  function _assertInt(buffer, values) {
186*890232f2SAndroid Build Coastguard Worker    const builder = flexbuffers.builder();
187*890232f2SAndroid Build Coastguard Worker    builder.startVector();
188*890232f2SAndroid Build Coastguard Worker    values.forEach(v => {
189*890232f2SAndroid Build Coastguard Worker      builder.addInt(v, true, true)
190*890232f2SAndroid Build Coastguard Worker    });
191*890232f2SAndroid Build Coastguard Worker    builder.end();
192*890232f2SAndroid Build Coastguard Worker    const data = builder.finish();
193*890232f2SAndroid Build Coastguard Worker    assert.deepStrictEqual(data, new Uint8Array(buffer));
194*890232f2SAndroid Build Coastguard Worker  }
195*890232f2SAndroid Build Coastguard Worker
196*890232f2SAndroid Build Coastguard Worker  function _assertUInt(buffer, values) {
197*890232f2SAndroid Build Coastguard Worker    const builder = flexbuffers.builder();
198*890232f2SAndroid Build Coastguard Worker    builder.startVector();
199*890232f2SAndroid Build Coastguard Worker    values.forEach(v => {
200*890232f2SAndroid Build Coastguard Worker      builder.addUInt(v, true, true);
201*890232f2SAndroid Build Coastguard Worker    });
202*890232f2SAndroid Build Coastguard Worker    builder.end();
203*890232f2SAndroid Build Coastguard Worker    const data = builder.finish();
204*890232f2SAndroid Build Coastguard Worker    assert.deepStrictEqual(data, new Uint8Array(buffer));
205*890232f2SAndroid Build Coastguard Worker  }
206*890232f2SAndroid Build Coastguard Worker
207*890232f2SAndroid Build Coastguard Worker  function _assertFloat(buffer, values) {
208*890232f2SAndroid Build Coastguard Worker    const builder = flexbuffers.builder();
209*890232f2SAndroid Build Coastguard Worker    builder.startVector();
210*890232f2SAndroid Build Coastguard Worker    values.forEach(v => {
211*890232f2SAndroid Build Coastguard Worker      builder.addFloat(v, true, true);
212*890232f2SAndroid Build Coastguard Worker    });
213*890232f2SAndroid Build Coastguard Worker    builder.end();
214*890232f2SAndroid Build Coastguard Worker    const data = builder.finish();
215*890232f2SAndroid Build Coastguard Worker    assert.deepStrictEqual(data, new Uint8Array(buffer));
216*890232f2SAndroid Build Coastguard Worker  }
217*890232f2SAndroid Build Coastguard Worker
218*890232f2SAndroid Build Coastguard Worker  _assertInt(
219*890232f2SAndroid Build Coastguard Worker    [185, 115, 175, 118, 250, 84, 8, 0, 4, 9, 10, 11, 12, 27, 27, 27, 27, 8, 40, 1],
220*890232f2SAndroid Build Coastguard Worker    [2345234523452345, 2345234523452345, 2345234523452345, 2345234523452345]
221*890232f2SAndroid Build Coastguard Worker  );
222*890232f2SAndroid Build Coastguard Worker
223*890232f2SAndroid Build Coastguard Worker  _assertUInt(
224*890232f2SAndroid Build Coastguard Worker    [185, 115, 175, 118, 250, 84, 8, 0, 4, 9, 10, 11, 12, 31, 31, 31, 31, 8, 40, 1],
225*890232f2SAndroid Build Coastguard Worker    [2345234523452345, 2345234523452345, 2345234523452345, 2345234523452345]
226*890232f2SAndroid Build Coastguard Worker  );
227*890232f2SAndroid Build Coastguard Worker
228*890232f2SAndroid Build Coastguard Worker  _assertFloat(
229*890232f2SAndroid Build Coastguard Worker    [154, 153, 153, 153, 153, 153, 185, 63, 4, 9, 10, 11, 12, 35, 35, 35, 35, 8, 40, 1],
230*890232f2SAndroid Build Coastguard Worker    [0.1, 0.1, 0.1, 0.1]
231*890232f2SAndroid Build Coastguard Worker  );
232*890232f2SAndroid Build Coastguard Worker}
233*890232f2SAndroid Build Coastguard Worker
234*890232f2SAndroid Build Coastguard Workerfunction testMapBuilder() {
235*890232f2SAndroid Build Coastguard Worker  const builder = flexbuffers.builder();
236*890232f2SAndroid Build Coastguard Worker  builder.startMap();
237*890232f2SAndroid Build Coastguard Worker  builder.addKey('a');
238*890232f2SAndroid Build Coastguard Worker  builder.add(12);
239*890232f2SAndroid Build Coastguard Worker  builder.addKey('');
240*890232f2SAndroid Build Coastguard Worker  builder.add(45);
241*890232f2SAndroid Build Coastguard Worker  builder.end();
242*890232f2SAndroid Build Coastguard Worker  const data = builder.finish();
243*890232f2SAndroid Build Coastguard Worker  assert.deepStrictEqual(data, new Uint8Array([97, 0, 0, 2, 2, 5, 2, 1, 2, 45, 12, 4, 4, 4, 36, 1]));
244*890232f2SAndroid Build Coastguard Worker}
245*890232f2SAndroid Build Coastguard Worker
246*890232f2SAndroid Build Coastguard Workerfunction testRoundTrip() {
247*890232f2SAndroid Build Coastguard Worker  const example = {
248*890232f2SAndroid Build Coastguard Worker    "age": 35,
249*890232f2SAndroid Build Coastguard Worker    "flags": [true, false, true, true],
250*890232f2SAndroid Build Coastguard Worker    "weight": 72.5,
251*890232f2SAndroid Build Coastguard Worker    "name": "Maxim",
252*890232f2SAndroid Build Coastguard Worker    "address": {
253*890232f2SAndroid Build Coastguard Worker      "city": "Bla",
254*890232f2SAndroid Build Coastguard Worker      "zip": "12345",
255*890232f2SAndroid Build Coastguard Worker      "countryCode": "XX",
256*890232f2SAndroid Build Coastguard Worker    }
257*890232f2SAndroid Build Coastguard Worker  };
258*890232f2SAndroid Build Coastguard Worker
259*890232f2SAndroid Build Coastguard Worker  function _assert(value) {
260*890232f2SAndroid Build Coastguard Worker    let buffer = flexbuffers.encode(value, 1);
261*890232f2SAndroid Build Coastguard Worker    let o = flexbuffers.toObject(buffer.buffer);
262*890232f2SAndroid Build Coastguard Worker    assert.deepStrictEqual(o, value);
263*890232f2SAndroid Build Coastguard Worker  }
264*890232f2SAndroid Build Coastguard Worker
265*890232f2SAndroid Build Coastguard Worker  _assert(example);
266*890232f2SAndroid Build Coastguard Worker  _assert(0x100000001n);
267*890232f2SAndroid Build Coastguard Worker  _assert({ test_number: 72.6 })
268*890232f2SAndroid Build Coastguard Worker}
269*890232f2SAndroid Build Coastguard Worker
270*890232f2SAndroid Build Coastguard Workerfunction testRoundTripWithBuilder() {
271*890232f2SAndroid Build Coastguard Worker  const example = {
272*890232f2SAndroid Build Coastguard Worker    "age": 35,
273*890232f2SAndroid Build Coastguard Worker    "flags": [true, false, true, true],
274*890232f2SAndroid Build Coastguard Worker    "weight": 72.5,
275*890232f2SAndroid Build Coastguard Worker    "name": "Maxim",
276*890232f2SAndroid Build Coastguard Worker    "address": {
277*890232f2SAndroid Build Coastguard Worker      "city": "Bla",
278*890232f2SAndroid Build Coastguard Worker      "zip": "12345",
279*890232f2SAndroid Build Coastguard Worker      "countryCode": "XX",
280*890232f2SAndroid Build Coastguard Worker    }
281*890232f2SAndroid Build Coastguard Worker  };
282*890232f2SAndroid Build Coastguard Worker
283*890232f2SAndroid Build Coastguard Worker  const builder = flexbuffers.builder();
284*890232f2SAndroid Build Coastguard Worker  builder.startMap();
285*890232f2SAndroid Build Coastguard Worker
286*890232f2SAndroid Build Coastguard Worker  builder.addKey('age');
287*890232f2SAndroid Build Coastguard Worker  builder.add(35);
288*890232f2SAndroid Build Coastguard Worker
289*890232f2SAndroid Build Coastguard Worker  builder.addKey('flags');
290*890232f2SAndroid Build Coastguard Worker  builder.startVector();
291*890232f2SAndroid Build Coastguard Worker  builder.add(true);
292*890232f2SAndroid Build Coastguard Worker  builder.add(false);
293*890232f2SAndroid Build Coastguard Worker  builder.add(true);
294*890232f2SAndroid Build Coastguard Worker  builder.add(true);
295*890232f2SAndroid Build Coastguard Worker  builder.end();
296*890232f2SAndroid Build Coastguard Worker
297*890232f2SAndroid Build Coastguard Worker  builder.addKey("weight");
298*890232f2SAndroid Build Coastguard Worker  builder.add(72.5);
299*890232f2SAndroid Build Coastguard Worker
300*890232f2SAndroid Build Coastguard Worker  builder.addKey("name");
301*890232f2SAndroid Build Coastguard Worker  builder.add("Maxim");
302*890232f2SAndroid Build Coastguard Worker
303*890232f2SAndroid Build Coastguard Worker  builder.addKey("address");
304*890232f2SAndroid Build Coastguard Worker
305*890232f2SAndroid Build Coastguard Worker  builder.startMap();
306*890232f2SAndroid Build Coastguard Worker  builder.addKey("city");
307*890232f2SAndroid Build Coastguard Worker  builder.add("Bla");
308*890232f2SAndroid Build Coastguard Worker  builder.addKey("zip");
309*890232f2SAndroid Build Coastguard Worker  builder.add("12345");
310*890232f2SAndroid Build Coastguard Worker  builder.addKey("countryCode");
311*890232f2SAndroid Build Coastguard Worker  builder.add("XX");
312*890232f2SAndroid Build Coastguard Worker  builder.end();
313*890232f2SAndroid Build Coastguard Worker
314*890232f2SAndroid Build Coastguard Worker  builder.end();
315*890232f2SAndroid Build Coastguard Worker
316*890232f2SAndroid Build Coastguard Worker  const data = builder.finish();
317*890232f2SAndroid Build Coastguard Worker  let o = flexbuffers.toObject(data.buffer);
318*890232f2SAndroid Build Coastguard Worker  assert.deepStrictEqual(o, example);
319*890232f2SAndroid Build Coastguard Worker
320*890232f2SAndroid Build Coastguard Worker  let root = flexbuffers.toReference(data.buffer);
321*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(root.isMap(), true);
322*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(root.get("age").numericValue(), 35);
323*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(root.get("age").intValue(), 35);
324*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(root.get("name").stringValue(), "Maxim");
325*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(root.get("weight").floatValue(), 72.5);
326*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(root.get("weight").numericValue(), 72.5);
327*890232f2SAndroid Build Coastguard Worker  let flags = root.get("flags");
328*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(flags.isVector(), true);
329*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(flags.length(), 4);
330*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(flags.get(0).boolValue(), true);
331*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(flags.get(1).boolValue(), false);
332*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(flags.get(2).boolValue(), true);
333*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(flags.get(3).boolValue(), true);
334*890232f2SAndroid Build Coastguard Worker
335*890232f2SAndroid Build Coastguard Worker  let address = root.get("address");
336*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(address.isMap(), true);
337*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(address.length(), 3);
338*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(address.get("city").stringValue(), "Bla");
339*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(address.get("zip").stringValue(), "12345");
340*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(address.get("countryCode").stringValue(), "XX");
341*890232f2SAndroid Build Coastguard Worker}
342*890232f2SAndroid Build Coastguard Worker
343*890232f2SAndroid Build Coastguard Workerfunction testGoldBuffer() {
344*890232f2SAndroid Build Coastguard Worker  const data = new Uint8Array(fs.readFileSync('gold_flexbuffer_example.bin')).buffer;
345*890232f2SAndroid Build Coastguard Worker  const b1 = flexbuffers.toReference(data).get("bools").get(1);
346*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(b1.isBool(), true);
347*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(b1.boolValue(), false);
348*890232f2SAndroid Build Coastguard Worker
349*890232f2SAndroid Build Coastguard Worker  const blob = flexbuffers.toReference(data).get("vec").get(3);
350*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(blob.isBlob(), true);
351*890232f2SAndroid Build Coastguard Worker  assert.deepStrictEqual(blob.blobValue(), new Uint8Array([77]));
352*890232f2SAndroid Build Coastguard Worker
353*890232f2SAndroid Build Coastguard Worker  const o = flexbuffers.toObject(data);
354*890232f2SAndroid Build Coastguard Worker  assert.deepStrictEqual(o, {
355*890232f2SAndroid Build Coastguard Worker    bool: true,
356*890232f2SAndroid Build Coastguard Worker    bools: [true, false, true, false],
357*890232f2SAndroid Build Coastguard Worker    bar: [1, 2, 3],
358*890232f2SAndroid Build Coastguard Worker    bar3: [1, 2, 3],
359*890232f2SAndroid Build Coastguard Worker    foo: 100,
360*890232f2SAndroid Build Coastguard Worker    mymap: {foo:'Fred'},
361*890232f2SAndroid Build Coastguard Worker    vec: [-100, 'Fred', 4, new Uint8Array([77]), false, 4]
362*890232f2SAndroid Build Coastguard Worker  });
363*890232f2SAndroid Build Coastguard Worker}
364*890232f2SAndroid Build Coastguard Worker
365*890232f2SAndroid Build Coastguard Workerfunction testBugWhereOffestWereStoredAsIntInsteadOfUInt() {
366*890232f2SAndroid Build Coastguard Worker  // Reported in https://github.com/google/flatbuffers/issues/5949#issuecomment-688421193
367*890232f2SAndroid Build Coastguard Worker  const object = {'channels_in': 64, 'dilation_height_factor': 1, 'dilation_width_factor': 1, 'fused_activation_function': 1, 'pad_values': 1, 'padding': 0, 'stride_height': 1, 'stride_width': 1};
368*890232f2SAndroid Build Coastguard Worker  let data1 = flexbuffers.encode(object);
369*890232f2SAndroid Build Coastguard Worker  const data = [99, 104, 97, 110, 110, 101, 108, 115, 95, 105, 110, 0,
370*890232f2SAndroid Build Coastguard Worker    100, 105, 108, 97, 116, 105, 111, 110, 95, 104, 101, 105, 103, 104, 116, 95, 102, 97, 99, 116, 111, 114, 0,
371*890232f2SAndroid Build Coastguard Worker    100, 105, 108, 97, 116, 105, 111, 110, 95, 119, 105, 100, 116, 104, 95, 102, 97, 99, 116, 111, 114, 0,
372*890232f2SAndroid Build Coastguard Worker    102, 117, 115, 101, 100, 95, 97, 99, 116, 105, 118, 97, 116, 105, 111, 110, 95, 102, 117, 110, 99, 116, 105, 111, 110, 0,
373*890232f2SAndroid Build Coastguard Worker    112, 97, 100, 95, 118, 97, 108, 117, 101, 115, 0, 112, 97, 100, 100, 105, 110, 103, 0,
374*890232f2SAndroid Build Coastguard Worker    115, 116, 114, 105, 100, 101, 95, 104, 101, 105, 103, 104, 116, 0,
375*890232f2SAndroid Build Coastguard Worker    115, 116, 114, 105, 100, 101, 95, 119, 105, 100, 116, 104, 0,
376*890232f2SAndroid Build Coastguard Worker    8, 130, 119, 97, 76, 51, 41, 34, 21, 8, 1, 8, 64, 1, 1, 1, 1, 0, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 16, 36, 1];
377*890232f2SAndroid Build Coastguard Worker  let object2 = flexbuffers.toObject(new Uint8Array(data).buffer);
378*890232f2SAndroid Build Coastguard Worker  let object1 = flexbuffers.toObject(new Uint8Array(data1).buffer);
379*890232f2SAndroid Build Coastguard Worker  assert.deepStrictEqual(object, object2);
380*890232f2SAndroid Build Coastguard Worker  assert.deepStrictEqual(object, object1);
381*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(data.length, data1.length);
382*890232f2SAndroid Build Coastguard Worker  let ref = flexbuffers.toReference(new Uint8Array(data).buffer);
383*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(ref.isMap(), true);
384*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(ref.length(), 8);
385*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(ref.get("channels_in").numericValue(), 64);
386*890232f2SAndroid Build Coastguard Worker  assert.strictEqual(ref.get("padding").isNumber(), true);
387*890232f2SAndroid Build Coastguard Worker}
388*890232f2SAndroid Build Coastguard Worker
389*890232f2SAndroid Build Coastguard Workermain();
390*890232f2SAndroid Build Coastguard Worker
391