Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1464)

Unified Diff: test/mjsunit/harmony/async-await-species.js

Issue 2209433003: [promise] separate PerformPromiseThen from PromiseThen (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/js/harmony-async-await.js ('K') | « src/js/promise.js ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/mjsunit/harmony/async-await-species.js
diff --git a/test/mjsunit/harmony/async-await-species.js b/test/mjsunit/harmony/async-await-species.js
new file mode 100644
index 0000000000000000000000000000000000000000..bb4d0bda63583f77f920261b14a9ec0aa659e184
--- /dev/null
+++ b/test/mjsunit/harmony/async-await-species.js
@@ -0,0 +1,82 @@
+// Copyright 2016 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: --harmony-async-await --allow-natives-syntax
+
+function assertEqualsAsync(expected, run, msg) {
+ var actual;
+ var hadValue = false;
+ var hadError = false;
+ var promise = run();
+
+ if (typeof promise !== "object" || typeof promise.then !== "function") {
+ throw new MjsUnitAssertionError(
+ "Expected " + run.toString() +
+ " to return a Promise, but it returned " + PrettyPrint(promise));
+ }
+
+ promise.then(function(value) { hadValue = true; actual = value; },
+ function(error) { hadError = true; actual = error; });
+
+ assertFalse(hadValue || hadError);
+
+ %RunMicrotasks();
+
+ if (hadError) throw actual;
+
+ assertTrue(
+ hadValue, "Expected '" + run.toString() + "' to produce a value");
+
+ assertEquals(expected, actual, msg);
+};
+
+function getStack(error) {
+ var stack = error.stack.split('\n').
+ filter(function(line) {
+ return /^\s*at [a-zA-Z0-9_]/.test(line);
+ }).
+ map(line => line.replace(/^\s*at ([a-zA-Z0-9_\.\[\]]+).*/, "$1"));
+
+ // remove `Promise.then()` invocation by assertEqualsAsync()
+ if (stack[2] === "assertEqualsAsync") return [];
+
+ return stack.reverse();
+}
+
+var log = [];
+class FakePromise extends Promise {
+ constructor(executor) {
+ var stack = getStack(new Error("Getting Callstack"));
+ if (stack.length) {
+ while (stack[0] === "assertEqualsAsync") stack.shift();
+ log.push("@@Species: [" + stack.join(" > ") + "]");
+ }
+ return new Promise(executor);
+ }
+};
+
+Object.defineProperty(Promise, Symbol.species, {
+ value: FakePromise,
+ configurable: true,
+ enumerable: false,
+ writable: false
+});
+
+// Internal `AsyncFunctionAwait` only --- no @@species invocations.
+async function test() { return await "foo"; }
+assertEqualsAsync("foo", function testInternalOnly() { return test(); },
+ "should not call Promise[@@Species]");
+assertEquals([], log);
+
+log.length = 0;
+assertEqualsAsync(
+ "foo",
+ function testThenOnReturnedPromise() {
+ return test().then(x => (log.push("Then: " + x), x));
+ },
+ "should call Promise[@@Species] after non-internal Then");
+assertEquals([
+ "@@Species: [testThenOnReturnedPromise > Promise.then > FakePromise]",
+ "Then: foo"
+], log);
« src/js/harmony-async-await.js ('K') | « src/js/promise.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698