'use strict'; const common = require('../common'); const assert = require('assert'); const rejection = new Error('Swallowed reject'); const rejection2 = new TypeError('Weird'); const resolveMessage = 'First call'; const rejectPromise = new Promise((r) => setTimeout(r, 10, rejection2)); const swallowedResolve = 'Swallowed resolve'; const swallowedResolve2 = 'Foobar'; process.on('multipleResolves', common.mustCall(handler, 4)); const p1 = new Promise((resolve, reject) => { resolve(resolveMessage); resolve(swallowedResolve); reject(rejection); }); const p2 = new Promise((resolve, reject) => { reject(rejectPromise); resolve(swallowedResolve2); reject(rejection2); }).catch(common.mustCall((exception) => { assert.strictEqual(exception, rejectPromise); })); const expected = [ 'resolve', p1, swallowedResolve, 'reject', p1, rejection, 'resolve', p2, swallowedResolve2, 'reject', p2, rejection2 ]; let count = 0; function handler(type, promise, reason) { assert.strictEqual(type, expected.shift()); // In the first two cases the promise is identical because it's not delayed. // The other two cases are not identical, because the `promise` is caught in a // state when it has no knowledge about the `.catch()` handler that is // attached to it right afterwards. if (count++ < 2) { assert.strictEqual(promise, expected.shift()); } else { assert.notStrictEqual(promise, expected.shift()); } assert.strictEqual(reason, expected.shift()); }