blob: 30ac1b002d993706babbe712715701ccab8b8068 [file] [log] [blame]
load(libdir + 'asserts.js');
load(libdir + 'eqArrayHelper.js');
assertThrowsInstanceOf(() => new Function('[...a, ,] = []'), SyntaxError, 'trailing elision');
assertThrowsInstanceOf(() => new Function('[a, ...b, c] = []'), SyntaxError, 'trailing param');
assertThrowsInstanceOf(() => new Function('[...[a]] = []'), SyntaxError, 'nested arraypattern');
assertThrowsInstanceOf(() => new Function('[...{a}] = []'), SyntaxError, 'nested objectpattern');
assertThrowsInstanceOf(() => new Function('[...a=b] = []'), SyntaxError, 'assignment expression');
assertThrowsInstanceOf(() => new Function('[...a()] = []'), SyntaxError, 'call expression');
assertThrowsInstanceOf(() => new Function('[...(a,b)] = []'), SyntaxError, 'comma expression');
assertThrowsInstanceOf(() => new Function('[...a++] = []'), SyntaxError, 'postfix expression');
assertThrowsInstanceOf(() => new Function('[...!a] = []'), SyntaxError, 'unary expression');
assertThrowsInstanceOf(() => new Function('[...a+b] = []'), SyntaxError, 'binary expression');
assertThrowsInstanceOf(() => new Function('var [...a.x] = []'), SyntaxError, 'lvalue expression in declaration');
assertThrowsInstanceOf(() => new Function('var [...(b)] = []'), SyntaxError);
// XXX: The way the current parser works, a trailing comma is lost before we
// check for destructuring. See bug 1041341. Once fixed, please update
// this assertion.
assertThrowsInstanceOf(() =>
assertThrowsInstanceOf(() => new Function('[...b,] = []'), SyntaxError)
, Error);
var inputArray = [1, 2, 3];
var inputDeep = [1, inputArray];
var inputObject = {a: inputArray};
var inputStr = 'str';
function *inputGenerator() {
yield 1;
yield 2;
yield 3;
}
var o = {prop: null, call: function () { return o; }};
var expected = [2, 3];
var expectedStr = ['t', 'r'];
function testAll(fn) {
testDeclaration(fn);
o.prop = null;
assertEqArray(fn('[, ...(o.prop)]', inputArray, 'o.prop'), expected);
o.prop = null;
assertEqArray(fn('[, ...(o.call().prop)]', inputArray, 'o.prop'), expected);
}
function testDeclaration(fn) {
testStr(fn);
assertEqArray(fn('[, ...rest]', inputArray), expected);
assertEqArray(fn('[, ...rest]', inputGenerator()), expected);
assertEqArray(fn('[, [, ...rest]]', inputDeep), expected);
assertEqArray(fn('{a: [, ...rest]}', inputObject), expected);
}
function testStr(fn) {
assertEqArray(fn('[, ...rest]', inputStr), expectedStr);
}
function testForIn(pattern, input, binding) {
binding = binding || 'rest';
return new Function('input',
'for (var ' + pattern + ' in {[input]: 1}) {}' +
'return ' + binding
)(input);
}
testStr(testForIn);
function testVar(pattern, input, binding) {
binding = binding || 'rest';
return new Function('input',
'var ' + pattern + ' = input;' +
'return ' + binding
)(input);
}
testDeclaration(testVar);
function testGlobal(pattern, input, binding) {
binding = binding || 'rest';
return new Function('input',
'(' + pattern + ' = input);' +
'return ' + binding
)(input);
}
testAll(testGlobal);
function testClosure(pattern, input, binding) {
binding = binding || 'rest';
return new Function('input',
'var ' + binding + '; (function () {' +
'(' + pattern + ' = input);' +
'})();' +
'return ' + binding
)(input);
}
testDeclaration(testClosure);
function testArgument(pattern, input, binding) {
binding = binding || 'rest';
return new Function('input',
'return (function (' + pattern + ') {' +
'return ' + binding + '; })(input);'
)(input);
}
testDeclaration(testArgument);
function testArgumentFunction(pattern, input, binding) {
binding = binding || 'rest';
return new Function(pattern,
'return ' + binding
)(input);
}
// XXX: ES6 requires the `Function` constructor to accept arbitrary
// `BindingElement`s as formal parameters. See Bug 1037939.
// Once fixed, please update the assertions below.
assertThrowsInstanceOf(() => testDeclaration(testArgumentFunction), SyntaxError);
function testThrow(pattern, input, binding) {
binding = binding || 'rest';
return new Function('input',
'try { throw input }' +
'catch(' + pattern + ') {' +
'return ' + binding + '; }'
)(input);
}
testDeclaration(testThrow);