forked from moltar/typescript-runtime-type-benchmarks
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathassertStrict.ts
65 lines (54 loc) · 1.67 KB
/
assertStrict.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
import { Benchmark } from './helpers/types';
import { validateData } from './parseSafe';
import type { ExpectStatic, SuiteAPI, TestAPI } from 'vitest';
type Fn = (data: unknown) => boolean;
/**
* Check that an object conforms to the schema.
*
* Raise errors if any extra keys not present in the schema are found.
*/
export class AssertStrict extends Benchmark<Fn> {
run() {
this.fn(validateData);
}
test(describe: SuiteAPI, expect: ExpectStatic, test: TestAPI) {
describe(this.moduleName, () => {
test('should validate the data', () => {
expect(this.fn(validateData)).toBe(true);
});
test('should throw on unknown attributes', () => {
const dataWithExtraKeys = {
...validateData,
extraAttribute: 'foo',
};
expect(() => this.fn(dataWithExtraKeys)).toThrow();
});
test('should throw on unknown attributes (nested)', () => {
const dataWithExtraNestedKeys = {
...validateData,
deeplyNested: {
...validateData.deeplyNested,
extraNestedAttribute: 'bar',
},
};
expect(() => this.fn(dataWithExtraNestedKeys)).toThrow();
});
test('should throw on missing attributes', () => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const data: any = {
...validateData,
};
delete data.number;
expect(() => this.fn(data)).toThrow();
});
test('should throw on data with an invalid attribute', () => {
expect(() =>
this.fn({
...validateData,
number: 'foo',
}),
).toThrow();
});
});
}
}