// Copyright (c) 2019, the Dart project authors. All rights reserved.
// Copyright 2016 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:
//
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * 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.
//     * Neither the name of Google Inc. nor the names of its
//       contributors may be used to endorse or promote products derived
//       from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
// OWNER OR 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 main() {
  void t(RegExp re, String s) {
    assertTrue(re.hasMatch(s));
  }

  void f(RegExp re, String s) {
    assertFalse(re.hasMatch(s));
  }

  t(RegExp(r"\p{Script=Common}+", unicode: true), ".");
  f(RegExp(r"\p{Script=Common}+", unicode: true),
      "supercalifragilisticexpialidocious");

  t(RegExp(r"\p{Script=Han}+", unicode: true), "话说天下大势，分久必合，合久必分");
  t(RegExp(r"\p{Script=Hani}+", unicode: true), "吾庄后有一桃园，花开正盛");
  f(RegExp(r"\p{Script=Han}+", unicode: true), "おはようございます");
  f(RegExp(r"\p{Script=Hani}+", unicode: true),
      "Something is rotten in the state of Denmark");

  t(RegExp(r"\p{Script=Latin}+", unicode: true),
      "Wie froh bin ich, daß ich weg bin!");
  t(RegExp(r"\p{Script=Latn}+", unicode: true),
      "It was a bright day in April, and the clocks were striking thirteen");
  f(RegExp(r"\p{Script=Latin}+", unicode: true), "奔腾千里荡尘埃，渡水登山紫雾开");
  f(RegExp(r"\p{Script=Latn}+", unicode: true), "いただきます");

  t(RegExp(r"\p{sc=Hiragana}", unicode: true), "いただきます");
  t(RegExp(r"\p{sc=Hira}", unicode: true), "ありがとうございました");
  f(RegExp(r"\p{sc=Hiragana}", unicode: true),
      "Als Gregor Samsa eines Morgens aus unruhigen Träumen erwachte");
  f(RegExp(r"\p{sc=Hira}", unicode: true), "Call me Ishmael");

  t(RegExp(r"\p{sc=Phoenician}", unicode: true), "\u{10900}\u{1091a}");
  t(RegExp(r"\p{sc=Phnx}", unicode: true), "\u{1091f}\u{10916}");
  f(RegExp(r"\p{sc=Phoenician}", unicode: true), "Arthur est un perroquet");
  f(RegExp(r"\p{sc=Phnx}", unicode: true), "设心狠毒非良士，操卓原来一路人");

  t(RegExp(r"\p{sc=Grek}", unicode: true),
      "ἄνδρα μοι ἔννεπε, μοῦσα, πολύτροπον, ὃς μάλα πολλὰ");
  t(RegExp(r"\p{sc=Greek}", unicode: true),
      "μῆνιν ἄειδε θεὰ Πηληϊάδεω Ἀχιλῆος");
  f(RegExp(r"\p{sc=Greek}", unicode: true), "高贤未服英雄志，屈节偏生杰士疑");
  f(RegExp(r"\p{sc=Greek}", unicode: true),
      "Mr. Jones, of the Manor Farm, had locked the hen-houses for the night");
}
