blob: 169c688ca1a4847aee4396353621033e54461bfe [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() {
List<String> 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",
"{",
"~"
];
sortedBy(compare) => strings.toList()..shuffle()..sort(compare);
test("String.compareTo", () {
expect(sortedBy(null), strings);
});
test("compareAsciiLowerCase", () {
expect(sortedBy(compareAsciiLowerCase),
sortedBy((a, b) {
int 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) {
int 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.
replaceNumbers(String string) => string.replaceAllMapped(new RegExp(r"\d+"), (m) {
var digits = m[0];
return new 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) {
int 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) {
int delta = replaceNumbers(a.toUpperCase()).compareTo(
replaceNumbers(b.toUpperCase()));
if (delta != 0) return delta;
if (a == b) return 0;
return a.compareTo(b);
}));
});
}