103 lines
2.8 KiB
Dart
103 lines
2.8 KiB
Dart
// Copyright (c) 2023, Sudipto Chandra
|
|
// All rights reserved. Check LICENSE file for details.
|
|
|
|
import 'dart:convert';
|
|
|
|
import 'package:hashlib/hashlib.dart';
|
|
import 'package:test/test.dart';
|
|
|
|
/// CRC-16 code for "123456789"
|
|
var known = {
|
|
CRC16Params.ibm: 0xBB3D,
|
|
CRC16Params.ccitt: 0x2189,
|
|
CRC16Params.arinc: 0xEBA4,
|
|
CRC16Params.cms: 0xAEE7,
|
|
CRC16Params.dds110: 0x9ECF,
|
|
CRC16Params.maximDow: 0x44C2,
|
|
CRC16Params.modbus: 0x4B37,
|
|
CRC16Params.umts: 0xFEE8,
|
|
CRC16Params.usb: 0xB4C8,
|
|
CRC16Params.genibus: 0xD64E,
|
|
CRC16Params.gsm: 0xCE3C,
|
|
CRC16Params.ibm3740: 0x29B1,
|
|
CRC16Params.ccittFalse: 0x29B1,
|
|
CRC16Params.ibmSdlc: 0x906E,
|
|
CRC16Params.x25: 0x906E,
|
|
CRC16Params.iso: 0xBF05,
|
|
CRC16Params.mcrf4xx: 0x6F91,
|
|
CRC16Params.riello: 0x63D0,
|
|
CRC16Params.augCcitt: 0xE5CC,
|
|
CRC16Params.spiFujitsu: 0xE5CC,
|
|
CRC16Params.tms37157: 0x26B1,
|
|
CRC16Params.xmodem: 0x31C3,
|
|
CRC16Params.cdma2000: 0x4C06,
|
|
CRC16Params.dectR: 0x007E,
|
|
CRC16Params.dectX: 0x007F,
|
|
CRC16Params.dnp: 0xEA82,
|
|
CRC16Params.en13757: 0xC2B7,
|
|
CRC16Params.lj1200: 0xBDF4,
|
|
CRC16Params.nrsc5: 0xA066,
|
|
CRC16Params.m17: 0x772B,
|
|
CRC16Params.opensafetyA: 0x5D38,
|
|
CRC16Params.opensafetyB: 0x20FE,
|
|
CRC16Params.profibus: 0xA819,
|
|
CRC16Params.t10Dif: 0xD0DB,
|
|
CRC16Params.teledisk: 0x0FB3,
|
|
};
|
|
|
|
void main() {
|
|
group('CRC test', () {
|
|
test("name", () {
|
|
expect(crc16.name, 'CRC-16/ARC');
|
|
});
|
|
test("name for defined polynomial", () {
|
|
expect(CRC16(CRC16Params.arinc).name, 'CRC-16/ARINC');
|
|
});
|
|
test("name for custom polynomial", () {
|
|
expect(CRC16(CRC16Params(0x1919)).name, 'CRC-16/1919');
|
|
});
|
|
|
|
test('code with an empty string', () {
|
|
expect(crc16code(""), 0);
|
|
});
|
|
test('with a string', () {
|
|
expect(crc16.string("Wikipedia").hex(), "ee3e");
|
|
});
|
|
test('code with a string', () {
|
|
expect(crc16.code("Wikipedia", utf8), 0xee3e);
|
|
});
|
|
|
|
test('createSink produces same result for same input', () {
|
|
final sink1 = crc16.createSink();
|
|
sink1.add(utf8.encode("TestString"));
|
|
final result1 = sink1.digest().hex();
|
|
|
|
final sink2 = crc16.createSink();
|
|
sink2.add(utf8.encode("TestString"));
|
|
final result2 = sink2.digest().hex();
|
|
|
|
expect(result1, equals(result2));
|
|
});
|
|
|
|
test('sink test', () {
|
|
final sink = crc16.createSink();
|
|
expect(sink.closed, isFalse);
|
|
sink.add([10, 20]);
|
|
expect(sink.closed, isFalse);
|
|
sink.close();
|
|
expect(sink.closed, isTrue);
|
|
expect(() => sink.add([10]), throwsStateError);
|
|
sink.reset();
|
|
expect(sink.closed, isFalse);
|
|
sink.add([10, 20, 30]);
|
|
expect(sink.digest().length, 2);
|
|
expect(sink.closed, isTrue);
|
|
});
|
|
|
|
for (var e in known.entries) {
|
|
test('check "${e.key.name}"', () {
|
|
expect(crc16code("123456789", params: e.key), e.value);
|
|
});
|
|
}
|
|
});
|
|
}
|