import { it } from 'vitest'; export function itEachAbsentStringValue(runner: (absentValue: string) => void): void { itEachAbsentTestCase(AbsentStringTestCases, runner); } export function itEachAbsentObjectValue( runner: (absentValue: AbsentObjectType) => void, ): void { itEachAbsentTestCase(AbsentObjectTestCases, runner); } export function itEachAbsentCollectionValue(runner: (absentValue: []) => void): void { itEachAbsentTestCase(getAbsentCollectionTestCases(), runner); } export function itEachAbsentTestCase( testCases: readonly IAbsentTestCase[], runner: (absentValue: T) => void, ): void { for (const testCase of testCases) { it(`given "${testCase.valueName}"`, () => { runner(testCase.absentValue); }); } } export const AbsentObjectTestCases: readonly IAbsentTestCase[] = [ { valueName: 'undefined', absentValue: undefined, }, { valueName: 'null', absentValue: null, }, ]; export const AbsentStringTestCases: readonly IAbsentStringCase[] = [ { valueName: 'empty', absentValue: '', }, ...AbsentObjectTestCases, ]; export function getAbsentCollectionTestCases(): readonly IAbsentCollectionCase[] { return [ ...AbsentObjectTestCases, { valueName: 'empty', absentValue: new Array(), }, ]; } type AbsentObjectType = undefined | null; interface IAbsentTestCase { readonly valueName: string; readonly absentValue: T; } // eslint-disable-next-line @typescript-eslint/no-empty-interface interface IAbsentStringCase extends IAbsentTestCase { // Marker interface } // eslint-disable-next-line @typescript-eslint/no-empty-interface interface IAbsentCollectionCase extends IAbsentTestCase { // Marker interface }