// 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'); // .return() from state suspendedStart with undefined testAsync(test => { test.plan(3); async function* gen() { test.unreachable(); } let didResolvePromise = false; let g = gen(); g.return(undefined).then( (iterResult) => { test.equals(true, didResolvePromise); test.equals({ value: undefined, done: true }, iterResult); }, test.unexpectedRejection()); g.next().then( (iterResult) => { 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()); }, "AsyncGenerator.return(undefined) / suspendStart"); // .return() from state suspendedStart with thenable testAsync(test => { test.plan(3); async function* gen() { test.unreachable(); } let didResolvePromise = false; let g = gen(); let resolve; let awaitedThenable = { then(resolveFn) { resolve = resolveFn; } }; g.return(awaitedThenable).then( (iterResult) => { test.equals(true, didResolvePromise); test.equals({ value: "resolvedPromise", done: true }, iterResult); }, test.unexpectedRejection()); g.next().then( (iterResult) => { test.equals({ value: undefined, done: true }, iterResult); }, test.unexpectedRejection()); test.drainMicrotasks(); resolve("resolvedPromise"); // Race: generator request's promise should resolve after this Promise. Promise.resolve("already-resolved").then( _ => { didResolvePromise = true }, test.unexpectedRejection()); }, "AsyncGenerator.return(thenable) / suspendStart"); // .return() from state suspendedYield with undefined testAsync(test => { test.plan(4); async function* gen() { yield; test.unreachable(); } let didResolvePromise = false; let g = gen(); g.next().then( (iterResult) => { test.equals({ value: undefined, done: false }, iterResult); }, test.unexpectedRejection()); g.return(undefined).then( (iterResult) => { test.equals(true, didResolvePromise); test.equals({ value: undefined, done: true }, iterResult); }, test.unexpectedRejection()); g.next().then( (iterResult) => { 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()); }, "AsyncGenerator.return(undefined) / suspendedYield"); // .return() from state suspendedYield with thenable testAsync(test => { test.plan(4); async function* gen() { yield; test.unreachable(); } let didResolvePromise = false; let g = gen(); let resolve; let awaitedThenable = { then(resolveFn) { resolve = resolveFn; } }; g.next().then( (iterResult) => { test.equals({ value: undefined, done: false }, iterResult); }, test.unexpectedRejection()); g.return(awaitedThenable).then( (iterResult) => { test.equals(true, didResolvePromise); test.equals({ value: "resolvedPromise", done: true }, iterResult); }, test.unexpectedRejection()); g.next().then( (iterResult) => { test.equals({ value: undefined, done: true }, iterResult); }, test.unexpectedRejection()); test.drainMicrotasks(); resolve("resolvedPromise"); // Race: generator request's promise should resolve after this Promise. Promise.resolve("already-resolved").then( _ => { didResolvePromise = true }, test.unexpectedRejection()); }, "AsyncGenerator.return(thenable) / suspendYield");