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

// @dart = 2.9

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