@@ -181,17 +181,27 @@ export default class ZigTestRunnerProvider {
181
181
if ( token . isCancellationRequested ) break ;
182
182
const test = Array . isArray ( item ) ? item [ 1 ] : item ;
183
183
run . started ( test ) ;
184
+ const start = new Date ( ) ;
185
+ run . appendOutput ( `[${ start . toISOString ( ) } ] Running test: ${ test . label } \r\n` ) ;
184
186
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
+ }
187
196
} 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 ) ;
189
199
}
190
200
}
191
201
run . end ( ) ;
192
202
}
193
203
194
- private async debugTest ( run : vscode . TestRun , testItem : vscode . TestItem ) {
204
+ private async debugTest ( run : vscode . TestRun , testItem : vscode . TestItem ) : Promise < [ number , string ] > {
195
205
if ( testItem . uri === undefined ) {
196
206
throw new Error ( "Unable to determine file location" ) ;
197
207
}
@@ -208,7 +218,58 @@ export default class ZigTestRunnerProvider {
208
218
cwd : path . dirname ( testItem . uri . fsPath ) ,
209
219
stopAtEntry : false ,
210
220
} ;
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
+ } ) ;
212
273
}
213
274
214
275
private async buildTestBinary ( run : vscode . TestRun , testFilePath : string , testDesc : string ) : Promise < string > {
0 commit comments