b62a7f18cb
It shipped in Chrome 69. Bug: v8:7220, v8:8562 Change-Id: I09d5ee9e98fc32ae3163c8983d552b99ac4f08e6 Reviewed-on: https://chromium-review.googlesource.com/c/1450781 Reviewed-by: Benedikt Meurer <bmeurer@chromium.org> Commit-Queue: Mathias Bynens <mathias@chromium.org> Cr-Commit-Position: refs/heads/master@{#59309}
163 lines
3.0 KiB
JavaScript
163 lines
3.0 KiB
JavaScript
// Copyright 2018 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.
|
|
|
|
// Flags: --allow-natives-syntax
|
|
|
|
assertEquals(Array.prototype.flatMap.length, 1);
|
|
assertEquals(Array.prototype.flatMap.name, 'flatMap');
|
|
|
|
assertEquals(
|
|
[1, 2, 3, 4].flatMap((element) => [element, element ** 2]),
|
|
[1, 1, 2, 4, 3, 9, 4, 16]
|
|
);
|
|
assertEquals(
|
|
[1, 2, 3, 4].flatMap((element) => [[element, element ** 2]]),
|
|
[[1, 1], [2, 4], [3, 9], [4, 16]]
|
|
);
|
|
|
|
{
|
|
const elements = new Set([
|
|
-Infinity,
|
|
-1,
|
|
-0,
|
|
+0,
|
|
+1,
|
|
Infinity,
|
|
null,
|
|
undefined,
|
|
true,
|
|
false,
|
|
'',
|
|
'foo',
|
|
/./,
|
|
[],
|
|
{},
|
|
Object.create(null),
|
|
new Proxy({}, {}),
|
|
Symbol(),
|
|
x => x ** 2,
|
|
String
|
|
]);
|
|
|
|
for (const value of elements) {
|
|
assertEquals(
|
|
[value].flatMap((element) => [element, element]),
|
|
[value, value]
|
|
);
|
|
}
|
|
}
|
|
|
|
{
|
|
const array = [42];
|
|
assertEquals(
|
|
[array].flatMap((element) => [element, element]),
|
|
[array, array]
|
|
);
|
|
}
|
|
|
|
{
|
|
const nonCallables = new Set([
|
|
-Infinity,
|
|
-1,
|
|
-0,
|
|
+0,
|
|
+1,
|
|
Infinity,
|
|
null,
|
|
undefined,
|
|
true,
|
|
false,
|
|
'',
|
|
'foo',
|
|
/./,
|
|
[],
|
|
{},
|
|
Object.create(null),
|
|
new Proxy({}, {}),
|
|
Symbol(),
|
|
]);
|
|
for (const nonCallable of nonCallables) {
|
|
assertThrows(() => {
|
|
[].flatMap(nonCallable);
|
|
}, TypeError);
|
|
}
|
|
}
|
|
|
|
{
|
|
const object = {
|
|
foo: 42,
|
|
get length() {
|
|
object.foo = 0;
|
|
}
|
|
};
|
|
const result = [object].flatMap((element) => [element, element]);
|
|
%HeapObjectVerify(result);
|
|
assertEquals(result, [object, object]);
|
|
assertEquals(result[0].foo, 42);
|
|
}
|
|
|
|
assertThrows(() => {
|
|
Array.prototype.flatMap.call(null, (element) => element);
|
|
}, TypeError);
|
|
assertThrows(() => {
|
|
Array.prototype.flatMap.call(undefined, (element) => element);
|
|
}, TypeError);
|
|
|
|
assertEquals(
|
|
Array.prototype.flatMap.call(
|
|
{
|
|
length: 1,
|
|
0: 'a',
|
|
1: 'b',
|
|
},
|
|
(element) => element
|
|
),
|
|
['a']
|
|
);
|
|
assertEquals(
|
|
Array.prototype.flatMap.call(
|
|
{
|
|
length: 2,
|
|
0: 'a',
|
|
1: 'b',
|
|
},
|
|
(element) => element
|
|
),
|
|
['a', 'b']
|
|
);
|
|
|
|
{
|
|
const result = [1, 2, 3].flatMap(function() {
|
|
return [this];
|
|
}, 'abc');
|
|
assertEquals(true, result[0] == 'abc');
|
|
assertEquals(true, result[1] == 'abc');
|
|
assertEquals(true, result[2] == 'abc');
|
|
}
|
|
|
|
{
|
|
const input = { 0: 'a', 1: 'b', 2: 'c', length: 'wat' };
|
|
assertEquals(Array.prototype.flatMap.call(input, x => [x]), []);
|
|
}
|
|
|
|
{
|
|
let count = 0;
|
|
const input = {
|
|
get length() { ++count; return 0; }
|
|
};
|
|
const result = Array.prototype.flatMap.call(input, x => [x]);
|
|
assertEquals(count, 1);
|
|
}
|
|
|
|
{
|
|
const descriptor = Object.getOwnPropertyDescriptor(
|
|
Array.prototype,
|
|
'flatMap'
|
|
);
|
|
assertEquals(descriptor.value, Array.prototype.flatMap);
|
|
assertEquals(descriptor.writable, true);
|
|
assertEquals(descriptor.enumerable, false);
|
|
assertEquals(descriptor.configurable, true);
|
|
}
|