verify-it
Version:
Randomised test property/data generation for NodeJS
217 lines (204 loc) • 5.02 kB
TypeScript
import type { TestFn as NativeTestFn } from 'node:test'
type LibraryTestFn = (done: TestDone) => any
type DescribeFn = (description: string, callback?: () => void) => void
type TestCallbackFn = NativeTestFn | LibraryTestFn
type VerifyFunction<F extends TestCallbackFn> = {
(description: string, callback: F): any
<T1>(
description: string,
gen1: () => T1,
callback: (value1: T1, ...args: Parameters<F>) => any
): any
<T1, T2>(
description: string,
gen1: () => T1,
gen2: () => T2,
callback: (value1: T1, value2: T2, ...args: Parameters<F>) => any
): any
<T1, T2, T3>(
description: string,
gen1: () => T1,
gen2: () => T2,
gen3: () => T3,
callback: (
value1: T1,
value2: T2,
value3: T3,
...args: Parameters<F>
) => any
): any
<T1, T2, T3, T4>(
description: string,
gen1: () => T1,
gen2: () => T2,
gen3: () => T3,
gen4: () => T4,
callback: (
value1: T1,
value2: T2,
value3: T3,
value4: T4,
...args: Parameters<F>
) => any
): any
<T1, T2, T3, T4, T5>(
description: string,
gen1: () => T1,
gen2: () => T2,
gen3: () => T3,
gen4: () => T4,
gen5: () => T5,
callback: (
value1: T1,
value2: T2,
value3: T3,
value4: T4,
value5: T5,
...args: Parameters<F>
) => any
): any
<T1, T2, T3, T4, T5, T6>(
description: string,
gen1: () => T1,
gen2: () => T2,
gen3: () => T3,
gen4: () => T4,
gen5: () => T5,
gen6: () => T6,
callback: (
value1: T1,
value2: T2,
value3: T3,
value4: T4,
value5: T5,
value6: T6,
...args: Parameters<F>
) => any
): any
<T1, T2, T3, T4, T5, T6, T7>(
description: string,
gen1: () => T1,
gen2: () => T2,
gen3: () => T3,
gen4: () => T4,
gen5: () => T5,
gen6: () => T6,
gen7: () => T7,
callback: (
value1: T1,
value2: T2,
value3: T3,
value4: T4,
value5: T5,
value6: T6,
value7: T7,
...args: Parameters<F>
) => any
): any
<T1, T2, T3, T4, T5, T6, T7, T8>(
description: string,
gen1: () => T1,
gen2: () => T2,
gen3: () => T3,
gen4: () => T4,
gen5: () => T5,
gen6: () => T6,
gen7: () => T7,
gen8: () => T8,
callback: (
value1: T1,
value2: T2,
value3: T3,
value4: T4,
value5: T5,
value6: T6,
value7: T7,
value8: T8,
...args: Parameters<F>
) => any
): any
<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
description: string,
gen1: () => T1,
gen2: () => T2,
gen3: () => T3,
gen4: () => T4,
gen5: () => T5,
gen6: () => T6,
gen7: () => T7,
gen8: () => T8,
gen9: () => T9,
callback: (
value1: T1,
value2: T2,
value3: T3,
value4: T4,
value5: T5,
value6: T6,
value7: T7,
value8: T8,
value9: T9,
...args: Parameters<F>
) => any
): any
}
type VerifyItObject<F extends TestCallbackFn> = VerifyFunction<F> & {
only: VerifyFunction<F>
skip: VerifyFunction<F>
}
type TestDone = (error?: any) => any
interface IVerify<T extends TestCallbackFn> {
it: VerifyItObject<T>
test: VerifyItObject<T>
describe: VerifyItObject<() => void>
}
export const Gen: {
string: () => string
stringWithLength: (length: number) => () => string
stringNonNumeric: () => string
integer: () => number
integerBetween(min: number, max: number): () => number
float: () => number
floatBetween(min: number, max: number): () => number
object: () => Record<string, string>
objectWith<Keys extends string[]>(
...keys: Keys
): () => Record<Keys[number], string>
error: () => Error
array<T>(generator: () => T, length: number): () => T[]
distinct<T>(generator: () => T, length: number): () => T[]
pick<T>(values: T[]): () => T
word: () => string
boolean: () => boolean
}
type Init<T extends TestCallbackFn> =
| {
it: (description: string, callback: T) => void
}
| {
test: (description: string, callback: T) => void
}
type InitDescribe = { describe: DescribeFn }
type InitFunction = {
<T extends Init<NativeTestFn> | (Init<NativeTestFn> & InitDescribe)>(
options: T
): T extends InitDescribe
? IVerify<NativeTestFn>
: Omit<IVerify<NativeTestFn>, 'describe'>
<T extends Init<LibraryTestFn> | (Init<LibraryTestFn> & InitDescribe)>(
options: T
): T extends InitDescribe
? IVerify<LibraryTestFn>
: Omit<IVerify<LibraryTestFn>, 'describe'>
}
export const init: InitFunction
declare global {
/**
* @deprecated Please use explicit initialisation using the `init()` function instead.
*
* The `verify` object provides a type-safe interface for defining tests with generators.
* Only available as a global if there is a global `test` or `it` function otherwise an error
* will be thrown at runtime.
*/
const verify: IVerify<LibraryTestFn>
}