blob: 0b909755fed82eb66802ae471784f57e62be0018 [file] [log] [blame]
// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
import 'dart:convert';
import 'package:convert/convert.dart';
import 'package:test/test.dart';
void main() {
group('encoder', () {
test('converts byte arrays to hex', () {
expect(hex.encode([0x1a, 0xb2, 0x3c, 0xd4]), equals('1ab23cd4'));
expect(hex.encode([0x00, 0x01, 0xfe, 0xff]), equals('0001feff'));
});
group('with chunked conversion', () {
test('converts byte arrays to hex', () {
var results = <String>[];
var controller = StreamController<String>(sync: true);
controller.stream.listen(results.add);
var sink = hex.encoder.startChunkedConversion(controller.sink);
sink.add([0x1a, 0xb2, 0x3c, 0xd4]);
expect(results, equals(['1ab23cd4']));
sink.add([0x00, 0x01, 0xfe, 0xff]);
expect(results, equals(['1ab23cd4', '0001feff']));
});
test('handles empty and single-byte lists', () {
var results = <String>[];
var controller = StreamController<String>(sync: true);
controller.stream.listen(results.add);
var sink = hex.encoder.startChunkedConversion(controller.sink);
sink.add([]);
expect(results, equals(['']));
sink.add([0x00]);
expect(results, equals(['', '00']));
sink.add([]);
expect(results, equals(['', '00', '']));
});
});
test('rejects non-bytes', () {
expect(() => hex.encode([0x100]), throwsFormatException);
var sink = hex.encoder.startChunkedConversion(
StreamController(sync: true),
);
expect(() => sink.add([0x100]), throwsFormatException);
});
});
group('decoder', () {
test('converts hex to byte arrays', () {
expect(hex.decode('1ab23cd4'), equals([0x1a, 0xb2, 0x3c, 0xd4]));
expect(hex.decode('0001feff'), equals([0x00, 0x01, 0xfe, 0xff]));
});
test('supports uppercase letters', () {
expect(
hex.decode('0123456789ABCDEFabcdef'),
equals([
0x01,
0x23,
0x45,
0x67,
0x89,
0xab,
0xcd,
0xef,
0xab,
0xcd,
0xef,
]),
);
});
group('with chunked conversion', () {
late List<List<int>> results;
late StringConversionSink sink;
setUp(() {
results = [];
var controller = StreamController<List<int>>(sync: true);
controller.stream.listen(results.add);
sink = hex.decoder.startChunkedConversion(controller.sink);
});
test('converts hex to byte arrays', () {
sink.add('1ab23cd4');
expect(
results,
equals([
[0x1a, 0xb2, 0x3c, 0xd4],
]),
);
sink.add('0001feff');
expect(
results,
equals([
[0x1a, 0xb2, 0x3c, 0xd4],
[0x00, 0x01, 0xfe, 0xff],
]),
);
});
test('supports trailing digits split across chunks', () {
sink.add('1ab23');
expect(
results,
equals([
[0x1a, 0xb2],
]),
);
sink.add('cd');
expect(
results,
equals([
[0x1a, 0xb2],
[0x3c],
]),
);
sink.add('40001');
expect(
results,
equals([
[0x1a, 0xb2],
[0x3c],
[0xd4, 0x00, 0x01],
]),
);
sink.add('feff');
expect(
results,
equals([
[0x1a, 0xb2],
[0x3c],
[0xd4, 0x00, 0x01],
[0xfe, 0xff],
]),
);
});
test('supports empty strings', () {
sink.add('');
expect(results, isEmpty);
sink.add('0');
expect(results, equals([<Never>[]]));
sink.add('');
expect(results, equals([<Never>[]]));
sink.add('0');
expect(
results,
equals([
<Never>[],
[0x00],
]),
);
sink.add('');
expect(
results,
equals([
<Never>[],
[0x00],
]),
);
});
test('rejects odd length detected in close()', () {
sink.add('1ab23');
expect(
results,
equals([
[0x1a, 0xb2],
]),
);
expect(() => sink.close(), throwsFormatException);
});
test('rejects odd length detected in addSlice()', () {
sink.addSlice('1ab23cd', 0, 5, false);
expect(
results,
equals([
[0x1a, 0xb2],
]),
);
expect(
() => sink.addSlice('1ab23cd', 5, 7, true),
throwsFormatException,
);
});
});
group('rejects non-hex character', () {
for (var char in [
'g',
'G',
'/',
':',
'@',
'`',
'\x00',
'\u0141',
'\u{10041}',
]) {
test('"$char"', () {
expect(() => hex.decode('a$char'), throwsFormatException);
expect(() => hex.decode('${char}a'), throwsFormatException);
var sink = hex.decoder.startChunkedConversion(
StreamController(sync: true),
);
expect(() => sink.add(char), throwsFormatException);
});
}
});
test('rejects odd length detected in convert()', () {
expect(() => hex.decode('1ab23cd'), throwsFormatException);
});
});
}