Index: test/mjsunit/harmony/promise-species.js |
diff --git a/test/mjsunit/harmony/promise-species.js b/test/mjsunit/harmony/promise-species.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..12244f291a14b58bc6f44714ce5787bfa03bb6f7 |
--- /dev/null |
+++ b/test/mjsunit/harmony/promise-species.js |
@@ -0,0 +1,42 @@ |
+// Copyright 2015 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-species --allow-natives-syntax |
+ |
+// Test that Promises use @@species appropriately |
+ |
+// Another constructor with no species will not be instantiated |
+var test = new Promise(function(){}); |
+var bogoCount = 0; |
+function bogusConstructor() { bogoCount++; } |
+test.constructor = bogusConstructor; |
+assertTrue(Promise.resolve(test) instanceof Promise); |
+assertFalse(Promise.resolve(test) instanceof bogusConstructor); |
+// Tests that chromium:575314 is fixed thoroughly |
+Promise.resolve(test).catch(e => %AbortJS("Error " + e)).then(() => { |
+ if (bogoCount != 0) %AbortJS("bogoCount was " + bogoCount + " should be 0"); |
+}); |
+ |
+// If there is a species, it will be instantiated |
+// @@species will be read exactly once, and the constructor is called with a |
+// function |
+var count = 0; |
+var params; |
+class MyPromise extends Promise { |
+ constructor(...args) { |
+ super(...args); |
+ params = args; |
+ } |
+ static get [Symbol.species]() { |
+ count++ |
+ return this; |
+ } |
+} |
+ |
+var myPromise = MyPromise.resolve().then(); |
+assertEquals(1, count); |
+assertEquals(1, params.length); |
+assertEquals('function', typeof(params[0])); |
+assertTrue(myPromise instanceof MyPromise); |
+assertTrue(myPromise instanceof Promise); |