diff options
Diffstat (limited to 'js/src/tests/test262/language/statements/for-await-of/ticks-with-async-iter-resolved-promise-and-constructor-lookup.js')
-rw-r--r-- | js/src/tests/test262/language/statements/for-await-of/ticks-with-async-iter-resolved-promise-and-constructor-lookup.js | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/js/src/tests/test262/language/statements/for-await-of/ticks-with-async-iter-resolved-promise-and-constructor-lookup.js b/js/src/tests/test262/language/statements/for-await-of/ticks-with-async-iter-resolved-promise-and-constructor-lookup.js new file mode 100644 index 0000000000..3253713c99 --- /dev/null +++ b/js/src/tests/test262/language/statements/for-await-of/ticks-with-async-iter-resolved-promise-and-constructor-lookup.js @@ -0,0 +1,78 @@ +// |reftest| async +// Copyright (C) 2019 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset +description: > + Ensure the number of ticks and Promise constructor lookups is correct with custom async iterator. +info: | + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation ( lhs, stmt, iteratorRecord, iterationKind, + lhsKind, labelSet [ , iteratorKind ] ) + 6.2.3.1 Await + +includes: [compareArray.js] +flags: [async] +features: [async-iteration] +---*/ + +// The expected event log. +var expected = [ + // Before entering loop. + "pre", + + // Await promise resolved. + "tick 1", + + // In loop body. + "loop", + + // Await promise resolved + "tick 2", + + // After exiting loop. + "post", +]; + +// The actual event log. +var actual = []; + +// Custom async iterator directly using a synchronous iterator. +function toAsyncIterator(iterable) { + return { + [Symbol.asyncIterator]() { + return iterable[Symbol.iterator](); + } + }; +} + +// Test function using for-await with a single, already resolved Promise. +async function f() { + var p = Promise.resolve(0); + actual.push("pre"); + for await (var x of toAsyncIterator([p])) { + actual.push("loop"); + } + actual.push("post"); +} + +// Count the number of ticks needed to complete the loop and compare the actual log. +Promise.resolve(0) + .then(() => actual.push("tick 1")) + .then(() => actual.push("tick 2")) + .then(() => { + assert.compareArray(actual, expected, "Ticks and constructor lookups"); +}).then($DONE, $DONE); + +// Redefine `Promise.constructor` in order to intercept "constructor" lookups from PromiseResolve. +// (Perform last so that the lookups from SpeciesConstructor in `then` aren't logged.) +Object.defineProperty(Promise.prototype, "constructor", { + get() { + actual.push("constructor"); + return Promise; + }, + configurable: true, +}); + +// Start the asynchronous function. +f(); |