From 24f3d633c51965eeeff4ace01098ca2deb2ded36 Mon Sep 17 00:00:00 2001 From: Han Feng Date: Sun, 3 Sep 2023 17:12:43 +0800 Subject: [PATCH 01/16] feat: support `diff` option --- packages/runner/src/collect.ts | 3 ++- packages/runner/src/context.ts | 2 ++ packages/runner/src/run.ts | 9 +++++---- packages/runner/src/setup.ts | 10 ++++++++++ packages/runner/src/types/runner.ts | 4 +++- packages/runner/src/types/tasks.ts | 6 ++++++ packages/utils/src/error.ts | 6 +++--- packages/vitest/src/node/config.ts | 5 +++++ packages/vitest/src/types/config.ts | 5 +++++ 9 files changed, 41 insertions(+), 9 deletions(-) diff --git a/packages/runner/src/collect.ts b/packages/runner/src/collect.ts index 807ca6fab0c4..cacd9c8a36a7 100644 --- a/packages/runner/src/collect.ts +++ b/packages/runner/src/collect.ts @@ -6,7 +6,7 @@ import { calculateSuiteHash, generateHash, interpretTaskModes, someTasksAreOnly import { clearCollectorContext, getDefaultSuite } from './suite' import { getHooks, setHooks } from './map' import { collectorContext } from './context' -import { runSetupFiles } from './setup' +import { loadDiffOptionFile, runSetupFiles } from './setup' const now = Date.now @@ -33,6 +33,7 @@ export async function collectTests(paths: string[], runner: VitestRunner): Promi try { const setupStart = now() await runSetupFiles(config, runner) + await loadDiffOptionFile(config, runner) const collectStart = now() file.setupDuration = collectStart - setupStart diff --git a/packages/runner/src/context.ts b/packages/runner/src/context.ts index 6e357f8f19a9..1b0d360d718d 100644 --- a/packages/runner/src/context.ts +++ b/packages/runner/src/context.ts @@ -1,5 +1,6 @@ import type { Awaitable } from '@vitest/utils' import { getSafeTimers } from '@vitest/utils' +import type { DiffOptions } from '@vitest/utils/diff' import type { RuntimeContext, SuiteCollector, Test, TestContext } from './types' import type { VitestRunner } from './types/runner' import { PendingError } from './errors' @@ -49,6 +50,7 @@ export function createTestContext(test: Test, runner: VitestRunner): TestContext context.meta = test context.task = test + context.diff = runner.config.diff as DiffOptions context.skip = () => { test.pending = true diff --git a/packages/runner/src/run.ts b/packages/runner/src/run.ts index 6765c9f95265..d91ea8bddc3f 100644 --- a/packages/runner/src/run.ts +++ b/packages/runner/src/run.ts @@ -1,6 +1,7 @@ import limit from 'p-limit' import { getSafeTimers, shuffle } from '@vitest/utils' import { processError } from '@vitest/utils/error' +import type { DiffOptions } from '@vitest/utils/diff' import type { VitestRunner } from './types/runner' import type { File, HookCleanupCallback, HookListener, SequenceHooks, Suite, SuiteHooks, Task, TaskMeta, TaskResult, TaskResultPack, TaskState, Test } from './types' import { partitionSuiteChildren } from './utils/suite' @@ -173,7 +174,7 @@ export async function runTest(test: Test, runner: VitestRunner) { } } catch (e) { - failTask(test.result, e) + failTask(test.result, e, test.context.diff) } // skipped with new PendingError @@ -189,7 +190,7 @@ export async function runTest(test: Test, runner: VitestRunner) { await callCleanupHooks(beforeEachCleanups) } catch (e) { - failTask(test.result, e) + failTask(test.result, e, test.context.diff) } if (test.result.state === 'pass') @@ -233,7 +234,7 @@ export async function runTest(test: Test, runner: VitestRunner) { updateTask(test, runner) } -function failTask(result: TaskResult, err: unknown) { +function failTask(result: TaskResult, err: unknown, diffOptions?: DiffOptions) { if (err instanceof PendingError) { result.state = 'skip' return @@ -244,7 +245,7 @@ function failTask(result: TaskResult, err: unknown) { ? err : [err] for (const e of errors) { - const error = processError(e) + const error = processError(e, diffOptions) result.error ??= error result.errors ??= [] result.errors.push(error) diff --git a/packages/runner/src/setup.ts b/packages/runner/src/setup.ts index 32c365b3037a..4b558aeb827d 100644 --- a/packages/runner/src/setup.ts +++ b/packages/runner/src/setup.ts @@ -15,3 +15,13 @@ export async function runSetupFiles(config: VitestRunnerConfig, runner: VitestRu await runner.importFile(fsPath, 'setup') } } + +export async function loadDiffOptionFile(config: VitestRunnerConfig, runner: VitestRunner) { + if (typeof config.diff !== 'string') + return + + const diffModule = await runner.importFile(config.diff, 'diff') as any + + if (diffModule && diffModule.default) + runner.config.diff = diffModule.default +} diff --git a/packages/runner/src/types/runner.ts b/packages/runner/src/types/runner.ts index 25142152f9aa..b060e86fb026 100644 --- a/packages/runner/src/types/runner.ts +++ b/packages/runner/src/types/runner.ts @@ -1,3 +1,4 @@ +import type { DiffOptions } from '@vitest/utils/diff' import type { File, SequenceHooks, SequenceSetupFiles, Suite, TaskResultPack, Test, TestContext } from './tasks' export interface VitestRunnerConfig { @@ -21,9 +22,10 @@ export interface VitestRunnerConfig { testTimeout: number hookTimeout: number retry: number + diff?: string | DiffOptions } -export type VitestRunnerImportSource = 'collect' | 'setup' +export type VitestRunnerImportSource = 'collect' | 'setup' | 'diff' export interface VitestRunnerConstructor { new(config: VitestRunnerConfig): VitestRunner diff --git a/packages/runner/src/types/tasks.ts b/packages/runner/src/types/tasks.ts index 60b6101f7abb..71125d4923c9 100644 --- a/packages/runner/src/types/tasks.ts +++ b/packages/runner/src/types/tasks.ts @@ -1,4 +1,5 @@ import type { Awaitable, ErrorWithDiff } from '@vitest/utils' +import type { DiffOptions } from '@vitest/utils/diff' import type { ChainableFunction } from '../utils/chain' export type RunMode = 'run' | 'skip' | 'only' | 'todo' @@ -259,6 +260,11 @@ export interface TestContext { */ task: Readonly + /** + * Diff options + */ + diff?: DiffOptions + /** * Extract hooks on test failed */ diff --git a/packages/utils/src/error.ts b/packages/utils/src/error.ts index c5403e54b26d..dc2aeb0d5aac 100644 --- a/packages/utils/src/error.ts +++ b/packages/utils/src/error.ts @@ -1,4 +1,4 @@ -import { diff } from './diff' +import { type DiffOptions, diff } from './diff' import { format } from './display' import { deepClone, getOwnProperties, getType } from './helpers' import { stringify } from './stringify' @@ -86,7 +86,7 @@ function normalizeErrorMessage(message: string) { return message.replace(/__vite_ssr_import_\d+__\./g, '') } -export function processError(err: any) { +export function processError(err: any, diffOptions?: DiffOptions) { if (!err || typeof err !== 'object') return { message: err } // stack is not serialized in worker communication @@ -101,7 +101,7 @@ export function processError(err: any) { const clonedExpected = deepClone(err.expected, { forceWritable: true }) const { replacedActual, replacedExpected } = replaceAsymmetricMatcher(clonedActual, clonedExpected) - err.diff = diff(replacedExpected, replacedActual) + err.diff = diff(replacedExpected, replacedActual, diffOptions) } if (typeof err.expected !== 'string') diff --git a/packages/vitest/src/node/config.ts b/packages/vitest/src/node/config.ts index ea8219b86f83..2f69c5858e9f 100644 --- a/packages/vitest/src/node/config.ts +++ b/packages/vitest/src/node/config.ts @@ -284,9 +284,14 @@ export function resolveConfig( ) resolved.coverage.exclude.push(...resolved.setupFiles.map(file => `${resolved.coverage.allowExternal ? '**/' : ''}${relative(resolved.root, file)}`)) + resolved.diff = normalize( + resolveModule(resolved.diff, { paths: [resolved.root] }) + ?? resolve(resolved.root, resolved.diff)) + resolved.forceRerunTriggers = [ ...resolved.forceRerunTriggers, ...resolved.setupFiles, + resolved.diff, ] // the server has been created, we don't need to override vite.server options diff --git a/packages/vitest/src/types/config.ts b/packages/vitest/src/types/config.ts index 6763cc938899..434e0542e873 100644 --- a/packages/vitest/src/types/config.ts +++ b/packages/vitest/src/types/config.ts @@ -539,6 +539,11 @@ export interface InlineConfig { */ snapshotFormat?: PrettyFormatOptions + /** + * Path to a module which has a default export of diff config. + */ + diff?: string + /** * Resolve custom snapshot path */ From ae9a6d5256b110a9c89e18cb035b29008b847718 Mon Sep 17 00:00:00 2001 From: Han Feng Date: Sun, 3 Sep 2023 18:05:32 +0800 Subject: [PATCH 02/16] chore: don't pollute test context --- packages/runner/src/context.ts | 2 -- packages/runner/src/run.ts | 8 ++++---- packages/runner/src/types/tasks.ts | 6 ------ 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/packages/runner/src/context.ts b/packages/runner/src/context.ts index 1b0d360d718d..6e357f8f19a9 100644 --- a/packages/runner/src/context.ts +++ b/packages/runner/src/context.ts @@ -1,6 +1,5 @@ import type { Awaitable } from '@vitest/utils' import { getSafeTimers } from '@vitest/utils' -import type { DiffOptions } from '@vitest/utils/diff' import type { RuntimeContext, SuiteCollector, Test, TestContext } from './types' import type { VitestRunner } from './types/runner' import { PendingError } from './errors' @@ -50,7 +49,6 @@ export function createTestContext(test: Test, runner: VitestRunner): TestContext context.meta = test context.task = test - context.diff = runner.config.diff as DiffOptions context.skip = () => { test.pending = true diff --git a/packages/runner/src/run.ts b/packages/runner/src/run.ts index d91ea8bddc3f..bec6ed5f7266 100644 --- a/packages/runner/src/run.ts +++ b/packages/runner/src/run.ts @@ -174,7 +174,7 @@ export async function runTest(test: Test, runner: VitestRunner) { } } catch (e) { - failTask(test.result, e, test.context.diff) + failTask(test.result, e, runner.config.diff as DiffOptions) } // skipped with new PendingError @@ -190,7 +190,7 @@ export async function runTest(test: Test, runner: VitestRunner) { await callCleanupHooks(beforeEachCleanups) } catch (e) { - failTask(test.result, e, test.context.diff) + failTask(test.result, e, runner.config.diff as DiffOptions) } if (test.result.state === 'pass') @@ -317,7 +317,7 @@ export async function runSuite(suite: Suite, runner: VitestRunner) { } } catch (e) { - failTask(suite.result, e) + failTask(suite.result, e, runner.config.diff as DiffOptions) } try { @@ -325,7 +325,7 @@ export async function runSuite(suite: Suite, runner: VitestRunner) { await callCleanupHooks(beforeAllCleanups) } catch (e) { - failTask(suite.result, e) + failTask(suite.result, e, runner.config.diff as DiffOptions) } if (suite.mode === 'run') { diff --git a/packages/runner/src/types/tasks.ts b/packages/runner/src/types/tasks.ts index 71125d4923c9..60b6101f7abb 100644 --- a/packages/runner/src/types/tasks.ts +++ b/packages/runner/src/types/tasks.ts @@ -1,5 +1,4 @@ import type { Awaitable, ErrorWithDiff } from '@vitest/utils' -import type { DiffOptions } from '@vitest/utils/diff' import type { ChainableFunction } from '../utils/chain' export type RunMode = 'run' | 'skip' | 'only' | 'todo' @@ -260,11 +259,6 @@ export interface TestContext { */ task: Readonly - /** - * Diff options - */ - diff?: DiffOptions - /** * Extract hooks on test failed */ From adc272e1f2dfbf598b2d38d8ab74e0809fbfee4d Mon Sep 17 00:00:00 2001 From: Han Feng Date: Sun, 3 Sep 2023 18:11:53 +0800 Subject: [PATCH 03/16] chore: check config file --- packages/runner/src/setup.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/runner/src/setup.ts b/packages/runner/src/setup.ts index 4b558aeb827d..364d59c39e2b 100644 --- a/packages/runner/src/setup.ts +++ b/packages/runner/src/setup.ts @@ -22,6 +22,8 @@ export async function loadDiffOptionFile(config: VitestRunnerConfig, runner: Vit const diffModule = await runner.importFile(config.diff, 'diff') as any - if (diffModule && diffModule.default) + if (diffModule && typeof diffModule.default === 'object' && diffModule.default != null) runner.config.diff = diffModule.default + else + throw new Error(`invalid diff config file ${config.diff}. Must have a default export with config object`) } From 5776a0e4a1ed3e3fa17f3300b7aca730926fad35 Mon Sep 17 00:00:00 2001 From: Han Feng Date: Sun, 3 Sep 2023 19:57:44 +0800 Subject: [PATCH 04/16] chore: load diff config in entry --- packages/runner/src/collect.ts | 3 +-- packages/runner/src/run.ts | 8 ++++---- packages/runner/src/setup.ts | 12 ------------ packages/runner/src/types/runner.ts | 4 ++-- packages/vitest/src/runtime/entry-vm.ts | 4 +++- packages/vitest/src/runtime/entry.ts | 4 ++++ packages/vitest/src/runtime/setup.common.ts | 14 ++++++++++++++ 7 files changed, 28 insertions(+), 21 deletions(-) diff --git a/packages/runner/src/collect.ts b/packages/runner/src/collect.ts index cacd9c8a36a7..807ca6fab0c4 100644 --- a/packages/runner/src/collect.ts +++ b/packages/runner/src/collect.ts @@ -6,7 +6,7 @@ import { calculateSuiteHash, generateHash, interpretTaskModes, someTasksAreOnly import { clearCollectorContext, getDefaultSuite } from './suite' import { getHooks, setHooks } from './map' import { collectorContext } from './context' -import { loadDiffOptionFile, runSetupFiles } from './setup' +import { runSetupFiles } from './setup' const now = Date.now @@ -33,7 +33,6 @@ export async function collectTests(paths: string[], runner: VitestRunner): Promi try { const setupStart = now() await runSetupFiles(config, runner) - await loadDiffOptionFile(config, runner) const collectStart = now() file.setupDuration = collectStart - setupStart diff --git a/packages/runner/src/run.ts b/packages/runner/src/run.ts index bec6ed5f7266..bd26172f11a8 100644 --- a/packages/runner/src/run.ts +++ b/packages/runner/src/run.ts @@ -174,7 +174,7 @@ export async function runTest(test: Test, runner: VitestRunner) { } } catch (e) { - failTask(test.result, e, runner.config.diff as DiffOptions) + failTask(test.result, e, runner.config.diffOptions) } // skipped with new PendingError @@ -190,7 +190,7 @@ export async function runTest(test: Test, runner: VitestRunner) { await callCleanupHooks(beforeEachCleanups) } catch (e) { - failTask(test.result, e, runner.config.diff as DiffOptions) + failTask(test.result, e, runner.config.diffOptions) } if (test.result.state === 'pass') @@ -317,7 +317,7 @@ export async function runSuite(suite: Suite, runner: VitestRunner) { } } catch (e) { - failTask(suite.result, e, runner.config.diff as DiffOptions) + failTask(suite.result, e, runner.config.diffOptions) } try { @@ -325,7 +325,7 @@ export async function runSuite(suite: Suite, runner: VitestRunner) { await callCleanupHooks(beforeAllCleanups) } catch (e) { - failTask(suite.result, e, runner.config.diff as DiffOptions) + failTask(suite.result, e, runner.config.diffOptions) } if (suite.mode === 'run') { diff --git a/packages/runner/src/setup.ts b/packages/runner/src/setup.ts index 364d59c39e2b..32c365b3037a 100644 --- a/packages/runner/src/setup.ts +++ b/packages/runner/src/setup.ts @@ -15,15 +15,3 @@ export async function runSetupFiles(config: VitestRunnerConfig, runner: VitestRu await runner.importFile(fsPath, 'setup') } } - -export async function loadDiffOptionFile(config: VitestRunnerConfig, runner: VitestRunner) { - if (typeof config.diff !== 'string') - return - - const diffModule = await runner.importFile(config.diff, 'diff') as any - - if (diffModule && typeof diffModule.default === 'object' && diffModule.default != null) - runner.config.diff = diffModule.default - else - throw new Error(`invalid diff config file ${config.diff}. Must have a default export with config object`) -} diff --git a/packages/runner/src/types/runner.ts b/packages/runner/src/types/runner.ts index b060e86fb026..f512731c959f 100644 --- a/packages/runner/src/types/runner.ts +++ b/packages/runner/src/types/runner.ts @@ -22,10 +22,10 @@ export interface VitestRunnerConfig { testTimeout: number hookTimeout: number retry: number - diff?: string | DiffOptions + diffOptions?: DiffOptions } -export type VitestRunnerImportSource = 'collect' | 'setup' | 'diff' +export type VitestRunnerImportSource = 'collect' | 'setup' export interface VitestRunnerConstructor { new(config: VitestRunnerConfig): VitestRunner diff --git a/packages/vitest/src/runtime/entry-vm.ts b/packages/vitest/src/runtime/entry-vm.ts index 78edc1a32e64..ce12e91e0d9e 100644 --- a/packages/vitest/src/runtime/entry-vm.ts +++ b/packages/vitest/src/runtime/entry-vm.ts @@ -11,7 +11,7 @@ import { VitestSnapshotEnvironment } from '../integrations/snapshot/environments import * as VitestIndex from '../index' import type { VitestExecutor } from './execute' import { resolveTestRunner } from './runners' -import { setupCommonEnv } from './setup.common' +import { loadDiffConfig, setupCommonEnv } from './setup.common' export async function run(files: string[], config: ResolvedConfig, executor: VitestExecutor): Promise { const workerState = getWorkerState() @@ -41,7 +41,9 @@ export async function run(files: string[], config: ResolvedConfig, executor: Vit if (config.chaiConfig) setupChaiConfig(config.chaiConfig) + const diffConfig = await loadDiffConfig(config, executor) const runner = await resolveTestRunner(config, executor) + runner.config.diffOptions = diffConfig workerState.durations.prepare = performance.now() - workerState.durations.prepare diff --git a/packages/vitest/src/runtime/entry.ts b/packages/vitest/src/runtime/entry.ts index 0dffd3f2b648..86a60f813aca 100644 --- a/packages/vitest/src/runtime/entry.ts +++ b/packages/vitest/src/runtime/entry.ts @@ -8,6 +8,7 @@ import { setupChaiConfig } from '../integrations/chai/config' import { setupGlobalEnv, withEnv } from './setup.node' import type { VitestExecutor } from './execute' import { resolveTestRunner } from './runners' +import { loadDiffConfig } from './setup.common' // browser shouldn't call this! export async function run(files: string[], config: ResolvedConfig, environment: ResolvedTestEnvironment, executor: VitestExecutor): Promise { @@ -19,7 +20,10 @@ export async function run(files: string[], config: ResolvedConfig, environment: if (config.chaiConfig) setupChaiConfig(config.chaiConfig) + const diffConfig = await loadDiffConfig(config, executor) const runner = await resolveTestRunner(config, executor) + runner.config.diffOptions = diffConfig + workerState.onCancel.then(reason => runner.onCancel?.(reason)) workerState.durations.prepare = performance.now() - workerState.durations.prepare diff --git a/packages/vitest/src/runtime/setup.common.ts b/packages/vitest/src/runtime/setup.common.ts index 32d8f5fc2096..5f4b2225b07e 100644 --- a/packages/vitest/src/runtime/setup.common.ts +++ b/packages/vitest/src/runtime/setup.common.ts @@ -1,6 +1,8 @@ import { setSafeTimers } from '@vitest/utils' import { resetRunOnceCounter } from '../integrations/run-once' import type { ResolvedConfig } from '../types' +import type { DiffOptions } from '../types/matcher-utils' +import type { VitestExecutor } from './execute' let globalSetup = false export async function setupCommonEnv(config: ResolvedConfig) { @@ -21,3 +23,15 @@ function setupDefines(defines: Record) { for (const key in defines) (globalThis as any)[key] = defines[key] } + +export async function loadDiffConfig(config: ResolvedConfig, executor: VitestExecutor) { + if (typeof config.diff !== 'string') + return + + const diffModule = await executor.executeFile(config.diff) + + if (diffModule && typeof diffModule.default === 'object' && diffModule.default != null) + return diffModule.default as DiffOptions + else + throw new Error(`invalid diff config file ${config.diff}. Must have a default export with config object`) +} From cd0714172990cd141a70fda2694ec1ea8c16489d Mon Sep 17 00:00:00 2001 From: Han Feng Date: Mon, 4 Sep 2023 09:43:22 +0800 Subject: [PATCH 05/16] test: add tests --- test/reporters/fixtures/custom-diff-options.test.ts | 5 +++++ test/reporters/fixtures/custom-diff-options.ts | 4 ++++ test/reporters/tests/custom-diff-options.spec.ts | 12 ++++++++++++ 3 files changed, 21 insertions(+) create mode 100644 test/reporters/fixtures/custom-diff-options.test.ts create mode 100644 test/reporters/fixtures/custom-diff-options.ts create mode 100644 test/reporters/tests/custom-diff-options.spec.ts diff --git a/test/reporters/fixtures/custom-diff-options.test.ts b/test/reporters/fixtures/custom-diff-options.test.ts new file mode 100644 index 000000000000..7f52fd58593e --- /dev/null +++ b/test/reporters/fixtures/custom-diff-options.test.ts @@ -0,0 +1,5 @@ +import { expect, test } from 'vitest' + +test('', () => { + expect({ foo: 1 }).toMatchInlineSnapshot('xxx') +}) diff --git a/test/reporters/fixtures/custom-diff-options.ts b/test/reporters/fixtures/custom-diff-options.ts new file mode 100644 index 000000000000..358794c614fe --- /dev/null +++ b/test/reporters/fixtures/custom-diff-options.ts @@ -0,0 +1,4 @@ +export default { + aAnnotation: 'Expected to be', + bAnnotation: 'But got', +} diff --git a/test/reporters/tests/custom-diff-options.spec.ts b/test/reporters/tests/custom-diff-options.spec.ts new file mode 100644 index 000000000000..b95971dadc49 --- /dev/null +++ b/test/reporters/tests/custom-diff-options.spec.ts @@ -0,0 +1,12 @@ +import { expect, test } from 'vitest' +import { resolve } from 'pathe' +import { runVitest } from '../../test-utils' + +test('should print function name', async () => { + const filename = resolve('./fixtures/custom-diff-options.test.ts') + const diff = resolve('./fixtures/custom-diff-options.ts') + const { stderr } = await runVitest({ root: './fixtures', diff }, [filename]) + + expect(stderr).toBeTruthy() + expect(stderr).toContain('function-as-name.test.ts > foo > Bar') +}) From a23a24aa239e081c22100588466621726ee16c98 Mon Sep 17 00:00:00 2001 From: Han Feng Date: Tue, 5 Sep 2023 15:46:23 +0800 Subject: [PATCH 06/16] fix: resolve config url --- packages/vitest/src/node/config.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/vitest/src/node/config.ts b/packages/vitest/src/node/config.ts index 2f69c5858e9f..c124d62ff682 100644 --- a/packages/vitest/src/node/config.ts +++ b/packages/vitest/src/node/config.ts @@ -284,16 +284,18 @@ export function resolveConfig( ) resolved.coverage.exclude.push(...resolved.setupFiles.map(file => `${resolved.coverage.allowExternal ? '**/' : ''}${relative(resolved.root, file)}`)) - resolved.diff = normalize( - resolveModule(resolved.diff, { paths: [resolved.root] }) - ?? resolve(resolved.root, resolved.diff)) - resolved.forceRerunTriggers = [ ...resolved.forceRerunTriggers, ...resolved.setupFiles, - resolved.diff, ] + if (resolved.diff) { + resolved.diff = normalize( + resolveModule(resolved.diff, { paths: [resolved.root] }) + ?? resolve(resolved.root, resolved.diff)) + resolved.forceRerunTriggers.push(resolved.diff) + } + // the server has been created, we don't need to override vite.server options resolved.api = resolveApiServerConfig(options) From 21e746d3a085bbfaafe4b323af4520766c2a4dcf Mon Sep 17 00:00:00 2001 From: Han Feng Date: Tue, 5 Sep 2023 16:01:33 +0800 Subject: [PATCH 07/16] test: update --- ...ons.test.ts => custom-diff-config.test.ts} | 0 ...-diff-options.ts => custom-diff-config.ts} | 0 .../reporters/fixtures/invalid-diff-config.ts | 1 + .../tests/custom-diff-config.spec.ts | 23 +++++++++++++++++++ .../tests/custom-diff-options.spec.ts | 12 ---------- 5 files changed, 24 insertions(+), 12 deletions(-) rename test/reporters/fixtures/{custom-diff-options.test.ts => custom-diff-config.test.ts} (100%) rename test/reporters/fixtures/{custom-diff-options.ts => custom-diff-config.ts} (100%) create mode 100644 test/reporters/fixtures/invalid-diff-config.ts create mode 100644 test/reporters/tests/custom-diff-config.spec.ts delete mode 100644 test/reporters/tests/custom-diff-options.spec.ts diff --git a/test/reporters/fixtures/custom-diff-options.test.ts b/test/reporters/fixtures/custom-diff-config.test.ts similarity index 100% rename from test/reporters/fixtures/custom-diff-options.test.ts rename to test/reporters/fixtures/custom-diff-config.test.ts diff --git a/test/reporters/fixtures/custom-diff-options.ts b/test/reporters/fixtures/custom-diff-config.ts similarity index 100% rename from test/reporters/fixtures/custom-diff-options.ts rename to test/reporters/fixtures/custom-diff-config.ts diff --git a/test/reporters/fixtures/invalid-diff-config.ts b/test/reporters/fixtures/invalid-diff-config.ts new file mode 100644 index 000000000000..2065be389c54 --- /dev/null +++ b/test/reporters/fixtures/invalid-diff-config.ts @@ -0,0 +1 @@ +export const diffOptions = {} diff --git a/test/reporters/tests/custom-diff-config.spec.ts b/test/reporters/tests/custom-diff-config.spec.ts new file mode 100644 index 000000000000..3445913eb245 --- /dev/null +++ b/test/reporters/tests/custom-diff-config.spec.ts @@ -0,0 +1,23 @@ +import { expect, test } from 'vitest' +import { resolve } from 'pathe' +import { runVitest } from '../../test-utils' + +test('custom diff config', async () => { + const filename = resolve('./fixtures/custom-diff-config.test.ts') + const diff = resolve('./fixtures/custom-diff-config.ts') + const { stderr } = await runVitest({ root: './fixtures', diff }, [filename]) + + expect(stderr).toBeTruthy() + expect(stderr).toContain('Expected to be') + expect(stderr).toContain('But got') +}) + +test('invalid diff config file', async () => { + const filename = resolve('./fixtures/custom-diff-config.test.ts') + const diff = resolve('./fixtures/invalid-diff-config.ts') + const { stderr } = await runVitest({ root: './fixtures', diff }, [filename]) + + expect(stderr).toBeTruthy() + expect(stderr).toContain('invalid diff config file') + expect(stderr).toContain('Must have a default export with config object') +}) diff --git a/test/reporters/tests/custom-diff-options.spec.ts b/test/reporters/tests/custom-diff-options.spec.ts deleted file mode 100644 index b95971dadc49..000000000000 --- a/test/reporters/tests/custom-diff-options.spec.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { expect, test } from 'vitest' -import { resolve } from 'pathe' -import { runVitest } from '../../test-utils' - -test('should print function name', async () => { - const filename = resolve('./fixtures/custom-diff-options.test.ts') - const diff = resolve('./fixtures/custom-diff-options.ts') - const { stderr } = await runVitest({ root: './fixtures', diff }, [filename]) - - expect(stderr).toBeTruthy() - expect(stderr).toContain('function-as-name.test.ts > foo > Bar') -}) From 1983e07761cd4f6e4057f993dc8ca8693bc4d8d1 Mon Sep 17 00:00:00 2001 From: Han Feng Date: Tue, 5 Sep 2023 16:33:34 +0800 Subject: [PATCH 08/16] docs: add documentation --- docs/config/index.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/config/index.md b/docs/config/index.md index 035979eb28d6..1cb98deaa2e0 100644 --- a/docs/config/index.md +++ b/docs/config/index.md @@ -1641,3 +1641,10 @@ export default defineConfig({ }) ``` +### diff + +- **Type:** `string` +- **CLI:** `--diff=` +- **Version:** Since Vitest 0.34.4 + +Path to a diff config that will be used to generate diff interface. Useful if you want to customize diff display. From 843118c6a946f79ce43d3a9b0c45fd41d08a5439 Mon Sep 17 00:00:00 2001 From: Han Feng Date: Tue, 5 Sep 2023 16:38:40 +0800 Subject: [PATCH 09/16] feat: add `--diff` command --- packages/vitest/src/node/cli.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/vitest/src/node/cli.ts b/packages/vitest/src/node/cli.ts index 25872408d6b7..287ec9a7d950 100644 --- a/packages/vitest/src/node/cli.ts +++ b/packages/vitest/src/node/cli.ts @@ -51,6 +51,7 @@ cli .option('--test-timeout