| // 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.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); |
| })); |
| }); |
| } |