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