forked from moltar/typescript-runtime-type-benchmarks
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathassertLoose.ts
70 lines (59 loc) · 1.84 KB
/
assertLoose.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
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.
*
* Ignore any extra keys in input objects.
*
* Such a validation mode is highly unsafe when used on untrusted input.
*
* But not checking for unknown/extra keys in records may provide massive
* speedups and may suffice in certain scenarios.
*/
export class AssertLoose 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 validate with unknown attributes', () => {
const dataWithExtraKeys = {
...validateData,
extraAttribute: 'foo',
};
expect(this.fn(dataWithExtraKeys)).toBe(true);
});
test('should validate with unknown attributes (nested)', () => {
const dataWithExtraNestedKeys = {
...validateData,
deeplyNested: {
...validateData.deeplyNested,
extraNestedAttribute: 'bar',
},
};
expect(this.fn(dataWithExtraNestedKeys)).toBe(true);
});
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();
});
});
}
}