var assert = function (result, expected, message = "") { if (result !== expected) { throw new Error('Error in assert. Expected "' + expected + '" but was "' + result + '":' + message ); } }; function checkSyntax(src) { try { eval(src); } catch (error) { if (error instanceof SyntaxError) throw new Error("Syntax Error: " + String(error) + "\n script: `" + src + "`"); } } function checkSyntaxError(src, message) { var bError = false; try { eval(src); } catch (error) { bError = error instanceof SyntaxError && (String(error) === message || typeof message === 'undefined'); } if (!bError) { throw new Error("Expected syntax Error: " + message + "\n in script: `" + src + "`"); } } (function checkSimpleAsyncGeneratorSloppyMode() { checkSyntax('var a1 = async function*asyncGenWithName1(){}'); checkSyntax('var a2 = async function *asyncGenWithName2(){ yield 11; }'); checkSyntax('var a3 = async function * asyncGenWithName2(){ await p; yield 11; }'); checkSyntax('var d1 = async function*(){}'); checkSyntax('var d2 = async function* (){ yield 11; }'); checkSyntax('var d3 = async function * (){ await p; yield 11; }'); checkSyntax('async function* withName1(){ }'); checkSyntax('async function *withName2(){ yield 11; }'); checkSyntax('async function * withName3(){ await p; yield 11; }'); checkSyntax('class A { async * method() { } }'); checkSyntax('class B { async * method() {yield 11;} }'); checkSyntax('class C { async * method() {yield 11; await p;} }'); checkSyntax('class D { async * "method"() {yield 11; await p;} }'); checkSyntax('class F { async * 0() {yield 11; await p;} }'); checkSyntax('var obj = { async * method() {yield 11; await p;} }'); checkSyntax('({ async foo() {} })'); checkSyntax('({ async : 1 })'); })(); (function checkSimpleAsyncGeneratorStrictMode() { checkSyntax('"use strict"; var a1 = async function*asyncGenWithName1(){}'); checkSyntax('"use strict"; var a2 = async function *asyncGenWithName2(){ yield 11; }'); checkSyntax('"use strict"; var a3 = async function * asyncGenWithName2(){ await p; yield 11; }'); checkSyntax('"use strict"; var d1 = async function*(){}'); checkSyntax('"use strict"; var d2 = async function* (){ yield 11; }'); checkSyntax('"use strict"; var d3 = async function * (){ await p; yield 11; }'); checkSyntax('"use strict"; async function* withName1(){ }'); checkSyntax('"use strict"; async function *withName2(){ yield 11; }'); checkSyntax('"use strict"; async function * withName3(){ await p; yield 11; }'); checkSyntax('"use strict"; class A { async * method() { } }'); checkSyntax('"use strict"; class B { async * method() {yield 11;} }'); checkSyntax('"use strict"; class C { async * method() {yield 11; await p;} }'); checkSyntax('"use strict"; class D { async * "method"() {yield 11; await p;} }'); checkSyntax('"use strict"; class E { async * ["calc" + "ulate"]() {yield 11; await p;} }'); checkSyntax('"use strict"; class F { async * 0() {yield 11; await p;} }'); checkSyntax('"use strict"; var obj = { async * method() {yield 11; await p;} }'); checkSyntax('"use strict"; ({ async foo() {} })'); checkSyntax('"use strict"; ({ async : 1 })'); })(); (function checkNestedAsyncGenerators() { var wrappers = [ {start: 'var a1 = async function*asyncGenWithName1(){', finish: '}'}, {start: 'async function*asyncGenWithName2(){ ', finish: '}'}, {start: 'class A { async * method() { ', finish: ' } }'} ]; expressions = [ 'await 10; yield 11; return 12;', 'var async = 10; yield async;', 'var async = 10; await async;', 'var async = 10; return async;', 'var async = function() {}; return async;', 'var async = function() {}; return async();', ]; wrappers.forEach(wrapper => { expressions.forEach(exp => { checkSyntax(wrapper.start + exp + wrapper.finish); }); }) })(); (function checkSimpleAsyncGeneratorSyntaxErrorInSloppyMode() { checkSyntaxError("var asyncGenFn = async function *await() {}"); checkSyntaxError("var asyncGenFn = async function*(await) {}"); checkSyntaxError("var asyncGenFn = async function *withName(await) {}"); checkSyntaxError("async function *asyncGeneratorFunctionDeclaration(await) {}"); checkSyntaxError("var asyncGenFn = *async function () {}"); checkSyntaxError("var asyncGenFn = *async function withName() {}"); checkSyntaxError("*async function asyncGeneratorFunctionDeclaration(await) {}"); checkSyntaxError("var obj = { *async asyncGeneratorMethod() {} };"); checkSyntaxError("var obj = { async asyncGeneratorMethod*() {} };"); checkSyntaxError("class A { get async* ttt() {} }"); checkSyntaxError("class B { get *async ttt() {} }"); checkSyntaxError('({ async = 1 })'); })(); (function checkSimpleAsyncGeneratorSyntaxErrorInStrictMode() { checkSyntaxError("'use strict'; var asyncGenFn = async function *await() {}"); checkSyntaxError("'use strict'; var asyncGenFn = async function*(await) {}"); checkSyntaxError("'use strict'; var asyncGenFn = async function *withName(await) {}"); checkSyntaxError("'use strict'; async function *asyncGeneratorFunctionDeclaration(await) {}"); checkSyntaxError("'use strict'; var asyncGenFn = *async function () {}"); checkSyntaxError("'use strict'; var asyncGenFn = *async function withName() {}"); checkSyntaxError("'use strict'; *async function asyncGeneratorFunctionDeclaration(await) {}"); checkSyntaxError("'use strict'; var obj = { *async asyncGeneratorMethod() {} };"); checkSyntaxError("'use strict'; var obj = { async asyncGeneratorMethod*() {} };"); checkSyntaxError("'use strict'; class A { get async* ttt() {} }"); checkSyntaxError("'use strict'; class B { get *async ttt() {} }"); checkSyntaxError("'use strict'; ({ async = 1 })"); })();