Skip to content

Commit 19571ad

Browse files
CopilotDevilTea
andcommitted
perf(benchmarks): add comprehensive benchmark tests for valchecker core and steps
Co-authored-by: DevilTea <16652879+DevilTea@users.noreply.github.com>
1 parent e863b38 commit 19571ad

File tree

5 files changed

+501
-1
lines changed

5 files changed

+501
-1
lines changed

benchmarks/core.bench.ts

Lines changed: 247 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
1+
import { array, boolean, check, createValchecker, literal, number, object, string, union } from '@valchecker/internal'
2+
import { bench, describe } from 'vitest'
3+
4+
describe('core - createValchecker', () => {
5+
bench('createValchecker - basic string schema', () => {
6+
const v = createValchecker({ steps: [string] })
7+
const schema = v.string()
8+
schema.execute('hello')
9+
})
10+
11+
bench('createValchecker - string with validation', () => {
12+
const v = createValchecker({ steps: [string, check] })
13+
const schema = v.string().check(x => x.length > 3)
14+
schema.execute('hello')
15+
})
16+
17+
bench('createValchecker - number schema', () => {
18+
const v = createValchecker({ steps: [number] })
19+
const schema = v.number()
20+
schema.execute(42)
21+
})
22+
23+
bench('createValchecker - boolean schema', () => {
24+
const v = createValchecker({ steps: [boolean] })
25+
const schema = v.boolean()
26+
schema.execute(true)
27+
})
28+
})
29+
30+
describe('core - Simple Objects', () => {
31+
bench('simple object - 3 properties', () => {
32+
const v = createValchecker({ steps: [object, string, number, boolean] })
33+
const schema = v.object({
34+
name: v.string(),
35+
age: v.number(),
36+
active: v.boolean(),
37+
})
38+
schema.execute({ name: 'John', age: 30, active: true })
39+
})
40+
41+
bench('simple object - 5 properties', () => {
42+
const v = createValchecker({ steps: [object, string, number, boolean] })
43+
const schema = v.object({
44+
name: v.string(),
45+
age: v.number(),
46+
active: v.boolean(),
47+
email: v.string(),
48+
score: v.number(),
49+
})
50+
schema.execute({ name: 'John', age: 30, active: true, email: 'john@example.com', score: 100 })
51+
})
52+
53+
bench('simple object - 10 properties', () => {
54+
const v = createValchecker({ steps: [object, string, number, boolean] })
55+
const schema = v.object({
56+
name: v.string(),
57+
age: v.number(),
58+
active: v.boolean(),
59+
email: v.string(),
60+
score: v.number(),
61+
field1: v.string(),
62+
field2: v.number(),
63+
field3: v.boolean(),
64+
field4: v.string(),
65+
field5: v.number(),
66+
})
67+
schema.execute({
68+
name: 'John',
69+
age: 30,
70+
active: true,
71+
email: 'john@example.com',
72+
score: 100,
73+
field1: 'value1',
74+
field2: 42,
75+
field3: false,
76+
field4: 'value4',
77+
field5: 99,
78+
})
79+
})
80+
})
81+
82+
describe('core - Nested Objects', () => {
83+
bench('nested object - 2 levels', () => {
84+
const v = createValchecker({ steps: [object, string, number] })
85+
const schema = v.object({
86+
name: v.string(),
87+
address: v.object({
88+
street: v.string(),
89+
city: v.string(),
90+
}),
91+
})
92+
schema.execute({
93+
name: 'John',
94+
address: { street: '123 Main St', city: 'New York' },
95+
})
96+
})
97+
98+
bench('nested object - 3 levels', () => {
99+
const v = createValchecker({ steps: [object, string, number] })
100+
const schema = v.object({
101+
name: v.string(),
102+
address: v.object({
103+
street: v.string(),
104+
city: v.string(),
105+
country: v.object({
106+
name: v.string(),
107+
code: v.string(),
108+
}),
109+
}),
110+
})
111+
schema.execute({
112+
name: 'John',
113+
address: {
114+
street: '123 Main St',
115+
city: 'New York',
116+
country: { name: 'USA', code: 'US' },
117+
},
118+
})
119+
})
120+
})
121+
122+
describe('core - Arrays', () => {
123+
bench('array - 10 strings', () => {
124+
const v = createValchecker({ steps: [array, string] })
125+
const schema = v.array(v.string())
126+
schema.execute(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'])
127+
})
128+
129+
bench('array - 50 numbers', () => {
130+
const v = createValchecker({ steps: [array, number] })
131+
const schema = v.array(v.number())
132+
const data = Array.from({ length: 50 }, (_, i) => i)
133+
schema.execute(data)
134+
})
135+
136+
bench('array - 100 objects', () => {
137+
const v = createValchecker({ steps: [array, object, string, number] })
138+
const schema = v.array(v.object({
139+
id: v.number(),
140+
name: v.string(),
141+
}))
142+
const data = Array.from({ length: 100 }, (_, i) => ({ id: i, name: `item${i}` }))
143+
schema.execute(data)
144+
})
145+
})
146+
147+
describe('core - Union Types', () => {
148+
bench('union - 2 types (string | number)', () => {
149+
const v = createValchecker({ steps: [union, string, number] })
150+
const schema = v.union([v.string(), v.number()])
151+
schema.execute('hello')
152+
})
153+
154+
bench('union - 3 types', () => {
155+
const v = createValchecker({ steps: [union, string, number, boolean] })
156+
const schema = v.union([v.string(), v.number(), v.boolean()])
157+
schema.execute(42)
158+
})
159+
160+
bench('union - 5 literal types', () => {
161+
const v = createValchecker({ steps: [union, literal] })
162+
const schema = v.union([
163+
v.literal('a'),
164+
v.literal('b'),
165+
v.literal('c'),
166+
v.literal('d'),
167+
v.literal('e'),
168+
])
169+
schema.execute('c')
170+
})
171+
})
172+
173+
describe('core - Complex Scenarios', () => {
174+
bench('complex - user profile', () => {
175+
const v = createValchecker({ steps: [object, string, number, boolean, array, union, literal] })
176+
const schema = v.object({
177+
id: v.number(),
178+
username: v.string(),
179+
email: v.string(),
180+
age: v.number(),
181+
isActive: v.boolean(),
182+
roles: v.array(v.string()),
183+
status: v.union([v.literal('active'), v.literal('inactive'), v.literal('pending')]),
184+
profile: v.object({
185+
firstName: v.string(),
186+
lastName: v.string(),
187+
bio: v.string(),
188+
}),
189+
})
190+
schema.execute({
191+
id: 1,
192+
username: 'johndoe',
193+
email: 'john@example.com',
194+
age: 30,
195+
isActive: true,
196+
roles: ['user', 'admin'],
197+
status: 'active',
198+
profile: {
199+
firstName: 'John',
200+
lastName: 'Doe',
201+
bio: 'Software developer',
202+
},
203+
})
204+
})
205+
206+
bench('complex - nested array of objects', () => {
207+
const v = createValchecker({ steps: [array, object, string, number] })
208+
const schema = v.array(v.object({
209+
id: v.number(),
210+
items: v.array(v.object({
211+
name: v.string(),
212+
value: v.number(),
213+
})),
214+
}))
215+
const data = Array.from({ length: 10 }, (_, i) => ({
216+
id: i,
217+
items: Array.from({ length: 5 }, (_, j) => ({
218+
name: `item${j}`,
219+
value: j * 10,
220+
})),
221+
}))
222+
schema.execute(data)
223+
})
224+
})
225+
226+
describe('core - Validation Failures', () => {
227+
bench('validation failure - string type mismatch', () => {
228+
const v = createValchecker({ steps: [string] })
229+
const schema = v.string()
230+
schema.execute(42)
231+
})
232+
233+
bench('validation failure - object missing required field', () => {
234+
const v = createValchecker({ steps: [object, string, number] })
235+
const schema = v.object({
236+
name: v.string(),
237+
age: v.number(),
238+
})
239+
schema.execute({ name: 'John' })
240+
})
241+
242+
bench('validation failure - union no match', () => {
243+
const v = createValchecker({ steps: [union, string, number] })
244+
const schema = v.union([v.string(), v.number()])
245+
schema.execute(true)
246+
})
247+
})

0 commit comments

Comments
 (0)