diff --git a/Userland/Libraries/LibJS/Tests/syntax/async-await.js b/Userland/Libraries/LibJS/Tests/syntax/async-await.js new file mode 100644 index 0000000000..6173c7d05a --- /dev/null +++ b/Userland/Libraries/LibJS/Tests/syntax/async-await.js @@ -0,0 +1,74 @@ +describe("parsing freestanding async functions", () => { + test("simple", () => { + expect(`async function foo() {}`).toEval(); + expect(`async + function foo() {}`).not.toEval(); + }); + test("await expression", () => { + expect(`async function foo() { await bar(); }`).toEval(); + expect(`async function foo() { await; }`).not.toEval(); + expect(`function foo() { await bar(); }`).not.toEval(); + expect(`function foo() { await; }`).toEval(); + }); +}); + +describe("parsing object literal async functions", () => { + test("simple", () => { + expect(`x = { async foo() { } }`).toEval(); + expect(`x = { async + foo() { } }`).toEval(); + }); + test("await expression", () => { + expect(`x = { foo() { await bar(); } }`).not.toEval(); + expect(`x = { foo() { await; } }`).toEval(); + expect(`x = { async foo() { await bar(); } }`).toEval(); + expect(`x = { async foo() { await; } }`).not.toEval(); + }); +}); + +describe("parsing classes with async methods", () => { + test("simple", () => { + expect(`class Foo { async foo() {} }`).toEval(); + expect(`class Foo { static async foo() {} }`).toEval(); + expect(`class Foo { async foo() { await bar(); } }`).toEval(); + expect(`class Foo { async foo() { await; } }`).not.toEval(); + expect(`class Foo { async constructor() {} }`).not.toEval(); + }); +}); + +test("function expression names equal to 'await'", () => { + expect(`async function foo() { (function await() {}); }`).toEval(); + expect(`async function foo() { function await() {} }`).not.toEval(); +}); + +test("basic functionality", () => { + test("simple", () => { + let executionValue = null; + let resultValue = null; + async function foo() { + executionValue = "someValue"; + return "otherValue"; + } + const returnValue = foo(); + expect(returnValue).toBeInstanceOf(Promise); + returnValue.then(result => { + resultValue = result; + }); + runQueuedPromiseJobs(); + expect(executionValue).toBe("someValue"); + expect(resultValue).toBe("otherValue"); + }); + + test("await", () => { + let resultValue = null; + async function foo() { + return "someValue"; + } + async function bar() { + resultValue = await foo(); + } + bar(); + runQueuedPromiseJobs(); + expect(resultValue).toBe("someValue"); + }); +});