blob: 143631dbc8ae383e028f4896cc56306fba519a2e [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// Copyright 2013 the V8 project authors. All rights reserved.
2// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions
6// are met:
7// 1. Redistributions of source code must retain the above copyright
8// notice, this list of conditions and the following disclaimer.
9// 2. Redistributions in binary form must reproduce the above copyright
10// notice, this list of conditions and the following disclaimer in the
11// documentation and/or other materials provided with the distribution.
12//
13// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
24description(
25"This page tests that a RegExp object's lastIndex behaves like a regular property."
26);
27
28// lastIndex is not configurable
29shouldBeFalse("delete /x/.lastIndex");
30shouldThrow("'use strict'; delete /x/.lastIndex");
31
32// lastIndex is not enumerable
33shouldBeTrue("'lastIndex' in /x/");
34shouldBeTrue("for (property in /x/) if (property === 'lastIndex') throw false; true");
35
36// lastIndex is writable
37shouldBeTrue("var re = /x/; re.lastIndex = re; re.lastIndex === re");
38
39// Cannot redefine lastIndex as an accessor
40shouldThrow("Object.defineProperty(/x/, {get:function(){}})");
41
42// Cannot redefine lastIndex as enumerable
43shouldThrow("Object.defineProperty(/x/, 'lastIndex', {enumerable:true}); true");
44shouldBeTrue("Object.defineProperty(/x/, 'lastIndex', {enumerable:false}); true");
45
46// Cannot redefine lastIndex as configurable
47shouldThrow("Object.defineProperty(/x/, 'lastIndex', {configurable:true}); true");
48shouldBeTrue("Object.defineProperty(/x/, 'lastIndex', {configurable:false}); true");
49
50// Can redefine lastIndex as read-only
51shouldBe("var re = Object.defineProperty(/x/, 'lastIndex', {writable:true}); re.lastIndex = 42; re.lastIndex", '42');
52shouldBe("var re = Object.defineProperty(/x/, 'lastIndex', {writable:false}); re.lastIndex = 42; re.lastIndex", '0');
53
54// Can redefine the value
55shouldBe("var re = Object.defineProperty(/x/, 'lastIndex', {value:42}); re.lastIndex", '42');
56
57// Cannot redefine read-only lastIndex as writable
58shouldThrow("Object.defineProperty(Object.defineProperty(/x/, 'lastIndex', {writable:false}), 'lastIndex', {writable:true}); true");
59
60// Can only redefine the value of a read-only lastIndex as the current value
61shouldThrow("Object.defineProperty(Object.defineProperty(/x/, 'lastIndex', {writable:false}), 'lastIndex', {value:42}); true");
62shouldBeTrue("Object.defineProperty(Object.defineProperty(/x/, 'lastIndex', {writable:false}), 'lastIndex', {value:0}); true");
63
64// Trying to run a global regular expression should throw, if lastIndex is read-only
65shouldBe("Object.defineProperty(/x/, 'lastIndex', {writable:false}).exec('')", 'null');
66shouldBe("Object.defineProperty(/x/, 'lastIndex', {writable:false}).exec('x')", '["x"]');
67shouldThrow("Object.defineProperty(/x/g, 'lastIndex', {writable:false}).exec('')");
68shouldThrow("Object.defineProperty(/x/g, 'lastIndex', {writable:false}).exec('x')");
69
70// Should be able to freeze a regular expression object.
71shouldBeTrue("var re = /x/; Object.freeze(re); Object.isFrozen(re);");