spread-call-funapply.js (2968B)
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(...new Set([null, [1, 2, 3]])), [1, 2, 3]); 13 assertEqArray(f.apply(...[null, [1, 2, 3]][Symbol.iterator]()), [1, 2, 3]); 14 let itr = {}; 15 itr[Symbol.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 // 12.2.4.1.2 Runtime Semantics: ArrayAccumulation 40 // If Type(spreadObj) is not Object, then throw a TypeError exception. 41 assertThrowsInstanceOf(() => f.apply(null, ...null, [1, 2, 3]), TypeError); 42 assertThrowsInstanceOf(() => f.apply(null, ...undefined, [1, 2, 3]), TypeError); 43 } 44 45 function checkNormal(f) { 46 checkCommon(f); 47 48 assertEqArray(f.apply(null, ...[[]]), [undefined, undefined, undefined]); 49 assertEqArray(f.apply(null, ...[[1]]), [1, undefined, undefined]); 50 assertEqArray(f.apply(null, ...[[1, 2]]), [1, 2, undefined]); 51 assertEqArray(f.apply(null, ...[[1, 2, 3, 4]]), [1, 2, 3]); 52 53 assertEqArray(f.apply(null, ...[[undefined]]), [undefined, undefined, undefined]); 54 } 55 56 checkNormal(function(a, b, c) { return [a, b, c]; }); 57 checkNormal((a, b, c) => [a, b, c]); 58 59 function checkDefault(f) { 60 checkCommon(f); 61 62 assertEqArray(f.apply(null, ...[[]]), [-1, -2, -3]); 63 assertEqArray(f.apply(null, ...[[1]]), [1, -2, -3]); 64 assertEqArray(f.apply(null, ...[[1, 2]]), [1, 2, -3]); 65 assertEqArray(f.apply(null, ...[[1, 2, 3, 4]]), [1, 2, 3]); 66 67 assertEqArray(f.apply(null, ...[[undefined]]), [-1, -2, -3]); 68 } 69 70 checkDefault(function(a = -1, b = -2, c = -3) { return [a, b, c]; }); 71 checkDefault((a = -1, b = -2, c = -3) => [a, b, c]); 72 73 function checkRest(f) { 74 checkCommon(f); 75 76 assertEqArray(f.apply(null, ...[[]]), []); 77 assertEqArray(f.apply(null, ...[[1]]), [1]); 78 assertEqArray(f.apply(null, ...[[1, 2]]), [1, 2]); 79 assertEqArray(f.apply(null, ...[[1, 2, 3, 4]]), [1, 2, 3, 4]); 80 81 assertEqArray(f.apply(null, ...[[undefined]]), [undefined]); 82 83 // other iterable objects 84 assertEqArray(f.apply(null, ...new Map([[["a", "A"], ["b", "B"]]])).map(([k, v]) => k + v), ["aA", "bB"]); 85 } 86 87 checkRest(function(...x) { return x; }); 88 checkRest((...x) => x);