test262/implementation-contributed/javascriptcore/stress/modules-syntax-error-with-names.js
test262-automation e9a5a7f918 [javascriptcore-test262-automation] changes from git@github.com:WebKit/webkit.git at sha 949e26452cfa153a7f4afe593da97e2fe9e1b706 on Tue Jul 03 2018 14:35:15 GMT-0400 (Eastern Daylight Time) (#1620)
* [javascriptcore-test262-automation] changes from git@github.com:WebKit/webkit.git at sha 949e26452cfa153a7f4afe593da97e2fe9e1b706 on Tue Jul 03 2018 14:35:15 GMT-0400 (Eastern Daylight Time)
2018-07-03 15:59:58 -04:00

256 lines
7.4 KiB
JavaScript

function shouldThrow(func, errorMessage) {
var errorThrown = false;
var error = null;
try {
func();
} catch (e) {
errorThrown = true;
error = e;
}
if (!errorThrown)
throw new Error('not thrown');
if (String(error) !== errorMessage)
throw new Error(`bad error: ${String(error)}`);
}
function checkModuleSyntaxError(source, errorMessage) {
shouldThrow(() => checkModuleSyntax(source), errorMessage);
}
// --------------- import -------------------
checkModuleSyntaxError(String.raw`
import A from "Cocoa"
const A = 20;
`, `SyntaxError: Cannot declare a const variable twice: 'A'.:3`);
checkModuleSyntaxError(String.raw`
const A = 20;
import A from "Cocoa"
`, `SyntaxError: Cannot declare an imported binding name twice: 'A'.:3`);
checkModuleSyntaxError(String.raw`
import A from "Cocoa"
let A = 20;
`, `SyntaxError: Cannot declare a let variable twice: 'A'.:3`);
checkModuleSyntaxError(String.raw`
let A = 20;
import A from "Cocoa"
`, `SyntaxError: Cannot declare an imported binding name twice: 'A'.:3`);
checkModuleSyntaxError(String.raw`
import * as A from "Cocoa"
const A = 20;
`, `SyntaxError: Cannot declare a const variable twice: 'A'.:3`);
checkModuleSyntaxError(String.raw`
const A = 20;
import * as A from "Cocoa"
`, `SyntaxError: Cannot declare an imported binding name twice: 'A'.:3`);
checkModuleSyntaxError(String.raw`
import * as A from "Cocoa"
let A = 20;
`, `SyntaxError: Cannot declare a let variable twice: 'A'.:3`);
checkModuleSyntaxError(String.raw`
let A = 20;
import * as A from "Cocoa"
`, `SyntaxError: Cannot declare an imported binding name twice: 'A'.:3`);
checkModuleSyntaxError(String.raw`
import { A } from "Cocoa"
const A = 20;
`, `SyntaxError: Cannot declare a const variable twice: 'A'.:3`);
checkModuleSyntaxError(String.raw`
const A = 20;
import { A } from "Cocoa"
`, `SyntaxError: Cannot declare an imported binding name twice: 'A'.:3`);
checkModuleSyntaxError(String.raw`
import { A } from "Cocoa"
let A = 20;
`, `SyntaxError: Cannot declare a let variable twice: 'A'.:3`);
checkModuleSyntaxError(String.raw`
let A = 20;
import { A } from "Cocoa"
`, `SyntaxError: Cannot declare an imported binding name twice: 'A'.:3`);
checkModuleSyntaxError(String.raw`
import { B as A } from "Cocoa"
const A = 20;
`, `SyntaxError: Cannot declare a const variable twice: 'A'.:3`);
checkModuleSyntaxError(String.raw`
const A = 20;
import { B as A } from "Cocoa"
`, `SyntaxError: Cannot declare an imported binding name twice: 'A'.:3`);
checkModuleSyntaxError(String.raw`
import { B as A } from "Cocoa"
let A = 20;
`, `SyntaxError: Cannot declare a let variable twice: 'A'.:3`);
checkModuleSyntaxError(String.raw`
let A = 20;
import { B as A } from "Cocoa"
`, `SyntaxError: Cannot declare an imported binding name twice: 'A'.:3`);
checkModuleSyntax(String.raw`
import { A as B } from "Cocoa"
const A = 20;
`, `SyntaxError: Cannot declare an imported binding name twice: 'A'.:2`);
checkModuleSyntax(String.raw`
const A = 20;
import { A as B } from "Cocoa"
`, `SyntaxError: Cannot declare an imported binding name twice: 'A'.:2`);
checkModuleSyntax(String.raw`
import { A as B } from "Cocoa"
let A = 20;
`, `SyntaxError: Cannot declare an imported binding name twice: 'A'.:2`);
checkModuleSyntax(String.raw`
let A = 20;
import { A as B } from "Cocoa"
`, `SyntaxError: Cannot declare an imported binding name twice: 'A'.:2`);
checkModuleSyntaxError(String.raw`
import { A, B as A } from "Cocoa"
`, `SyntaxError: Cannot declare an imported binding name twice: 'A'.:2`);
checkModuleSyntaxError(String.raw`
import { A, A } from "Cocoa"
`, `SyntaxError: Cannot declare an imported binding name twice: 'A'.:2`);
checkModuleSyntaxError(String.raw`
import { C as A, B as A } from "Cocoa"
`, `SyntaxError: Cannot declare an imported binding name twice: 'A'.:2`);
checkModuleSyntaxError(String.raw`
import A, { A } from "Cocoa"
`, `SyntaxError: Cannot declare an imported binding name twice: 'A'.:2`);
checkModuleSyntaxError(String.raw`
import A, { B as A } from "Cocoa"
`, `SyntaxError: Cannot declare an imported binding name twice: 'A'.:2`);
checkModuleSyntaxError(String.raw`
import A, * as A from "Cocoa"
`, `SyntaxError: Cannot declare an imported binding name twice: 'A'.:2`);
checkModuleSyntaxError(String.raw`
import A from "Cocoa"
const { A } = obj;
`, `SyntaxError: Unexpected token '}'. Cannot declare a lexical variable twice: 'A'.:3`);
checkModuleSyntaxError(String.raw`
import A from "Cocoa"
const [ A ] = array;
`, `SyntaxError: Unexpected identifier 'A'. Cannot declare a lexical variable twice: 'A'.:3`);
checkModuleSyntaxError(String.raw`
import A from "Cocoa"
const { B:A } = obj;
`, `SyntaxError: Unexpected identifier 'A'. Cannot declare a lexical variable twice: 'A'.:3`);
checkModuleSyntax(String.raw`
import A from "Cocoa"
const { A:B } = obj;
`);
// --------------- export -------------------
checkModuleSyntaxError(String.raw`
export { A as B } from 'mod'
export B from 'mod2'
`, `SyntaxError: Unexpected identifier 'B'. Expected either a declaration or a variable statement.:3`);
checkModuleSyntax(String.raw`
export { A as B } from 'mod'
const A = 42;
const B = 'Cocoa';
`);
checkModuleSyntaxError(String.raw`
export { A as B }
const B = 'Cocoa';
`, `SyntaxError: Exported binding 'A' needs to refer to a top-level declared variable.:4`);
checkModuleSyntaxError(String.raw`
export default 20;
export default function hello () { }
`, `SyntaxError: Only one 'default' export is allowed.:4`);
checkModuleSyntaxError(String.raw`
export default function hello () { }
export default 20;
`, `SyntaxError: Only one 'default' export is allowed.:4`);
checkModuleSyntaxError(String.raw`
var a = 42;
var b = 55;
export { a as Cocoa, b as Cocoa };
`, `SyntaxError: Cannot export a duplicate name 'Cocoa'.:4`);
checkModuleSyntaxError(String.raw`
var a = 42;
var b = 55;
export { a as Cocoa, b as Cocoa };
`, `SyntaxError: Cannot export a duplicate name 'Cocoa'.:4`);
checkModuleSyntaxError(String.raw`
var Cocoa = 42;
var b = 55;
export { Cocoa, b as Cocoa };
`, `SyntaxError: Cannot export a duplicate name 'Cocoa'.:4`);
checkModuleSyntaxError(String.raw`
export var Cocoa = 42;
var b = 55;
export { b as Cocoa };
`, `SyntaxError: Cannot export a duplicate name 'Cocoa'.:4`);
checkModuleSyntaxError(String.raw`
var a = 42;
export { a as Cocoa };
export function Cocoa() { }
`, `SyntaxError: Cannot export a duplicate function name: 'Cocoa'.:5`);
checkModuleSyntaxError(String.raw`
var a = 42;
export { a as Cocoa };
export class Cocoa { }
`, `SyntaxError: Cannot export a duplicate class name: 'Cocoa'.:5`);
// FIXME: These tests also should be passed. But now, var and lexical declared names can be co-exist on Script / Module top level scope.
// This will be fixed when this issue is fixed for Script environment.
// http://www.ecma-international.org/ecma-262/6.0/#sec-scripts-static-semantics-early-errors
// http://www.ecma-international.org/ecma-262/6.0/#sec-module-semantics-static-semantics-early-errors
checkModuleSyntaxError(String.raw`
import A from "Cocoa"
var A = 20;
`, `SyntaxError: Cannot declare a var variable that shadows a let/const/class variable: 'A'.:3`);
// checkModuleSyntaxError(String.raw`
// var A = 20;
// import A from "Cocoa"
// `, ``);
checkModuleSyntaxError(String.raw`
import A from "Cocoa"
var A = 20;
`, `SyntaxError: Cannot declare a var variable that shadows a let/const/class variable: 'A'.:3`);
// checkModuleSyntaxError(String.raw`
// var A = 20;
// import A from "Cocoa"
// `, ``);