assertron 11.2.0 → 11.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/assert-order/AssertOrder.d.ts.map +1 -1
- package/cjs/assert-order/AssertOrder.js +3 -1
- package/cjs/assert-order/AssertOrder.js.map +1 -1
- package/cjs/assert-order/InvalidOrder.d.ts.map +1 -1
- package/cjs/assert-order/InvalidOrder.js +4 -2
- package/cjs/assert-order/InvalidOrder.js.map +1 -1
- package/cjs/assert-order/StateMachine.d.ts.map +1 -1
- package/cjs/assert-order/StateMachine.js +17 -8
- package/cjs/assert-order/StateMachine.js.map +1 -1
- package/cjs/assert-order/types.d.ts.map +1 -1
- package/cjs/assertron/assertron.d.ts.map +1 -1
- package/cjs/assertron/assertron.js.map +1 -1
- package/cjs/assertron/falsy.d.ts.map +1 -1
- package/cjs/assertron/falsy.js.map +1 -1
- package/cjs/assertron/isInstanceof.d.ts.map +1 -1
- package/cjs/assertron/isInstanceof.js.map +1 -1
- package/cjs/assertron/pathEqual.js.map +1 -1
- package/cjs/assertron/rejects.d.ts.map +1 -1
- package/cjs/assertron/rejects.js +3 -1
- package/cjs/assertron/rejects.js.map +1 -1
- package/cjs/assertron/repeat.d.ts.map +1 -1
- package/cjs/assertron/repeat.js +3 -1
- package/cjs/assertron/repeat.js.map +1 -1
- package/cjs/assertron/resolves.d.ts.map +1 -1
- package/cjs/assertron/resolves.js +3 -1
- package/cjs/assertron/resolves.js.map +1 -1
- package/cjs/assertron/satisfies.d.ts.map +1 -1
- package/cjs/assertron/satisfies.js.map +1 -1
- package/cjs/assertron/throws.d.ts.map +1 -1
- package/cjs/assertron/throws.js +7 -3
- package/cjs/assertron/throws.js.map +1 -1
- package/cjs/assertron/truthy.d.ts.map +1 -1
- package/cjs/assertron/truthy.js.map +1 -1
- package/cjs/errors.d.ts.map +1 -1
- package/cjs/errors.js.map +1 -1
- package/cjs/package.json +1 -1
- package/cjs/types.d.ts.map +1 -1
- package/cjs/utils/index.js.map +1 -1
- package/cjs/utils/isErrorConstructor.js.map +1 -1
- package/cjs/utils/notEqualMessage.js.map +1 -1
- package/cjs/utils/notSatisfiedMessage.d.ts.map +1 -1
- package/cjs/utils/notSatisfiedMessage.js +8 -3
- package/cjs/utils/notSatisfiedMessage.js.map +1 -1
- package/cjs/utils/notThrownMessage.js.map +1 -1
- package/cjs/utils/promiseMessages.d.ts.map +1 -1
- package/cjs/utils/promiseMessages.js +8 -4
- package/cjs/utils/promiseMessages.js.map +1 -1
- package/cjs/utils/unexpectedErrorMessage.d.ts.map +1 -1
- package/cjs/utils/unexpectedErrorMessage.js +1 -2
- package/cjs/utils/unexpectedErrorMessage.js.map +1 -1
- package/esm/assert-order/AssertOrder.d.ts.map +1 -1
- package/esm/assert-order/AssertOrder.js +3 -1
- package/esm/assert-order/AssertOrder.js.map +1 -1
- package/esm/assert-order/InvalidOrder.d.ts.map +1 -1
- package/esm/assert-order/InvalidOrder.js +4 -2
- package/esm/assert-order/InvalidOrder.js.map +1 -1
- package/esm/assert-order/StateMachine.d.ts.map +1 -1
- package/esm/assert-order/StateMachine.js +17 -8
- package/esm/assert-order/StateMachine.js.map +1 -1
- package/esm/assert-order/types.d.ts.map +1 -1
- package/esm/assertron/assertron.d.ts.map +1 -1
- package/esm/assertron/assertron.js.map +1 -1
- package/esm/assertron/falsy.d.ts.map +1 -1
- package/esm/assertron/falsy.js.map +1 -1
- package/esm/assertron/isInstanceof.d.ts.map +1 -1
- package/esm/assertron/isInstanceof.js.map +1 -1
- package/esm/assertron/pathEqual.js.map +1 -1
- package/esm/assertron/rejects.d.ts.map +1 -1
- package/esm/assertron/rejects.js +3 -1
- package/esm/assertron/rejects.js.map +1 -1
- package/esm/assertron/repeat.d.ts.map +1 -1
- package/esm/assertron/repeat.js +3 -1
- package/esm/assertron/repeat.js.map +1 -1
- package/esm/assertron/resolves.d.ts.map +1 -1
- package/esm/assertron/resolves.js +3 -1
- package/esm/assertron/resolves.js.map +1 -1
- package/esm/assertron/satisfies.d.ts.map +1 -1
- package/esm/assertron/satisfies.js.map +1 -1
- package/esm/assertron/throws.d.ts.map +1 -1
- package/esm/assertron/throws.js +7 -3
- package/esm/assertron/throws.js.map +1 -1
- package/esm/assertron/truthy.d.ts.map +1 -1
- package/esm/assertron/truthy.js.map +1 -1
- package/esm/errors.d.ts.map +1 -1
- package/esm/errors.js.map +1 -1
- package/esm/types.d.ts.map +1 -1
- package/esm/utils/index.js.map +1 -1
- package/esm/utils/isErrorConstructor.js.map +1 -1
- package/esm/utils/notEqualMessage.js.map +1 -1
- package/esm/utils/notSatisfiedMessage.d.ts.map +1 -1
- package/esm/utils/notSatisfiedMessage.js +8 -3
- package/esm/utils/notSatisfiedMessage.js.map +1 -1
- package/esm/utils/notThrownMessage.js.map +1 -1
- package/esm/utils/promiseMessages.d.ts.map +1 -1
- package/esm/utils/promiseMessages.js +8 -4
- package/esm/utils/promiseMessages.js.map +1 -1
- package/esm/utils/unexpectedErrorMessage.d.ts.map +1 -1
- package/esm/utils/unexpectedErrorMessage.js +1 -2
- package/esm/utils/unexpectedErrorMessage.js.map +1 -1
- package/package.json +20 -14
- package/ts/assert-order/AssertOrder.ts +138 -143
- package/ts/assert-order/InvalidOrder.ts +22 -18
- package/ts/assert-order/StateMachine.ts +95 -88
- package/ts/assert-order/index.ts +0 -1
- package/ts/assert-order/internalInterfaces.ts +3 -3
- package/ts/assert-order/types.ts +5 -5
- package/ts/assertron/assertron.ts +38 -31
- package/ts/assertron/falsy.ts +1 -2
- package/ts/assertron/isInstanceof.ts +6 -3
- package/ts/assertron/pathEqual.ts +2 -2
- package/ts/assertron/rejects.ts +6 -4
- package/ts/assertron/repeat.ts +27 -21
- package/ts/assertron/resolves.ts +6 -4
- package/ts/assertron/satisfies.ts +27 -20
- package/ts/assertron/throws.ts +75 -54
- package/ts/assertron/truthy.ts +1 -4
- package/ts/errors.ts +7 -7
- package/ts/testUtils.ts +51 -54
- package/ts/types.ts +0 -1
- package/ts/utils/index.ts +1 -1
- package/ts/utils/isErrorConstructor.ts +1 -1
- package/ts/utils/notEqualMessage.ts +1 -1
- package/ts/utils/notSatisfiedMessage.ts +17 -13
- package/ts/utils/notThrownMessage.ts +1 -1
- package/ts/utils/promiseMessages.ts +12 -5
- package/ts/utils/unexpectedErrorMessage.ts +3 -2
|
@@ -5,147 +5,142 @@ import { StateMachine } from './StateMachine.js'
|
|
|
5
5
|
// order.atMost(step, count) // exected to be executed at most `count` times
|
|
6
6
|
|
|
7
7
|
export class AssertOrder {
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
private assert(method: string, step: number) {
|
|
147
|
-
if (this.state.isNotValid(step)) {
|
|
148
|
-
throw new InvalidOrder(this.state.get(), method, [step], { ssf: (this as any)[method] })
|
|
149
|
-
}
|
|
150
|
-
}
|
|
8
|
+
/**
|
|
9
|
+
* Gets the current expecting step.
|
|
10
|
+
*/
|
|
11
|
+
get currentStep() {
|
|
12
|
+
return this.state.step
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
private state: StateMachine
|
|
16
|
+
constructor(plan?: number) {
|
|
17
|
+
this.state = new StateMachine(plan)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Asserts the current step is `step`.
|
|
22
|
+
* @param step expected step.
|
|
23
|
+
*/
|
|
24
|
+
is(step: number) {
|
|
25
|
+
this.assert('is', step)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Asserts the current step is not `step`.
|
|
30
|
+
* @param step not expected step.
|
|
31
|
+
*/
|
|
32
|
+
not(step: number) {
|
|
33
|
+
if (this.state.isValid(step)) {
|
|
34
|
+
throw new InvalidOrder(this.state.get(), 'not', [step], { ssf: this.not })
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Reset to specified step.
|
|
40
|
+
*/
|
|
41
|
+
jump(step: number) {
|
|
42
|
+
this.state.jump(step)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Move to next step.
|
|
47
|
+
*/
|
|
48
|
+
move() {
|
|
49
|
+
this.state.move()
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Asserts the specified step will run once.
|
|
54
|
+
*/
|
|
55
|
+
once(step: number) {
|
|
56
|
+
this.assert('once', step)
|
|
57
|
+
this.state.move()
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
on(step: number, assert: (step: number) => void) {
|
|
61
|
+
this.state.on(step, () => {
|
|
62
|
+
assert(step)
|
|
63
|
+
})
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
atLeastOnce(step: number) {
|
|
67
|
+
const nextStep = step + 1
|
|
68
|
+
if (this.state.step === step) {
|
|
69
|
+
this.state.move()
|
|
70
|
+
return this.state.moveSubStep()
|
|
71
|
+
} else if (this.state.step === nextStep && this.state.subStep > 0) {
|
|
72
|
+
return this.state.moveSubStep()
|
|
73
|
+
} else throw new InvalidOrder(this.state.get(), 'atLeastOnce', [step], { ssf: this.atLeastOnce })
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
any(steps: number[]) {
|
|
77
|
+
const index = steps.indexOf(this.state.step)
|
|
78
|
+
if (index === -1) throw new InvalidOrder(this.state.get(), 'any', [steps], { ssf: this.any })
|
|
79
|
+
|
|
80
|
+
this.state.move()
|
|
81
|
+
return steps[index]
|
|
82
|
+
}
|
|
83
|
+
onAny(steps: number[], ...asserts: Array<(...args: any[]) => any>) {
|
|
84
|
+
steps.forEach(step => {
|
|
85
|
+
this.state.on(step, () => {
|
|
86
|
+
let firstError: any
|
|
87
|
+
let hasPass = false
|
|
88
|
+
asserts.forEach(assert => {
|
|
89
|
+
try {
|
|
90
|
+
assert(step)
|
|
91
|
+
hasPass = true
|
|
92
|
+
} catch (err) {
|
|
93
|
+
if (!firstError) firstError = err
|
|
94
|
+
}
|
|
95
|
+
})
|
|
96
|
+
if (!hasPass) throw firstError
|
|
97
|
+
})
|
|
98
|
+
})
|
|
99
|
+
return
|
|
100
|
+
}
|
|
101
|
+
end(timeout: number): Promise<number>
|
|
102
|
+
end(): number
|
|
103
|
+
end(timeout?: number) {
|
|
104
|
+
if (timeout) {
|
|
105
|
+
return new Promise(r => {
|
|
106
|
+
setTimeout(r, timeout)
|
|
107
|
+
}).then(() => {
|
|
108
|
+
return this.end()
|
|
109
|
+
})
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (!this.state.isMaxStepDefined()) {
|
|
113
|
+
this.state.stopAccepting()
|
|
114
|
+
return this.state.getTimeTaken()
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (this.state.isAccepting()) {
|
|
118
|
+
throw new InvalidOrder(this.state.get(), 'end', [], { ssf: this.end })
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
exactly(step: number, times: number) {
|
|
122
|
+
if (this.state.isNotValid(step))
|
|
123
|
+
throw new InvalidOrder(this.state.get(), 'exactly', [step, times], { ssf: this.exactly })
|
|
124
|
+
|
|
125
|
+
if (this.state.maxSubStep === undefined) {
|
|
126
|
+
this.state.maxSubStep = times
|
|
127
|
+
this.state.minSubStep = times
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return this.state.moveSubStep()
|
|
131
|
+
}
|
|
132
|
+
wait(step: number): Promise<void>
|
|
133
|
+
wait(step: number, callback: () => void): void
|
|
134
|
+
wait(step: number, callback?: () => void) {
|
|
135
|
+
if (callback) this.on(step, callback)
|
|
136
|
+
else
|
|
137
|
+
return new Promise<any>(a => {
|
|
138
|
+
this.on(step, a)
|
|
139
|
+
})
|
|
140
|
+
}
|
|
141
|
+
private assert(method: string, step: number) {
|
|
142
|
+
if (this.state.isNotValid(step)) {
|
|
143
|
+
throw new InvalidOrder(this.state.get(), method, [step], { ssf: (this as any)[method] })
|
|
144
|
+
}
|
|
145
|
+
}
|
|
151
146
|
}
|
|
@@ -2,34 +2,38 @@ import { AssertionError } from '../errors.js'
|
|
|
2
2
|
import type { State } from './types.js'
|
|
3
3
|
|
|
4
4
|
export class InvalidOrder extends AssertionError {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
constructor(
|
|
6
|
+
public state: State,
|
|
7
|
+
public method: string,
|
|
8
|
+
public args: any[],
|
|
9
|
+
options: AssertionError.Options
|
|
10
|
+
) {
|
|
11
|
+
super(method === 'end' ? getEndMessage(state) : getExpectingMessage(state, method, args), options)
|
|
12
|
+
}
|
|
8
13
|
}
|
|
9
14
|
|
|
10
15
|
function getEndMessage(state: State) {
|
|
11
|
-
|
|
16
|
+
return `Planned for ${state.maxStep} step but expecting step ${state.step} when 'end()' is called`
|
|
12
17
|
}
|
|
13
18
|
|
|
14
19
|
function getExpectingMessage(state: State, method: string, args: any[]) {
|
|
15
|
-
|
|
20
|
+
return `Expecting ${getExpectingCalls(state)}, but received '${method}(${getMethodArgs(args)})'`
|
|
16
21
|
}
|
|
17
22
|
|
|
18
23
|
function getExpectingCalls(state: State) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
return message
|
|
24
|
+
let message: string
|
|
25
|
+
if (state.subStep === 0) {
|
|
26
|
+
const methods = ['is', 'once', 'any']
|
|
27
|
+
message = methods
|
|
28
|
+
.map(m => `'${m}(${['any'].indexOf(m) === -1 ? state.step : `[${state.step}]`})'`)
|
|
29
|
+
.join(', ')
|
|
30
|
+
} else {
|
|
31
|
+
const methods = ['exactly']
|
|
32
|
+
message = methods.map(m => `'${m}(${state.step}, ${state.maxSubStep})'`).join(', ')
|
|
33
|
+
}
|
|
34
|
+
return message
|
|
31
35
|
}
|
|
32
36
|
|
|
33
37
|
function getMethodArgs(args: any[]) {
|
|
34
|
-
|
|
38
|
+
return args.map(a => (Array.isArray(a) ? `[${a.join(', ')}]` : a)).join(', ')
|
|
35
39
|
}
|
|
@@ -1,96 +1,103 @@
|
|
|
1
1
|
import * as perf from 'perf_hooks'
|
|
2
2
|
import type { State } from './types.js'
|
|
3
3
|
|
|
4
|
-
let timeTracker: { start(): void
|
|
5
|
-
|
|
6
|
-
if (process && typeof process.hrtime === 'function') {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
4
|
+
let timeTracker: { start(): void; taken(): number }
|
|
5
|
+
|
|
6
|
+
if (global['process'] && typeof global['process'].hrtime === 'function') {
|
|
7
|
+
let tick: [number, number]
|
|
8
|
+
timeTracker = {
|
|
9
|
+
start() {
|
|
10
|
+
tick = global['process'].hrtime()
|
|
11
|
+
},
|
|
12
|
+
taken() {
|
|
13
|
+
const [second, nanoSecond] = global['process'].hrtime(tick)
|
|
14
|
+
return second * 1000 + nanoSecond / 1e6
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
} else if (perf.performance && typeof perf.performance.now === 'function') {
|
|
18
|
+
const now = perf.performance.now
|
|
19
|
+
let tick: number
|
|
20
|
+
timeTracker = {
|
|
21
|
+
start() {
|
|
22
|
+
tick = now()
|
|
23
|
+
},
|
|
24
|
+
taken() {
|
|
25
|
+
return now() - tick
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
} else {
|
|
29
|
+
let tick: number
|
|
30
|
+
timeTracker = {
|
|
31
|
+
start() {
|
|
32
|
+
tick = new Date().valueOf()
|
|
33
|
+
},
|
|
34
|
+
taken() {
|
|
35
|
+
return new Date().valueOf() - tick
|
|
36
|
+
}
|
|
37
|
+
}
|
|
30
38
|
}
|
|
31
39
|
|
|
32
40
|
export class StateMachine {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
41
|
+
listeners: Record<number, Array<() => void>> = {}
|
|
42
|
+
step = 1
|
|
43
|
+
maxStep?: number
|
|
36
44
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
45
|
+
subStep = 0
|
|
46
|
+
minSubStep?: number
|
|
47
|
+
maxSubStep?: number
|
|
48
|
+
constructor(maxStep?: number) {
|
|
49
|
+
this.maxStep = maxStep
|
|
50
|
+
timeTracker.start()
|
|
51
|
+
}
|
|
52
|
+
jump(step: number) {
|
|
53
|
+
this.step = step
|
|
54
|
+
this.subStep = 0
|
|
55
|
+
return this.step
|
|
56
|
+
}
|
|
57
|
+
move() {
|
|
58
|
+
const listeners = this.listeners[this.step]
|
|
59
|
+
this.step = this.step + 1
|
|
60
|
+
this.subStep = 0
|
|
61
|
+
if (listeners) {
|
|
62
|
+
listeners.forEach(l => l())
|
|
63
|
+
}
|
|
64
|
+
return this.step
|
|
65
|
+
}
|
|
66
|
+
moveSubStep() {
|
|
67
|
+
const subStep = ++this.subStep
|
|
68
|
+
if (this.maxSubStep === this.subStep) this.move()
|
|
69
|
+
return subStep
|
|
70
|
+
}
|
|
71
|
+
get(): State {
|
|
72
|
+
const { step, subStep, maxStep, minSubStep, maxSubStep } = this
|
|
73
|
+
return {
|
|
74
|
+
step,
|
|
75
|
+
maxStep,
|
|
76
|
+
subStep,
|
|
77
|
+
minSubStep,
|
|
78
|
+
maxSubStep
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
on(step: number, listener: () => void) {
|
|
82
|
+
this.listeners[step] = [listener]
|
|
83
|
+
}
|
|
84
|
+
isNotValid(step: number) {
|
|
85
|
+
return step !== this.step || (this.maxStep !== undefined && this.maxStep < step)
|
|
86
|
+
}
|
|
87
|
+
isValid(step: number) {
|
|
88
|
+
return step === this.step
|
|
89
|
+
}
|
|
90
|
+
isMaxStepDefined() {
|
|
91
|
+
return this.maxStep !== undefined
|
|
92
|
+
}
|
|
93
|
+
stopAccepting() {
|
|
94
|
+
this.maxStep = this.step - 1
|
|
95
|
+
}
|
|
96
|
+
isAccepting() {
|
|
97
|
+
// istanbul ignore next
|
|
98
|
+
return this.maxStep ? this.maxStep >= this.step : true
|
|
99
|
+
}
|
|
100
|
+
getTimeTaken() {
|
|
101
|
+
return timeTracker.taken()
|
|
102
|
+
}
|
|
96
103
|
}
|
package/ts/assert-order/index.ts
CHANGED
package/ts/assert-order/types.ts
CHANGED
|
@@ -13,38 +13,45 @@ import { throws } from './throws.js'
|
|
|
13
13
|
import { truthy } from './truthy.js'
|
|
14
14
|
|
|
15
15
|
export type Assertron = {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
16
|
+
false(value: unknown): asserts value is false
|
|
17
|
+
falsy(value: any): asserts value is false | 0 | '' | null | undefined
|
|
18
|
+
isInstanceof<T extends AnyConstructor>(value: unknown, type: T): asserts value is InstanceType<T>
|
|
19
|
+
pathEqual(actual: string, expected: string): void
|
|
20
|
+
rejects<R = any>(promise: Promise<any>): Promise<R>
|
|
21
|
+
repeat<R>(
|
|
22
|
+
fn: () => R | (() => Promise<R>),
|
|
23
|
+
times: number
|
|
24
|
+
): ReturnType<typeof fn> extends Promise<R> ? Promise<R> : R
|
|
25
|
+
resolves(promise: Promise<any>): Promise<void>
|
|
26
|
+
satisfies<Actual, Expected extends Actual>(actual: Actual, expected: SatisfyExpectation<Expected>): void
|
|
27
|
+
throws<E extends Error>(value: PromiseLike<any>, error?: ErrorValidator | ErrorConstructor<E>): Promise<E>
|
|
28
|
+
throws<E extends Error>(value: (...args: any[]) => never, error?: ErrorValidator | ErrorConstructor<E>): E
|
|
29
|
+
throws<E extends Error, R = any>(
|
|
30
|
+
value: (...args: any[]) => R,
|
|
31
|
+
error?: ErrorValidator | ErrorConstructor<E>
|
|
32
|
+
): R extends Promise<any> ? Promise<E> : E
|
|
33
|
+
throws<T, R = any>(
|
|
34
|
+
value: (...args: any[]) => R,
|
|
35
|
+
validator?: ErrorValidator
|
|
36
|
+
): R extends Promise<any> ? Promise<T> : T
|
|
37
|
+
true(value: any): asserts value is true
|
|
38
|
+
truthy(value: unknown): void
|
|
30
39
|
}
|
|
31
40
|
|
|
32
41
|
export const assertron: Assertron = {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
},
|
|
49
|
-
truthy
|
|
42
|
+
false(value: any) {
|
|
43
|
+
if (value !== false) throw new AssertionError(notEqualMessage(value, false), { ssf: assertron.false })
|
|
44
|
+
},
|
|
45
|
+
falsy,
|
|
46
|
+
isInstanceof,
|
|
47
|
+
pathEqual,
|
|
48
|
+
rejects,
|
|
49
|
+
repeat,
|
|
50
|
+
resolves,
|
|
51
|
+
satisfies,
|
|
52
|
+
throws,
|
|
53
|
+
true(value: any) {
|
|
54
|
+
if (value !== true) throw new AssertionError(notEqualMessage(value, true), { ssf: assertron.true })
|
|
55
|
+
},
|
|
56
|
+
truthy
|
|
50
57
|
}
|
package/ts/assertron/falsy.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { AssertionError } from '../errors.js'
|
|
2
2
|
|
|
3
3
|
export function falsy(value: any) {
|
|
4
|
-
|
|
5
|
-
throw new AssertionError(`Expected value to be falsy, but received ${value}`, { ssf: falsy })
|
|
4
|
+
if (value) throw new AssertionError(`Expected value to be falsy, but received ${value}`, { ssf: falsy })
|
|
6
5
|
}
|