-
-
Notifications
You must be signed in to change notification settings - Fork 6.5k
/
bind.ts
83 lines (73 loc) · 2.47 KB
/
bind.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
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*/
import type {Global} from '@jest/types';
import {ErrorWithStack} from 'jest-util';
import convertArrayTable from './table/array';
import convertTemplateTable from './table/template';
import {validateArrayTable, validateTemplateTableHeadings} from './validation';
export type EachTests = Array<{
title: string;
arguments: Array<unknown>;
}>;
// type TestFn = (done?: Global.DoneFn) => Promise<any> | void | undefined;
type GlobalCallback = (
testName: string,
fn: Global.ConcurrentTestFn,
timeout?: number,
) => void;
export default <EachCallback extends Global.TestCallback>(
cb: GlobalCallback,
supportsDone: boolean = true,
) => (table: Global.EachTable, ...taggedTemplateData: Global.TemplateData) =>
function eachBind(
title: string,
test: Global.EachTestFn<EachCallback>,
timeout?: number,
): void {
try {
const tests = isArrayTable(taggedTemplateData)
? buildArrayTests(title, table)
: buildTemplateTests(title, table, taggedTemplateData);
return tests.forEach(row =>
cb(
row.title,
applyArguments(supportsDone, row.arguments, test),
timeout,
),
);
} catch (e) {
const error = new ErrorWithStack(e.message, eachBind);
return cb(title, () => {
throw error;
});
}
};
const isArrayTable = (data: Global.TemplateData) => data.length === 0;
const buildArrayTests = (title: string, table: Global.EachTable): EachTests => {
validateArrayTable(table);
return convertArrayTable(title, table as Global.ArrayTable);
};
const buildTemplateTests = (
title: string,
table: Global.EachTable,
taggedTemplateData: Global.TemplateData,
): EachTests => {
const headings = getHeadingKeys(table[0] as string);
validateTemplateTableHeadings(headings, taggedTemplateData);
return convertTemplateTable(title, headings, taggedTemplateData);
};
const getHeadingKeys = (headings: string): Array<string> =>
headings.replace(/\s/g, '').split('|');
const applyArguments = <EachCallback extends Global.TestCallback>(
supportsDone: boolean,
params: Array<unknown>,
test: Global.EachTestFn<EachCallback>,
): Global.EachTestFn<any> =>
supportsDone && params.length < test.length
? (done: Global.DoneFn) => test(...params, done)
: () => test(...params);