// 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'); // Yield a thenable which is never settled testAsync(test => { test.plan(0); let awaitedThenable = { then() { } }; async function* gen() { yield awaitedThenable; test.unreachable(); } gen().next().then( (iterResult) => test.unreachable(), test.unexpectedRejection()); }, "yield-await-thenable-pending"); // Yield a thenable which is fulfilled later testAsync(test => { test.plan(1); let resolve; let awaitedThenable = { then(resolveFn) { resolve = resolveFn; } }; async function* gen() { let input = yield awaitedThenable; test.equals("resolvedPromise", input); } gen().next().then( (iterResult) => { test.equals({ value: "resolvedPromise", done: false }, iterResult); }, test.unexpectedRejection()); test.drainMicrotasks(); resolve("resolvedPromise"); }, "yield-await-thenable-resolved"); // Yield 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");