1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/jit-test/tests/basic/spread-call-funapply.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,91 @@ 1.4 +load(libdir + "asserts.js"); 1.5 +load(libdir + "eqArrayHelper.js"); 1.6 +load(libdir + "iteration.js"); 1.7 + 1.8 +function checkCommon(f) { 1.9 + assertEqArray(f.apply(null, ...[[1, 2, 3]]), [1, 2, 3]); 1.10 + assertEqArray(f.apply(...[null], [1, 2, 3]), [1, 2, 3]); 1.11 + assertEqArray(f.apply(...[null], ...[[1, 2, 3]]), [1, 2, 3]); 1.12 + assertEqArray(f.apply(...[null, [1, 2, 3]]), [1, 2, 3]); 1.13 + 1.14 + // other iterable objects 1.15 + assertEqArray(f.apply(...Set([null, [1, 2, 3]])), [1, 2, 3]); 1.16 + assertEqArray(f.apply(...[null, [1, 2, 3]][std_iterator]()), [1, 2, 3]); 1.17 + let itr = {}; 1.18 + itr[std_iterator] = function() { 1.19 + return { 1.20 + i: 0, 1.21 + next: function() { 1.22 + this.i++; 1.23 + if (this.i == 1) 1.24 + return { value: null, done: false }; 1.25 + else if (this.i == 2) 1.26 + return { value: [1, 2, 3], done: false }; 1.27 + else 1.28 + return { value: undefined, done: true }; 1.29 + } 1.30 + }; 1.31 + }; 1.32 + assertEqArray(f.apply(...itr), [1, 2, 3]); 1.33 + function* gen() { 1.34 + yield null; 1.35 + yield [1, 2, 3]; 1.36 + } 1.37 + assertEqArray(f.apply(...gen()), [1, 2, 3]); 1.38 + 1.39 + let a; 1.40 + assertEqArray(f.apply(null, ...a=[[1, 2, 3]]), [1, 2, 3]); 1.41 + 1.42 + // According to the draft spec, null and undefined are to be treated as empty 1.43 + // arrays. However, they are not iterable. If the spec is not changed to be in 1.44 + // terms of iterables, these tests should be fixed. 1.45 + //assertEqArray(f.apply(null, ...null, [1, 2, 3]), [1, 2, 3]); 1.46 + //assertEqArray(f.apply(null, ...undefined, [1, 2, 3]), [1, 2, 3]); 1.47 + assertThrowsInstanceOf(() => f.apply(null, ...null, [1, 2, 3]), TypeError); 1.48 + assertThrowsInstanceOf(() => f.apply(null, ...undefined, [1, 2, 3]), TypeError); 1.49 +} 1.50 + 1.51 +function checkNormal(f) { 1.52 + checkCommon(f); 1.53 + 1.54 + assertEqArray(f.apply(null, ...[[]]), [undefined, undefined, undefined]); 1.55 + assertEqArray(f.apply(null, ...[[1]]), [1, undefined, undefined]); 1.56 + assertEqArray(f.apply(null, ...[[1, 2]]), [1, 2, undefined]); 1.57 + assertEqArray(f.apply(null, ...[[1, 2, 3, 4]]), [1, 2, 3]); 1.58 + 1.59 + assertEqArray(f.apply(null, ...[[undefined]]), [undefined, undefined, undefined]); 1.60 +} 1.61 + 1.62 +checkNormal(function(a, b, c) [a, b, c]); 1.63 +checkNormal((a, b, c) => [a, b, c]); 1.64 + 1.65 +function checkDefault(f) { 1.66 + checkCommon(f); 1.67 + 1.68 + assertEqArray(f.apply(null, ...[[]]), [-1, -2, -3]); 1.69 + assertEqArray(f.apply(null, ...[[1]]), [1, -2, -3]); 1.70 + assertEqArray(f.apply(null, ...[[1, 2]]), [1, 2, -3]); 1.71 + assertEqArray(f.apply(null, ...[[1, 2, 3, 4]]), [1, 2, 3]); 1.72 + 1.73 + assertEqArray(f.apply(null, ...[[undefined]]), [-1, -2, -3]); 1.74 +} 1.75 + 1.76 +checkDefault(function(a = -1, b = -2, c = -3) [a, b, c]); 1.77 +checkDefault((a = -1, b = -2, c = -3) => [a, b, c]); 1.78 + 1.79 +function checkRest(f) { 1.80 + checkCommon(f); 1.81 + 1.82 + assertEqArray(f.apply(null, ...[[]]), []); 1.83 + assertEqArray(f.apply(null, ...[[1]]), [1]); 1.84 + assertEqArray(f.apply(null, ...[[1, 2]]), [1, 2]); 1.85 + assertEqArray(f.apply(null, ...[[1, 2, 3, 4]]), [1, 2, 3, 4]); 1.86 + 1.87 + assertEqArray(f.apply(null, ...[[undefined]]), [undefined]); 1.88 + 1.89 + // other iterable objects 1.90 + assertEqArray(f.apply(null, ...Map([[["a", "A"], ["b", "B"]]])).map(([k, v]) => k + v), ["aA", "bB"]); 1.91 +} 1.92 + 1.93 +checkRest(function(...x) x); 1.94 +checkRest((...x) => x);