// 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.

// @dart = 2.9

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