| // 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 | 
 |  | 
 | aa(/(a)(?i)\1/); | 
 | aa(/([az])(?i)\1/); | 
 |  | 
 | function aa(re) { | 
 |   assertTrue(re.test("aa")); | 
 |   assertTrue(re.test("aA")); | 
 |   assertFalse(re.test("Aa")); | 
 |   assertFalse(re.test("AA")); | 
 | } | 
 |  | 
 | aai(/(a)(?-i)\1/i); | 
 | aai(/([az])(?-i)\1/i); | 
 |  | 
 | 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/); | 
 | abcd(/[aw]([bx](?i)[cy])[dz]/); | 
 |  | 
 | 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/i); | 
 | abcdei(/[aw]([bx](?-i)[cy])[dz]/i); | 
 |  | 
 | 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/); | 
 | abc(/[ax](?i:[by])[cz]/); | 
 |  | 
 | 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/i); | 
 | abci(/[ax](?-i:[by])[cz]/i); | 
 |  | 
 | 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")); | 
 | } | 
 |  | 
 | assertThrows(() => new RegExp("foo(?i:")); | 
 | assertThrows(() => new RegExp("foo(?--i)")); | 
 | assertThrows(() => new RegExp("foo(?i-i)")); | 
 |  | 
 | assertThrows(() => new RegExp("foo(?m:")); | 
 | assertThrows(() => new RegExp("foo(?--m)")); | 
 | assertThrows(() => new RegExp("foo(?m-m)")); | 
 |  | 
 | var re = /^\s(?m)^.$\s(?-m)$/; | 
 | assertTrue(re.test("\n.\n")); | 
 | assertFalse(re.test(" .\n")); | 
 | assertFalse(re.test("\n. ")); | 
 | assertFalse(re.test(" . ")); | 
 | assertFalse(re.test("_\n.\n")); | 
 | assertFalse(re.test("\n.\n_")); | 
 | assertFalse(re.test("_\n.\n_")); | 
 |  | 
 | assertEquals(["abcd", "d"], /a.*?(.)(?i)\b/.exec('abcd\u017F cd')); | 
 | assertEquals(["abcd", "d"], /a.*?(.)(?i)\b/.exec('abcd\u212A cd')); | 
 |  | 
 | assertEquals(["a\u017F ", " "], /a.*?(?i)\B(.)/.exec('a\u017F ')); | 
 | assertEquals(["a\u212A ", " "], /a.*?(?i)\B(.)/.exec('a\u212A ')); | 
 |  | 
 | // Nested flags. | 
 | var res = [ | 
 |   /^a(?i:b(?-i:c(?i:d)e)f)g$/, | 
 |   /^a(?i:b(?-i)c(?i)d(?-i)e(?i)f)g$/, | 
 |   /^(?-i:a(?i:b(?-i:c(?i:d)e)f)g)$/i, | 
 |   /^(?-i:a(?i:b(?-i)c(?i)d(?-i)e(?i)f)g)$/i, | 
 | ]; | 
 |  | 
 | for (var idx = 0; idx < res.length; idx++) { | 
 |   var re = res[idx]; | 
 |   for (var i = 0; i < 128; i++) { | 
 |     var s = (i & 1) ? "A" : "a"; | 
 |     s += (i & 2) ? "B" : "b"; | 
 |     s += (i & 4) ? "C" : "c"; | 
 |     s += (i & 8) ? "D" : "d"; | 
 |     s += (i & 16) ? "E" : "e"; | 
 |     s += (i & 32) ? "F" : "f"; | 
 |     s += (i & 64) ? "G" : "g"; | 
 |     if ((i & (1 | 4 | 16 | 64)) != 0) { | 
 |       assertFalse(re.test(s), s); | 
 |     } else { | 
 |       assertTrue(re.test(s), s); | 
 |     } | 
 |   } | 
 | } |