diff options
Diffstat (limited to 'js/src/tests/test262/built-ins/AsyncGeneratorPrototype/return/return-suspendedYield-broken-promise-try-catch.js')
-rw-r--r-- | js/src/tests/test262/built-ins/AsyncGeneratorPrototype/return/return-suspendedYield-broken-promise-try-catch.js | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/js/src/tests/test262/built-ins/AsyncGeneratorPrototype/return/return-suspendedYield-broken-promise-try-catch.js b/js/src/tests/test262/built-ins/AsyncGeneratorPrototype/return/return-suspendedYield-broken-promise-try-catch.js new file mode 100644 index 0000000000..c105dfd70b --- /dev/null +++ b/js/src/tests/test262/built-ins/AsyncGeneratorPrototype/return/return-suspendedYield-broken-promise-try-catch.js @@ -0,0 +1,65 @@ +// |reftest| async +// Copyright (C) 2022 Chengzhong Wu. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-asyncgenerator-prototype-return +description: > + A broken promise should resume the generator and reject with + the exception when the generator's state is suspendedYield. +info: | + AsyncGenerator.prototype.return ( value ) + ... + 9. Else if state is suspendedYield, then + a. Perform AsyncGeneratorResume(generator, completion). + ... + + AsyncGeneratorCompleteStep ( generator, completion, done [ , realm ] ) + Resumes the steps defined at AsyncGeneratorStart ( generator, generatorBody ) + ... + 4. Set the code evaluation state of genContext such that when evaluation is resumed for that execution context the following steps will be performed: + ... + i. Perform AsyncGeneratorDrainQueue(generator). + j. Return undefined. + + AsyncGeneratorDrainQueue ( generator ) + ... + 5. Repeat, while done is false, + a. Let next be the first element of queue. + b. Let completion be Completion(next.[[Completion]]). + c. If completion.[[Type]] is return, then + i. Set generator.[[AsyncGeneratorState]] to awaiting-return. + ii. Perform AsyncGeneratorAwaitReturn(generator). + iii. Set done to true. + ... + +flags: [async] +features: [async-iteration] +---*/ + +let caughtErr; +var g = async function*() { + try { + yield; + return 'this is never returned'; + } catch (err) { + caughtErr = err; + return 1; + } +}; + +let brokenPromise = Promise.resolve(42); +Object.defineProperty(brokenPromise, 'constructor', { + get: function () { + throw new Error('broken promise'); + } +}); + +var it = g(); +it.next().then(() => { + return it.return(brokenPromise); +}).then(ret => { + assert.sameValue(caughtErr.message, 'broken promise'); + assert.sameValue(ret.value, 1, 'returned value'); + assert.sameValue(ret.done, true, 'iterator is closed'); +}).then($DONE, $DONE); |