summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/es6/promise-species.js
blob: f6f2e7a1b5c9342204661fdd6da8db3624523318 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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: --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);