export interface DataValidationTestScenario { readonly description: string; readonly data: T; readonly expectedPass: boolean; readonly expectedMessage?: string; } export function generateDataValidationTestScenarios( ...conditionBasedScenarios: DataValidationConditionBasedTestScenario[] ): DataValidationTestScenario[] { return conditionBasedScenarios.flatMap((conditionScenario) => [ conditionScenario.expectFail.map((failDefinition): DataValidationTestScenario => ({ description: `fails: "${failDefinition.description}"`, data: failDefinition.data, expectedPass: false, expectedMessage: conditionScenario.assertErrorMessage, })), conditionScenario.expectPass.map((passDefinition): DataValidationTestScenario => ({ description: `passes: "${passDefinition.description}"`, data: passDefinition.data, expectedPass: true, expectedMessage: conditionScenario.assertErrorMessage, })), ].flat()); } interface DataValidationConditionBasedTestScenario { readonly assertErrorMessage?: string; readonly expectPass: readonly DataValidationScenarioDefinition[]; readonly expectFail: readonly DataValidationScenarioDefinition[]; } interface DataValidationScenarioDefinition { readonly description: string; readonly data: T; }