| 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(){ for await(const value of foo()) {} }'); |
| checkSyntax('var a1 = async function asyncWithName1(){ for await(const value of foo()) {} }'); |
| checkSyntax('var a1 = async function*asyncGenWithName1(){ for await(let value of foo()) {} }'); |
| checkSyntax('var a1 = async function asyncWithName1(){ for await(let value of foo()) {} }'); |
| })(); |
| |
| (function checkSimpleAsyncGeneratorStrictMode() { |
| checkSyntax('"use strict"; var a1 = async function*asyncGenWithName1(){ for await(const value of foo()) {} }'); |
| checkSyntax('"use strict"; var a1 = async function asyncWithName1(){ for await(const value of foo()) {} }'); |
| checkSyntax('"use strict"; var a1 = async function*asyncGenWithName1(){ for await(let value of foo()) {} }'); |
| checkSyntax('"use strict"; var a1 = async function asyncWithName1(){ for await(let value of foo()) {} }'); |
| })(); |
| |
| |
| (function checkNestedAsyncGenerators() { |
| var wrappers = [ |
| {start: 'var a1 = async function*asyncGenWithName1(){', finish: '}'}, |
| {start: 'async function*asyncGenWithName2(){ ', finish: '}'}, |
| {start: 'async function asyncWithName2(){ ', finish: '}'}, |
| {start: 'class A { async * method() { ', finish: ' } }'}, |
| {start: 'var a1 = async () => {', finish: '}'}, |
| {start: 'var a1 = async () => { try { ', finish: ' } catch (e) {} }'}, |
| {start: 'var a1 = async () => { { ', finish: ' } }'}, |
| {start: 'var a1 = async () => { if (true) { ', finish: ' } }'}, |
| {start: 'var a1 = async () => { if (true) ', finish: ' }'}, |
| {start: 'var a1 = async () => { if (true) foo(); else { ', finish: ' } }'}, |
| {start: 'var a1 = async () => { while (true) { ', finish: ' } }'}, |
| {start: 'var a1 = async () => { for(;;) { ', finish: ' } }'}, |
| {start: 'var a1 = async () => { switch(e) { case \'1\' : ', finish: ' } }'}, |
| ]; |
| |
| expressions = [ |
| 'for await(const value of foo()) {}', |
| 'for await(let value of foo()) {}', |
| 'for await(var value of foo()) {}', |
| 'for await(var [a, b] of foo()) {}', |
| 'for await(let {a, b} of foo()) {}', |
| 'for await(const [... b] of foo()) {}', |
| 'for await(const [,,, b] of foo()) {}', |
| 'for await(const value of boo) {}', |
| 'for await(let value of boo) {}', |
| 'for await(const value of foo().boo()) {}', |
| 'for await(let value of foo.boo()) {}', |
| 'for await(let value of foo.boo(value)) {}', |
| 'for await(let value of [1,2,3]) {}', |
| 'for await(value of [1,2,3]) {}', |
| 'for await(value of x + x) {}', |
| 'for await(value of f()) {}', |
| 'for await(value of (x + x)) {}', |
| ]; |
| |
| wrappers.forEach(wrapper => { |
| expressions.forEach(exp => { |
| checkSyntax(wrapper.start + exp + wrapper.finish); |
| }); |
| }) |
| })(); |
| |
| |
| (function checkSimpleAsyncGeneratorSyntaxErrorInSloppyMode() { |
| checkSyntaxError("var asyncGenFn = function () { for await(const value of foo()) {} }"); |
| checkSyntaxError("var asyncGenFn = async function () { var arr = () => { for await(const value of foo()) {} } }"); |
| checkSyntaxError("var asyncGenFn = function* () { for await(const value of foo()) {} }"); |
| checkSyntaxError("var asyncGenFn = async function* () { var arr = () => { for await(const value of foo()) {} } }"); |
| checkSyntaxError('var a1 = async function*asyncGenWithName1(){ for await(const value in foo()) {} }'); |
| checkSyntaxError('var a1 = async function asyncWithName1(){ for await(const value in foo()) {} }'); |
| checkSyntaxError('var a1 = async function asyncWithName1(){ for await (;;) {} }'); |
| checkSyntaxError("var a1 = async function asyncWithName1(){ for await (let v = 4;;) {} }"); |
| checkSyntaxError("var a1 = async function asyncWithName1(){ for await (let v of f();;) {} }"); |
| checkSyntaxError("var a1 = async function asyncWithName1(){ for await (let v of boo;;) {} }"); |
| checkSyntaxError("var a1 = async function asyncWithName1(){ for await (let v of boo of) {} }"); |
| checkSyntaxError("async function asyncWithName1(){ for await (let v of boo in) {} }"); |
| checkSyntaxError("async function asyncWithName1(){ for await (v in x + x ) {} }"); |
| })(); |
| |
| (function checkSimpleAsyncGeneratorSyntaxErrorInStrictMode() { |
| checkSyntaxError("'use strict'; var asyncGenFn = function () { for await(const value of foo()) {} }"); |
| checkSyntaxError("'use strict'; var asyncGenFn = async function () { var arr = () => { for await(const value of foo()) {} } }"); |
| checkSyntaxError("'use strict'; var asyncGenFn = function* () { for await(const value of foo()) {} }"); |
| checkSyntaxError("'use strict'; var asyncGenFn = async function* () { var arr = () => { for await(const value of foo()) {} } }"); |
| checkSyntaxError("'use strict'; var a1 = async function*asyncGenWithName1(){ for await(const value in foo()) {} }"); |
| checkSyntaxError("'use strict'; var a1 = async function asyncWithName1(){ for await(const value in foo()) {} }"); |
| checkSyntaxError("'use strict'; var a1 = async function asyncWithName1(){ for await (;;) {} }"); |
| checkSyntaxError("'use strict'; var a1 = async function asyncWithName1(){ for await (let v = 4;;) {} }"); |
| checkSyntaxError("'use strict'; var a1 = async function asyncWithName1(){ for await (let v of f();;) {} }"); |
| checkSyntaxError("'use strict'; var a1 = async function asyncWithName1(){ for await (let v of boo;;) {} }"); |
| checkSyntaxError("'use strict'; var a1 = async function asyncWithName1(){ for await (let v of boo of) {} }"); |
| checkSyntaxError("'use strict'; async function asyncWithName1(){ for await (let v of boo in) {} }"); |
| checkSyntaxError("'use strict'; async function asyncWithName1(){ for await (v in x + x ) {} }"); |
| })(); |