Skip to content

Commit efd221a

Browse files
committed
feat: support restarting test runs
1 parent dfc652f commit efd221a

File tree

2 files changed

+55
-7
lines changed

2 files changed

+55
-7
lines changed

client/src/lsp_extensions.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,11 @@ interface TestOutput {
213213
location?: Location;
214214
}
215215

216+
interface TestRunRestart {
217+
type: "restart";
218+
enqueued: EnqueuedTestModule[]
219+
}
220+
216221
interface TestEnd {
217222
/** The test run has ended. */
218223
type: "end";
@@ -223,6 +228,7 @@ type TestRunProgressMessage =
223228
| TestFailedErrored
224229
| TestPassed
225230
| TestOutput
231+
| TestRunRestart
226232
| TestEnd;
227233

228234
export interface TestRunProgressParams {

client/src/testing.ts

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,18 @@ function getTestItem(
131131
}
132132
}
133133

134+
interface TestRunRequestInfo {
135+
readonly include: readonly vscode.TestItem[] | undefined;
136+
readonly exclude: readonly vscode.TestItem[] | undefined;
137+
readonly profile: vscode.TestRunProfile | undefined;
138+
}
139+
134140
export class DenoTestController implements vscode.Disposable {
135141
#runCount = 0;
136-
#runs = new Map<number, vscode.TestRun>();
142+
#runs = new Map<
143+
number,
144+
{ run: vscode.TestRun; request: TestRunRequestInfo }
145+
>();
137146
#subscriptions: vscode.Disposable[] = [];
138147

139148
constructor(client: LanguageClient) {
@@ -148,7 +157,14 @@ export class DenoTestController implements vscode.Disposable {
148157
) => {
149158
const run = testController.createTestRun(request);
150159
const id = ++this.#runCount;
151-
this.#runs.set(id, run);
160+
this.#runs.set(id, {
161+
run,
162+
request: {
163+
include: request.include,
164+
exclude: request.exclude,
165+
profile: request.profile,
166+
},
167+
});
152168
// currently on "run" is implemented and exposed
153169
let kind: "run" | "coverage" | "debug" = "run";
154170
switch (request.profile?.kind) {
@@ -176,7 +192,9 @@ export class DenoTestController implements vscode.Disposable {
176192

177193
cancellation.onCancellationRequested(async () => {
178194
await client.sendRequest(testRunCancel, { id });
179-
run.end();
195+
// The run can be replaced
196+
const runData = this.#runs.get(id);
197+
runData?.run.end();
180198
this.#runs.delete(id);
181199
});
182200

@@ -197,7 +215,7 @@ export class DenoTestController implements vscode.Disposable {
197215
runHandler,
198216
true,
199217
undefined,
200-
true
218+
true,
201219
);
202220
// TODO(@kitsonk) add debug run profile
203221
// TODO(@kitsonk) add coverage run profile
@@ -217,7 +235,7 @@ export class DenoTestController implements vscode.Disposable {
217235
expectedOutput,
218236
actualOutput,
219237
)
220-
: new vscode.TestMessage(msg);
238+
: new vscode.TestMessage(msg);
221239

222240
if (location) {
223241
testMessage.location = p2c.asLocation(location);
@@ -281,10 +299,11 @@ export class DenoTestController implements vscode.Disposable {
281299
);
282300

283301
client.onNotification(testRunProgress, ({ id, message }) => {
284-
const run = this.#runs.get(id);
285-
if (!run) {
302+
const runData = this.#runs.get(id);
303+
if (!runData) {
286304
return;
287305
}
306+
const { run } = runData;
288307
switch (message.type) {
289308
case "enqueued":
290309
case "started":
@@ -321,6 +340,29 @@ export class DenoTestController implements vscode.Disposable {
321340
run.appendOutput(value, loc, item);
322341
break;
323342
}
343+
case "restart": {
344+
const { enqueued } = message;
345+
run.end();
346+
const newRun = testController.createTestRun(
347+
new vscode.TestRunRequest(
348+
runData.request.include,
349+
runData.request.exclude,
350+
runData.request.profile,
351+
true,
352+
),
353+
);
354+
for (const { textDocument, ids } of enqueued) {
355+
for (const id of ids) {
356+
const item = getTestItem(testController, { textDocument, id });
357+
if (!item) {
358+
continue;
359+
}
360+
newRun.enqueued(item);
361+
}
362+
}
363+
this.#runs.set(id, { run: newRun, request: runData.request });
364+
break;
365+
}
324366
case "end": {
325367
run.end();
326368
this.#runs.delete(id);

0 commit comments

Comments
 (0)