blob: 2b2d004251a13a82fbd9a382177f8bf65ed20f4f [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));
70 assertEquals(" .", ".".padStart(10, { toString() { return ""; } }));
71 assertEquals("nullnulln.", ".".padStart(10, null));
72})();
73
74
75(function TestFillerRepetition() {
76 for (var i = 2000; i > 0; --i) {
77 var expected = "xoxo".repeat(i / 4).slice(0, i - 3) + "123";
78 var actual = "123".padStart(i, "xoxo");
79 assertEquals(expected, actual);
80 assertEquals(i > "123".length ? i : 3, actual.length);
81 }
82})();
83
84
85(function TestTruncation() {
86 assertEquals("ba", "a".padStart(2, "bc"));
87})();