284 lines
10 KiB
Dart
284 lines
10 KiB
Dart
import 'package:ini_parser/ini_parser.dart';
|
|
import 'package:ini_parser/models/ini_config.dart';
|
|
import 'package:spec/spec.dart';
|
|
|
|
void main() {
|
|
group('Constants', () {
|
|
group('success', () {
|
|
const raw = r'''
|
|
[Constants]
|
|
endianness = little
|
|
nPages = 15
|
|
pageSize = 128, 288, 288, 128, 288, 128, 240, 384, 192, 192, 288, 192, 128, 288, 256
|
|
pageIdentifier = "$tsCanId\x01 ", "$tsCanId\x02", "$tsCanId\x03", "$tsCanId\x04", "$tsCanId\x05", "$tsCanId\x06", "$tsCanId\x07", "$tsCanId\x08", "$tsCanId\x09", "$tsCanId\x0A", "$tsCanId\x0B", "$tsCanId\x0C", "$tsCanId\x0D", "$tsCanId\x0E", "$tsCanId\x0F"
|
|
|
|
page = 1
|
|
aseTaperTime = scalar, U08, 0, "S", 0.1, 0.0, 0.0, 25.5, 1
|
|
divider = scalar, U08, 25, "", 1.0, 0.0
|
|
aeMode = bits, U08, 3, [0:1], "TPS", "MAP", "INVALID", "INVALID"
|
|
iat_adcChannel = bits, U08, 348, [0:5], 0="NONE", 1="18 - AN temp 1",13="19 - AN volt 4",5="28 - AN volt 10, Aux Reuse"
|
|
cltAdvValues = array, S08, 77, [ 6x6], "deg", 1.0, -15, -15, 15, 0
|
|
|
|
page = 2
|
|
fuelLoadBins = array, U08, 272, [ 16], { bitStringValue(algorithmUnits , algorithm) }, fuelLoadRes, 0.0, 0.0, {fuelLoadMax}, fuelDecimalRes
|
|
engineMake = string, ASCII, 1092, 32
|
|
unusedBits4_123 = bits, U08, 123, [3:7]
|
|
rtc_trim = scalar, S08, 123, "ppm", 1, 0, -127, +127, 0
|
|
inj4CylPairing = bits, U08, 123, [1:2], "1+3 & 2+4", "1+4 & 2+3", "INVALID", "INVALID"
|
|
''';
|
|
|
|
test('config', () async {
|
|
final result = await INIParser(raw).parse();
|
|
|
|
expect(result.constants.config.endianness).toEqual('little');
|
|
expect(result.constants.config.nPages).toEqual(15);
|
|
expect(result.constants.config.pageSizes).toEqual([
|
|
128,
|
|
288,
|
|
288,
|
|
128,
|
|
288,
|
|
128,
|
|
240,
|
|
384,
|
|
192,
|
|
192,
|
|
288,
|
|
192,
|
|
128,
|
|
288,
|
|
256,
|
|
]);
|
|
expect(result.constants.config.pageIdentifiers).toEqual([
|
|
r'$tsCanId\x01',
|
|
r'$tsCanId\x02',
|
|
r'$tsCanId\x03',
|
|
r'$tsCanId\x04',
|
|
r'$tsCanId\x05',
|
|
r'$tsCanId\x06',
|
|
r'$tsCanId\x07',
|
|
r'$tsCanId\x08',
|
|
r'$tsCanId\x09',
|
|
r'$tsCanId\x0A',
|
|
r'$tsCanId\x0B',
|
|
r'$tsCanId\x0C',
|
|
r'$tsCanId\x0D',
|
|
r'$tsCanId\x0E',
|
|
r'$tsCanId\x0F',
|
|
]);
|
|
});
|
|
|
|
test('scalar long', () async {
|
|
final result = await INIParser(raw).parse();
|
|
final constant =
|
|
result.constants.pages[0].constants[0] as ConstantScalar;
|
|
|
|
expect(result.constants.pages.length).toEqual(2);
|
|
expect(result.constants.pages[0].number).toEqual(1);
|
|
expect(constant.name).toEqual('aseTaperTime');
|
|
expect(constant.type).toEqual(ConstantType.scalar);
|
|
expect(constant.size).toEqual(ConstantSize.u08);
|
|
expect(constant.offset).toEqual(0);
|
|
expect(constant.units).toEqual('S');
|
|
expect(constant.scale).toEqual('0.1');
|
|
expect(constant.transform).toEqual('0.0');
|
|
expect(constant.min).toEqual('0.0');
|
|
expect(constant.max).toEqual('25.5');
|
|
expect(constant.digits).toEqual('1');
|
|
});
|
|
|
|
test('scalar short', () async {
|
|
final result = await INIParser(raw).parse();
|
|
final constant =
|
|
result.constants.pages[0].constants[1] as ConstantScalar;
|
|
|
|
expect(result.constants.pages.length).toEqual(2);
|
|
expect(constant.name).toEqual('divider');
|
|
expect(constant.type).toEqual(ConstantType.scalar);
|
|
expect(constant.size).toEqual(ConstantSize.u08);
|
|
expect(constant.offset).toEqual(25);
|
|
expect(constant.units).toEqual('');
|
|
expect(constant.scale).toEqual('1.0');
|
|
expect(constant.transform).toEqual('0.0');
|
|
expect(constant.min).toBeNull();
|
|
expect(constant.max).toBeNull();
|
|
expect(constant.digits).toBeNull();
|
|
});
|
|
|
|
test('bits - regular list', () async {
|
|
final result = await INIParser(raw).parse();
|
|
final constant = result.constants.pages[0].constants[2] as ConstantBits;
|
|
|
|
expect(result.constants.pages.length).toEqual(2);
|
|
expect(constant.name).toEqual('aeMode');
|
|
expect(constant.type).toEqual(ConstantType.bits);
|
|
expect(constant.size).toEqual(ConstantSize.u08);
|
|
expect(constant.offset).toEqual(3);
|
|
expect(constant.bits.low).toEqual(0);
|
|
expect(constant.bits.high).toEqual(1);
|
|
expect(constant.options).toEqual({
|
|
0: 'TPS',
|
|
1: 'MAP',
|
|
2: 'INVALID',
|
|
3: 'INVALID',
|
|
});
|
|
});
|
|
|
|
test('bits - list with keys', () async {
|
|
final result = await INIParser(raw).parse();
|
|
final constant = result.constants.pages[0].constants[3] as ConstantBits;
|
|
|
|
expect(result.constants.pages.length).toEqual(2);
|
|
expect(constant.name).toEqual('iat_adcChannel');
|
|
expect(constant.type).toEqual(ConstantType.bits);
|
|
expect(constant.size).toEqual(ConstantSize.u08);
|
|
expect(constant.offset).toEqual(348);
|
|
expect(constant.bits.low).toEqual(0);
|
|
expect(constant.bits.high).toEqual(5);
|
|
expect(constant.options).toEqual({
|
|
0: 'NONE',
|
|
1: '18 - AN temp 1',
|
|
13: '19 - AN volt 4',
|
|
5: '28 - AN volt 10, Aux Reuse',
|
|
});
|
|
});
|
|
|
|
test('array', () async {
|
|
final result = await INIParser(raw).parse();
|
|
final constant =
|
|
result.constants.pages[0].constants[4] as ConstantArray;
|
|
|
|
expect(result.constants.pages.length).toEqual(2);
|
|
expect(constant.name).toEqual('cltAdvValues');
|
|
expect(constant.type).toEqual(ConstantType.array);
|
|
expect(constant.size).toEqual(ConstantSize.s08);
|
|
expect(constant.offset).toEqual(77);
|
|
expect(constant.shape.columns).toEqual(6);
|
|
expect(constant.shape.rows).toEqual(6);
|
|
expect(constant.units).toEqual('deg');
|
|
expect(constant.scale).toEqual('1.0');
|
|
expect(constant.transform).toEqual('-15');
|
|
expect(constant.min).toEqual('-15');
|
|
expect(constant.max).toEqual('15');
|
|
expect(constant.digits).toEqual('0');
|
|
});
|
|
|
|
test('array with expressions', () async {
|
|
final result = await INIParser(raw).parse();
|
|
final constant =
|
|
result.constants.pages[1].constants[0] as ConstantArray;
|
|
|
|
expect(result.constants.pages[1].number).toEqual(2);
|
|
expect(result.constants.pages.length).toEqual(2);
|
|
expect(constant.name).toEqual('fuelLoadBins');
|
|
expect(constant.type).toEqual(ConstantType.array);
|
|
expect(constant.size).toEqual(ConstantSize.u08);
|
|
expect(constant.offset).toEqual(272);
|
|
expect(constant.shape.columns).toEqual(16);
|
|
expect(constant.shape.rows).toBeNull();
|
|
expect(constant.units)
|
|
.toEqual('{ bitStringValue(algorithmUnits , algorithm) }');
|
|
expect(constant.scale).toEqual('fuelLoadRes');
|
|
expect(constant.transform).toEqual('0.0');
|
|
expect(constant.min).toEqual('0.0');
|
|
expect(constant.max).toEqual('{fuelLoadMax}');
|
|
expect(constant.digits).toEqual('fuelDecimalRes');
|
|
});
|
|
|
|
test('string', () async {
|
|
final result = await INIParser(raw).parse();
|
|
final constant =
|
|
result.constants.pages[1].constants[1] as ConstantString;
|
|
|
|
expect(result.constants.pages[1].number).toEqual(2);
|
|
expect(result.constants.pages.length).toEqual(2);
|
|
expect(constant.name).toEqual('engineMake');
|
|
expect(constant.type).toEqual(ConstantType.string);
|
|
expect(constant.size).toEqual(ConstantSize.ascii);
|
|
expect(constant.offset).toEqual(1092);
|
|
expect(constant.length).toEqual(32);
|
|
});
|
|
|
|
test('bits with no options', () async {
|
|
final result = await INIParser(raw).parse();
|
|
final constant = result.constants.pages[1].constants[2] as ConstantBits;
|
|
|
|
expect(constant.name).toEqual('unusedBits4_123');
|
|
expect(constant.type).toEqual(ConstantType.bits);
|
|
expect(constant.size).toEqual(ConstantSize.u08);
|
|
expect(constant.offset).toEqual(123);
|
|
expect(constant.bits.low).toEqual(3);
|
|
expect(constant.bits.high).toEqual(7);
|
|
expect(constant.options).toEqual({});
|
|
});
|
|
|
|
test('edge cases', () async {
|
|
final result = await INIParser(raw).parse();
|
|
final constant1 =
|
|
result.constants.pages[1].constants[3] as ConstantScalar;
|
|
|
|
expect(constant1.name).toEqual('rtc_trim');
|
|
expect(constant1.type).toEqual(ConstantType.scalar);
|
|
expect(constant1.size).toEqual(ConstantSize.s08);
|
|
expect(constant1.offset).toEqual(123);
|
|
expect(constant1.units).toEqual('ppm');
|
|
expect(constant1.scale).toEqual('1');
|
|
expect(constant1.transform).toEqual('0');
|
|
expect(constant1.min).toEqual('-127');
|
|
expect(constant1.max).toEqual('+127');
|
|
expect(constant1.digits).toEqual('0');
|
|
|
|
final constant2 =
|
|
result.constants.pages[1].constants[4] as ConstantBits;
|
|
|
|
expect(constant2.name).toEqual('inj4CylPairing');
|
|
expect(constant2.type).toEqual(ConstantType.bits);
|
|
expect(constant2.size).toEqual(ConstantSize.u08);
|
|
expect(constant2.offset).toEqual(123);
|
|
expect(constant2.bits.low).toEqual(1);
|
|
expect(constant2.bits.high).toEqual(2);
|
|
expect(constant2.options).toEqual({
|
|
0: '1+3 & 2+4',
|
|
1: '1+4 & 2+3',
|
|
2: 'INVALID',
|
|
3: 'INVALID',
|
|
});
|
|
});
|
|
});
|
|
|
|
group('failure', () {
|
|
group('invalid definition', () {
|
|
const raw = '''
|
|
[Constants]
|
|
test =
|
|
''';
|
|
test('ParserException', () async {
|
|
expect(() => INIParser(raw).parse()).throws.isException();
|
|
});
|
|
});
|
|
|
|
group('invalid type', () {
|
|
const raw = '''
|
|
[Constants]
|
|
page = 1
|
|
invalid = bats, U08, 3, [0:1], "TPS", "MAP", "INVALID", "INVALID"
|
|
''';
|
|
test('Unknown ConstantType', () async {
|
|
expect(() => INIParser(raw).parse()).throws.isException();
|
|
});
|
|
});
|
|
|
|
group('invalid size', () {
|
|
const raw = '''
|
|
[Constants]
|
|
page = 1
|
|
invalid = bits, X08, 3, [0:1], "TPS", "MAP", "INVALID", "INVALID"
|
|
''';
|
|
test('Unknown ConstantSize', () async {
|
|
expect(() => INIParser(raw).parse()).throws.isException();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
}
|