| // Copyright 2015 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. | |
| var r1 = /abc/gi; | |
| assertEquals("abc", r1.source); | |
| assertTrue(r1.global); | |
| assertTrue(r1.ignoreCase); | |
| assertFalse(r1.multiline); | |
| assertFalse(r1.sticky); | |
| assertFalse(r1.unicode); | |
| // Internal slot of prototype is not read. | |
| var r2 = { __proto__: r1 }; | |
| assertThrows(function() { r2.source; }, TypeError); | |
| assertThrows(function() { r2.global; }, TypeError); | |
| assertThrows(function() { r2.ignoreCase; }, TypeError); | |
| assertThrows(function() { r2.multiline; }, TypeError); | |
| assertThrows(function() { r2.sticky; }, TypeError); | |
| assertThrows(function() { r2.unicode; }, TypeError); | |
| var r3 = /I/; | |
| var string = "iIiIi"; | |
| var expected = "iXiIi"; | |
| assertFalse(r3.global); | |
| assertFalse(r3.ignoreCase); | |
| assertEquals("", r3.flags); | |
| assertEquals(expected, string.replace(r3, "X")); | |
| var get_count = 0; | |
| Object.defineProperty(r3, "global", { | |
| get: function() { get_count++; return true; } | |
| }); | |
| Object.defineProperty(r3, "ignoreCase", { | |
| get: function() { get_count++; return true; } | |
| }); | |
| assertTrue(r3.global); | |
| assertEquals(1, get_count); | |
| assertTrue(r3.ignoreCase); | |
| assertEquals(2, get_count); | |
| // Overridden flag getters affects the flags getter. | |
| assertEquals("gi", r3.flags); | |
| assertEquals(4, get_count); | |
| // Overridden flag getters affect string.replace | |
| // TODO(adamk): Add more tests here once we've switched | |
| // to use [[OriginalFlags]] in more cases. | |
| // TODO(jgruber): This exact case actually causes an infinite loop in the spec | |
| // (@@replace sees global = true while BuiltinExec sees global = false). | |
| // Comment the test for now and remove / fix once this has been resolved on | |
| // the spec side. | |
| //assertEquals(expected, string.replace(r3, "X")); | |
| //assertEquals(5, get_count); | |
| function testName(name) { | |
| // Test for ES2017 RegExp web compatibility semantics | |
| // https://github.com/tc39/ecma262/pull/511 | |
| assertEquals(name === "source" ? "(?:)" : undefined, | |
| RegExp.prototype[name]); | |
| assertEquals( | |
| "get " + name, | |
| Object.getOwnPropertyDescriptor(RegExp.prototype, name).get.name); | |
| } | |
| testName("global"); | |
| testName("ignoreCase"); | |
| testName("multiline"); | |
| testName("source"); | |
| testName("sticky"); | |
| testName("unicode"); | |
| RegExp.prototype.flags = 'setter should be undefined'; | |
| assertEquals('', RegExp('').flags); | |
| assertEquals('', /./.flags); | |
| assertEquals('gimuy', RegExp('', 'yugmi').flags); | |
| assertEquals('gimuy', /foo/yumig.flags); | |
| var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, 'flags'); | |
| assertTrue(descriptor.configurable); | |
| assertFalse(descriptor.enumerable); | |
| assertInstanceof(descriptor.get, Function); | |
| assertEquals(undefined, descriptor.set); | |
| function testGenericFlags(object) { | |
| return descriptor.get.call(object); | |
| } | |
| assertEquals('', testGenericFlags({})); | |
| assertEquals('i', testGenericFlags({ ignoreCase: true })); | |
| assertEquals('uy', testGenericFlags({ global: 0, sticky: 1, unicode: 1 })); | |
| assertEquals('m', testGenericFlags({ __proto__: { multiline: true } })); | |
| assertThrows(function() { testGenericFlags(); }, TypeError); | |
| assertThrows(function() { testGenericFlags(undefined); }, TypeError); | |
| assertThrows(function() { testGenericFlags(null); }, TypeError); | |
| assertThrows(function() { testGenericFlags(true); }, TypeError); | |
| assertThrows(function() { testGenericFlags(false); }, TypeError); | |
| assertThrows(function() { testGenericFlags(''); }, TypeError); | |
| assertThrows(function() { testGenericFlags(42); }, TypeError); | |
| var counter = 0; | |
| var map = {}; | |
| var object = { | |
| get global() { | |
| map.g = counter++; | |
| }, | |
| get ignoreCase() { | |
| map.i = counter++; | |
| }, | |
| get multiline() { | |
| map.m = counter++; | |
| }, | |
| get unicode() { | |
| map.u = counter++; | |
| }, | |
| get sticky() { | |
| map.y = counter++; | |
| } | |
| }; | |
| testGenericFlags(object); | |
| assertEquals({ g: 0, i: 1, m: 2, u: 3, y: 4 }, map); |