summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/basic/spread-call-funapply.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/basic/spread-call-funapply.js')
-rw-r--r--js/src/jit-test/tests/basic/spread-call-funapply.js88
1 files changed, 88 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/basic/spread-call-funapply.js b/js/src/jit-test/tests/basic/spread-call-funapply.js
new file mode 100644
index 0000000000..a285d4e827
--- /dev/null
+++ b/js/src/jit-test/tests/basic/spread-call-funapply.js
@@ -0,0 +1,88 @@
+load(libdir + "asserts.js");
+load(libdir + "eqArrayHelper.js");
+load(libdir + "iteration.js");
+
+function checkCommon(f) {
+ assertEqArray(f.apply(null, ...[[1, 2, 3]]), [1, 2, 3]);
+ assertEqArray(f.apply(...[null], [1, 2, 3]), [1, 2, 3]);
+ assertEqArray(f.apply(...[null], ...[[1, 2, 3]]), [1, 2, 3]);
+ assertEqArray(f.apply(...[null, [1, 2, 3]]), [1, 2, 3]);
+
+ // other iterable objects
+ assertEqArray(f.apply(...new Set([null, [1, 2, 3]])), [1, 2, 3]);
+ assertEqArray(f.apply(...[null, [1, 2, 3]][Symbol.iterator]()), [1, 2, 3]);
+ let itr = {};
+ itr[Symbol.iterator] = function() {
+ return {
+ i: 0,
+ next: function() {
+ this.i++;
+ if (this.i == 1)
+ return { value: null, done: false };
+ else if (this.i == 2)
+ return { value: [1, 2, 3], done: false };
+ else
+ return { value: undefined, done: true };
+ }
+ };
+ };
+ assertEqArray(f.apply(...itr), [1, 2, 3]);
+ function* gen() {
+ yield null;
+ yield [1, 2, 3];
+ }
+ assertEqArray(f.apply(...gen()), [1, 2, 3]);
+
+ let a;
+ assertEqArray(f.apply(null, ...a=[[1, 2, 3]]), [1, 2, 3]);
+
+ // 12.2.4.1.2 Runtime Semantics: ArrayAccumulation
+ // If Type(spreadObj) is not Object, then throw a TypeError exception.
+ assertThrowsInstanceOf(() => f.apply(null, ...null, [1, 2, 3]), TypeError);
+ assertThrowsInstanceOf(() => f.apply(null, ...undefined, [1, 2, 3]), TypeError);
+}
+
+function checkNormal(f) {
+ checkCommon(f);
+
+ assertEqArray(f.apply(null, ...[[]]), [undefined, undefined, undefined]);
+ assertEqArray(f.apply(null, ...[[1]]), [1, undefined, undefined]);
+ assertEqArray(f.apply(null, ...[[1, 2]]), [1, 2, undefined]);
+ assertEqArray(f.apply(null, ...[[1, 2, 3, 4]]), [1, 2, 3]);
+
+ assertEqArray(f.apply(null, ...[[undefined]]), [undefined, undefined, undefined]);
+}
+
+checkNormal(function(a, b, c) { return [a, b, c]; });
+checkNormal((a, b, c) => [a, b, c]);
+
+function checkDefault(f) {
+ checkCommon(f);
+
+ assertEqArray(f.apply(null, ...[[]]), [-1, -2, -3]);
+ assertEqArray(f.apply(null, ...[[1]]), [1, -2, -3]);
+ assertEqArray(f.apply(null, ...[[1, 2]]), [1, 2, -3]);
+ assertEqArray(f.apply(null, ...[[1, 2, 3, 4]]), [1, 2, 3]);
+
+ assertEqArray(f.apply(null, ...[[undefined]]), [-1, -2, -3]);
+}
+
+checkDefault(function(a = -1, b = -2, c = -3) { return [a, b, c]; });
+checkDefault((a = -1, b = -2, c = -3) => [a, b, c]);
+
+function checkRest(f) {
+ checkCommon(f);
+
+ assertEqArray(f.apply(null, ...[[]]), []);
+ assertEqArray(f.apply(null, ...[[1]]), [1]);
+ assertEqArray(f.apply(null, ...[[1, 2]]), [1, 2]);
+ assertEqArray(f.apply(null, ...[[1, 2, 3, 4]]), [1, 2, 3, 4]);
+
+ assertEqArray(f.apply(null, ...[[undefined]]), [undefined]);
+
+ // other iterable objects
+ assertEqArray(f.apply(null, ...new Map([[["a", "A"], ["b", "B"]]])).map(([k, v]) => k + v), ["aA", "bB"]);
+}
+
+checkRest(function(...x) { return x; });
+checkRest((...x) => x);