Skip to content

Commit e2bbf4b

Browse files
committed
test: add unit test for runPendingImmediatesAfterCurrentTask
1 parent 3cbb3b2 commit e2bbf4b

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
import { createPromiseWithResolvers } from '../../shared/lib/promise-with-resolvers'
2+
import {
3+
install,
4+
runPendingImmediatesAfterCurrentTask,
5+
} from './fast-set-immediate.external'
6+
7+
install()
8+
9+
it('runs immediates after each task', async () => {
10+
const logs: string[] = []
11+
12+
const log = (...args: any[]) => {
13+
const { inspect } = require('node:util') as typeof import('node:util')
14+
15+
let logLine = args
16+
.map((arg) =>
17+
typeof arg === 'string' ? arg : inspect(arg, { colors: true })
18+
)
19+
.join(' ')
20+
21+
logs.push(logLine)
22+
process.stdout.write(logLine + '\n')
23+
}
24+
25+
const done = createPromiseWithResolvers<void>()
26+
27+
setTimeout(() => {
28+
runPendingImmediatesAfterCurrentTask()
29+
30+
log('timeout 1')
31+
setImmediate(() => {
32+
log('timeout 1 -> immediate 1')
33+
process.nextTick(() => {
34+
log('timeout 1 -> immediate 1 -> nextTick 1')
35+
queueMicrotask(() => {
36+
log('timeout 1 -> immediate 1 -> nextTick 1 -> microtask 1')
37+
})
38+
queueMicrotask(() => {
39+
process.nextTick(() => {
40+
log(
41+
'timeout 1 -> immediate 1 -> nextTick 1 -> microtask 2 -> nextTick'
42+
)
43+
})
44+
})
45+
})
46+
})
47+
setImmediate(() => {
48+
log('timeout 1 -> immediate 2')
49+
})
50+
process.nextTick(() => {
51+
log('timeout 1 -> nextTick 1')
52+
queueMicrotask(() => {
53+
log('timeout 1 -> nextTick 1 -> microtask 1')
54+
})
55+
queueMicrotask(() => {
56+
process.nextTick(() => {
57+
log('timeout 1 -> nextTick 1 -> microtask 2 -> nextTick')
58+
})
59+
})
60+
process.nextTick(() => {
61+
log('timeout 1 -> nextTick 1 -> nextTick 1')
62+
})
63+
})
64+
})
65+
setTimeout(() => {
66+
runPendingImmediatesAfterCurrentTask()
67+
68+
log('timeout 2')
69+
setImmediate(() => {
70+
log('timeout 2 -> immediate 1')
71+
setImmediate(() => {
72+
log('timeout 2 -> immediate 1 -> immediate 1')
73+
})
74+
})
75+
})
76+
setTimeout(() => {
77+
log('timeout 3')
78+
done.resolve()
79+
})
80+
81+
await done.promise
82+
83+
expect(logs).toEqual([
84+
// ===================================
85+
'timeout 1',
86+
'timeout 1 -> nextTick 1',
87+
'timeout 1 -> nextTick 1 -> nextTick 1',
88+
'timeout 1 -> nextTick 1 -> microtask 1',
89+
'timeout 1 -> nextTick 1 -> microtask 2 -> nextTick',
90+
// ======================
91+
'timeout 1 -> immediate 1',
92+
'timeout 1 -> immediate 1 -> nextTick 1',
93+
'timeout 1 -> immediate 1 -> nextTick 1 -> microtask 1',
94+
'timeout 1 -> immediate 1 -> nextTick 1 -> microtask 2 -> nextTick',
95+
// ======================
96+
'timeout 1 -> immediate 2',
97+
// ===================================
98+
'timeout 2',
99+
// ======================
100+
'timeout 2 -> immediate 1',
101+
// ======================
102+
'timeout 2 -> immediate 1 -> immediate 1',
103+
// ===================================
104+
'timeout 3',
105+
])
106+
})

0 commit comments

Comments
 (0)