summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/promise/promise-race-with-non-default-resolving.js
blob: 23d4b95bc3ed3ea191b5be0e728cd7c6b51a215b (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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
function newPromiseCapability() {
    var resolve, reject, promise = new Promise(function(r1, r2) {
        resolve = r1;
        reject = r2;
    });
    return {promise, resolve, reject};
}

function neverCalled() {
    // Quit with non-zero exit code to ensure a test suite error is shown,
    // even when this function is called within promise handlers which normally
    // swallow any exceptions.
    quit(1);
}

var {promise, resolve} = newPromiseCapability();

var getterCount = 0;

class P extends Promise {
    constructor(executor) {
        var {promise, resolve, reject} = newPromiseCapability();

        executor(function(v) {
            // Resolve the promise.
            resolve(v);

            // But then return an object from the resolve function. This object
            // must be treated as the resolution value for the otherwise
            // skipped promise which gets created when Promise.prototype.then is
            // called in PerformPromiseRace.
            return {
                get then() {
                    getterCount++;
                }
            };
        }, neverCalled);

        return promise;
    }

    // Default to the standard Promise.resolve function, so we don't create
    // another instance of this class when resolving the passed promise objects
    // in Promise.race.
    static resolve(v) {
        return Promise.resolve(v);
    }
}

P.race([promise]);

resolve(0);

drainJobQueue();

assertEq(getterCount, 1);