-
-
Notifications
You must be signed in to change notification settings - Fork 269
/
use-subtests.ts
46 lines (42 loc) · 1.22 KB
/
use-subtests.ts
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
import { Base, TestBase } from '@tapjs/core'
import { useState } from 'react'
import { listenCleanup } from '../listen-cleanup.js'
import { useCleanup } from './use-cleanup.js'
const ALLSUBS = new Map<Base, Base[]>()
const FINSUBS = new Map<Base, Base[]>()
export const useSubtests = (
test: TestBase,
which: 'active' | 'finished' | 'all' = 'all',
) => {
const [tests, updateTests] = useState<Base[]>([])
const cache = which === 'finished' ? FINSUBS : ALLSUBS
const addSub = (t: Base) => {
const tests = (cache.get(test) || []).concat(t)
cache.set(test, tests)
updateTests(tests)
}
const updateActive = () => updateTests([...test.activeSubtests])
useCleanup(
cleanup => {
if (which === 'active') {
cleanup.push(
listenCleanup(test, 'subtestStart', updateActive),
)
cleanup.push(listenCleanup(test, 'subtestEnd', updateActive))
} else {
cleanup.push(
listenCleanup(test, 'complete', () => cache.delete(test)),
)
cleanup.push(
listenCleanup(
test,
which === 'all' ? 'subtestStart' : 'subtestEnd',
addSub,
),
)
}
},
[test, tests, which],
)
return tests
}