Skip to content

Commit 2f9a893

Browse files
luehmannVexu
authored andcommitted
Provide test results when debugging tests
Previously, tests would succeed once the debugger started. Now, they wait for the debugging session to terminate and may fail depending on the exit code. Test duration and output are also collected with the test result.
1 parent db14a21 commit 2f9a893

File tree

1 file changed

+66
-5
lines changed

1 file changed

+66
-5
lines changed

src/zigTestRunnerProvider.ts

Lines changed: 66 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -181,17 +181,27 @@ export default class ZigTestRunnerProvider {
181181
if (token.isCancellationRequested) break;
182182
const test = Array.isArray(item) ? item[1] : item;
183183
run.started(test);
184+
const start = new Date();
185+
run.appendOutput(`[${start.toISOString()}] Running test: ${test.label}\r\n`);
184186
try {
185-
await this.debugTest(run, test);
186-
run.passed(test);
187+
const [exitCode, output] = await this.debugTest(run, test);
188+
run.appendOutput(output.replaceAll("\n", "\r\n"));
189+
run.appendOutput("\r\n");
190+
const elapsed = new Date().getMilliseconds() - start.getMilliseconds();
191+
if (exitCode === 0) {
192+
run.passed(test, elapsed);
193+
} else {
194+
run.failed(test, new vscode.TestMessage(output));
195+
}
187196
} catch (e) {
188-
run.failed(test, new vscode.TestMessage((e as Error).message));
197+
const elapsed = new Date().getMilliseconds() - start.getMilliseconds();
198+
run.failed(test, new vscode.TestMessage((e as Error).message), elapsed);
189199
}
190200
}
191201
run.end();
192202
}
193203

194-
private async debugTest(run: vscode.TestRun, testItem: vscode.TestItem) {
204+
private async debugTest(run: vscode.TestRun, testItem: vscode.TestItem): Promise<[number, string]> {
195205
if (testItem.uri === undefined) {
196206
throw new Error("Unable to determine file location");
197207
}
@@ -208,7 +218,58 @@ export default class ZigTestRunnerProvider {
208218
cwd: path.dirname(testItem.uri.fsPath),
209219
stopAtEntry: false,
210220
};
211-
await vscode.debug.startDebugging(undefined, debugConfig);
221+
return new Promise((resolve, reject) => {
222+
const disposables: vscode.Disposable[] = [];
223+
let exitCode = 0;
224+
let output = "";
225+
226+
vscode.debug.onDidTerminateDebugSession((session) => {
227+
if (session.name === debugConfig.name) {
228+
for (const disposable of disposables) {
229+
disposable.dispose();
230+
}
231+
resolve([exitCode, output]);
232+
}
233+
}, disposables);
234+
235+
type Message =
236+
| { type: "event"; event: "output"; body: { output: string } }
237+
| { type: "event"; event: "exited"; body: { exitCode: number } }
238+
| { type: "response" };
239+
disposables.push(
240+
vscode.debug.registerDebugAdapterTrackerFactory(debugAdapter, {
241+
createDebugAdapterTracker() {
242+
return {
243+
onDidSendMessage: (m: Message) => {
244+
if (m.type === "event" && m.event === "output") {
245+
output += m.body.output;
246+
}
247+
if (m.type === "event" && m.event === "exited") {
248+
exitCode = m.body.exitCode;
249+
}
250+
},
251+
};
252+
},
253+
}),
254+
);
255+
256+
vscode.debug.startDebugging(undefined, debugConfig).then(
257+
(success) => {
258+
if (!success) {
259+
for (const disposable of disposables) {
260+
disposable.dispose();
261+
}
262+
reject(new Error("Failed to start debug session"));
263+
}
264+
},
265+
(err: unknown) => {
266+
for (const disposable of disposables) {
267+
disposable.dispose();
268+
}
269+
reject(err as Error);
270+
},
271+
);
272+
});
212273
}
213274

214275
private async buildTestBinary(run: vscode.TestRun, testFilePath: string, testDesc: string): Promise<string> {

0 commit comments

Comments
 (0)