-
-
Notifications
You must be signed in to change notification settings - Fork 6.2k
/
xfail.ts
87 lines (77 loc) · 2.34 KB
/
xfail.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
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
import { assert, AssertionError } from "chai"
import { AsyncFunc, Context, Func, Test, TestFunction } from "mocha"
type XFailFunction = {
it: TestFunction
unless: (condition: boolean | (() => boolean)) => { it: TestFunction }
}
const wrap = (
fn: Func | AsyncFunc,
condition: boolean | (() => boolean),
): Func => {
return function Wrapped(this: Context): PromiseLike<any> {
if (typeof condition === "function") {
if (!condition()) {
return Promise.resolve()
}
} else if (condition === false) {
return Promise.resolve()
}
return new Promise<void>((ok, fail) => {
if (fn.length > 1) {
;(fn as Func).call(context as unknown as Context, (err: any) =>
err ? fail(err) : ok(),
)
} else {
ok((fn as AsyncFunc).call(context as unknown as Context))
}
}).then(
(e: any) => assert.fail("Expected this test to fail"),
(e: any) => {
if (!(e instanceof AssertionError)) {
throw e
}
},
)
}
}
function unless(condition: boolean | (() => boolean)): { it: TestFunction } {
const xfailIt: TestFunction = (
fnOrTitle: Func | AsyncFunc | string,
fn?: Func | AsyncFunc,
): Test => {
if (typeof fnOrTitle === "string") {
return it(fnOrTitle, wrap(fn!, condition))
} else {
return it(wrap(fnOrTitle, condition))
}
}
xfailIt.only = (
fnOrTitle: Func | AsyncFunc | string,
fn?: Func | AsyncFunc,
): Test => {
if (typeof fnOrTitle === "string") {
return it.skip(fnOrTitle, wrap(fn!, condition))
} else {
return it.skip(wrap(fnOrTitle, condition))
}
}
xfailIt.skip = (
fnOrTitle: Func | AsyncFunc | string,
fn?: Func | AsyncFunc,
): Test => {
if (typeof fnOrTitle === "string") {
return it.skip(fnOrTitle, wrap(fn!, condition))
} else {
return it.skip(wrap(fnOrTitle, condition))
}
}
xfailIt.retries = (n: number): void => {
it.retries(n)
}
return { it: xfailIt }
}
const xfail: XFailFunction = {
...unless(true),
unless,
}
export { xfail }