From 04253c32545b76f7d368545e7605e4f1c01bdd16 Mon Sep 17 00:00:00 2001 From: Idan Horowitz Date: Tue, 9 Nov 2021 23:41:29 +0200 Subject: [PATCH] LibJS: Add tests for async functions and await expressions --- .../LibJS/Tests/syntax/async-await.js | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 Userland/Libraries/LibJS/Tests/syntax/async-await.js 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"); + }); +});