v8/test/mjsunit/harmony/harmony-string-pad-end.js
adamk 02149d89a5 Include harmony-string-padding.js in the context snapshot
The attached chromium bug suggests that turning this on via a flag
regressed a perf test. Having previously run into slowdowns due
to experimental JS natives, my suspicion is that this regression
can be fixed by including the new builtins in the snapshot.
My intention is to land this patch to see if the regression
goes away on the bots.

Given the nature of this feature, it seems low-risk to remove
the runtime flag. If need be, it would be trivial to craft
a patch to remove these two methods from String.prototype
if we run into web compat issues during the release (note
that no release branch has yet picked up this feature).

BUG=v8:4954, chromium:677444

Review-Url: https://codereview.chromium.org/2610853010
Cr-Commit-Position: refs/heads/master@{#42111}
2017-01-06 18:56:00 +00:00

97 lines
3.1 KiB
JavaScript

// Copyright 2016 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
(function TestMeta() {
assertEquals(1, String.prototype.padEnd.length);
assertEquals("function", typeof String.prototype.padEnd);
assertEquals(Object.getPrototypeOf(Function),
Object.getPrototypeOf(String.prototype.padEnd));
assertEquals("padEnd", String.prototype.padEnd.name);
var desc = Object.getOwnPropertyDescriptor(String.prototype, "padEnd");
assertFalse(desc.enumerable);
assertTrue(desc.configurable);
assertTrue(desc.writable);
assertEquals(undefined, desc.get);
assertEquals(undefined, desc.set);
assertThrows(() => new Function(`${String.prototype.padEnd}`), SyntaxError);
})();
(function TestRequireObjectCoercible() {
var padEnd = String.prototype.padEnd;
assertThrows(() => padEnd.call(null, 4, "test"), TypeError);
assertThrows(() => padEnd.call(undefined, 4, "test"), TypeError);
assertEquals("123 ", padEnd.call({
__proto__: null,
valueOf() { return 123; }
}, 6, " "));
var proxy = new Proxy({}, {
get(t, name) {
if (name === Symbol.toPrimitive || name === "toString") return;
if (name === "valueOf") return () => 6.7;
assertUnreachable();
}
});
assertEquals("6.7 ", padEnd.call(proxy, 6, " "));
proxy = new Proxy({}, {
get(t, name) {
if (name === Symbol.toPrimitive || name === "valueOf") return;
if (name === "toString") return () => 6.7;
assertUnreachable();
}
});
assertEquals("6.7 ", padEnd.call(proxy, 6, " "));
})();
(function TestToLength() {
assertThrows(() => "123".padEnd(Symbol("16")), TypeError);
assertEquals("123", "123".padEnd(-1));
assertEquals("123", "123".padEnd({ toString() { return -1; } }));
assertEquals("123", "123".padEnd(-0));
assertEquals("123", "123".padEnd({ toString() { return -0; } }));
assertEquals("123", "123".padEnd(+0));
assertEquals("123", "123".padEnd({ toString() { return +0; } }));
assertEquals("123", "123".padEnd(NaN));
assertEquals("123", "123".padEnd({ toString() { return NaN; } }));
})();
(function TestFillerToString() {
assertEquals(". ", ".".padEnd(10));
assertEquals(". ", ".".padEnd(10, undefined));
assertEquals(".nullnulln", ".".padEnd(10, null));
assertEquals(".XXXXXXXXX", ".".padEnd(10, { toString() { return "X"; } }));
assertEquals(
".111111111",
".".padEnd(10, { toString: undefined, valueOf() { return 1; } }));
})();
(function TestFillerEmptyString() {
assertEquals(".", ".".padEnd(10, ""));
assertEquals(".", ".".padEnd(10, { toString() { return ""; } }));
assertEquals(
".", ".".padEnd(10, { toString: undefined, valueOf() { return ""; } }));
})();
(function TestFillerRepetition() {
for (var i = 2000; i > 0; --i) {
var expected = "123" + "xoxo".repeat(i / 4).slice(0, i - 3);
var actual = "123".padEnd(i, "xoxo");
assertEquals(expected, actual);
assertEquals(i > "123".length ? i : 3, actual.length);
}
})();
(function TestTruncation() {
assertEquals("ab", "a".padEnd(2, "bc"));
})();