// Copyright (c) 2019, the Dart project authors. All rights reserved.
// Copyright 2011 the V8 project authors. 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 'package:expect/expect.dart';

import 'v8_regexp_utils.dart';

void execl(List<String>? expectation, RegExp re, String subject) {
  shouldBe(re.firstMatch(subject), expectation);
}

void execs(List<String>? expectation, String pattern, String subject) {
  final re = RegExp(pattern, unicode: true);
  shouldBe(re.firstMatch(subject), expectation);
}

void main() {
  // Character ranges.
  execs(["A"], r"[A-D]", "A");
  execs(["ABCD"], r"[A-D]+", "ZABCDEF");

  execs(["\u{12345}"], r"[\u1234-\u{12345}]", "\u{12345}");
  execs(null, r"[^\u1234-\u{12345}]", "\u{12345}");

  execs(["\u{1234}"], r"[\u1234-\u{12345}]", "\u{1234}");
  execs(null, r"[^\u1234-\u{12345}]", "\u{1234}");

  execs(null, r"[\u1234-\u{12345}]", "\u{1233}");
  execs(["\u{1233}"], r"[^\u1234-\u{12345}]", "\u{1233}");

  execs(["\u{12346}"], r"[^\u1234-\u{12345}]", "\u{12346}");
  execs(null, r"[\u1234-\u{12345}]", "\u{12346}");

  execs(["\u{12342}"], r"[\u{12340}-\u{12345}]", "\u{12342}");
  execs(["\u{12342}"], r"[\ud808\udf40-\ud808\udf45]", "\u{12342}");
  execs(null, r"[^\u{12340}-\u{12345}]", "\u{12342}");
  execs(null, r"[^\ud808\udf40-\ud808\udf45]", "\u{12342}");

  execs(["\u{ffff}"], r"[\u{ff80}-\u{12345}]", "\u{ffff}");
  execs(["\u{ffff}"], r"[\u{ff80}-\ud808\udf45]", "\u{ffff}");
  execs(null, r"[^\u{ff80}-\u{12345}]", "\u{ffff}");
  execs(null, r"[^\u{ff80}-\ud808\udf45]", "\u{ffff}");

  // Lone surrogate
  execs(["\udc00"], r"[^\u{ff80}-\u{12345}]", "\uff99\u{dc00}A");
  execs(["\udc01"], r"[\u0100-\u{10ffff}]", "A\udc01");
  execs(["\udc03"], r"[\udc01-\udc03]", "\ud801\udc02\udc03");
  execs(["\ud801"], r"[\ud801-\ud803]", "\ud802\udc01\ud801");

  // Paired surrogate.
  execs(null, r"[^\u{ff80}-\u{12345}]", "\u{d800}\u{dc00}");
  execs(["\ud800\udc00"], r"[\u{ff80}-\u{12345}]", "\u{d800}\u{dc00}");
  execs(["foo\u{10e6d}bar"], r"foo\ud803\ude6dbar", "foo\u{10e6d}bar");

  // Lone surrogates
  execs(["\ud801\ud801"], r"\ud801+", "\ud801\udc01\ud801\ud801");
  execs(["\udc01\udc01"], r"\udc01+", "\ud801\ud801\udc01\udc01\udc01");

  execs(["\udc02\udc03A"], r"\W\WA", "\ud801\udc01A\udc02\udc03A");
  execs(["\ud801\ud802"], r"\ud801.", "\ud801\udc01\ud801\ud802");
  execs(["\udc02\udc03A"], r"[\ud800-\udfff][\ud800-\udfff]A",
      "\ud801\udc01A\udc02\udc03A");

  // Character classes
  execs(null, r"\w", "\ud801\udc01");
  execl(["\ud801"], RegExp(r"[^\w]"), "\ud801\udc01");
  execs(["\ud801\udc01"], r"[^\w]", "\ud801\udc01");
  execl(["\ud801"], RegExp(r"\W"), "\ud801\udc01");
  execs(["\ud801\udc01"], r"\W", "\ud801\udc01");

  execs(["\ud800X"], r".X", "\ud800XaX");
  execs(["aX"], r".(?<!\ud800)X", "\ud800XaX");
  execs(["aX"], r".(?<![\ud800-\ud900])X", "\ud800XaX");

  execs(null, r"[]", "\u1234");
  execs(["0abc"], r"[^]abc", "0abc");
  execs(["\u1234abc"], r"[^]abc", "\u1234abc");
  execs(["\u{12345}abc"], r"[^]abc", "\u{12345}abc");

  execs(null, r"[\u{0}-\u{1F444}]", "\ud83d\udfff");

  // Backward matches of lone surrogates.
  execs(["B", "\ud803A"], r"(?<=([\ud800-\ud900]A))B",
      "\ud801\udc00AB\udc00AB\ud802\ud803AB");
  execs(["B", "\udc00A"], r"(?<=([\ud800-\u{10300}]A))B",
      "\ud801\udc00AB\udc00AB\ud802\ud803AB");
  execs(["B", "\udc11A"], r"(?<=([\udc00-\udd00]A))B",
      "\ud801\udc00AB\udc11AB\ud802\ud803AB");
  execs(["X", "\ud800C"], r"(?<=(\ud800\w))X",
      "\ud800\udc00AX\udc11BX\ud800\ud800CX");
  execs(["C", "\ud800\ud800"], r"(?<=(\ud800.))\w",
      "\ud800\udc00AX\udc11BX\ud800\ud800CX");
  execs(["X", "\udc01C"], r"(?<=(\udc01\w))X",
      "\ud800\udc01AX\udc11BX\udc01\udc01CX");
  execs(["C", "\udc01\udc01"], r"(?<=(\udc01.)).",
      "\ud800\udc01AX\udc11BX\udc01\udc01CX");

  const L = "\ud800";
  const T = "\udc00";
  const X = "X";

  // Test string contains only match.
  void testw(bool expect, String src, String subject) {
    var re = RegExp(r"^" + src + r"$", unicode: true);
    assertEquals(expect, re.hasMatch(subject));
  }

  // Test string starts with match.
  void tests(bool expect, String src, String subject) {
    var re = RegExp(r"^" + src, unicode: true);
    assertEquals(expect, re.hasMatch(subject));
  }

  testw(true, X, X);
  testw(true, L, L);
  testw(true, T, T);
  testw(true, L + T, L + T);
  testw(true, T + L, T + L);
  testw(false, T, L + T);
  testw(false, L, L + T);
  testw(true, r".(?<=" + L + r")", L);
  testw(true, r".(?<=" + T + r")", T);
  testw(true, r".(?<=" + L + T + r")", L + T);
  testw(true, r".(?<=" + L + T + r")", L + T);
  tests(true, r".(?<=" + T + r")", T + L);
  tests(false, r".(?<=" + L + r")", L + T);
  tests(false, r".(?<=" + T + r")", L + T);
  tests(true, r"..(?<=" + T + r")", T + T + L);
  tests(true, r"..(?<=" + T + r")", X + T + L);
  tests(true, r"...(?<=" + L + r")", X + T + L);
  tests(false, r"...(?<=" + T + r")", X + L + T);
  tests(true, r"..(?<=" + L + T + r")", X + L + T);
  tests(true, r"..(?<=" + L + T + r"(?<=" + L + T + r"))", X + L + T);
  tests(false, r"..(?<=" + L + r"(" + T + r"))", X + L + T);
  tests(false, r".*" + L, X + L + T);
  tests(true, r".*" + L, X + L + L + T);
  tests(false, r".*" + L, X + L + T + L + T);
  tests(false, r".*" + T, X + L + T + L + T);
  tests(true, r".*" + T, X + L + T + T + L + T);
}
