1'use strict';
2
3const common = require('../common');
4const assert = require('assert');
5
6const rejection = new Error('Swallowed reject');
7const rejection2 = new TypeError('Weird');
8const resolveMessage = 'First call';
9const rejectPromise = new Promise((r) => setTimeout(r, 10, rejection2));
10const swallowedResolve = 'Swallowed resolve';
11const swallowedResolve2 = 'Foobar';
12
13process.on('multipleResolves', common.mustCall(handler, 4));
14
15const p1 = new Promise((resolve, reject) => {
16  resolve(resolveMessage);
17  resolve(swallowedResolve);
18  reject(rejection);
19});
20
21const p2 = new Promise((resolve, reject) => {
22  reject(rejectPromise);
23  resolve(swallowedResolve2);
24  reject(rejection2);
25}).catch(common.mustCall((exception) => {
26  assert.strictEqual(exception, rejectPromise);
27}));
28
29const expected = [
30  'resolve',
31  p1,
32  swallowedResolve,
33  'reject',
34  p1,
35  rejection,
36  'resolve',
37  p2,
38  swallowedResolve2,
39  'reject',
40  p2,
41  rejection2,
42];
43
44let count = 0;
45
46function handler(type, promise, reason) {
47  assert.strictEqual(type, expected.shift());
48  // In the first two cases the promise is identical because it's not delayed.
49  // The other two cases are not identical, because the `promise` is caught in a
50  // state when it has no knowledge about the `.catch()` handler that is
51  // attached to it right afterwards.
52  if (count++ < 2) {
53    assert.strictEqual(promise, expected.shift());
54  } else {
55    assert.notStrictEqual(promise, expected.shift());
56  }
57  assert.strictEqual(reason, expected.shift());
58}
59