diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts index e25292bf250..512fd8e646e 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { window, Pseudoterminal, EventEmitter, TerminalDimensions, workspace, ConfigurationTarget } from 'vscode'; +import { window, Pseudoterminal, EventEmitter, TerminalDimensions, workspace, ConfigurationTarget, Disposable } from 'vscode'; import { doesNotThrow, equal, ok, deepEqual } from 'assert'; suite('window namespace tests', () => { @@ -12,49 +12,47 @@ suite('window namespace tests', () => { await workspace.getConfiguration('terminal.integrated').update('windowsEnableConpty', false, ConfigurationTarget.Global); }); suite('Terminal', () => { + let disposables: Disposable[] = []; + + teardown(() => { + disposables.forEach(d => d.dispose()); + disposables.length = 0; + }); + test('sendText immediately after createTerminal should not throw', (done) => { - const reg1 = window.onDidOpenTerminal(term => { + disposables.push(window.onDidOpenTerminal(term => { try { equal(terminal, term); } catch (e) { done(e); } terminal.dispose(); - reg1.dispose(); - const reg2 = window.onDidCloseTerminal(() => { - reg2.dispose(); - done(); - }); - }); + disposables.push(window.onDidCloseTerminal(() => done())); + })); const terminal = window.createTerminal(); doesNotThrow(terminal.sendText.bind(terminal, 'echo "foo"')); }); test('onDidCloseTerminal event fires when terminal is disposed', (done) => { - const reg1 = window.onDidOpenTerminal(term => { + disposables.push(window.onDidOpenTerminal(term => { try { equal(terminal, term); } catch (e) { done(e); } terminal.dispose(); - reg1.dispose(); - const reg2 = window.onDidCloseTerminal(() => { - reg2.dispose(); - done(); - }); - }); + disposables.push(window.onDidCloseTerminal(() => done())); + })); const terminal = window.createTerminal(); }); test('processId immediately after createTerminal should fetch the pid', (done) => { - const reg1 = window.onDidOpenTerminal(term => { + disposables.push(window.onDidOpenTerminal(term => { try { equal(terminal, term); } catch (e) { done(e); } - reg1.dispose(); terminal.processId.then(id => { try { ok(id > 0); @@ -62,29 +60,22 @@ suite('window namespace tests', () => { done(e); } terminal.dispose(); - const reg2 = window.onDidCloseTerminal(() => { - reg2.dispose(); - done(); - }); + disposables.push(window.onDidCloseTerminal(() => done())); }); - }); + })); const terminal = window.createTerminal(); }); test('name in constructor should set terminal.name', (done) => { - const reg1 = window.onDidOpenTerminal(term => { + disposables.push(window.onDidOpenTerminal(term => { try { equal(terminal, term); } catch (e) { done(e); } terminal.dispose(); - reg1.dispose(); - const reg2 = window.onDidCloseTerminal(() => { - reg2.dispose(); - done(); - }); - }); + disposables.push(window.onDidCloseTerminal(() => done())); + })); const terminal = window.createTerminal('a'); try { equal(terminal.name, 'a'); @@ -94,19 +85,15 @@ suite('window namespace tests', () => { }); test('onDidOpenTerminal should fire when a terminal is created', (done) => { - const reg1 = window.onDidOpenTerminal(term => { + disposables.push(window.onDidOpenTerminal(term => { try { equal(term.name, 'b'); } catch (e) { done(e); } - reg1.dispose(); - const reg2 = window.onDidCloseTerminal(() => { - reg2.dispose(); - done(); - }); + disposables.push(window.onDidCloseTerminal(() => done())); terminal.dispose(); - }); + })); const terminal = window.createTerminal('b'); }); // test('onDidChangeActiveTerminal should fire when new terminals are created', (done) => { @@ -182,7 +169,7 @@ suite('window namespace tests', () => { suite('hideFromUser', () => { test('should be available to terminals API', done => { const terminal = window.createTerminal({ name: 'bg', hideFromUser: true }); - window.onDidOpenTerminal(t => { + disposables.push(window.onDidOpenTerminal(t => { try { equal(t, terminal); equal(t.name, 'bg'); @@ -190,12 +177,12 @@ suite('window namespace tests', () => { } catch (e) { done(e); } - const reg3 = window.onDidCloseTerminal(() => { - reg3.dispose(); + disposables.push(window.onDidCloseTerminal(() => { + // reg3.dispose(); done(); - }); + })); terminal.dispose(); - }); + })); }); }); @@ -204,17 +191,17 @@ suite('window namespace tests', () => { const openEvents: string[] = []; const dataEvents: { name: string, data: string }[] = []; const closeEvents: string[] = []; - const reg1 = window.onDidOpenTerminal(e => openEvents.push(e.name)); + disposables.push(window.onDidOpenTerminal(e => openEvents.push(e.name))); let resolveOnceDataWritten: (() => void) | undefined; - const reg2 = window.onDidWriteTerminalData(e => { + disposables.push(window.onDidWriteTerminalData(e => { dataEvents.push({ name: e.terminal.name, data: e.data }); resolveOnceDataWritten!(); - }); + })); - const reg3 = window.onDidCloseTerminal(e => { + disposables.push(window.onDidCloseTerminal(e => { closeEvents.push(e.name); try { @@ -226,16 +213,12 @@ suite('window namespace tests', () => { deepEqual(openEvents, ['test1', 'test2']); deepEqual(dataEvents, [{ name: 'test1', data: 'write1' }, { name: 'test2', data: 'write2' }]); deepEqual(closeEvents, ['test1', 'test2']); - - reg1.dispose(); - reg2.dispose(); - reg3.dispose(); done(); } } catch (e) { done(e); } - }); + })); const term1Write = new EventEmitter(); const term1Close = new EventEmitter(); @@ -272,19 +255,15 @@ suite('window namespace tests', () => { suite('Extension pty terminals', () => { test('should fire onDidOpenTerminal and onDidCloseTerminal', (done) => { - const reg1 = window.onDidOpenTerminal(term => { + disposables.push(window.onDidOpenTerminal(term => { try { equal(term.name, 'c'); } catch (e) { done(e); } - reg1.dispose(); - const reg2 = window.onDidCloseTerminal(() => { - reg2.dispose(); - done(); - }); + disposables.push(window.onDidCloseTerminal(() => done())); term.dispose(); - }); + })); const pty: Pseudoterminal = { onDidWrite: new EventEmitter().event, open: () => { }, @@ -341,15 +320,14 @@ suite('window namespace tests', () => { // }); test('should respect dimension overrides', (done) => { - const reg1 = window.onDidOpenTerminal(term => { + disposables.push(window.onDidOpenTerminal(term => { try { equal(terminal, term); } catch (e) { done(e); } - reg1.dispose(); term.show(); - const reg2 = window.onDidChangeTerminalDimensions(e => { + disposables.push(window.onDidChangeTerminalDimensions(e => { try { equal(e.dimensions.columns, 10); equal(e.dimensions.rows, 5); @@ -357,14 +335,10 @@ suite('window namespace tests', () => { } catch (e) { done(e); } - reg2.dispose(); - const reg3 = window.onDidCloseTerminal(() => { - reg3.dispose(); - done(); - }); + disposables.push(window.onDidCloseTerminal(() => done())); terminal.dispose(); - }); - }); + })); + })); const writeEmitter = new EventEmitter(); const overrideDimensionsEmitter = new EventEmitter(); const pty: Pseudoterminal = { diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts index e4344f0d58a..edb404b8653 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts @@ -4,14 +4,20 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import * as vscode from 'vscode'; +import { window, tasks, Disposable, TaskDefinition, Task, EventEmitter, CustomExecution, Pseudoterminal, TaskScope, commands, Task2 } from 'vscode'; suite('workspace-namespace', () => { suite('Tasks', () => { + let disposables: Disposable[] = []; + + teardown(() => { + disposables.forEach(d => d.dispose()); + disposables.length = 0; + }); test('CustomExecution task should start and shutdown successfully', (done) => { - interface CustomTestingTaskDefinition extends vscode.TaskDefinition { + interface CustomTestingTaskDefinition extends TaskDefinition { /** * One of the task properties. This can be used to customize the task in the tasks.json */ @@ -19,49 +25,58 @@ suite('workspace-namespace', () => { } const taskType: string = 'customTesting'; const taskName = 'First custom task'; - const reg1 = vscode.window.onDidOpenTerminal(term => { - reg1.dispose(); - const reg2 = vscode.window.onDidWriteTerminalData(e => { - reg2.dispose(); + let isPseudoterminalClosed = false; + disposables.push(window.onDidOpenTerminal(term => { + disposables.push(window.onDidWriteTerminalData(e => { try { assert.equal(e.data, 'testing\r\n'); } catch (e) { done(e); } + disposables.push(window.onDidCloseTerminal(() => { + try { + // Pseudoterminal.close should have fired by now, additionally we want + // to make sure all events are flushed before continuing with more tests + assert.ok(isPseudoterminalClosed); + } catch (e) { + done(e); + return; + } + done(); + })); term.dispose(); - }); - }); - const taskProvider = vscode.tasks.registerTaskProvider(taskType, { + })); + })); + disposables.push(tasks.registerTaskProvider(taskType, { provideTasks: () => { - const result: vscode.Task[] = []; + const result: Task[] = []; const kind: CustomTestingTaskDefinition = { type: taskType, customProp1: 'testing task one' }; - const writeEmitter = new vscode.EventEmitter(); - const execution = new vscode.CustomExecution((): Thenable => { - const pty: vscode.Pseudoterminal = { + const writeEmitter = new EventEmitter(); + const execution = new CustomExecution((): Thenable => { + const pty: Pseudoterminal = { onDidWrite: writeEmitter.event, - open: () => { - writeEmitter.fire('testing\r\n'); - }, - close: () => { - taskProvider.dispose(); - done(); - } + open: () => writeEmitter.fire('testing\r\n'), + close: () => isPseudoterminalClosed = true }; return Promise.resolve(pty); }); - const task = new vscode.Task2(kind, vscode.TaskScope.Workspace, taskName, taskType, execution); + const task = new Task2(kind, TaskScope.Workspace, taskName, taskType, execution); result.push(task); return result; }, - resolveTask(_task: vscode.Task): vscode.Task | undefined { + resolveTask(_task: Task): Task | undefined { + try { assert.fail('resolveTask should not trigger during the test'); + } catch (e) { + done(e); + } return undefined; } - }); - vscode.commands.executeCommand('workbench.action.tasks.runTask', `${taskType}: ${taskName}`); + })); + commands.executeCommand('workbench.action.tasks.runTask', `${taskType}: ${taskName}`); }); }); });