// Copyright (c) 2014, the Dart project authors. All rights reserved.
// Copyright 2013 the V8 project authors. All rights reserved.
// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1.  Redistributions of source code must retain the above copyright
//     notice, this list of conditions and the following disclaimer.
// 2.  Redistributions in binary form must reproduce the above copyright
//     notice, this list of conditions and the following disclaimer in the
//     documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import 'v8_regexp_utils.dart';
import 'package:expect/expect.dart';

void main() {
  shouldBeTrue(
    new RegExp(r"ΣΤΙΓΜΑΣ", caseSensitive: false).hasMatch("στιγμας"),
  );
  shouldBeTrue(new RegExp(r"ΔΣΔ", caseSensitive: false).hasMatch("δςδ"));
  shouldBeTrue(new RegExp(r"ς", caseSensitive: false).hasMatch("σ"));
  shouldBeTrue(new RegExp(r"σ", caseSensitive: false).hasMatch("ς"));

  // Simple case, has no canonical equivalents
  shouldBeTrue(new RegExp(r"\u1f16", caseSensitive: false).hasMatch("\u1f16"));

  // Test the sets of USC2 code points that have more than one canonically equivalent value.
  dynamic ucs2CodePoint(x) => new String.fromCharCode(x);
  dynamic testSet(s) {
    for (var i in s) {
      for (var j in s) {
        shouldBeTrue(
          new RegExp(
            ucs2CodePoint(i),
            caseSensitive: false,
          ).hasMatch(ucs2CodePoint(j)),
        );
        shouldBeTrue(
          new RegExp(
            "[${ucs2CodePoint(i - 1)}-${ucs2CodePoint(i + 1)}]",
            caseSensitive: false,
          ).hasMatch(ucs2CodePoint(j)),
        );
      }
    }
  }

  testSet([0x01c4, 0x01c5, 0x01c6]);
  testSet([0x01c7, 0x01c8, 0x01c9]);
  testSet([0x01ca, 0x01cb, 0x01cc]);
  testSet([0x01f1, 0x01f2, 0x01f3]);
  testSet([0x0392, 0x03b2, 0x03d0]);
  testSet([0x0395, 0x03b5, 0x03f5]);
  testSet([0x0398, 0x03b8, 0x03d1]);
  testSet([0x0345, 0x0399, 0x03b9, 0x1fbe]);
  testSet([0x039a, 0x03ba, 0x03f0]);
  testSet([0x00b5, 0x039c, 0x03bc]);
  testSet([0x03a0, 0x03c0, 0x03d6]);
  testSet([0x03a1, 0x03c1, 0x03f1]);
  testSet([0x03a3, 0x03c2, 0x03c3]);
  testSet([0x03a6, 0x03c6, 0x03d5]);
  testSet([0x1e60, 0x1e61, 0x1e9b]);

  // Test a couple of lo/hi pairs
  shouldBeTrue(new RegExp(r"\u03cf", caseSensitive: false).hasMatch("\u03cf"));
  shouldBeTrue(new RegExp(r"\u03d7", caseSensitive: false).hasMatch("\u03cf"));
  shouldBeTrue(new RegExp(r"\u03cf", caseSensitive: false).hasMatch("\u03d7"));
  shouldBeTrue(new RegExp(r"\u03d7", caseSensitive: false).hasMatch("\u03d7"));
  shouldBeTrue(new RegExp(r"\u1f11", caseSensitive: false).hasMatch("\u1f11"));
  shouldBeTrue(new RegExp(r"\u1f19", caseSensitive: false).hasMatch("\u1f11"));
  shouldBeTrue(new RegExp(r"\u1f11", caseSensitive: false).hasMatch("\u1f19"));
  shouldBeTrue(new RegExp(r"\u1f19", caseSensitive: false).hasMatch("\u1f19"));

  // Test an aligned alternating capitalization pair.
  shouldBeFalse(new RegExp(r"\u0489", caseSensitive: false).hasMatch("\u048a"));
  shouldBeTrue(new RegExp(r"\u048a", caseSensitive: false).hasMatch("\u048a"));
  shouldBeTrue(new RegExp(r"\u048b", caseSensitive: false).hasMatch("\u048a"));
  shouldBeFalse(new RegExp(r"\u048c", caseSensitive: false).hasMatch("\u048a"));
  shouldBeFalse(new RegExp(r"\u0489", caseSensitive: false).hasMatch("\u048b"));
  shouldBeTrue(new RegExp(r"\u048a", caseSensitive: false).hasMatch("\u048b"));
  shouldBeTrue(new RegExp(r"\u048b", caseSensitive: false).hasMatch("\u048b"));
  shouldBeFalse(new RegExp(r"\u048c", caseSensitive: false).hasMatch("\u048b"));
  shouldBeTrue(
    new RegExp(r"[\u0489-\u048a]", caseSensitive: false).hasMatch("\u048b"),
  );
  shouldBeTrue(
    new RegExp(r"[\u048b-\u048c]", caseSensitive: false).hasMatch("\u048a"),
  );

  // Test an unaligned alternating capitalization pair.
  shouldBeFalse(new RegExp(r"\u04c4", caseSensitive: false).hasMatch("\u04c5"));
  shouldBeTrue(new RegExp(r"\u04c5", caseSensitive: false).hasMatch("\u04c5"));
  shouldBeTrue(new RegExp(r"\u04c6", caseSensitive: false).hasMatch("\u04c5"));
  shouldBeFalse(new RegExp(r"\u04c7", caseSensitive: false).hasMatch("\u04c5"));
  shouldBeFalse(new RegExp(r"\u04c4", caseSensitive: false).hasMatch("\u04c6"));
  shouldBeTrue(new RegExp(r"\u04c5", caseSensitive: false).hasMatch("\u04c6"));
  shouldBeTrue(new RegExp(r"\u04c6", caseSensitive: false).hasMatch("\u04c6"));
  shouldBeFalse(new RegExp(r"\u04c7", caseSensitive: false).hasMatch("\u04c6"));
  shouldBeTrue(
    new RegExp(r"[\u04c4-\u04c5]", caseSensitive: false).hasMatch("\u04c6"),
  );
  shouldBeTrue(
    new RegExp(r"[\u04c6-\u04c7]", caseSensitive: false).hasMatch("\u04c5"),
  );

  var successfullyParsed = true;
}
