blob: 33bf8f3c9d5c11a7139c7012a3e69113cb370eed [file] [log] [blame]
Ben Murdochda12d292016-06-02 14:46:10 +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
5// Flags: --harmony-string-padding
6
7(function TestMeta() {
8 assertEquals(1, String.prototype.padStart.length);
9 assertEquals("function", typeof String.prototype.padStart);
10 assertEquals(Object.getPrototypeOf(Function),
11 Object.getPrototypeOf(String.prototype.padStart));
12 assertEquals("padStart", String.prototype.padStart.name);
13
14 var desc = Object.getOwnPropertyDescriptor(String.prototype, "padStart");
15 assertFalse(desc.enumerable);
16 assertTrue(desc.configurable);
17 assertTrue(desc.writable);
18 assertEquals(undefined, desc.get);
19 assertEquals(undefined, desc.set);
20
21 assertThrows(() => new Function(`${String.prototype.padStart}`), SyntaxError);
22})();
23
24
25(function TestRequireObjectCoercible() {
26 var padStart = String.prototype.padStart;
27 assertThrows(() => padStart.call(null, 4, "test"), TypeError);
28 assertThrows(() => padStart.call(undefined, 4, "test"), TypeError);
29 assertEquals(" 123", padStart.call({
30 __proto__: null,
31 valueOf() { return 123; }
32 }, 6, " "));
33
34 var proxy = new Proxy({}, {
35 get(t, name) {
36 if (name === Symbol.toPrimitive || name === "toString") return;
37 if (name === "valueOf") return () => 6.7;
38 assertUnreachable();
39 }
40 });
41 assertEquals(" 6.7", padStart.call(proxy, 6, " "));
42
43 proxy = new Proxy({}, {
44 get(t, name) {
45 if (name === Symbol.toPrimitive || name === "valueOf") return;
46 if (name === "toString") return () => 6.7;
47 assertUnreachable();
48 }
49 });
50 assertEquals(" 6.7", padStart.call(proxy, 6, " "));
51})();
52
53
54(function TestToLength() {
55 assertThrows(() => "123".padStart(Symbol("16")), TypeError);
56 assertEquals("123", "123".padStart(-1));
57 assertEquals("123", "123".padStart({ toString() { return -1; } }));
58 assertEquals("123", "123".padStart(-0));
59 assertEquals("123", "123".padStart({ toString() { return -0; } }));
60 assertEquals("123", "123".padStart(+0));
61 assertEquals("123", "123".padStart({ toString() { return +0; } }));
62 assertEquals("123", "123".padStart(NaN));
63 assertEquals("123", "123".padStart({ toString() { return NaN; } }));
64})();
65
66
67(function TestFillerToString() {
68 assertEquals(" .", ".".padStart(10));
69 assertEquals(" .", ".".padStart(10, undefined));
Ben Murdochda12d292016-06-02 14:46:10 +010070 assertEquals("nullnulln.", ".".padStart(10, null));
Ben Murdochc5610432016-08-08 18:44:38 +010071 assertEquals("XXXXXXXXX.", ".".padStart(10, { toString() { return "X"; } }));
72 assertEquals(
73 "111111111.",
74 ".".padStart(10, { toString: undefined, valueOf() { return 1; } }));
75})();
76
77
78(function TestFillerEmptyString() {
79 assertEquals(".", ".".padStart(10, ""));
80 assertEquals(".", ".".padStart(10, { toString() { return ""; } }));
81 assertEquals(
82 ".", ".".padStart(10, { toString: undefined, valueOf() { return ""; } }));
Ben Murdochda12d292016-06-02 14:46:10 +010083})();
84
85
86(function TestFillerRepetition() {
87 for (var i = 2000; i > 0; --i) {
88 var expected = "xoxo".repeat(i / 4).slice(0, i - 3) + "123";
89 var actual = "123".padStart(i, "xoxo");
90 assertEquals(expected, actual);
91 assertEquals(i > "123".length ? i : 3, actual.length);
92 }
93})();
94
95
96(function TestTruncation() {
97 assertEquals("ba", "a".padStart(2, "bc"));
98})();