// 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);
  })());
})();
