Invalid flags in a RegExp literal should be an early SyntaxError
[WebKit-https.git] / JSTests / stress / array-species-functions.js
1 C = class extends Array { }
2 N = class { }
3 N[Symbol.species] = function() { throw "this should never be called"; }
4
5 function id(x) { return x; }
6
7 testFunctions = [
8     [Array.prototype.concat, []],
9     [Array.prototype.slice, [1,2]],
10     [Array.prototype.splice, []],
11     [Array.prototype.splice, [0,1]],
12     [Array.prototype.map, [id]],
13     [Array.prototype.filter, [id]]
14 ];
15
16 objProp = Object.defineProperty;
17
18 function funcThrows(func, args) {
19     try {
20         func.call(...args)
21         return false;
22     } catch (e) {
23         return true;
24     }
25 }
26
27 function test(testData) {
28     "use strict";
29     let [protoFunction, args] = testData;
30     let foo = new C(10);
31     let n = new N();
32
33     // Test non-array ignores constructor.
34     objProp(n, "constructor", { value: C });
35     let bar = protoFunction.call(n, ...args);
36     if (!(bar instanceof Array) || bar instanceof N || bar instanceof C)
37         throw Error();
38
39     objProp(foo, "constructor", { value: null });
40     if (!funcThrows(protoFunction, [foo, ...args]))
41         throw "didn't throw";
42
43     // Test array defaults cases.
44     foo = new C(10);
45
46     objProp(C, Symbol.species, { value: undefined, writable: true});
47     bar = protoFunction.call(foo, ...args);
48     if (!(bar instanceof Array) || bar instanceof C)
49         throw Error();
50
51     C[Symbol.species] = null;
52     bar = protoFunction.call(foo, ...args);
53     if (!(bar instanceof Array) || bar instanceof C)
54         throw Error();
55
56     // Test species is custom constructor.
57     let called = false;
58     function species(...args) {
59         called = true;
60         return new C(...args);
61     }
62
63     C[Symbol.species] = species;
64     bar = protoFunction.call(foo, ...args);
65
66     if (!(bar instanceof Array) || !(bar instanceof C) || !called)
67         throw Error("failed on " + protoFunction);
68
69     function speciesThrows() {
70         throw Error();
71     }
72
73     C[Symbol.species] = speciesThrows;
74     if (!funcThrows(protoFunction, [foo, ...args]))
75         throw "didn't throw";
76
77     C[Symbol.species] = true;
78     if (!funcThrows(protoFunction, [foo, ...args]))
79         throw "didn't throw";
80
81 }
82
83 testFunctions.forEach(test);