Files
apidash/packages/json_explorer/test/unit/flatten_tests.dart
2024-11-29 01:24:01 +05:30

354 lines
12 KiB
Dart

import 'dart:convert';
import 'package:flutter_test/flutter_test.dart';
import 'package:json_explorer/json_explorer.dart';
void main() {
List<NodeViewModelState> _buildList(String jsonString) {
final builtNodes = buildViewModelNodes(json.decode(jsonString));
return flatten(builtNodes);
}
group('Flatten algorithm tests', () {
group('Classes', () {
test('builds a flat list from a simple json', () {
const jsonString = '''
{
"firstField": "firstField",
"secondField": "secondField",
"thirdField": "thirdField"
}
''';
final viewModels = _buildList(jsonString);
expect(viewModels, hasLength(3));
expect(viewModels[0].key, 'firstField');
expect(viewModels[0].value, 'firstField');
expect(viewModels[0].isRoot, isFalse);
expect(viewModels[0].treeDepth, 0);
expect(viewModels[1].key, 'secondField');
expect(viewModels[1].value, 'secondField');
expect(viewModels[1].isRoot, isFalse);
expect(viewModels[1].treeDepth, 0);
expect(viewModels[2].key, 'thirdField');
expect(viewModels[2].value, 'thirdField');
expect(viewModels[2].isRoot, isFalse);
expect(viewModels[2].treeDepth, 0);
});
test('builds a flat list from multiple json classes', () {
const jsonString = '''
{
"firstClass": {
"firstField": "firstField",
"secondField": "secondField",
"thirdField": "thirdField"
},
"secondClass": {
"firstField": "firstField",
"secondField": "secondField",
"thirdField": "thirdField"
}
}
''';
final viewModels = _buildList(jsonString);
expect(viewModels, hasLength(8));
expect(viewModels[0].key, 'firstClass');
expect(viewModels[0].value, isNotNull);
expect(viewModels[0].isRoot, isTrue);
expect(viewModels[0].isClass, isTrue);
expect(viewModels[0].isArray, isFalse);
expect(viewModels[0].childrenCount, 3);
expect(viewModels[0].treeDepth, 0);
expect(viewModels[1].key, 'firstField');
expect(viewModels[1].value, 'firstField');
expect(viewModels[1].isRoot, isFalse);
expect(viewModels[1].treeDepth, 1);
expect(viewModels[2].key, 'secondField');
expect(viewModels[2].value, 'secondField');
expect(viewModels[2].isRoot, isFalse);
expect(viewModels[2].treeDepth, 1);
expect(viewModels[3].key, 'thirdField');
expect(viewModels[3].value, 'thirdField');
expect(viewModels[3].isRoot, isFalse);
expect(viewModels[3].treeDepth, 1);
expect(viewModels[4].key, 'secondClass');
expect(viewModels[4].value, isNotNull);
expect(viewModels[4].isRoot, isTrue);
expect(viewModels[4].isClass, isTrue);
expect(viewModels[4].isArray, isFalse);
expect(viewModels[4].childrenCount, 3);
expect(viewModels[4].treeDepth, 0);
expect(viewModels[5].key, 'firstField');
expect(viewModels[5].value, 'firstField');
expect(viewModels[5].isRoot, isFalse);
expect(viewModels[5].treeDepth, 1);
expect(viewModels[6].key, 'secondField');
expect(viewModels[6].value, 'secondField');
expect(viewModels[6].isRoot, isFalse);
expect(viewModels[6].treeDepth, 1);
expect(viewModels[7].key, 'thirdField');
expect(viewModels[7].value, 'thirdField');
expect(viewModels[7].isRoot, isFalse);
expect(viewModels[7].treeDepth, 1);
});
test('builds a flat list from multiple nested json classes', () {
const jsonString = '''
{
"firstClass": {
"firstField": "firstField",
"firstClassField": {
"firstField": "firstField",
"innerClassField": {
"firstField": "firstField"
}
},
"secondClassField": {
"firstField": "firstField",
"innerClassField": {
"firstField": "firstField"
}
}
}
}
''';
final viewModels = _buildList(jsonString);
expect(viewModels, hasLength(10));
expect(viewModels[0].key, 'firstClass');
expect(viewModels[0].value, isNotNull);
expect(viewModels[0].isRoot, isTrue);
expect(viewModels[0].isClass, isTrue);
expect(viewModels[0].isArray, isFalse);
expect(viewModels[0].childrenCount, 3);
expect(viewModels[0].treeDepth, 0);
expect(viewModels[1].key, 'firstField');
expect(viewModels[1].value, isNotNull);
expect(viewModels[1].isRoot, isFalse);
expect(viewModels[1].treeDepth, 1);
expect(viewModels[2].key, 'firstClassField');
expect(viewModels[2].value, isNotNull);
expect(viewModels[2].isRoot, isTrue);
expect(viewModels[2].isClass, isTrue);
expect(viewModels[2].isArray, isFalse);
expect(viewModels[2].childrenCount, 2);
expect(viewModels[2].treeDepth, 1);
expect(viewModels[3].key, 'firstField');
expect(viewModels[3].value, isNotNull);
expect(viewModels[3].isRoot, isFalse);
expect(viewModels[3].treeDepth, 2);
expect(viewModels[4].key, 'innerClassField');
expect(viewModels[4].value, isNotNull);
expect(viewModels[4].isRoot, isTrue);
expect(viewModels[4].isClass, isTrue);
expect(viewModels[4].isArray, isFalse);
expect(viewModels[4].childrenCount, 1);
expect(viewModels[4].treeDepth, 2);
expect(viewModels[5].key, 'firstField');
expect(viewModels[5].value, isNotNull);
expect(viewModels[5].isRoot, isFalse);
expect(viewModels[5].treeDepth, 3);
expect(viewModels[6].key, 'secondClassField');
expect(viewModels[6].value, isNotNull);
expect(viewModels[6].isRoot, isTrue);
expect(viewModels[6].isClass, isTrue);
expect(viewModels[6].isArray, isFalse);
expect(viewModels[6].childrenCount, 2);
expect(viewModels[6].treeDepth, 1);
expect(viewModels[7].key, 'firstField');
expect(viewModels[7].value, isNotNull);
expect(viewModels[7].isRoot, isFalse);
expect(viewModels[7].treeDepth, 2);
expect(viewModels[8].key, 'innerClassField');
expect(viewModels[8].value, isNotNull);
expect(viewModels[8].isRoot, isTrue);
expect(viewModels[8].isClass, isTrue);
expect(viewModels[8].isArray, isFalse);
expect(viewModels[8].childrenCount, 1);
expect(viewModels[8].treeDepth, 2);
expect(viewModels[9].key, 'firstField');
expect(viewModels[9].value, isNotNull);
expect(viewModels[9].isRoot, isFalse);
expect(viewModels[9].treeDepth, 3);
});
});
group('Arrays', () {
test('builds a flat list from json array', () {
const jsonString = '[1, 2]';
final viewModels = _buildList(jsonString);
expect(viewModels, hasLength(3));
expect(viewModels[0].key, 'data');
expect(viewModels[0].value, isNotNull);
expect(viewModels[0].isRoot, isTrue);
expect(viewModels[0].isArray, isTrue);
expect(viewModels[0].childrenCount, 2);
expect(viewModels[0].treeDepth, 0);
expect(viewModels[1].key, '0');
expect(viewModels[1].value, 1);
expect(viewModels[1].isRoot, isFalse);
expect(viewModels[1].treeDepth, 1);
expect(viewModels[2].key, '1');
expect(viewModels[2].value, 2);
expect(viewModels[2].isRoot, isFalse);
expect(viewModels[2].treeDepth, 1);
});
test('builds a flat list from array of classes', () {
const jsonString = '''
[
{
"0.firstField": "firstField"
},
{
"1.firstField": "firstField"
}
]
''';
final viewModels = _buildList(jsonString);
expect(viewModels, hasLength(5));
expect(viewModels[0].key, 'data');
expect(viewModels[0].value, isNotNull);
expect(viewModels[0].isRoot, isTrue);
expect(viewModels[0].isArray, isTrue);
expect(viewModels[0].childrenCount, 2);
expect(viewModels[0].treeDepth, 0);
expect(viewModels[1].key, '0');
expect(viewModels[1].value, isNotNull);
expect(viewModels[1].isRoot, isTrue);
expect(viewModels[1].isClass, isTrue);
expect(viewModels[1].isArray, isFalse);
expect(viewModels[1].childrenCount, 1);
expect(viewModels[1].treeDepth, 1);
expect(viewModels[2].key, '0.firstField');
expect(viewModels[2].value, isNotNull);
expect(viewModels[2].isRoot, isFalse);
expect(viewModels[2].treeDepth, 2);
expect(viewModels[3].key, '1');
expect(viewModels[3].value, isNotNull);
expect(viewModels[3].isRoot, isTrue);
expect(viewModels[3].isClass, isTrue);
expect(viewModels[3].isArray, isFalse);
expect(viewModels[3].childrenCount, 1);
expect(viewModels[3].treeDepth, 1);
expect(viewModels[4].key, '1.firstField');
expect(viewModels[4].value, isNotNull);
expect(viewModels[4].isRoot, isFalse);
expect(viewModels[4].treeDepth, 2);
});
test('builds a flat list from class with nested arrays', () {
const jsonString = '''
{
"firstClass": {
"firstClass.firstField": "firstField",
"firstClass.array": [
1,
2
]
},
"secondClass": {
"secondClass.firstField": "firstField",
"secondClass.array": [
3,
4
]
}
}
''';
final viewModels = _buildList(jsonString);
expect(viewModels, hasLength(10));
expect(viewModels[0].key, 'firstClass');
expect(viewModels[0].value, isNotNull);
expect(viewModels[0].isRoot, isTrue);
expect(viewModels[0].isClass, isTrue);
expect(viewModels[0].isArray, isFalse);
expect(viewModels[0].childrenCount, 2);
expect(viewModels[0].treeDepth, 0);
expect(viewModels[1].key, 'firstClass.firstField');
expect(viewModels[1].value, 'firstField');
expect(viewModels[1].isRoot, isFalse);
expect(viewModels[1].treeDepth, 1);
expect(viewModels[2].key, 'firstClass.array');
expect(viewModels[2].value, isNotNull);
expect(viewModels[2].isRoot, isTrue);
expect(viewModels[2].isArray, isTrue);
expect(viewModels[2].childrenCount, 2);
expect(viewModels[2].treeDepth, 1);
expect(viewModels[3].key, '0');
expect(viewModels[3].value, 1);
expect(viewModels[3].isRoot, isFalse);
expect(viewModels[3].treeDepth, 2);
expect(viewModels[4].key, '1');
expect(viewModels[4].value, 2);
expect(viewModels[4].isRoot, isFalse);
expect(viewModels[4].treeDepth, 2);
expect(viewModels[5].key, 'secondClass');
expect(viewModels[5].value, isNotNull);
expect(viewModels[5].isRoot, isTrue);
expect(viewModels[5].isClass, isTrue);
expect(viewModels[5].isArray, isFalse);
expect(viewModels[5].childrenCount, 2);
expect(viewModels[5].treeDepth, 0);
expect(viewModels[6].key, 'secondClass.firstField');
expect(viewModels[6].value, 'firstField');
expect(viewModels[6].isRoot, isFalse);
expect(viewModels[6].treeDepth, 1);
expect(viewModels[7].key, 'secondClass.array');
expect(viewModels[7].value, isNotNull);
expect(viewModels[7].isRoot, isTrue);
expect(viewModels[7].isArray, isTrue);
expect(viewModels[7].childrenCount, 2);
expect(viewModels[7].treeDepth, 1);
expect(viewModels[8].key, '0');
expect(viewModels[8].value, 3);
expect(viewModels[8].isRoot, isFalse);
expect(viewModels[8].treeDepth, 2);
expect(viewModels[9].key, '1');
expect(viewModels[9].value, 4);
expect(viewModels[9].isRoot, isFalse);
expect(viewModels[9].treeDepth, 2);
});
});
});
}