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