Table-driven testing patterns using @kitz/test. Triggers on creating test cases, parameterized tests, or when writing .test.ts files.
/plugin marketplace add jasonkuhrt/claude-marketplace/plugin install kitz@jasonkuhrtThis skill inherits all available tools. When active, it can use any tool Claude has access to.
import { Test } from '@kitz/test'
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()
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)
})
Use for nested groupings:
Test.describe('String > uppercase', [
['hello', 'HELLO'],
])
.describe('String > lowercase', [
['HELLO', 'hello'],
])
.test(({ input, output }) => {
// runs for each describe block
})
Cartesian product of inputs:
Test.on(format)
.matrix({
locale: ['en', 'fr', 'de'],
currency: ['USD', 'EUR'],
amount: [100, 1000],
})
.test()
Transform expected outputs before comparison:
Test.on(serialize)
.cases(
[{ a: 1 }, '{"a":1}'],
)
.onOutput(JSON.parse) // parse expected before comparing
.test()
Override default assertion:
Test.on(approximateCalc)
.cases(
[[1.1], 1],
[[2.9], 3],
)
.test(({ input, output, actual }) => {
expect(actual).toBeCloseTo(output, 0)
})
Test.on() or Test.describe() in Vitest describe blocks - they create their own> separator for nested describes: 'Parent > Child'