From 0fd7552be5eb6f32df634388a705e4981e1c2723 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Sun, 20 Feb 2022 18:37:52 +0300 Subject: [PATCH 1/4] feat: allow changing name pattern during watch mode --- packages/vitest/src/node/core.ts | 5 ++++ packages/vitest/src/node/stdin.ts | 42 +++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/packages/vitest/src/node/core.ts b/packages/vitest/src/node/core.ts index 856b6f9bfb16..40bdb20ce946 100644 --- a/packages/vitest/src/node/core.ts +++ b/packages/vitest/src/node/core.ts @@ -208,6 +208,11 @@ export class Vitest { await this.report('onWatcherStart') } + async changeNamePattern(pattern: string, files: string[] = this.state.getFilepaths(), trigger?: string) { + this.config.testNamePattern = new RegExp(pattern) + await this.rerunFiles(files, trigger) + } + async returnFailed() { await this.rerunFiles(this.state.getFailedFilepaths(), 'rerun failed') } diff --git a/packages/vitest/src/node/stdin.ts b/packages/vitest/src/node/stdin.ts index 8247a900df41..060620b149f3 100644 --- a/packages/vitest/src/node/stdin.ts +++ b/packages/vitest/src/node/stdin.ts @@ -6,6 +6,7 @@ const keys = [ ['a', 'rerun all tests'], ['f', 'rerun only failed tests'], ['u', 'update snapshot'], + ['t', 'change testNamePattern'], ['q', 'quit'], ] @@ -18,7 +19,37 @@ ${keys.map(i => c.dim(' press ') + c.reset(c.bold(i[0])) + c.dim(` to ${i[1]}`) ) } +function useChangePattern(ctx: Vitest) { + let namePattern = '' + let changingPattern = false + + function endPattern() { + ctx.changeNamePattern(namePattern, undefined, 'change pattern') + namePattern = '' + changingPattern = false + } + + function startPattern() { + process.stdout.write(`\n${c.bgYellow(' PATTERN ')} ${c.yellow('Change testNamePattern to:')} `) + changingPattern = true + } + + function appendPattern(str: string) { + namePattern += str + process.stdout.write(str) + } + + return { + changingPattern, + endPattern, + startPattern, + appendPattern, + } +} + export function registerConsoleShortcuts(ctx: Vitest) { + const { changingPattern, endPattern, startPattern, appendPattern } = useChangePattern(ctx) + readline.emitKeypressEvents(process.stdin) process.stdin.setRawMode(true) process.stdin.on('keypress', (str: string, key: any) => { @@ -32,6 +63,13 @@ export function registerConsoleShortcuts(ctx: Vitest) { const name = key?.name + if (changingPattern) { + if (name === 'return') + return endPattern() + + return appendPattern(name) + } + // help if (name === 'h') return printShortcutsHelp() @@ -41,6 +79,10 @@ export function registerConsoleShortcuts(ctx: Vitest) { // rerun all tests if (name === 'a' || name === 'return') return ctx.rerunFiles(undefined, 'rerun all') + // change testNamePattern + if (name === 't') + return startPattern() + // quit if (name === 'q') return ctx.exit(true) From 45c1d1eadc4b63814aa8aba4add9f74924ddc66b Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Sun, 20 Feb 2022 18:57:53 +0300 Subject: [PATCH 2/4] chore: refactor changing testNamePattern --- packages/vitest/src/node/stdin.ts | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/packages/vitest/src/node/stdin.ts b/packages/vitest/src/node/stdin.ts index 060620b149f3..fae9932c16e4 100644 --- a/packages/vitest/src/node/stdin.ts +++ b/packages/vitest/src/node/stdin.ts @@ -6,7 +6,7 @@ const keys = [ ['a', 'rerun all tests'], ['f', 'rerun only failed tests'], ['u', 'update snapshot'], - ['t', 'change testNamePattern'], + ['t', 'filter by a test name regex pattern'], ['q', 'quit'], ] @@ -23,32 +23,34 @@ function useChangePattern(ctx: Vitest) { let namePattern = '' let changingPattern = false - function endPattern() { + function end() { ctx.changeNamePattern(namePattern, undefined, 'change pattern') namePattern = '' changingPattern = false } - function startPattern() { - process.stdout.write(`\n${c.bgYellow(' PATTERN ')} ${c.yellow('Change testNamePattern to:')} `) + function start() { + process.stdout.write(`\n${c.bgMagenta(' PATTERN ')} ${c.magenta('Filter tests by its name regexp pattern:')} `) changingPattern = true } - function appendPattern(str: string) { + function append(str: string) { namePattern += str process.stdout.write(str) } return { - changingPattern, - endPattern, - startPattern, - appendPattern, + get isChanging() { + return changingPattern + }, + end, + start, + append, } } export function registerConsoleShortcuts(ctx: Vitest) { - const { changingPattern, endPattern, startPattern, appendPattern } = useChangePattern(ctx) + const pattern = useChangePattern(ctx) readline.emitKeypressEvents(process.stdin) process.stdin.setRawMode(true) @@ -63,11 +65,11 @@ export function registerConsoleShortcuts(ctx: Vitest) { const name = key?.name - if (changingPattern) { + if (pattern.isChanging) { if (name === 'return') - return endPattern() + return pattern.end() - return appendPattern(name) + return pattern.append(name) } // help @@ -81,7 +83,7 @@ export function registerConsoleShortcuts(ctx: Vitest) { return ctx.rerunFiles(undefined, 'rerun all') // change testNamePattern if (name === 't') - return startPattern() + return pattern.start() // quit if (name === 'q') From dc5ad328afd71c74c8e3b12063889021fcc3ab45 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Sun, 20 Feb 2022 18:59:23 +0300 Subject: [PATCH 3/4] chore: cleanup --- packages/vitest/src/node/stdin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vitest/src/node/stdin.ts b/packages/vitest/src/node/stdin.ts index fae9932c16e4..e5cfacc3a707 100644 --- a/packages/vitest/src/node/stdin.ts +++ b/packages/vitest/src/node/stdin.ts @@ -30,7 +30,7 @@ function useChangePattern(ctx: Vitest) { } function start() { - process.stdout.write(`\n${c.bgMagenta(' PATTERN ')} ${c.magenta('Filter tests by its name regexp pattern:')} `) + process.stdout.write(`\n${c.bgMagenta(' FILTER ')} ${c.magenta('Filter tests by their name (using regexp):')} `) changingPattern = true } From 5751c9ebe20e48b379f10fa239ebc611c468232a Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Sun, 20 Feb 2022 19:23:48 +0300 Subject: [PATCH 4/4] chore: allow backspace and uppercase in testNamePattern --- packages/vitest/src/node/stdin.ts | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/vitest/src/node/stdin.ts b/packages/vitest/src/node/stdin.ts index e5cfacc3a707..8e8f5a1a6003 100644 --- a/packages/vitest/src/node/stdin.ts +++ b/packages/vitest/src/node/stdin.ts @@ -23,6 +23,12 @@ function useChangePattern(ctx: Vitest) { let namePattern = '' let changingPattern = false + function backspace() { + readline.moveCursor(process.stdout, -1, process.stdout.rows) + process.stdout.write(' ') + readline.moveCursor(process.stdout, -1, process.stdout.rows) + } + function end() { ctx.changeNamePattern(namePattern, undefined, 'change pattern') namePattern = '' @@ -34,9 +40,15 @@ function useChangePattern(ctx: Vitest) { changingPattern = true } - function append(str: string) { - namePattern += str - process.stdout.write(str) + function append(str: string, key: any) { + if (key.name === 'backspace') { + namePattern = namePattern.slice(0, namePattern.length - 1) + backspace() + } + else { + namePattern += str + process.stdout.write(str) + } } return { @@ -69,7 +81,7 @@ export function registerConsoleShortcuts(ctx: Vitest) { if (name === 'return') return pattern.end() - return pattern.append(name) + return pattern.append(str, key) } // help