js/src/jit-test/tests/basic/spread-call-funapply.js

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:c72f7a6d7f68
1 load(libdir + "asserts.js");
2 load(libdir + "eqArrayHelper.js");
3 load(libdir + "iteration.js");
4
5 function checkCommon(f) {
6 assertEqArray(f.apply(null, ...[[1, 2, 3]]), [1, 2, 3]);
7 assertEqArray(f.apply(...[null], [1, 2, 3]), [1, 2, 3]);
8 assertEqArray(f.apply(...[null], ...[[1, 2, 3]]), [1, 2, 3]);
9 assertEqArray(f.apply(...[null, [1, 2, 3]]), [1, 2, 3]);
10
11 // other iterable objects
12 assertEqArray(f.apply(...Set([null, [1, 2, 3]])), [1, 2, 3]);
13 assertEqArray(f.apply(...[null, [1, 2, 3]][std_iterator]()), [1, 2, 3]);
14 let itr = {};
15 itr[std_iterator] = function() {
16 return {
17 i: 0,
18 next: function() {
19 this.i++;
20 if (this.i == 1)
21 return { value: null, done: false };
22 else if (this.i == 2)
23 return { value: [1, 2, 3], done: false };
24 else
25 return { value: undefined, done: true };
26 }
27 };
28 };
29 assertEqArray(f.apply(...itr), [1, 2, 3]);
30 function* gen() {
31 yield null;
32 yield [1, 2, 3];
33 }
34 assertEqArray(f.apply(...gen()), [1, 2, 3]);
35
36 let a;
37 assertEqArray(f.apply(null, ...a=[[1, 2, 3]]), [1, 2, 3]);
38
39 // According to the draft spec, null and undefined are to be treated as empty
40 // arrays. However, they are not iterable. If the spec is not changed to be in
41 // terms of iterables, these tests should be fixed.
42 //assertEqArray(f.apply(null, ...null, [1, 2, 3]), [1, 2, 3]);
43 //assertEqArray(f.apply(null, ...undefined, [1, 2, 3]), [1, 2, 3]);
44 assertThrowsInstanceOf(() => f.apply(null, ...null, [1, 2, 3]), TypeError);
45 assertThrowsInstanceOf(() => f.apply(null, ...undefined, [1, 2, 3]), TypeError);
46 }
47
48 function checkNormal(f) {
49 checkCommon(f);
50
51 assertEqArray(f.apply(null, ...[[]]), [undefined, undefined, undefined]);
52 assertEqArray(f.apply(null, ...[[1]]), [1, undefined, undefined]);
53 assertEqArray(f.apply(null, ...[[1, 2]]), [1, 2, undefined]);
54 assertEqArray(f.apply(null, ...[[1, 2, 3, 4]]), [1, 2, 3]);
55
56 assertEqArray(f.apply(null, ...[[undefined]]), [undefined, undefined, undefined]);
57 }
58
59 checkNormal(function(a, b, c) [a, b, c]);
60 checkNormal((a, b, c) => [a, b, c]);
61
62 function checkDefault(f) {
63 checkCommon(f);
64
65 assertEqArray(f.apply(null, ...[[]]), [-1, -2, -3]);
66 assertEqArray(f.apply(null, ...[[1]]), [1, -2, -3]);
67 assertEqArray(f.apply(null, ...[[1, 2]]), [1, 2, -3]);
68 assertEqArray(f.apply(null, ...[[1, 2, 3, 4]]), [1, 2, 3]);
69
70 assertEqArray(f.apply(null, ...[[undefined]]), [-1, -2, -3]);
71 }
72
73 checkDefault(function(a = -1, b = -2, c = -3) [a, b, c]);
74 checkDefault((a = -1, b = -2, c = -3) => [a, b, c]);
75
76 function checkRest(f) {
77 checkCommon(f);
78
79 assertEqArray(f.apply(null, ...[[]]), []);
80 assertEqArray(f.apply(null, ...[[1]]), [1]);
81 assertEqArray(f.apply(null, ...[[1, 2]]), [1, 2]);
82 assertEqArray(f.apply(null, ...[[1, 2, 3, 4]]), [1, 2, 3, 4]);
83
84 assertEqArray(f.apply(null, ...[[undefined]]), [undefined]);
85
86 // other iterable objects
87 assertEqArray(f.apply(null, ...Map([[["a", "A"], ["b", "B"]]])).map(([k, v]) => k + v), ["aA", "bB"]);
88 }
89
90 checkRest(function(...x) x);
91 checkRest((...x) => x);

mercurial