| // Copyright 2018 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Flags: --harmony-await-optimization |
| |
| // test basic interleaving |
| (function () { |
| const actual = []; |
| const expected = [ 'await', 1, 'await', 2 ]; |
| const iterations = 2; |
| |
| async function pushAwait() { |
| actual.push('await'); |
| } |
| |
| async function callAsync() { |
| for (let i = 0; i < iterations; i++) { |
| await pushAwait(); |
| } |
| return 0; |
| } |
| |
| function checkAssertions() { |
| assertArrayEquals(expected, actual, |
| 'Async/await and promises should be interleaved.'); |
| } |
| |
| assertPromiseResult((async() => { |
| callAsync(); |
| |
| return new Promise(function (resolve) { |
| actual.push(1); |
| resolve(); |
| }).then(function () { |
| actual.push(2); |
| }).then(checkAssertions); |
| })()); |
| })(); |
| |
| // test async generators |
| (function () { |
| const actual = []; |
| const expected = [ 'await', 1, 'await', 2 ]; |
| const iterations = 2; |
| |
| async function pushAwait() { |
| actual.push('await'); |
| } |
| |
| async function* callAsync() { |
| for (let i = 0; i < iterations; i++) { |
| await pushAwait(); |
| } |
| return 0; |
| } |
| |
| function checkAssertions() { |
| assertArrayEquals(expected, actual, |
| 'Async/await and promises should be interleaved when using async generators.'); |
| } |
| |
| assertPromiseResult((async() => { |
| callAsync().next(); |
| |
| return new Promise(function (resolve) { |
| actual.push(1); |
| resolve(); |
| }).then(function () { |
| actual.push(2); |
| }).then(checkAssertions); |
| })()); |
| })(); |
| |
| // test yielding from async generators |
| (function () { |
| const actual = []; |
| const expected = [ |
| 'Promise: 6', |
| 'Promise: 5', |
| 'Await: 3', |
| 'Promise: 4', |
| 'Promise: 3', |
| 'Await: 2', |
| 'Promise: 2', |
| 'Promise: 1', |
| 'Await: 1', |
| 'Promise: 0' |
| ]; |
| const iterations = 3; |
| |
| async function* naturalNumbers(start) { |
| let current = start; |
| while (current > 0) { |
| yield Promise.resolve(current--); |
| } |
| } |
| |
| async function trigger() { |
| for await (const num of naturalNumbers(iterations)) { |
| actual.push('Await: ' + num); |
| } |
| } |
| |
| async function checkAssertions() { |
| assertArrayEquals(expected, actual, |
| 'Async/await and promises should be interleaved when yielding.'); |
| } |
| |
| async function countdown(counter) { |
| actual.push('Promise: ' + counter); |
| if (counter > 0) { |
| return Promise.resolve(counter - 1).then(countdown); |
| } else { |
| await checkAssertions(); |
| } |
| } |
| |
| assertPromiseResult((async() => { |
| trigger(); |
| |
| return countdown(iterations * 2); |
| })()); |
| })(); |