| // 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"); |