瀏覽代碼

LibJS: Add tests for async functions and await expressions

Idan Horowitz 3 年之前
父節點
當前提交
04253c3254
共有 1 個文件被更改,包括 74 次插入0 次删除
  1. 74 0
      Userland/Libraries/LibJS/Tests/syntax/async-await.js

+ 74 - 0
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");
+    });
+});