blob: d8cc18bec60648e0bc73db1485d866ac847334ad [file] [log] [blame]
function shouldBe(actual, expected) {
if (actual !== expected)
throw new Error('bad value: ' + actual);
}
function testSyntaxError(script, message) {
var error = null;
try {
eval(script);
} catch (e) {
error = e;
}
if (!error)
throw new Error("Expected syntax error not thrown");
if (String(error) !== message)
throw new Error("Bad error: " + String(error));
}
(function () {
var [a, b, ...c] = "Cocoa";
shouldBe(a, 'C');
shouldBe(b, 'o');
shouldBe(JSON.stringify(c), String.raw`["c","o","a"]`);
}());
(function () {
var [a, b, ...c] = "Co";
shouldBe(a, 'C');
shouldBe(b, 'o');
shouldBe(JSON.stringify(c), String.raw`[]`);
}());
(function () {
var [a, b, ...c] = "C";
shouldBe(a, 'C');
shouldBe(b, undefined);
shouldBe(JSON.stringify(c), String.raw`[]`);
}());
(function () {
var a, b, c;
[a, b, ...c] = "Cocoa";
shouldBe(a, 'C');
shouldBe(b, 'o');
shouldBe(JSON.stringify(c), String.raw`["c","o","a"]`);
}());
(function () {
var a, b, c;
[a, b, ...c] = "Co";
shouldBe(a, 'C');
shouldBe(b, 'o');
shouldBe(JSON.stringify(c), String.raw`[]`);
}());
(function () {
var a, b, c;
[a, b, ...c] = "C";
shouldBe(a, 'C');
shouldBe(b, undefined);
shouldBe(JSON.stringify(c), String.raw`[]`);
}());
(function ([a, b, ...c]) {
shouldBe(a, 'C');
shouldBe(b, 'o');
shouldBe(JSON.stringify(c), String.raw`["c","o","a"]`);
}("Cocoa"));
(function ([a, b, ...c]) {
shouldBe(a, 'C');
shouldBe(b, 'o');
shouldBe(JSON.stringify(c), String.raw`[]`);
}("Co"));
(function ([a, b, ...c]) {
shouldBe(a, 'C');
shouldBe(b, undefined);
shouldBe(JSON.stringify(c), String.raw`[]`);
}("C"));
testSyntaxError(String.raw`var [a, ...b, c] = 20`, String.raw`SyntaxError: Unexpected token ','. Expected a closing ']' following a rest element destructuring pattern.`);
testSyntaxError(String.raw`var [a, ...b,] = 20`, String.raw`SyntaxError: Unexpected token ','. Expected a closing ']' following a rest element destructuring pattern.`);
testSyntaxError(String.raw`var [a, ...b,,] = 20`, String.raw`SyntaxError: Unexpected token ','. Expected a closing ']' following a rest element destructuring pattern.`);
testSyntaxError(String.raw`var [a, ...b = 20] = 20`, String.raw`SyntaxError: Unexpected token '='. Expected a closing ']' following a rest element destructuring pattern.`);
testSyntaxError(String.raw`(function ([a, ...b,]) { })`, String.raw`SyntaxError: Unexpected token ','. Expected a closing ']' following a rest element destructuring pattern.`);
testSyntaxError(String.raw`(function ([a, ...b,,]) { })`, String.raw`SyntaxError: Unexpected token ','. Expected a closing ']' following a rest element destructuring pattern.`);
testSyntaxError(String.raw`(function ([a, ...b = 20,,]) { })`, String.raw`SyntaxError: Unexpected token '='. Expected a closing ']' following a rest element destructuring pattern.`);
testSyntaxError(String.raw`[a, ...b, c] = 20`, String.raw`SyntaxError: Unexpected token ','. Expected a closing ']' following a rest element destructuring pattern.`);
testSyntaxError(String.raw`[a, ...b,] = 20`, String.raw`SyntaxError: Unexpected token ','. Expected a closing ']' following a rest element destructuring pattern.`);
testSyntaxError(String.raw`[a, ...b,,] = 20`, String.raw`SyntaxError: Unexpected token ','. Expected a closing ']' following a rest element destructuring pattern.`);
testSyntaxError(String.raw`[a, ...b = 20] = 20`, String.raw`SyntaxError: Unexpected token '='. Expected a closing ']' following a rest element destructuring pattern.`);
(function () {
var a, b, c;
[a, b, ...[...c]] = "Cocoa";
shouldBe(a, 'C');
shouldBe(b, 'o');
shouldBe(JSON.stringify(c), String.raw`["c","o","a"]`);
}());
(function () {
var a, b, c, d, e, f;
[a, b, ...{ 0: c, 1: d, 2: e, 3: f }] = "Cocoa";
shouldBe(a, 'C');
shouldBe(b, 'o');
shouldBe(c, 'c');
shouldBe(d, 'o');
shouldBe(f, undefined);
}());
(function () {
var a, b, c, d, e;
[a, b, ...[c, d, ...e]] = "Cocoa";
shouldBe(a, 'C');
shouldBe(b, 'o');
shouldBe(c, 'c');
shouldBe(d, 'o');
shouldBe(JSON.stringify(e), String.raw`["a"]`);
}());
function iterator(array) {
var nextCount = 0;
var returnCount = 0;
var original = array.values();
return {
[Symbol.iterator]() {
return this;
},
next() {
++nextCount;
return original.next();
},
return() {
++returnCount;
return { done: true };
},
reportNext() {
return nextCount;
},
reportReturn() {
return returnCount;
}
};
};
(function () {
var iter = iterator([1, 2, 3]);
var [...a] = iter;
shouldBe(iter.reportNext(), 4);
shouldBe(iter.reportReturn(), 0);
shouldBe(JSON.stringify(a), String.raw`[1,2,3]`);
}());
(function () {
var iter = iterator([1, 2, 3]);
var [a, b, ...c] = iter;
shouldBe(iter.reportNext(), 4);
shouldBe(iter.reportReturn(), 0);
shouldBe(a, 1);
shouldBe(b, 2);
shouldBe(JSON.stringify(c), String.raw`[3]`);
}());
(function () {
var iter = iterator([1, 2, 3]);
var [a, b, c, d, ...e] = iter;
shouldBe(iter.reportNext(), 4);
shouldBe(iter.reportReturn(), 0);
shouldBe(a, 1);
shouldBe(b, 2);
shouldBe(c, 3);
shouldBe(d, undefined);
shouldBe(JSON.stringify(e), String.raw`[]`);
}());
(function () {
var iter = iterator([1, 2, 3]);
var a, b;
[...[a, b]] = iter;
shouldBe(iter.reportNext(), 4);
shouldBe(iter.reportReturn(), 0);
shouldBe(a, 1);
shouldBe(b, 2);
}());