blob: 875b1c161467073d3e73935fce84f68ca9594e6c [file] [log] [blame]
import 'dart:typed_data';
import 'package:flat_buffers/flex_buffers.dart' show Reference, Builder;
import 'package:test/test.dart';
void main() {
test('is null', () {
expect(Reference.fromBuffer(b([0, 0, 1])).isNull, isTrue);
});
test('bool value', () {
expect(Reference.fromBuffer(b([1, 104, 1])).boolValue, isTrue);
expect(Reference.fromBuffer(b([0, 104, 1])).boolValue, isFalse);
});
test('int value', () {
expect(Reference.fromBuffer(b([25, 4, 1])).intValue, 25);
expect(Reference.fromBuffer(b([231, 4, 1])).intValue, -25);
expect(Reference.fromBuffer(b([230, 8, 1])).intValue, 230);
expect(Reference.fromBuffer(b([230, 0, 5, 2])).intValue, 230);
expect(Reference.fromBuffer(b([1, 4, 5, 2])).intValue, 1025);
expect(Reference.fromBuffer(b([255, 251, 5, 2])).intValue, -1025);
expect(Reference.fromBuffer(b([1, 4, 9, 2])).intValue, 1025);
expect(Reference.fromBuffer(b([255, 255, 255, 127, 6, 4])).intValue,
2147483647);
expect(Reference.fromBuffer(b([0, 0, 0, 128, 6, 4])).intValue, -2147483648);
expect(
Reference.fromBuffer(b([255, 255, 255, 255, 0, 0, 0, 0, 7, 8]))
.intValue,
4294967295);
expect(
Reference.fromBuffer(b([255, 255, 255, 255, 255, 255, 255, 127, 7, 8]))
.intValue,
9223372036854775807);
expect(Reference.fromBuffer(b([0, 0, 0, 0, 0, 0, 0, 128, 7, 8])).intValue,
-9223372036854775808);
// Dart does not really support UInt64
// expect(FlxValue.fromBuffer(b([255, 255, 255, 255, 255, 255, 255, 255, 11, 8])).intValue, 18446744073709551615);
});
test('double value', () {
expect(Reference.fromBuffer(b([0, 0, 144, 64, 14, 4])).doubleValue, 4.5);
expect(Reference.fromBuffer(b([205, 204, 204, 61, 14, 4])).doubleValue,
closeTo(.1, .001));
expect(
Reference.fromBuffer(b([154, 153, 153, 153, 153, 153, 185, 63, 15, 8]))
.doubleValue,
.1);
});
test('num value', () {
expect(Reference.fromBuffer(b([0, 0, 144, 64, 14, 4])).numValue, 4.5);
expect(Reference.fromBuffer(b([205, 204, 204, 61, 14, 4])).numValue,
closeTo(.1, .001));
expect(
Reference.fromBuffer(b([154, 153, 153, 153, 153, 153, 185, 63, 15, 8]))
.numValue,
.1);
expect(Reference.fromBuffer(b([255, 251, 5, 2])).numValue, -1025);
});
test('string value', () {
expect(
Reference.fromBuffer(b([5, 77, 97, 120, 105, 109, 0, 6, 20, 1]))
.stringValue,
'Maxim');
expect(
Reference.fromBuffer(b([
10,
104,
101,
108,
108,
111,
32,
240,
159,
152,
177,
0,
11,
20,
1
])).stringValue,
'hello 😱');
});
test('blob value', () {
expect(
Reference.fromBuffer(b([3, 1, 2, 3, 3, 100, 1])).blobValue, [1, 2, 3]);
});
test('bool vector', () {
var flx = Reference.fromBuffer(b([3, 1, 0, 1, 3, 144, 1]));
expect(flx[0].boolValue, true);
expect(flx[1].boolValue, false);
expect(flx[2].boolValue, true);
});
test('number vector', () {
testNumbers([3, 1, 2, 3, 3, 44, 1], [1, 2, 3]);
testNumbers([3, 255, 2, 3, 3, 44, 1], [-1, 2, 3]);
testNumbers([3, 0, 1, 0, 43, 2, 3, 0, 6, 45, 1], [1, 555, 3]);
testNumbers([3, 0, 0, 0, 1, 0, 0, 0, 204, 216, 0, 0, 3, 0, 0, 0, 12, 46, 1],
[1, 55500, 3]);
testNumbers([
3,
0,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
172,
128,
94,
239,
12,
0,
0,
0,
3,
0,
0,
0,
0,
0,
0,
0,
24,
47,
1
], [
1,
55555555500,
3
]);
testNumbers(
[3, 0, 0, 0, 0, 0, 192, 63, 0, 0, 32, 64, 0, 0, 96, 64, 12, 54, 1],
[1.5, 2.5, 3.5]);
testNumbers([
3,
0,
0,
0,
0,
0,
0,
0,
154,
153,
153,
153,
153,
153,
241,
63,
154,
153,
153,
153,
153,
153,
1,
64,
102,
102,
102,
102,
102,
102,
10,
64,
24,
55,
1
], [
1.1,
2.2,
3.3
]);
});
test('number vector, fixed type', () {
testNumbers([1, 2, 2, 64, 1], [1, 2]);
testNumbers([255, 255, 0, 1, 4, 65, 1], [-1, 256]);
testNumbers([211, 255, 255, 255, 0, 232, 3, 0, 8, 66, 1], [-45, 256000]);
testNumbers([
211,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
127,
16,
67,
1
], [
-45,
9223372036854775807
]);
testNumbers([1, 2, 2, 68, 1], [1, 2]);
testNumbers([1, 0, 0, 1, 4, 69, 1], [1, 256]);
testNumbers([45, 0, 0, 0, 0, 232, 3, 0, 8, 70, 1], [45, 256000]);
testNumbers([205, 204, 140, 63, 0, 0, 0, 192, 8, 74, 1], [1.1, -2]);
testNumbers([
154,
153,
153,
153,
153,
153,
241,
63,
0,
0,
0,
0,
0,
0,
112,
192,
16,
75,
1
], [
1.1,
-256
]);
testNumbers([211, 255, 255, 255, 0, 232, 3, 0, 4, 0, 0, 0, 12, 78, 1],
[-45, 256000, 4]);
testNumbers([
211,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
127,
4,
0,
0,
0,
0,
0,
0,
0,
9,
0,
0,
0,
0,
0,
0,
0,
32,
91,
1
], [
-45,
9223372036854775807,
4,
9
]);
testNumbers([
45,
0,
0,
0,
0,
0,
0,
0,
255,
255,
255,
255,
255,
255,
255,
127,
4,
0,
0,
0,
0,
0,
0,
0,
9,
0,
0,
0,
0,
0,
0,
0,
32,
95,
1
], [
45,
9223372036854775807,
4,
9
]);
testNumbers([
154,
153,
153,
153,
153,
153,
241,
63,
0,
0,
0,
0,
0,
0,
112,
64,
0,
0,
0,
0,
0,
0,
16,
64,
24,
87,
1
], [
1.1,
256,
4
]);
testNumbers([
154,
153,
153,
153,
153,
153,
241,
63,
0,
0,
0,
0,
0,
0,
112,
64,
0,
0,
0,
0,
0,
0,
16,
64,
0,
0,
0,
0,
0,
0,
34,
64,
32,
99,
1
], [
1.1,
256,
4,
9
]);
});
test('string vector', () {
testStrings([
3,
102,
111,
111,
0,
3,
98,
97,
114,
0,
3,
98,
97,
122,
0,
3,
15,
11,
7,
3,
60,
1
], [
'foo',
'bar',
'baz'
]);
testStrings([
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
], [
'foo',
'bar',
'baz',
'foo',
'bar',
'baz'
]);
});
test('mixed vector', () {
var flx = Reference.fromBuffer(b([
3,
102,
111,
111,
0,
0,
0,
0,
5,
0,
0,
0,
0,
0,
0,
0,
15,
0,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
251,
255,
255,
255,
255,
255,
255,
255,
205,
204,
204,
204,
204,
204,
244,
63,
1,
0,
0,
0,
0,
0,
0,
0,
20,
4,
4,
15,
104,
45,
43,
1
]));
expect(flx.length, 5);
expect(flx[0].stringValue, 'foo');
expect(flx[1].numValue, 1);
expect(flx[2].numValue, -5);
expect(flx[3].numValue, 1.3);
expect(flx[4].boolValue, true);
});
test('single value map', () {
var flx = Reference.fromBuffer(b([97, 0, 1, 3, 1, 1, 1, 12, 4, 2, 36, 1]));
expect(flx.length, 1);
expect(flx['a'].numValue, 12);
});
test('two value map', () {
var flx = Reference.fromBuffer(
b([0, 97, 0, 2, 4, 4, 2, 1, 2, 45, 12, 4, 4, 4, 36, 1]));
expect(flx.length, 2);
expect(flx['a'].numValue, 12);
expect(flx[''].numValue, 45);
});
test('complex map', () {
var flx = complexMap();
expect(flx.length, 5);
expect(flx['age'].numValue, 35);
expect(flx['weight'].numValue, 72.5);
expect(flx['name'].stringValue, 'Maxim');
expect(flx['flags'].length, 4);
expect(flx['flags'][0].boolValue, true);
expect(flx['flags'][1].boolValue, false);
expect(flx['flags'][2].boolValue, true);
expect(flx['flags'][3].boolValue, true);
expect(flx['address'].length, 3);
expect(flx['address']['city'].stringValue, 'Bla');
expect(flx['address']['zip'].stringValue, '12345');
expect(flx['address']['countryCode'].stringValue, 'XX');
expect(
() => flx['address']['country'].stringValue,
throwsA(predicate((dynamic e) =>
e is ArgumentError &&
e.message ==
'Key: [country] is not applicable on: //address of: ValueType.Map')));
expect(
() => flx['address']['countryCode'][0],
throwsA(predicate((dynamic e) =>
e is ArgumentError &&
e.message ==
'Key: [0] is not applicable on: //address/countryCode of: ValueType.String')));
expect(
() => flx[1],
throwsA(predicate((dynamic e) =>
e is ArgumentError &&
e.message ==
'Key: [1] is not applicable on: / of: ValueType.Map')));
expect(
() => flx['flags'][4],
throwsA(predicate((dynamic e) =>
e is ArgumentError &&
e.message ==
'Key: [4] is not applicable on: //flags of: ValueType.VectorBool length: 4')));
expect(
() => flx['flags'][-1],
throwsA(predicate((dynamic e) =>
e is ArgumentError &&
e.message ==
'Key: [-1] is not applicable on: //flags of: ValueType.VectorBool length: 4')));
});
test('complex map to json', () {
var flx = complexMap();
expect(flx.json,
'{"address":{"city":"Bla","countryCode":"XX","zip":"12345"},"age":35,"flags":[true,false,true,true],"name":"Maxim","weight":72.5}');
});
test('complex map iterators', () {
var flx = complexMap();
expect(flx.mapKeyIterable.map((e) => e).toList(),
['address', 'age', 'flags', 'name', 'weight']);
expect(flx.mapValueIterable.map((e) => e.json).toList(), [
flx['address'].json,
flx['age'].json,
flx['flags'].json,
flx['name'].json,
flx['weight'].json
]);
expect(flx['flags'].vectorIterable.map((e) => e.boolValue).toList(),
[true, false, true, true]);
});
test('bug where offest were stored as int instead of uint', () {
const data = [
99,
104,
97,
110,
110,
101,
108,
115,
95,
105,
110,
0,
100,
105,
108,
97,
116,
105,
111,
110,
95,
104,
101,
105,
103,
104,
116,
95,
102,
97,
99,
116,
111,
114,
0,
100,
105,
108,
97,
116,
105,
111,
110,
95,
119,
105,
100,
116,
104,
95,
102,
97,
99,
116,
111,
114,
0,
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,
112,
97,
100,
95,
118,
97,
108,
117,
101,
115,
0,
112,
97,
100,
100,
105,
110,
103,
0,
115,
116,
114,
105,
100,
101,
95,
104,
101,
105,
103,
104,
116,
0,
115,
116,
114,
105,
100,
101,
95,
119,
105,
100,
116,
104,
0,
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
];
var flx = Reference.fromBuffer(b(data));
expect(flx.json,
'{"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}');
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
};
var data1 = Builder.buildFromObject(object).asUint8List();
expect(data1.length, data.length);
var flx1 = Reference.fromBuffer(b(data1));
expect(flx1.json,
'{"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}');
});
}
ByteBuffer b(List<int> values) {
var data = Uint8List.fromList(values);
return data.buffer;
}
void testNumbers(List<int> buffer, List<num> numbers) {
var flx = Reference.fromBuffer(b(buffer));
expect(flx.length, numbers.length);
for (var i = 0; i < flx.length; i++) {
expect(flx[i].numValue, closeTo(numbers[i], 0.001));
}
}
void testStrings(List<int> buffer, List<String> numbers) {
var flx = Reference.fromBuffer(b(buffer));
expect(flx.length, numbers.length);
for (var i = 0; i < flx.length; i++) {
expect(flx[i].stringValue, numbers[i]);
}
}
Reference complexMap() {
// {
// "age": 35,
// "flags": [True, False, True, True],
// "weight": 72.5,
// "name": "Maxim",
// "address": {
// "city": "Bla",
// "zip": "12345",
// "countryCode": "XX",
// }
// }
return Reference.fromBuffer(b([
97,
100,
100,
114,
101,
115,
115,
0,
99,
105,
116,
121,
0,
3,
66,
108,
97,
0,
99,
111,
117,
110,
116,
114,
121,
67,
111,
100,
101,
0,
2,
88,
88,
0,
122,
105,
112,
0,
5,
49,
50,
51,
52,
53,
0,
3,
38,
29,
14,
3,
1,
3,
38,
22,
15,
20,
20,
20,
97,
103,
101,
0,
102,
108,
97,
103,
115,
0,
4,
1,
0,
1,
1,
110,
97,
109,
101,
0,
5,
77,
97,
120,
105,
109,
0,
119,
101,
105,
103,
104,
116,
0,
5,
93,
36,
33,
23,
12,
0,
0,
7,
0,
0,
0,
1,
0,
0,
0,
5,
0,
0,
0,
60,
0,
0,
0,
35,
0,
0,
0,
51,
0,
0,
0,
45,
0,
0,
0,
0,
0,
145,
66,
36,
4,
144,
20,
14,
25,
38,
1
]));
}