// 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 load('test/mjsunit/test-async.js'); 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(3); 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("resolvedPromise", iterResult.value); test.equals(true, iterResult.done); 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");