| name | table-testing |
| description | Table-driven testing patterns using @kitz/test. Triggers on creating test cases, parameterized tests, or when writing .test.ts files. |
Table-Driven Testing
Import
import { Test } from '@kitz/test'
Function Mode (Preferred)
Types are inferred from the function signature:
// Basic - input/output pairs
Test.on(add)
.cases(
[[2, 3], 5],
[[-1, 1], 0],
[[0, 0], 0],
)
.test()
// Snapshot mode - no expected output
Test.on(parseValue)
.cases(
[['42']],
[['hello']],
)
.test()
Describe Mode
For custom types or grouping:
Test.describe('Transform')
.inputType<string>()
.outputType<string>()
.cases(
['hello', 'HELLO'],
['world', 'WORLD'],
)
.test(({ input, output }) => {
expect(input.toUpperCase()).toBe(output)
})
Chained Describes
Use for nested groupings:
Test.describe('String > uppercase', [
['hello', 'HELLO'],
])
.describe('String > lowercase', [
['HELLO', 'hello'],
])
.test(({ input, output }) => {
// runs for each describe block
})
Matrix Testing
Cartesian product of inputs:
Test.on(format)
.matrix({
locale: ['en', 'fr', 'de'],
currency: ['USD', 'EUR'],
amount: [100, 1000],
})
.test()
Output Transformation
Transform expected outputs before comparison:
Test.on(serialize)
.cases(
[{ a: 1 }, '{"a":1}'],
)
.onOutput(JSON.parse) // parse expected before comparing
.test()
Custom Assertions
Override default assertion:
Test.on(approximateCalc)
.cases(
[[1.1], 1],
[[2.9], 3],
)
.test(({ input, output, actual }) => {
expect(actual).toBeCloseTo(output, 0)
})
Key Rules
- NEVER wrap
Test.on()orTest.describe()in Vitestdescribeblocks - they create their own - Use
>separator for nested describes:'Parent > Child' - Function mode infers types automatically - prefer it when testing a single function
- Snapshot mode (no expected output) uses Vitest's snapshot system