blob: f6f2e7a1b5c9342204661fdd6da8db3624523318 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ben Murdoch61f157c2016-09-16 13:49:30 +01005// Flags: --allow-natives-syntax
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00006
7// Test that Promises use @@species appropriately
8
9// Another constructor with no species will not be instantiated
10var test = new Promise(function(){});
11var bogoCount = 0;
12function bogusConstructor() { bogoCount++; }
13test.constructor = bogusConstructor;
14assertTrue(Promise.resolve(test) instanceof Promise);
15assertFalse(Promise.resolve(test) instanceof bogusConstructor);
16// Tests that chromium:575314 is fixed thoroughly
17Promise.resolve(test).catch(e => %AbortJS("Error " + e)).then(() => {
18 if (bogoCount != 0) %AbortJS("bogoCount was " + bogoCount + " should be 0");
19});
20
21// If there is a species, it will be instantiated
22// @@species will be read exactly once, and the constructor is called with a
23// function
24var count = 0;
25var params;
26class MyPromise extends Promise {
27 constructor(...args) {
28 super(...args);
29 params = args;
30 }
31 static get [Symbol.species]() {
32 count++
33 return this;
34 }
35}
36
37var myPromise = MyPromise.resolve().then();
38assertEquals(1, count);
39assertEquals(1, params.length);
40assertEquals('function', typeof(params[0]));
41assertTrue(myPromise instanceof MyPromise);
42assertTrue(myPromise instanceof Promise);