diff --git a/.changeset/clever-jobs-teach.md b/.changeset/clever-jobs-teach.md new file mode 100644 index 00000000..da2dacfc --- /dev/null +++ b/.changeset/clever-jobs-teach.md @@ -0,0 +1,5 @@ +--- +"@fast-check/vitest": minor +--- + +✨(vitest) Support plugin API of fast-check diff --git a/packages/vitest/src/internals/TestBuilder.ts b/packages/vitest/src/internals/TestBuilder.ts index 6021a9d8..1a01063f 100644 --- a/packages/vitest/src/internals/TestBuilder.ts +++ b/packages/vitest/src/internals/TestBuilder.ts @@ -1,7 +1,7 @@ import { record } from 'fast-check'; import { buildTestWithPropRunner } from './TestWithPropRunnerBuilder.js'; -import type { Parameters as FcParameters, ExecutionTree, RunDetails, RunDetailsCommon } from 'fast-check'; +import type { Parameters as FcParameters, ExecutionTree, RunDetails, RunDetailsCommon, Plugin } from 'fast-check'; import type { ArbitraryTuple, Prop, ArbitraryRecord, PropRecord, It, FcExtra } from './types.js'; /** @@ -31,7 +31,7 @@ function adaptParametersForRecord( examples: parameters.examples !== undefined ? parameters.examples.map((example) => example[0]) : undefined, reporter: originalParamaters.reporter, asyncReporter: originalParamaters.asyncReporter, - plugins: undefined, + plugins: originalParamaters.plugins, }; return enrichedParameters; } @@ -58,6 +58,28 @@ function adaptRunDetailsForRecord( return adaptedRunDetailsCommon as RunDetails; } +function adaptPluginForRecord(plugin: Plugin, originalParamaters: FcParameters): Plugin<[Ts]> { + return (pluginIndex, sharedSessionContext) => { + const instance = plugin(pluginIndex, sharedSessionContext); + return { + ...instance, + decorateRun: + instance.decorateRun !== undefined + ? (nestedRun) => { + // oxlint-disable-next-line typescript/no-non-null-assertion + const decorated = instance.decorateRun!((value) => nestedRun([value])); + return (value) => decorated(value[0]); + } + : undefined, + afterAll: + instance.afterAll !== undefined + ? // oxlint-disable-next-line typescript/no-non-null-assertion + (runDetails) => instance.afterAll!(adaptRunDetailsForRecord(runDetails, originalParamaters)) + : undefined, + }; + }; +} + /** * Build `{it,test}.*.prop` out of `{it,test}.*` * @param testFn - The source `{it,test}.*` @@ -99,7 +121,10 @@ function buildTestProp( ? // oxlint-disable-next-line typescript/no-non-null-assertion (runDetails) => params.asyncReporter!(adaptRunDetailsForRecord(runDetails, params)) : undefined, - plugins: undefined, + plugins: + params.plugins !== undefined + ? params.plugins.map((plugin) => adaptPluginForRecord(plugin, params)) + : undefined, } : undefined; buildTestWithPropRunner(