diff --git a/src/features/ExternalApi.ts b/src/features/ExternalApi.ts index 252da1ed16..1ea1879372 100644 --- a/src/features/ExternalApi.ts +++ b/src/features/ExternalApi.ts @@ -20,6 +20,7 @@ export interface IPowerShellExtensionClient { getPowerShellVersionDetails(uuid: string): Promise; waitUntilStarted(uuid: string): Promise; getStorageUri(): vscode.Uri; + getExtensionTerminal(): vscode.Terminal; } /* @@ -171,6 +172,10 @@ export class ExternalApiFeature extends LanguageClientConsumer implements IPower return this.extensionContext.globalStorageUri; } + public getExtensionTerminal(): vscode.Terminal { + return this.sessionManager.getExtensionTerminal(); + } + public dispose() { // Nothing to dispose. } diff --git a/src/main.ts b/src/main.ts index 69e0008d1c..228eab695b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -178,6 +178,7 @@ export async function activate(context: vscode.ExtensionContext): Promise externalApi.getPowerShellVersionDetails(uuid), waitUntilStarted: uuid => externalApi.waitUntilStarted(uuid), getStorageUri: () => externalApi.getStorageUri(), + getExtensionTerminal: () => externalApi.getExtensionTerminal(), }; } diff --git a/src/process.ts b/src/process.ts index 94623016d2..d2967819e0 100644 --- a/src/process.ts +++ b/src/process.ts @@ -2,7 +2,6 @@ // Licensed under the MIT License. import cp = require("child_process"); -import * as semver from "semver"; import path = require("path"); import vscode = require("vscode"); import { Logger } from "./logging"; @@ -22,7 +21,7 @@ export class PowerShellProcess { public onExited: vscode.Event; private onExitedEmitter = new vscode.EventEmitter(); - private consoleTerminal: vscode.Terminal = undefined; + public consoleTerminal: vscode.Terminal = undefined; private consoleCloseSubscription: vscode.Disposable; constructor( diff --git a/src/session.ts b/src/session.ts index 7b097b1660..29e2df8dda 100644 --- a/src/session.ts +++ b/src/session.ts @@ -331,6 +331,10 @@ Type 'help' to get help. await this.start(exeNameOverride); } + public getExtensionTerminal(): vscode.Terminal { + return this.languageServerProcess.consoleTerminal; + } + public getSessionDetails(): IEditorServicesSessionDetails { return this.sessionDetails; } diff --git a/test/features/ExtensionTerminal.test.ts b/test/features/ExtensionTerminal.test.ts new file mode 100644 index 0000000000..f0eb24bc96 --- /dev/null +++ b/test/features/ExtensionTerminal.test.ts @@ -0,0 +1,36 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import * as assert from "assert"; +import fs = require("fs"); +import os = require("os"); +import path = require("path"); +import utils = require("../utils"); +import vscode = require("vscode"); +import { sleep } from "../../src/utils"; + +describe("Extension Terminal feature", function () { + let terminal: vscode.Terminal; + const testFile = path.join(os.tmpdir(), "ExtensionTerminalTests.log") + + before(async function () { + const extension = await utils.ensureExtensionIsActivated(); + terminal = extension.getExtensionTerminal(); + terminal.show(true); + sleep(1000); + }); + + beforeEach(function () { + if (fs.existsSync(testFile)) { + fs.rmSync(testFile); + } + assert.strictEqual(false, fs.existsSync(testFile)); + }) + + it("Can run code in the terminal", async function () { + const script = `Write-Output 'hi' >> '${testFile}'`; + terminal.sendText(script); + sleep(1000); + assert.strictEqual(fs.readFileSync(testFile), "hi"); + }); +}); diff --git a/test/index.ts b/test/index.ts index 0164cc7459..9963650db6 100644 --- a/test/index.ts +++ b/test/index.ts @@ -25,7 +25,7 @@ export function run(): Promise { }); return new Promise((c, e) => { - glob("**/**.test.js", { cwd: __dirname }, (err, files) => { + glob("**/ExtensionTerminal.test.js", { cwd: __dirname }, (err, files) => { if (err) { return e(err); }