This commit is contained in:
meganrogge
2023-09-21 09:15:31 -07:00
parent 2f4371e8bd
commit c20815788f
2 changed files with 27 additions and 16 deletions

View File

@@ -52,11 +52,23 @@ export class TaskTerminalStatus extends Disposable {
})); }));
} }
public override dispose(): void {
super.dispose();
for (const terminalData of this.terminalMap.values()) {
terminalData.disposeListener?.dispose();
}
this.terminalMap.clear();
this._marker?.dispose();
}
addTerminal(task: Task, terminal: ITerminalInstance, problemMatcher: AbstractProblemCollector) { addTerminal(task: Task, terminal: ITerminalInstance, problemMatcher: AbstractProblemCollector) {
const status: ITerminalStatus = { id: TASK_TERMINAL_STATUS_ID, severity: Severity.Info }; const status: ITerminalStatus = { id: TASK_TERMINAL_STATUS_ID, severity: Severity.Info };
terminal.statusList.add(status); terminal.statusList.add(status);
this._register(problemMatcher.onDidFindFirstMatch(() => { this._register(problemMatcher.onDidFindFirstMatch(() => {
this._marker = terminal.registerMarker(); this._marker = terminal.registerMarker();
if (this._marker) {
this._register(this._marker);
}
})); }));
this._register(problemMatcher.onDidFindErrors(() => { this._register(problemMatcher.onDidFindErrors(() => {
if (this._marker) { if (this._marker) {

View File

@@ -5,7 +5,7 @@
import { ok } from 'assert'; import { ok } from 'assert';
import { Emitter, Event } from 'vs/base/common/event'; import { Emitter, Event } from 'vs/base/common/event';
import { DisposableStore } from 'vs/base/common/lifecycle'; import { Disposable } from 'vs/base/common/lifecycle';
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
import { AudioCue, IAudioCueService } from 'vs/platform/audioCues/browser/audioCueService'; import { AudioCue, IAudioCueService } from 'vs/platform/audioCues/browser/audioCueService';
import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService';
@@ -34,8 +34,14 @@ class TestAudioCueService implements Partial<IAudioCueService> {
} }
} }
class TestTerminal implements Partial<ITerminalInstance> { class TestTerminal extends Disposable implements Partial<ITerminalInstance> {
statusList: TerminalStatusList = new TerminalStatusList(new TestConfigurationService()); statusList: TerminalStatusList = this._register(new TerminalStatusList(new TestConfigurationService()));
constructor() {
super();
}
override dispose(): void {
super.dispose();
}
} }
class TestTask extends CommonTask { class TestTask extends CommonTask {
@@ -52,7 +58,7 @@ class TestTask extends CommonTask {
} }
} }
class TestProblemCollector implements Partial<AbstractProblemCollector> { class TestProblemCollector extends Disposable implements Partial<AbstractProblemCollector> {
protected readonly _onDidFindFirstMatch = new Emitter<void>(); protected readonly _onDidFindFirstMatch = new Emitter<void>();
readonly onDidFindFirstMatch = this._onDidFindFirstMatch.event; readonly onDidFindFirstMatch = this._onDidFindFirstMatch.event;
protected readonly _onDidFindErrors = new Emitter<void>(); protected readonly _onDidFindErrors = new Emitter<void>();
@@ -62,7 +68,6 @@ class TestProblemCollector implements Partial<AbstractProblemCollector> {
} }
suite('Task Terminal Status', () => { suite('Task Terminal Status', () => {
let store: DisposableStore;
let instantiationService: TestInstantiationService; let instantiationService: TestInstantiationService;
let taskService: TestTaskService; let taskService: TestTaskService;
let taskTerminalStatus: TaskTerminalStatus; let taskTerminalStatus: TaskTerminalStatus;
@@ -70,22 +75,16 @@ suite('Task Terminal Status', () => {
let testTask: Task; let testTask: Task;
let problemCollector: AbstractProblemCollector; let problemCollector: AbstractProblemCollector;
let audioCueService: TestAudioCueService; let audioCueService: TestAudioCueService;
const store = ensureNoDisposablesAreLeakedInTestSuite();
setup(() => { setup(() => {
store = new DisposableStore(); instantiationService = store.add(new TestInstantiationService());
instantiationService = new TestInstantiationService();
taskService = new TestTaskService(); taskService = new TestTaskService();
audioCueService = new TestAudioCueService(); audioCueService = new TestAudioCueService();
taskTerminalStatus = new TaskTerminalStatus(taskService as any, audioCueService as any); taskTerminalStatus = store.add(new TaskTerminalStatus(taskService as any, audioCueService as any));
testTerminal = instantiationService.createInstance(TestTerminal) as any; testTerminal = store.add(instantiationService.createInstance(TestTerminal) as any);
testTask = instantiationService.createInstance(TestTask) as unknown as Task; testTask = instantiationService.createInstance(TestTask) as unknown as Task;
problemCollector = instantiationService.createInstance(TestProblemCollector) as any; problemCollector = store.add(instantiationService.createInstance(TestProblemCollector) as any);
store.add(instantiationService);
store.add(taskTerminalStatus);
}); });
teardown(() => {
store.clear();
});
ensureNoDisposablesAreLeakedInTestSuite();
test('Should add failed status when there is an exit code on task end', async () => { test('Should add failed status when there is an exit code on task end', async () => {
taskTerminalStatus.addTerminal(testTask, testTerminal, problemCollector); taskTerminalStatus.addTerminal(testTask, testTerminal, problemCollector);
taskService.triggerStateChange({ kind: TaskEventKind.ProcessStarted }); taskService.triggerStateChange({ kind: TaskEventKind.ProcessStarted });