From 7038b80d3a59e845c2063ccb32ac1f46af92601a Mon Sep 17 00:00:00 2001 From: Christoph Bergmeister Date: Tue, 22 Jan 2019 20:54:36 +0000 Subject: [PATCH 1/4] Execute interpolated Pester describe blocks if PSES signals that it is possible --- src/features/PesterTests.ts | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/features/PesterTests.ts b/src/features/PesterTests.ts index 75bb17698b..dafde19ce0 100644 --- a/src/features/PesterTests.ts +++ b/src/features/PesterTests.ts @@ -35,8 +35,9 @@ export class PesterTestsFeature implements IFeature { // This command is provided for usage by PowerShellEditorServices (PSES) only this.command = vscode.commands.registerCommand( "PowerShell.RunPesterTests", - (uriString, runInDebugger, describeBlockName?) => { - this.launchTests(uriString, runInDebugger, describeBlockName); + (uriString, runInDebugger, describeBlockName?, describeBlockLineNumber?, pesterSupportsLineNumber?) => { + this.launchTests(uriString, runInDebugger, describeBlockName, + describeBlockLineNumber, pesterSupportsLineNumber); }); } @@ -54,9 +55,10 @@ export class PesterTestsFeature implements IFeature { this.launch(launchConfig); } - private async launchTests(uriString: string, runInDebugger: boolean, describeBlockName?: string) { + private async launchTests(uriString: string, runInDebugger: boolean, describeBlockName?: string, + describeBlockLineNumber?: number, pesterSupportsLineNumber = false) { // PSES passes null for the describeBlockName to signal that it can't evaluate the TestName. - if (!describeBlockName) { + if (!describeBlockName && !pesterSupportsLineNumber) { const answer = await vscode.window.showErrorMessage( "This Describe block's TestName parameter cannot be evaluated. " + `Would you like to ${runInDebugger ? "debug" : "run"} all the tests in this file?`, @@ -68,9 +70,10 @@ export class PesterTestsFeature implements IFeature { } const launchType = runInDebugger ? LaunchType.Debug : LaunchType.Run; - const launchConfig = this.createLaunchConfig(uriString, launchType); + const launchConfig = this.createLaunchConfig(uriString, launchType, + describeBlockLineNumber, pesterSupportsLineNumber); - if (describeBlockName) { + if (describeBlockName && !pesterSupportsLineNumber) { launchConfig.args.push("-TestName"); launchConfig.args.push(`'${describeBlockName}'`); } @@ -78,7 +81,8 @@ export class PesterTestsFeature implements IFeature { this.launch(launchConfig); } - private createLaunchConfig(uriString: string, launchType: LaunchType) { + private createLaunchConfig(uriString: string, launchType: LaunchType, + describeBlockLineNumber?: number, pesterSupportsLineNumber = false) { const uri = vscode.Uri.parse(uriString); const currentDocument = vscode.window.activeTextEditor.document; const settings = Settings.load(); @@ -87,6 +91,14 @@ export class PesterTestsFeature implements IFeature { // special chars like & $ @ () [], we do have to double up the interior single quotes. const scriptPath = uri.fsPath.replace(/'/g, "''"); + let pesterOption: string; + if (pesterSupportsLineNumber) { + pesterOption = "(New-PesterOption -ScriptBlockFilter " + + `@( @{ IncludeVSCodeMarker=$true; Line=${describeBlockLineNumber}; Path='${scriptPath}' } ) )`; + } else { + pesterOption = "@{IncludeVSCodeMarker=$true}"; + } + const launchConfig = { request: "launch", type: "PowerShell", @@ -96,7 +108,7 @@ export class PesterTestsFeature implements IFeature { "-Script", `'${scriptPath}'`, "-PesterOption", - "@{IncludeVSCodeMarker=$true}", + pesterOption, ], internalConsoleOptions: "neverOpen", noDebug: (launchType === LaunchType.Run), From 6b20203a38c029a1b8a6a4f977d794ae15f5efc5 Mon Sep 17 00:00:00 2001 From: Christoph Bergmeister Date: Tue, 22 Jan 2019 21:37:02 +0000 Subject: [PATCH 2/4] add info to tell user that his/her Pester version is too old to give a hint that they should upgrade --- src/features/PesterTests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/features/PesterTests.ts b/src/features/PesterTests.ts index dafde19ce0..5bced86e6a 100644 --- a/src/features/PesterTests.ts +++ b/src/features/PesterTests.ts @@ -60,7 +60,7 @@ export class PesterTestsFeature implements IFeature { // PSES passes null for the describeBlockName to signal that it can't evaluate the TestName. if (!describeBlockName && !pesterSupportsLineNumber) { const answer = await vscode.window.showErrorMessage( - "This Describe block's TestName parameter cannot be evaluated. " + + "This Describe block's TestName parameter cannot be evaluated in versions of Pester before 4.6.0." + `Would you like to ${runInDebugger ? "debug" : "run"} all the tests in this file?`, "Yes", "No"); From 53ac14d511e7c7b572c4271acd95948f45762665 Mon Sep 17 00:00:00 2001 From: Christoph Bergmeister Date: Tue, 22 Jan 2019 22:13:25 +0000 Subject: [PATCH 3/4] use nullable describeblockline to make decision if Pester version is good enough --- src/features/PesterTests.ts | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/features/PesterTests.ts b/src/features/PesterTests.ts index 5bced86e6a..094d4f7f52 100644 --- a/src/features/PesterTests.ts +++ b/src/features/PesterTests.ts @@ -35,9 +35,8 @@ export class PesterTestsFeature implements IFeature { // This command is provided for usage by PowerShellEditorServices (PSES) only this.command = vscode.commands.registerCommand( "PowerShell.RunPesterTests", - (uriString, runInDebugger, describeBlockName?, describeBlockLineNumber?, pesterSupportsLineNumber?) => { - this.launchTests(uriString, runInDebugger, describeBlockName, - describeBlockLineNumber, pesterSupportsLineNumber); + (uriString, runInDebugger, describeBlockName?, describeBlockLineNumber?) => { + this.launchTests(uriString, runInDebugger, describeBlockName, describeBlockLineNumber); }); } @@ -56,11 +55,11 @@ export class PesterTestsFeature implements IFeature { } private async launchTests(uriString: string, runInDebugger: boolean, describeBlockName?: string, - describeBlockLineNumber?: number, pesterSupportsLineNumber = false) { + describeBlockLineNumber?: number) { // PSES passes null for the describeBlockName to signal that it can't evaluate the TestName. - if (!describeBlockName && !pesterSupportsLineNumber) { + if (!describeBlockName && !describeBlockLineNumber) { const answer = await vscode.window.showErrorMessage( - "This Describe block's TestName parameter cannot be evaluated in versions of Pester before 4.6.0." + + "This Describe block's TestName parameter cannot be evaluated in versions of Pester before 4.6.0. " + `Would you like to ${runInDebugger ? "debug" : "run"} all the tests in this file?`, "Yes", "No"); @@ -70,10 +69,9 @@ export class PesterTestsFeature implements IFeature { } const launchType = runInDebugger ? LaunchType.Debug : LaunchType.Run; - const launchConfig = this.createLaunchConfig(uriString, launchType, - describeBlockLineNumber, pesterSupportsLineNumber); + const launchConfig = this.createLaunchConfig(uriString, launchType, describeBlockLineNumber); - if (describeBlockName && !pesterSupportsLineNumber) { + if (describeBlockName && !describeBlockLineNumber) { launchConfig.args.push("-TestName"); launchConfig.args.push(`'${describeBlockName}'`); } From 318b3dfe0aa8001d4e562e7116088d0e69716162 Mon Sep 17 00:00:00 2001 From: Christoph Bergmeister Date: Tue, 22 Jan 2019 22:18:15 +0000 Subject: [PATCH 4/4] cleanup --- src/features/PesterTests.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/features/PesterTests.ts b/src/features/PesterTests.ts index 094d4f7f52..8856d492c7 100644 --- a/src/features/PesterTests.ts +++ b/src/features/PesterTests.ts @@ -79,8 +79,7 @@ export class PesterTestsFeature implements IFeature { this.launch(launchConfig); } - private createLaunchConfig(uriString: string, launchType: LaunchType, - describeBlockLineNumber?: number, pesterSupportsLineNumber = false) { + private createLaunchConfig(uriString: string, launchType: LaunchType, describeBlockLineNumber?: number) { const uri = vscode.Uri.parse(uriString); const currentDocument = vscode.window.activeTextEditor.document; const settings = Settings.load(); @@ -90,7 +89,7 @@ export class PesterTestsFeature implements IFeature { const scriptPath = uri.fsPath.replace(/'/g, "''"); let pesterOption: string; - if (pesterSupportsLineNumber) { + if (describeBlockLineNumber) { pesterOption = "(New-PesterOption -ScriptBlockFilter " + `@( @{ IncludeVSCodeMarker=$true; Line=${describeBlockLineNumber}; Path='${scriptPath}' } ) )`; } else {