[JSC] Do not use asArrayModes() with Structures because it discards TypedArray inform...
[WebKit-https.git] / JSTests / stress / array-flatmap.js
1 function shouldBe(actual, expected) {
2     if (actual !== expected)
3         throw new Error('bad value: ' + actual);
4 }
5
6 function shouldBeArray(actual, expected) {
7     shouldBe(actual.length, expected.length);
8     for (var i = 0; i < expected.length; ++i) {
9         try {
10             if (Array.isArray(expected[i])) {
11                 shouldBe(Array.isArray(actual[i]), true);
12                 shouldBeArray(actual[i], expected[i]);
13             } else
14                 shouldBe(actual[i], expected[i]);
15         } catch(e) {
16             print(JSON.stringify(actual));
17             throw e;
18         }
19     }
20 }
21
22 function shouldThrow(func, errorMessage) {
23     var errorThrown = false;
24     var error = null;
25     try {
26         func();
27     } catch (e) {
28         errorThrown = true;
29         error = e;
30     }
31     if (!errorThrown)
32         throw new Error('not thrown');
33     if (String(error) !== errorMessage)
34         throw new Error(`bad error: ${String(error)}`);
35 }
36
37 shouldThrow(() => {
38     [].flatMap();
39 }, `TypeError: Array.prototype.flatMap callback must be a function`);
40
41 var array = [42];
42 shouldBeArray(array.flatMap(function (v) {
43     "use strict";
44     shouldBe(v, 42);
45     return this;
46 }, `Cocoa`), [`Cocoa`]);
47
48 shouldBeArray([].flatMap((v) => v), []);
49 shouldBeArray([42].flatMap((v) => v), [42]);
50 shouldBeArray([42].flatMap((v) => [v]), [42]);
51 shouldBeArray([42].flatMap((v) => [[v]]), [[42]]);
52 shouldBeArray([42].flatMap((v) => [v, v, v]), [42,42,42]);
53 shouldBeArray([42,[43],44].flatMap((v) => [v, v]), [42,42,[43],[43],44,44]);
54 shouldBeArray([,,,,,,].flatMap((v) => [v, v]), []);
55 shouldBeArray([42,43,44].flatMap((v) => []), []);
56 shouldBeArray([42,[43],44].flatMap((v) => v), [42,43,44]);
57
58 class DerivedArray extends Array { }
59 shouldBe((new DerivedArray).flatMap(() => {}) instanceof DerivedArray, true);
60 var flatMap = [].flatMap;
61 var realm = createGlobalObject();
62 shouldBe(flatMap.call({}, () => {}) instanceof Array, true);
63 shouldBe(flatMap.call(new realm.Array, () => {}) instanceof Array, true);
64 var array2 = new realm.Array;
65 array2.constructor = 0;
66
67 shouldThrow(() => {
68     flatMap.call(array2, () => {});
69 }, `TypeError: 0 is not a constructor`);
70
71 var array2 = new realm.Array;
72 array2.constructor = undefined;
73 shouldBe(flatMap.call(array2, () => {}) instanceof Array, true);
74
75 var array2 = new realm.Array;
76 array2.constructor = {
77     get [Symbol.species]() {
78         return null;
79     }
80 };
81 shouldBe(flatMap.call(array2, () => {}) instanceof Array, true);
82
83 var array2 = new realm.Array;
84 array2.constructor = {
85     get [Symbol.species]() {
86         return undefined;
87     }
88 };
89 shouldBe(flatMap.call(array2, () => {}) instanceof Array, true);
90
91 var array2 = new realm.Array;
92 array2.constructor = {
93     get [Symbol.species]() {
94         return DerivedArray;
95     }
96 };
97 shouldBe(flatMap.call(array2, () => {}) instanceof DerivedArray, true);