Skip to content

Commit ad01d4a

Browse files
committed
Fix the test to work with integratedTerminal mode
1 parent da18921 commit ad01d4a

1 file changed

Lines changed: 31 additions & 3 deletions

File tree

Extension/test/scenarios/RunWithoutDebugging/tests/runWithoutDebugging.integration.test.ts

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ function createSessionTerminatedPromise(sessionName: string): Promise<void> {
106106
});
107107
}
108108

109-
function createTracker(debugType: string, sessionName: string, timeoutMs: number, timeoutMessage: string): TrackerController {
109+
function createTracker(debugType: string, sessionName: string, programName: string, timeoutMs: number, timeoutMessage: string): TrackerController {
110110
const state: TrackerState = {
111111
setBreakpointsRequestReceived: false,
112112
stoppedEventReceived: false,
@@ -150,6 +150,34 @@ function createTracker(debugType: string, sessionName: string, timeoutMs: number
150150
resolve('stopped');
151151
}
152152

153+
// integratedTerminal scenarios may not send an 'exited' event if the terminal does not support shell integration.
154+
// We have to close the terminal with the exit code to get the result.
155+
if (message.event === 'terminated' && !state.exitedEventReceived) {
156+
state.exitedEventReceived = true;
157+
const disp = vscode.window.onDidCloseTerminal((terminal) => {
158+
if (terminal.name === programName) {
159+
state.exitedEventReceived = true;
160+
state.actualExitCode = terminal.exitStatus?.code;
161+
if (!state.stoppedEventReceived) {
162+
state.exitedBeforeStop = true;
163+
}
164+
if (timeoutHandle) {
165+
clearTimeout(timeoutHandle);
166+
timeoutHandle = undefined;
167+
}
168+
disp.dispose();
169+
resolve('exited');
170+
}
171+
});
172+
173+
vscode.window.terminals.forEach((terminal) => {
174+
if (terminal.name === programName) {
175+
const exitCommand = isWindows ? 'exit /b %ErrorLevel%' : 'exit $?';
176+
terminal.sendText(exitCommand);
177+
}
178+
});
179+
}
180+
153181
if (message.event === 'exited') {
154182
state.exitedEventReceived = true;
155183
state.actualExitCode = message.body?.exitCode;
@@ -210,7 +238,7 @@ suite('Run Without Debugging Integration Test', function (): void {
210238
await compileProgram(workspacePath, sourceFile, executablePath);
211239

212240
const breakpoint = await createBreakpointAtReturnStatement(sourceUri);
213-
const tracker = createTracker(debugType, sessionName, 30000, 'Timed out waiting for debugger event.');
241+
const tracker = createTracker(debugType, sessionName, executablePath, 30000, 'Timed out waiting for debugger event.');
214242
const debugSessionTerminated = createSessionTerminatedPromise(sessionName);
215243

216244
try {
@@ -259,7 +287,7 @@ suite('Run Without Debugging Integration Test', function (): void {
259287
const breakpoint = await createBreakpointAtReturnStatement(sourceUri);
260288

261289
let launchedSession: vscode.DebugSession | undefined;
262-
const tracker = createTracker(debugType, sessionName, 45000, 'Timed out waiting for debugger event in normal debug mode.');
290+
const tracker = createTracker(debugType, sessionName, executablePath, 45000, 'Timed out waiting for debugger event in normal debug mode.');
263291

264292
const startedSubscription = vscode.debug.onDidStartDebugSession((session) => {
265293
if (session.name === sessionName) {

0 commit comments

Comments
 (0)