forked from PowerShell/vscode-powershell
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPesterTests.ts
128 lines (106 loc) · 4.75 KB
/
PesterTests.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*---------------------------------------------------------
* Copyright (C) Microsoft Corporation. All rights reserved.
*--------------------------------------------------------*/
import * as path from "path";
import vscode = require("vscode");
import { SessionManager } from "../session";
import Settings = require("../settings");
import utils = require("../utils");
enum LaunchType {
Debug,
Run,
}
export class PesterTestsFeature implements vscode.Disposable {
private command: vscode.Disposable;
private invokePesterStubScriptPath: string;
constructor(private sessionManager: SessionManager) {
this.invokePesterStubScriptPath = path.resolve(__dirname, "../../../InvokePesterStub.ps1");
// File context-menu command - Run Pester Tests
this.command = vscode.commands.registerCommand(
"PowerShell.RunPesterTestsFromFile",
(fileUri) => {
this.launchAllTestsInActiveEditor(LaunchType.Run, fileUri);
});
// File context-menu command - Debug Pester Tests
this.command = vscode.commands.registerCommand(
"PowerShell.DebugPesterTestsFromFile",
(fileUri) => {
this.launchAllTestsInActiveEditor(LaunchType.Debug, fileUri);
});
// This command is provided for usage by PowerShellEditorServices (PSES) only
this.command = vscode.commands.registerCommand(
"PowerShell.RunPesterTests",
(uriString, runInDebugger, describeBlockName?, describeBlockLineNumber?) => {
this.launchTests(uriString, runInDebugger, describeBlockName, describeBlockLineNumber);
});
}
public dispose() {
this.command.dispose();
}
private launchAllTestsInActiveEditor(launchType: LaunchType, fileUri: vscode.Uri) {
const uriString = fileUri.toString();
const launchConfig = this.createLaunchConfig(uriString, launchType);
launchConfig.args.push("-All");
this.launch(launchConfig);
}
private async launchTests(
uriString: string,
runInDebugger: boolean,
describeBlockName?: string,
describeBlockLineNumber?: number) {
const launchType = runInDebugger ? LaunchType.Debug : LaunchType.Run;
const launchConfig = this.createLaunchConfig(uriString, launchType, describeBlockName, describeBlockLineNumber);
this.launch(launchConfig);
}
private createLaunchConfig(uriString: string, launchType: LaunchType, testName?: string, lineNum?: number) {
const uri = vscode.Uri.parse(uriString);
const currentDocument = vscode.window.activeTextEditor.document;
const settings = Settings.load();
// Since we pass the script path to PSES in single quotes to avoid issues with PowerShell
// special chars like & $ @ () [], we do have to double up the interior single quotes.
const scriptPath = uri.fsPath.replace(/'/g, "''");
const launchConfig = {
request: "launch",
type: "PowerShell",
name: "PowerShell Launch Pester Tests",
script: this.invokePesterStubScriptPath,
args: [
"-ScriptPath",
`'${scriptPath}'`,
],
internalConsoleOptions: "neverOpen",
noDebug: (launchType === LaunchType.Run),
createTemporaryIntegratedConsole: settings.debugging.createTemporaryIntegratedConsole,
cwd:
currentDocument.isUntitled
? vscode.workspace.rootPath
: path.dirname(currentDocument.fileName),
};
if (lineNum) {
launchConfig.args.push("-LineNumber", `${lineNum}`);
}
if (testName) {
// Escape single quotes inside double quotes by doubling them up
if (testName.includes("'")) {
testName = testName.replace(/'/g, "''");
}
launchConfig.args.push("-TestName", `'${testName}'`);
}
if (!settings.pester.useLegacyCodeLens) {
launchConfig.args.push("-MinimumVersion5");
}
launchConfig.args.push("-Output", `'${settings.pester.outputVerbosity}'`);
return launchConfig;
}
private launch(launchConfig) {
// Create or show the interactive console
// TODO #367: Check if "newSession" mode is configured
vscode.commands.executeCommand("PowerShell.ShowSessionConsole", true);
// Write out temporary debug session file
utils.writeSessionFile(
utils.getDebugSessionFilePath(),
this.sessionManager.getSessionDetails());
// TODO: Update to handle multiple root workspaces.
vscode.debug.startDebugging(vscode.workspace.workspaceFolders[0], launchConfig);
}
}