// Copyright (c) 2016, 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.

/// Tests case-ignoring compare and equality.

import "package:collection/collection.dart";
import "package:test/test.dart";

main() {
  test("equality ignore ASCII case", () {
    var strings = [
      "0@`aopz[{",
      "0@`aopz[{",
      "0@`Aopz[{",
      "0@`aOpz[{",
      "0@`AOpz[{",
      "0@`aoPz[{",
      "0@`AoPz[{",
      "0@`aOPz[{",
      "0@`AOPz[{",
      "0@`aopZ[{",
      "0@`AopZ[{",
      "0@`aOpZ[{",
      "0@`AOpZ[{",
      "0@`aoPZ[{",
      "0@`AoPZ[{",
      "0@`aOPZ[{",
      "0@`AOPZ[{",
    ];

    for (var s1 in strings) {
      for (var s2 in strings) {
        var reason = "$s1 =?= $s2";
        expect(equalsIgnoreAsciiCase(s1, s2), true, reason: reason);
        expect(hashIgnoreAsciiCase(s1), hashIgnoreAsciiCase(s2),
            reason: reason);
      }
    }

    var upperCaseLetters = "@`abcdefghijklmnopqrstuvwxyz[{åÅ";
    var lowerCaseLetters = "@`ABCDEFGHIJKLMNOPQRSTUVWXYZ[{åÅ";
    expect(equalsIgnoreAsciiCase(upperCaseLetters, lowerCaseLetters), true);

    testChars(String char1, String char2, bool areEqual) {
      expect(equalsIgnoreAsciiCase(char1, char2), areEqual,
          reason: "$char1 ${areEqual ? "=" : "!"}= $char2");
    }

    for (int i = 0; i < upperCaseLetters.length; i++) {
      for (int j = 0; i < upperCaseLetters.length; i++) {
        testChars(upperCaseLetters[i], upperCaseLetters[j], i == j);
        testChars(lowerCaseLetters[i], upperCaseLetters[j], i == j);
        testChars(upperCaseLetters[i], lowerCaseLetters[j], i == j);
        testChars(lowerCaseLetters[i], lowerCaseLetters[j], i == j);
      }
    }
  });
}
