| // 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); |
| } |