[JSC] Implement Array.prototype.flatMap and Array.prototype.flatten
[WebKit-https.git] / JSTests / stress / array-flatten.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 shouldBe([].flatten.length, 0);
38 shouldBe([].flatten.name, `flatten`);
39
40 shouldBeArray([].flatten(), []);
41 shouldBeArray([0, 1, 2, 3, , 4].flatten(), [0, 1, 2, 3, 4]);
42 shouldBeArray([,,,,,].flatten(), []);
43
44 shouldBeArray([].flatten(0), []);
45 shouldBeArray([0, 1, 2, 3, , 4].flatten(0), [0, 1, 2, 3, 4]);
46 shouldBeArray([,,,,,].flatten(0), []);
47
48 shouldBeArray([].flatten(-1), []);
49 shouldBeArray([0, 1, 2, 3, , 4].flatten(-1), [0, 1, 2, 3, 4]);
50 shouldBeArray([,,,,,].flatten(-1), []);
51
52 shouldBeArray([[],[]].flatten(), []);
53 shouldBeArray([[0],[1]].flatten(), [0,1]);
54 shouldBeArray([[0],[],1].flatten(), [0,1]);
55 shouldBeArray([[0],[[]],1].flatten(), [0,[],1]);
56 shouldBeArray([[0],[[]],1].flatten(1), [0,[],1]);
57 shouldBeArray([[0],[[]],1].flatten(2), [0,1]);
58
59 shouldBeArray([[],[]].flatten(0), [[],[]]);
60 shouldBeArray([[0],[1]].flatten(0), [[0],[1]]);
61 shouldBeArray([[0],[],1].flatten(0), [[0],[],1]);
62 shouldBeArray([[0],[[]],1].flatten(0), [[0],[[]],1]);
63
64 shouldBeArray([[[[[[[[[[[[[[[[[[[[[42]]]]]]]]]]]]]]]]]]]]].flatten(Infinity), [42]);
65
66 var array = [];
67 shouldBe(array.flatten() !== array, true);
68
69 class DerivedArray extends Array { }
70 shouldBe((new DerivedArray).flatten() instanceof DerivedArray, true);
71 var flatten = [].flatten;
72 var realm = createGlobalObject();
73 shouldBe(flatten.call({}) instanceof Array, true);
74 shouldBe(flatten.call(new realm.Array) instanceof Array, true);
75 var array2 = new realm.Array;
76 array2.constructor = 0;
77
78 shouldThrow(() => {
79     flatten.call(array2);
80 }, `TypeError: 0 is not a constructor`);
81
82 var array2 = new realm.Array;
83 array2.constructor = undefined;
84 shouldBe(flatten.call(array2) instanceof Array, true);
85
86 var array2 = new realm.Array;
87 array2.constructor = {
88     get [Symbol.species]() {
89         return null;
90     }
91 };
92 shouldBe(flatten.call(array2) instanceof Array, true);
93
94 var array2 = new realm.Array;
95 array2.constructor = {
96     get [Symbol.species]() {
97         return undefined;
98     }
99 };
100 shouldBe(flatten.call(array2) instanceof Array, true);
101
102 var array2 = new realm.Array;
103 array2.constructor = {
104     get [Symbol.species]() {
105         return DerivedArray;
106     }
107 };
108 shouldBe(flatten.call(array2) instanceof DerivedArray, true);