| Index: packages/collection/test/comparators_test.dart
 | 
| diff --git a/packages/collection/test/comparators_test.dart b/packages/collection/test/comparators_test.dart
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..4acdc2c18716c05f9ecd5f0a972e8b94a58cf4a8
 | 
| --- /dev/null
 | 
| +++ b/packages/collection/test/comparators_test.dart
 | 
| @@ -0,0 +1,119 @@
 | 
| +// 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);
 | 
| +           }));
 | 
| +  });
 | 
| +}
 | 
| 
 |