// Copyright 2017 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: --allow-natives-syntax

testAsync(test => {
  test.plan(2);

  async function* gen() {
    return;
    test.unreachable();
  }

  let didResolvePromise = false;
  gen().next().then(
      (iterResult) => {
        test.equals(false, didResolvePromise);
        test.equals({ value: undefined, done: true }, iterResult);
      },
      test.unexpectedRejection());

  // Race: generator request's promise should resolve before this Promise.
  Promise.resolve("already-resolved").then(
      _ => { didResolvePromise = true },
      test.unexpectedRejection());

}, "return-race-no-operand");

testAsync(test => {
  test.plan(2);

  async function* gen() {
    return undefined;
    test.unreachable();
  }

  let didResolvePromise = false;
  gen().next().then(
      (iterResult) => {
        test.equals(true, didResolvePromise);
        test.equals({ value: undefined, done: true }, iterResult);
      },
      test.unexpectedRejection());

  // Race: generator request's promise should resolve after this Promise.
  Promise.resolve("already-resolved").then(
      _ => { didResolvePromise = true },
      test.unexpectedRejection());

}, "return-race-with-operand");

// Return a thenable which is never settled
testAsync(test => {
  test.plan(0);

  let promise = { then() { } };

  async function* gen() {
    return promise;
    test.unreachable();
  }

  gen().next().then(
      (iterResult) => test.unreachable(),
      test.unexpectedRejection());
}, "return-await-thenable-pending");

// Return a thenable which is fulfilled later
testAsync(test => {
  test.plan(2);

  let resolve;
  let awaitedThenable = { then(resolveFn) { resolve = resolveFn; } };
  let finallyEvaluated = false;

  async function* gen() {
    try {
      return awaitedThenable;
    } finally {
      finallyEvaluated = true;
    }
  }

  gen().next().then(
      (iterResult) => {
        test.equals({ value: "resolvedPromise", done: true }, iterResult);
        test.equals(true, finallyEvaluated);
      },
      test.unexpectedRejection());

  test.drainMicrotasks();
  resolve("resolvedPromise");
}, "yield-await-thenable-resolved");

// Return a thenable which is rejected later
testAsync(test => {
  test.plan(2);

  let reject;
  let awaitedThenable = { then(resolveFn, rejectFn) { reject = rejectFn; } };
  async function* gen() {
    try {
      yield awaitedThenable;
    } catch (e) {
      test.equals("rejection", e);
      return e;
    }
  }

  gen().next().then(
      (iterResult) => {
        test.equals({ value: "rejection", done: true }, iterResult);
      },
      test.unexpectedRejection());

  test.drainMicrotasks();
  reject("rejection");
}, "yield-await-thenable-rejected");
