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