• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1describe("unittests:: evaluation:: forAwaitOfEvaluation", () => {
2    it("sync (es5)", async () => {
3        const result = evaluator.evaluateTypeScript(`
4        let i = 0;
5        const iterator: IterableIterator<any> = {
6            [Symbol.iterator]() { return this; },
7            next() {
8                switch (i++) {
9                    case 0: return { value: 1, done: false };
10                    case 1: return { value: Promise.resolve(2), done: false };
11                    case 2: return { value: new Promise<number>(resolve => setTimeout(resolve, 100, 3)), done: false };
12                    default: return { value: undefined, done: true };
13                }
14            }
15        };
16        export const output: any[] = [];
17        export async function main() {
18            for await (const item of iterator) {
19                output.push(item);
20            }
21        }`, { downlevelIteration: true });
22        await result.main();
23        assert.strictEqual(result.output[0], 1);
24        assert.strictEqual(result.output[1], 2);
25        assert.strictEqual(result.output[2], 3);
26    });
27
28    it("sync (es2015)", async () => {
29        const result = evaluator.evaluateTypeScript(`
30        let i = 0;
31        const iterator: IterableIterator<any> = {
32            [Symbol.iterator]() { return this; },
33            next() {
34                switch (i++) {
35                    case 0: return { value: 1, done: false };
36                    case 1: return { value: Promise.resolve(2), done: false };
37                    case 2: return { value: new Promise<number>(resolve => setTimeout(resolve, 100, 3)), done: false };
38                    default: return { value: undefined, done: true };
39                }
40            }
41        };
42        export const output: any[] = [];
43        export async function main() {
44            for await (const item of iterator) {
45                output.push(item);
46            }
47        }`, { target: ts.ScriptTarget.ES2015 });
48        await result.main();
49        assert.strictEqual(result.output[0], 1);
50        assert.strictEqual(result.output[1], 2);
51        assert.strictEqual(result.output[2], 3);
52    });
53
54    it("async (es5)", async () => {
55        const result = evaluator.evaluateTypeScript(`
56        let i = 0;
57        const iterator = {
58            [Symbol.asyncIterator](): AsyncIterableIterator<any> { return this; },
59            async next() {
60                switch (i++) {
61                    case 0: return { value: 1, done: false };
62                    case 1: return { value: Promise.resolve(2), done: false };
63                    case 2: return { value: new Promise<number>(resolve => setTimeout(resolve, 100, 3)), done: false };
64                    default: return { value: undefined, done: true };
65                }
66            }
67        };
68        export const output: any[] = [];
69        export async function main() {
70            for await (const item of iterator) {
71                output.push(item);
72            }
73        }`, { downlevelIteration: true });
74        await result.main();
75        assert.strictEqual(result.output[0], 1);
76        assert.instanceOf(result.output[1], Promise);
77        assert.instanceOf(result.output[2], Promise);
78    });
79
80    it("async (es2015)", async () => {
81        const result = evaluator.evaluateTypeScript(`
82        let i = 0;
83        const iterator = {
84            [Symbol.asyncIterator](): AsyncIterableIterator<any> { return this; },
85            async next() {
86                switch (i++) {
87                    case 0: return { value: 1, done: false };
88                    case 1: return { value: Promise.resolve(2), done: false };
89                    case 2: return { value: new Promise<number>(resolve => setTimeout(resolve, 100, 3)), done: false };
90                    default: return { value: undefined, done: true };
91                }
92            }
93        };
94        export const output: any[] = [];
95        export async function main() {
96            for await (const item of iterator) {
97                output.push(item);
98            }
99        }`, { target: ts.ScriptTarget.ES2015 });
100        await result.main();
101        assert.strictEqual(result.output[0], 1);
102        assert.instanceOf(result.output[1], Promise);
103        assert.instanceOf(result.output[2], Promise);
104    });
105});
106