blob: d4b65005d3b03db36dcd20a02a7bab03cfd6c375 [file] [log] [blame]
Ben Murdochc5610432016-08-08 18:44:38 +01001// Copyright 2016 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5var limit = 10000;
6
7function testStringWrapper(string) {
8 assertEquals('a', string[0]);
9 assertEquals('b', string[1]);
10 assertEquals('c', string[2]);
11}
12
13(function testFastStringWrapperGrow() {
14 var string = new String("abc");
15 for (var i = 0; i < limit; i += 2) {
16 string[i] = {};
17 }
18 testStringWrapper(string);
19
20 for (var i = limit; i > 0; i -= 2) {
21 delete string[i];
22 }
23 testStringWrapper(string);
24})();
25
26(function testSlowStringWrapperGrow() {
27 var string = new String("abc");
28 // Force Slow String Wrapper Elements Kind
29 string[limit] = limit;
30 for (var i = 0; i < limit; i += 2) {
31 string[i] = {};
32 }
33 testStringWrapper(string);
34 assertEquals(limit, string[limit]);
35
36 for (var i = limit; i > 0; i -= 2) {
37 delete string[i];
38 }
39 testStringWrapper(string);
40 assertEquals(undefined, string[limit]);
41})();
42
43
44(function testReconfigureStringWrapperElements() {
45 var s = new String('abc');
46 // Can't reconfigure string contents.
47 assertThrows(() => Object.defineProperty(s, '1', {value: "value"}), TypeError);
48
49 // Configure a property outside the string range
50 var value = 'v1';
51 Object.defineProperty(s, '3', {
52 get: () => {return value},
53 configurable:true
54 });
55 assertEquals('v1', s[3]);
56 value = 'v2';
57 assertEquals('v2', s[3]);
58
59 Object.defineProperty(s, '3', {value: 'v3', configurable: false});
60 assertEquals('v3', s[3]);
61 assertThrows(() => Object.defineProperty(s, '3', {value:2}), TypeError);
62})();