summaryrefslogtreecommitdiffstats
path: root/js/src/tests/test262/language/statements/for-await-of/ticks-with-async-iter-resolved-promise-and-constructor-lookup.js
diff options
context:
space:
mode:
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.js78
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();