From 3ee4e70248bf8d838b0309d8f96832b6e3124b63 Mon Sep 17 00:00:00 2001 From: AriPerkkio Date: Thu, 26 Jan 2023 11:47:23 +0200 Subject: [PATCH 1/5] fix: watch mode's filename pattern to persist on unrelated file changes --- packages/vitest/src/node/core.ts | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/packages/vitest/src/node/core.ts b/packages/vitest/src/node/core.ts index ab5c95156741..0866786c89f3 100644 --- a/packages/vitest/src/node/core.ts +++ b/packages/vitest/src/node/core.ts @@ -40,6 +40,7 @@ export class Vitest { invalidates: Set = new Set() changedTests: Set = new Set() + filenamePattern?: string runningPromise?: Promise closingPromise?: Promise @@ -372,15 +373,21 @@ export class Vitest { } async changeNamePattern(pattern: string, files: string[] = this.state.getFilepaths(), trigger?: string) { + // Empty test name pattern should reset filename pattern as well + if (pattern === '') + this.filenamePattern = undefined + this.config.testNamePattern = pattern ? new RegExp(pattern) : undefined await this.rerunFiles(files, trigger) } async changeFilenamePattern(pattern: string) { + this.filenamePattern = pattern + const files = this.state.getFilepaths() - if (!pattern) + if (!this.filenamePattern) return await this.rerunFiles(files, 'reset filename pattern') - const filteredFiles = await this.globTestFiles([pattern]) + const filteredFiles = await this.globTestFiles([this.filenamePattern]) await this.rerunFiles(filteredFiles, 'change filename pattern') } @@ -433,7 +440,17 @@ export class Vitest { this.isFirstRun = false this.snapshot.clear() - const files = Array.from(this.changedTests) + let files = Array.from(this.changedTests) + + if (this.filenamePattern) { + const filteredFiles = await this.globTestFiles([this.filenamePattern]) + files = files.filter(file => filteredFiles.includes(file)) + + // A file that does not match the current filename pattern was changed + if (files.length === 0) + return + } + this.changedTests.clear() if (this.coverageProvider && this.config.coverage.cleanOnRerun) From 501c5d75bfe2d0d87ac15619d9461bba23314910 Mon Sep 17 00:00:00 2001 From: AriPerkkio Date: Thu, 26 Jan 2023 11:55:00 +0200 Subject: [PATCH 2/5] fix: watch mode's filename pattern to persist re-run of failed tests, snapshot updates and testname filter changes --- packages/vitest/src/node/core.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/vitest/src/node/core.ts b/packages/vitest/src/node/core.ts index 0866786c89f3..d00af5841a1b 100644 --- a/packages/vitest/src/node/core.ts +++ b/packages/vitest/src/node/core.ts @@ -360,6 +360,11 @@ export class Vitest { } async rerunFiles(files: string[] = this.state.getFilepaths(), trigger?: string) { + if (this.filenamePattern) { + const filteredFiles = await this.globTestFiles([this.filenamePattern]) + files = files.filter(file => filteredFiles.includes(file)) + } + if (this.coverageProvider && this.config.coverage.cleanOnRerun) await this.coverageProvider.clean() @@ -385,10 +390,9 @@ export class Vitest { this.filenamePattern = pattern const files = this.state.getFilepaths() - if (!this.filenamePattern) - return await this.rerunFiles(files, 'reset filename pattern') - const filteredFiles = await this.globTestFiles([this.filenamePattern]) - await this.rerunFiles(filteredFiles, 'change filename pattern') + const trigger = this.filenamePattern ? 'change filename pattern' : 'reset filename pattern' + + await this.rerunFiles(files, trigger) } async rerunFailed() { From 8ad8fa46ba71833388284fb2ebb6378c8a98582d Mon Sep 17 00:00:00 2001 From: AriPerkkio Date: Thu, 26 Jan 2023 12:00:49 +0200 Subject: [PATCH 3/5] fix: dont incorrectly mark run failed if filename pattern excludes previously failed tests --- packages/vitest/src/node/core.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vitest/src/node/core.ts b/packages/vitest/src/node/core.ts index d00af5841a1b..e44c1468f37b 100644 --- a/packages/vitest/src/node/core.ts +++ b/packages/vitest/src/node/core.ts @@ -374,7 +374,7 @@ export class Vitest { await this.reportCoverage(!trigger) if (!this.config.browser) - await this.report('onWatcherStart') + await this.report('onWatcherStart', this.state.getFiles(files)) } async changeNamePattern(pattern: string, files: string[] = this.state.getFilepaths(), trigger?: string) { @@ -467,7 +467,7 @@ export class Vitest { await this.reportCoverage(false) if (!this.config.browser) - await this.report('onWatcherStart') + await this.report('onWatcherStart', this.state.getFiles(files)) }, WATCHER_DEBOUNCE) } From 03dce7dfc196b9c1d4e3949780756c4f325fb32c Mon Sep 17 00:00:00 2001 From: AriPerkkio Date: Thu, 26 Jan 2023 13:19:44 +0200 Subject: [PATCH 4/5] feat: show active filename pattern on CLI --- packages/vitest/src/node/reporters/base.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/vitest/src/node/reporters/base.ts b/packages/vitest/src/node/reporters/base.ts index a65c152ff5b5..68347a694e6b 100644 --- a/packages/vitest/src/node/reporters/base.ts +++ b/packages/vitest/src/node/reporters/base.ts @@ -155,15 +155,17 @@ export abstract class BaseReporter implements Reporter { const BADGE = c.inverse(c.bold(c.blue(' RERUN '))) const TRIGGER = trigger ? c.dim(` ${this.relative(trigger)}`) : '' + const FILENAME_PATTERN = this.ctx.filenamePattern ? `${BADGE_PADDING} ${c.dim('Filename pattern: ')}${c.blue(this.ctx.filenamePattern)}\n` : '' + if (files.length > 1) { // we need to figure out how to handle rerun all from stdin - this.ctx.logger.clearFullScreen(`\n${BADGE}${TRIGGER}\n`) + this.ctx.logger.clearFullScreen(`\n${BADGE}${TRIGGER}\n${FILENAME_PATTERN}`) this._lastRunCount = 0 } else if (files.length === 1) { const rerun = this._filesInWatchMode.get(files[0]) ?? 1 this._lastRunCount = rerun - this.ctx.logger.clearFullScreen(`\n${BADGE}${TRIGGER} ${c.blue(`x${rerun}`)}\n`) + this.ctx.logger.clearFullScreen(`\n${BADGE}${TRIGGER} ${c.blue(`x${rerun}`)}\n${FILENAME_PATTERN}`) } this._timeStart = new Date() From 5174a4daa476725d29f250e564de1d6c23e44c99 Mon Sep 17 00:00:00 2001 From: AriPerkkio Date: Thu, 26 Jan 2023 13:26:18 +0200 Subject: [PATCH 5/5] feat: show active test name pattern on CLI --- packages/vitest/src/node/reporters/base.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/vitest/src/node/reporters/base.ts b/packages/vitest/src/node/reporters/base.ts index 68347a694e6b..a52d6666a80a 100644 --- a/packages/vitest/src/node/reporters/base.ts +++ b/packages/vitest/src/node/reporters/base.ts @@ -156,16 +156,17 @@ export abstract class BaseReporter implements Reporter { const BADGE = c.inverse(c.bold(c.blue(' RERUN '))) const TRIGGER = trigger ? c.dim(` ${this.relative(trigger)}`) : '' const FILENAME_PATTERN = this.ctx.filenamePattern ? `${BADGE_PADDING} ${c.dim('Filename pattern: ')}${c.blue(this.ctx.filenamePattern)}\n` : '' + const TESTNAME_PATTERN = this.ctx.config.testNamePattern ? `${BADGE_PADDING} ${c.dim('Test name pattern: ')}${c.blue(String(this.ctx.config.testNamePattern))}\n` : '' if (files.length > 1) { // we need to figure out how to handle rerun all from stdin - this.ctx.logger.clearFullScreen(`\n${BADGE}${TRIGGER}\n${FILENAME_PATTERN}`) + this.ctx.logger.clearFullScreen(`\n${BADGE}${TRIGGER}\n${FILENAME_PATTERN}${TESTNAME_PATTERN}`) this._lastRunCount = 0 } else if (files.length === 1) { const rerun = this._filesInWatchMode.get(files[0]) ?? 1 this._lastRunCount = rerun - this.ctx.logger.clearFullScreen(`\n${BADGE}${TRIGGER} ${c.blue(`x${rerun}`)}\n${FILENAME_PATTERN}`) + this.ctx.logger.clearFullScreen(`\n${BADGE}${TRIGGER} ${c.blue(`x${rerun}`)}\n${FILENAME_PATTERN}${TESTNAME_PATTERN}`) } this._timeStart = new Date()