blob: ab4871167399040fe87a29ccae9eefd8f44f4ebe [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 'package:collection/collection.dart';
import 'package:test/test.dart';
void main() {
var strings = [
'',
'\x00',
' ',
'+',
'/',
'0',
'00',
'000',
'001',
'01',
'011',
'1',
'100',
'11',
'110',
'9',
':',
'=',
'@',
'A',
'A0',
'A000A',
'A001A',
'A00A',
'A01A',
'A0A',
'A1A',
'AA',
'AAB',
'AB',
'Z',
'[',
'_',
'`',
'a',
'a0',
'a000a',
'a001a',
'a00a',
'a01a',
'a0a',
'a1a',
'aa',
'aab',
'ab',
'z',
'{',
'~'
];
List<String> sortedBy(int Function(String, String)? compare) =>
strings.toList()
..shuffle()
..sort(compare);
test('String.compareTo', () {
expect(sortedBy(null), strings);
});
test('compareAsciiLowerCase', () {
expect(sortedBy(compareAsciiLowerCase), sortedBy((a, b) {
var delta = a.toLowerCase().compareTo(b.toLowerCase());
if (delta != 0) return delta;
if (a == b) return 0;
return a.compareTo(b);
}));
});
test('compareAsciiUpperCase', () {
expect(sortedBy(compareAsciiUpperCase), sortedBy((a, b) {
var delta = a.toUpperCase().compareTo(b.toUpperCase());
if (delta != 0) return delta;
if (a == b) return 0;
return a.compareTo(b);
}));
});
// Replace any digit sequence by ("0", value, length) as char codes.
// This will sort alphabetically (by charcode) the way digits sort
// numerically, and the leading 0 means it sorts like a digit
// compared to non-digits.
String replaceNumbers(String string) =>
string.replaceAllMapped(RegExp(r'\d+'), (m) {
var digits = m[0]!;
return String.fromCharCodes([0x30, int.parse(digits), digits.length]);
});
test('compareNatural', () {
expect(sortedBy(compareNatural),
sortedBy((a, b) => replaceNumbers(a).compareTo(replaceNumbers(b))));
});
test('compareAsciiLowerCaseNatural', () {
expect(sortedBy(compareAsciiLowerCaseNatural), sortedBy((a, b) {
var delta = replaceNumbers(a.toLowerCase())
.compareTo(replaceNumbers(b.toLowerCase()));
if (delta != 0) return delta;
if (a == b) return 0;
return a.compareTo(b);
}));
});
test('compareAsciiUpperCaseNatural', () {
expect(sortedBy(compareAsciiUpperCaseNatural), sortedBy((a, b) {
var delta = replaceNumbers(a.toUpperCase())
.compareTo(replaceNumbers(b.toUpperCase()));
if (delta != 0) return delta;
if (a == b) return 0;
return a.compareTo(b);
}));
});
}