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