BackwardsGraph needs to consider back edges as the backward's root successor
[WebKit-https.git] / JSTests / es6 / String.prototype_methods_String.prototype.padStart.js
1 function shouldBe(expected, actual, msg) {
2     if (msg === void 0)
3         msg = '';
4     else
5         msg = ' for ' + msg;
6     if (actual !== expected)
7         throw new Error('bad value' + msg + ': ' + actual + '. Expected ' + expected);
8 }
9
10 function shouldThrow(func, errorMessage) {
11     var errorThrown = false;
12     var error = null;
13     try {
14         func();
15     } catch (e) {
16         errorThrown = true;
17         error = e;
18     }
19     if (!errorThrown)
20         throw new Error('not thrown');
21     if (String(error) !== errorMessage)
22         throw new Error(`bad error: ${String(error)}`);
23 }
24
25 (function TestMeta() {
26     shouldBe(1, String.prototype.padEnd.length);
27     shouldBe("function", typeof String.prototype.padStart);
28     shouldBe(Object.getPrototypeOf(Function), Object.getPrototypeOf(String.prototype.padStart));
29     shouldBe("padStart", String.prototype.padStart.name);
30
31     var descriptor = Object.getOwnPropertyDescriptor(String.prototype, "padStart");
32     shouldBe(undefined, descriptor.get);
33     shouldBe(undefined, descriptor.set);
34     shouldBe(true, descriptor.configurable);
35     shouldBe(false, descriptor.enumerable);
36     shouldBe(true, descriptor.writable);
37     shouldBe(String.prototype.padStart, descriptor.value);
38
39     shouldThrow(() => new Function(`${String.prototype.padStart}`), "SyntaxError: Unexpected identifier 'code'. Expected either a closing ']' or a ',' following an array element.");
40 })();
41
42 (function TestRequireObjectCoercible() {
43     var padStart = String.prototype.padStart;
44     shouldThrow(() => padStart.call(null, 4, "test"), "TypeError: String.prototype.padStart requires that |this| not be null or undefined");
45     shouldThrow(() => padStart.call(undefined, 4, "test"), "TypeError: String.prototype.padStart requires that |this| not be null or undefined");
46     shouldBe("   123", padStart.call({
47         __proto__: null,
48         valueOf() { return 123; }
49     }, 6, " "));
50
51     var proxy = new Proxy({}, {
52         get(t, name) {
53             if (name === Symbol.toPrimitive || name === "toString") return;
54             if (name === "valueOf") return () => 6.7;
55             throw new Error("unreachable code");
56         }
57     });
58     shouldBe("   6.7", padStart.call(proxy, 6, " "));
59
60     proxy = new Proxy({}, {
61         get(t, name) {
62             if (name === Symbol.toPrimitive || name === "valueOf") return;
63             if (name === "toString") return () => 6.7;
64             throw new Error("unreachable code");
65         }
66     });
67     shouldBe("   6.7", padStart.call(proxy, 6, " "));
68 })();
69
70 (function TestToLength() {
71     shouldThrow(() => "123".padStart(Symbol("16")), "TypeError: Cannot convert a symbol to a number");
72     shouldBe("123", "123".padStart(-1));
73     shouldBe("123", "123".padStart({ toString() { return -1; } }));
74     shouldBe("123", "123".padStart(-0));
75     shouldBe("123", "123".padStart({ toString() { return -0; } }));
76     shouldBe("123", "123".padStart(+0));
77     shouldBe("123", "123".padStart({ toString() { return +0; } }));
78     shouldBe("123", "123".padStart(NaN));
79     shouldBe("123", "123".padStart({ toString() { return NaN; } }));
80 })();
81
82 (function TestFillerToString() {
83     shouldBe("         .", ".".padStart(10));
84     shouldBe("         .", ".".padStart(10, undefined));
85     shouldBe("XXXXXXXXX.", ".".padStart(10, { toString() { return "X"; } }));
86     shouldBe("111111111.", ".".padStart(10, { toString: undefined, valueOf() { return 1; } }));
87     shouldBe("nullnulln.", ".".padStart(10, null));
88 })();
89
90 (function TestFillerEmptyString() {
91     shouldBe(".", ".".padStart(10000, ""));
92     shouldBe(".", ".".padStart(10000, { toString() { return ""; } }));
93     shouldBe(".", ".".padStart(10000, { toString: undefined, valueOf() { return ""; } }));
94 })();
95
96 (function TestSingleCharacterFiller() {
97     shouldBe("!!!!!!!!!.", ".".padStart(10, "!"));
98     shouldBe("!!!!!!!!!.", ".".padStart(10, { toString() { return "!"; } }));
99     shouldBe("!!!!!!!!!.", ".".padStart(10, "" + "!" + ""));
100     shouldBe("!!!!!!!!!.", ".".padStart(10, { toString() { return "" + "!" + ""; } }));
101 })();
102
103 (function TestMemoryLimits() {
104     shouldThrow(() => ".".padStart(0x80000000, "o"), "Error: Out of memory");
105     shouldThrow(() => ".".padStart({ valueOf() { return 0x80000000; } }, "o"), "Error: Out of memory");
106     shouldThrow(() => ".".padStart("0x80000000", "o"), "Error: Out of memory");
107 })();
108
109 (function TestFillerRepetition() {
110     for (var i = 2000; i > 0; --i) {
111         var expected = "xoxo".repeat(i / 4).slice(0, i - 3) + "123";
112         var actual = "123".padStart(i, "xoxo");
113         shouldBe(expected, actual);
114         shouldBe(i > "123".length ? i : 3, actual.length);
115         actual = "123".padStart(i, "xo" + "" + "xo");
116         shouldBe(expected, actual);
117         shouldBe(i > "123".length ? i : 3, actual.length);
118     }
119 })();