import { scenarioTest, isScenarioTest } from "./scenarioTest"; import { gherkinTest, isGherkinTest } from "./gherkinTest"; import type { GivenScenarioTest, GwtDefinition, TestFunction } from "../types"; import type { GherkinTest } from "../types/gherkin/Gherkin"; import type { ConfigureTestFunction } from "../types/Gwt"; type TestType = GwtDefinition> = { test: (def: any) => boolean; runner: ( testFunc: TestFunction, configureTestFunc: ConfigureTestFunction | undefined, name: string, gwtDefinition: T, ) => void; }; const testTypes: Array> = [ { test: isGherkinTest, runner: gherkinTest, } as TestType>, { test: isScenarioTest, runner: scenarioTest, } as TestType>, ]; export const gwtRunner = ( testFunc: TestFunction, configureTestFunc?: ConfigureTestFunction, ) => (name: string, gwtDefinition: GwtDefinition): void => { const testType = testTypes.find(({ test }) => test(gwtDefinition)); if (!testType) { throw new Error(`Invalid GWT definition. Valid keys are [given,when,then] or [given,scenario]. Supplied keys were [${Object.keys(gwtDefinition).join(",")}]`); } return testType.runner(testFunc, configureTestFunc, name, gwtDefinition); };