function testSyntax(script) {
    try {
        eval(script);
    } catch (error) {
        if (error instanceof SyntaxError)
            throw new Error("Bad error: " + String(error));
    }
}

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));
}

testSyntaxError(`
(function () {
    try {
    } catch ([a, a]) {
    }
})
`, `SyntaxError: Unexpected identifier 'a'. Cannot declare a lexical variable twice: 'a'.`);

testSyntaxError(`
(function () {
    try {
    } catch ({ a, b:a }) {
    }
})
`, `SyntaxError: Unexpected identifier 'a'. Cannot declare a lexical variable twice: 'a'.`);

testSyntax(`
(function () {
    try {
    } catch (let) {
    }
})
`, ``);

testSyntax(`
(function () {
    try {
    } catch ([let]) {
    }
})
`, ``);

testSyntaxError(`
(function () {
    'use strict';
    try {
    } catch (let) {
    }
})
`, `SyntaxError: Cannot use 'let' as a catch parameter name in strict mode.`);

testSyntaxError(`
(function () {
    'use strict';
    try {
    } catch ([let]) {
    }
})
`, `SyntaxError: Cannot use 'let' as a catch parameter name in strict mode.`);


testSyntax(`
(function () {
    try {
    } catch (yield) {
    }
})
`);

testSyntax(`
(function () {
    try {
    } catch ([yield]) {
    }
})
`);

testSyntaxError(`
(function () {
    'use strict';
    try {
    } catch (yield) {
    }
})
`, `SyntaxError: Cannot use 'yield' as a catch parameter name in strict mode.`);

testSyntaxError(`
(function () {
    'use strict';
    try {
    } catch ([yield]) {
    }
})
`, `SyntaxError: Cannot use 'yield' as a catch parameter name in strict mode.`);

testSyntaxError(`
(function () {
    try {
    } catch (yield = 20) {
    }
})
`, `SyntaxError: Unexpected token '='. Expected ')' to end a 'catch' target.`);

testSyntax(`
(function () {
    try {
    } catch ([...yield]) {
    }
})
`);

testSyntax(`
(function () {
    try {
    } catch ([yield = 30]) {
    }
})
`);

testSyntax(`
(function () {
    try {
    } catch ({ yield = 30 }) {
    }
})
`);

testSyntaxError(`
(function () {
    try {
    } catch (...Hello) {
    }
})
`, `SyntaxError: Unexpected token '...'. Expected a parameter pattern or a ')' in parameter list.`);

testSyntaxError(`
(function *() {
    try {
    } catch (yield) {
    }
})
`, `SyntaxError: Cannot use 'yield' as a catch parameter name in a generator function.`);

testSyntax(`
(function *() {
    try {
    } catch ({ value = yield 42 }) {
    }
})
`);

testSyntax(`
(function *() {
    try {
    } catch ({ value = yield }) {
    }
})
`);
