// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Flags: --regexp-mode-modifiers

// These tests won't all run on the noi18n build of V8.

aa(/(a)(?i)\1/u);
aa(/([az])(?i)\1/u);

function aa(re) {
  assertTrue(re.test("aa"));
  assertTrue(re.test("aA"));
  assertFalse(re.test("Aa"));
  assertFalse(re.test("AA"));
}

aai(/(a)(?-i)\1/iu);
aai(/([az])(?-i)\1/iu);

function aai(re) {
  assertTrue(re.test("aa"));
  assertFalse(re.test("aA"));
  assertFalse(re.test("Aa"));
  assertTrue(re.test("AA"));
}

abcd(/a(b(?i)c)d/u);
abcd(/[aw]([bx](?i)[cy])[dz]/u);

function abcd(re) {
  assertTrue(re.test("abcd"));
  assertFalse(re.test("abcD"));
  assertTrue(re.test("abCd"));
  assertFalse(re.test("abCD"));
  assertFalse(re.test("aBcd"));
  assertFalse(re.test("aBcD"));
  assertFalse(re.test("aBCd"));
  assertFalse(re.test("aBCD"));
  assertFalse(re.test("Abcd"));
  assertFalse(re.test("AbcD"));
  assertFalse(re.test("AbCd"));
  assertFalse(re.test("AbCD"));
  assertFalse(re.test("ABcd"));
  assertFalse(re.test("ABcD"));
  assertFalse(re.test("ABCd"));
  assertFalse(re.test("ABCD"));
}

abcdei(/a(b(?-i)c)d/iu);
abcdei(/[aw]([bx](?-i)[cy])[dz]/iu);

function abcdei(re) {
  assertTrue(re.test("abcd"));
  assertTrue(re.test("abcD"));
  assertFalse(re.test("abCd"));
  assertFalse(re.test("abCD"));
  assertTrue(re.test("aBcd"));
  assertTrue(re.test("aBcD"));
  assertFalse(re.test("aBCd"));
  assertFalse(re.test("aBCD"));
  assertTrue(re.test("Abcd"));
  assertTrue(re.test("AbcD"));
  assertFalse(re.test("AbCd"));
  assertFalse(re.test("AbCD"));
  assertTrue(re.test("ABcd"));
  assertTrue(re.test("ABcD"));
  assertFalse(re.test("ABCd"));
  assertFalse(re.test("ABCD"));
}

abc(/a(?i:b)c/u);
abc(/[ax](?i:[by])[cz]/u);

function abc(re) {
  assertTrue(re.test("abc"));
  assertFalse(re.test("abC"));
  assertTrue(re.test("aBc"));
  assertFalse(re.test("aBC"));
  assertFalse(re.test("Abc"));
  assertFalse(re.test("AbC"));
  assertFalse(re.test("ABc"));
  assertFalse(re.test("ABC"));
}

abci(/a(?-i:b)c/iu);
abci(/[ax](?-i:[by])[cz]/iu);

function abci(re) {
  assertTrue(re.test("abc"));
  assertTrue(re.test("abC"));
  assertFalse(re.test("aBc"));
  assertFalse(re.test("aBC"));
  assertTrue(re.test("Abc"));
  assertTrue(re.test("AbC"));
  assertFalse(re.test("ABc"));
  assertFalse(re.test("ABC"));
}

// The following tests are taken from test/mjsunit/es7/regexp-ui-word.js but
// using inline syntax instead of the global /i flag.
assertTrue(/(?i)\w/u.test('\u017F'));
assertTrue(/(?i)\w/u.test('\u212A'));
assertFalse(/(?i)\W/u.test('\u017F'));
assertFalse(/(?i)\W/u.test('\u212A'));
assertFalse(/(?i)\W/u.test('s'));
assertFalse(/(?i)\W/u.test('S'));
assertFalse(/(?i)\W/u.test('K'));
assertFalse(/(?i)\W/u.test('k'));

assertTrue(/(?i)[\w]/u.test('\u017F'));
assertTrue(/(?i)[\w]/u.test('\u212A'));
assertFalse(/(?i)[\W]/u.test('\u017F'));
assertFalse(/(?i)[\W]/u.test('\u212A'));
assertFalse(/(?i)[\W]/u.test('s'));
assertFalse(/(?i)[\W]/u.test('S'));
assertFalse(/(?i)[\W]/u.test('K'));
assertFalse(/(?i)[\W]/u.test('k'));

assertTrue(/(?i)\b/u.test('\u017F'));
assertFalse(/(?i:)\b/u.test('\u017F'));
assertTrue(/(?i)\b/u.test('\u212A'));
assertFalse(/(?i:)\b/u.test('\u212A'));
assertTrue(/(?i)\b/u.test('s'));
assertTrue(/(?i)\b/u.test('S'));
assertFalse(/(?i)\B/u.test('\u017F'));
assertFalse(/(?i)\B/u.test('\u212A'));
assertFalse(/(?i)\B/u.test('s'));
assertFalse(/(?i)\B/u.test('S'));
assertFalse(/(?i)\B/u.test('K'));
assertFalse(/(?i)\B/u.test('k'));

assertEquals(["abcd\u017F", "\u017F"], /a.*?(.)(?i)\b/u.exec('abcd\u017F cd'));
assertEquals(["abcd\u212A", "\u212A"], /a.*?(.)(?i)\b/u.exec('abcd\u212A cd'));

assertEquals(["a\u017F", "\u017F"], /a.*?(?i:\B)(.)/u.exec('a\u017F '));
assertEquals(["a\u212A", "\u212A"], /a.*?(?i:\B)(.)/u.exec('a\u212A '));