From 9fee021ba41d002581ab35869ee2cd6fe9c08fcf Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 21 Jul 2021 10:40:19 -0700 Subject: [PATCH] Test getInstanceFromResource Part of #126387 Co-Authored-By: Megan Rogge --- .../terminal/browser/terminalEditorService.ts | 13 +-- .../terminal/browser/terminalGroupService.ts | 12 +-- .../terminal/browser/terminalService.ts | 13 +-- .../contrib/terminal/browser/terminalUri.ts | 14 ++++ .../terminal/test/browser/terminalUri.test.ts | 84 +++++++++++++------ 5 files changed, 79 insertions(+), 57 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalEditorService.ts b/src/vs/workbench/contrib/terminal/browser/terminalEditorService.ts index 399419fd63f..8b633d0ca92 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalEditorService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalEditorService.ts @@ -16,7 +16,7 @@ import { IRemoteTerminalService, ITerminalEditorService, ITerminalInstance, ITer import { TerminalEditor } from 'vs/workbench/contrib/terminal/browser/terminalEditor'; import { TerminalEditorInput } from 'vs/workbench/contrib/terminal/browser/terminalEditorInput'; import { DeserializedTerminalEditorInput } from 'vs/workbench/contrib/terminal/browser/terminalEditorSerializer'; -import { parseTerminalUri } from 'vs/workbench/contrib/terminal/browser/terminalUri'; +import { getInstanceFromResource, parseTerminalUri } from 'vs/workbench/contrib/terminal/browser/terminalUri'; import { ILocalTerminalService, IOffProcessTerminalService } from 'vs/workbench/contrib/terminal/common/terminal'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; @@ -219,16 +219,7 @@ export class TerminalEditorService extends Disposable implements ITerminalEditor } getInstanceFromResource(resource: URI | undefined): ITerminalInstance | undefined { - if (URI.isUri(resource)) { - // note that the uri and and instance id might - // not match this window - for (const instance of this.instances) { - if (instance.resource.path === resource.path) { - return instance; - } - } - } - return undefined; + return getInstanceFromResource(this.instances, resource); } splitInstance(instanceToSplit: ITerminalInstance, shellLaunchConfig: IShellLaunchConfig = {}): ITerminalInstance { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalGroupService.ts b/src/vs/workbench/contrib/terminal/browser/terminalGroupService.ts index 04a252eab81..0a127312646 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalGroupService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalGroupService.ts @@ -16,6 +16,7 @@ import { IShellLaunchConfig, TerminalSettingId } from 'vs/platform/terminal/comm import { IViewDescriptorService, IViewsService, ViewContainerLocation } from 'vs/workbench/common/views'; import { ITerminalFindHost, ITerminalGroup, ITerminalGroupService, ITerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminal'; import { TerminalGroup } from 'vs/workbench/contrib/terminal/browser/terminalGroup'; +import { getInstanceFromResource } from 'vs/workbench/contrib/terminal/browser/terminalUri'; import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView'; import { TERMINAL_VIEW_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { TerminalContextKeys } from 'vs/workbench/contrib/terminal/common/terminalContextKey'; @@ -177,16 +178,7 @@ export class TerminalGroupService extends Disposable implements ITerminalGroupSe } getInstanceFromResource(resource: URI | undefined): ITerminalInstance | undefined { - if (URI.isUri(resource)) { - // note that the uri and and instance id might - // not match this window - for (const instance of this.instances) { - if (instance.resource.path === resource.path) { - return instance; - } - } - } - return undefined; + return getInstanceFromResource(this.instances, resource); } findNext(): void { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalService.ts b/src/vs/workbench/contrib/terminal/browser/terminalService.ts index 08a4747f528..4cc01ff917c 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalService.ts @@ -36,7 +36,7 @@ import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/term import { TerminalEditor } from 'vs/workbench/contrib/terminal/browser/terminalEditor'; import { getColorClass, getUriClasses } from 'vs/workbench/contrib/terminal/browser/terminalIcon'; import { configureTerminalProfileIcon } from 'vs/workbench/contrib/terminal/browser/terminalIcons'; -import { getTerminalUri, parseTerminalUri } from 'vs/workbench/contrib/terminal/browser/terminalUri'; +import { getInstanceFromResource, getTerminalUri, parseTerminalUri } from 'vs/workbench/contrib/terminal/browser/terminalUri'; import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView'; import { ILocalTerminalService, IOffProcessTerminalService, IRemoteTerminalAttachTarget, IStartExtensionTerminalRequest, ITerminalConfigHelper, ITerminalProcessExtHostProxy, ITerminalProfileContribution, TERMINAL_VIEW_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { TerminalContextKeys } from 'vs/workbench/contrib/terminal/common/terminalContextKey'; @@ -606,16 +606,7 @@ export class TerminalService implements ITerminalService { } getInstanceFromResource(resource: URI | undefined): ITerminalInstance | undefined { - if (URI.isUri(resource)) { - // note that the uri and and instance id might - // not match this window - for (const instance of this.instances) { - if (instance.resource.path === resource.path) { - return instance; - } - } - } - return undefined; + return getInstanceFromResource(this.instances, resource); } isAttachedToTerminal(remoteTerm: IRemoteTerminalAttachTarget): boolean { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalUri.ts b/src/vs/workbench/contrib/terminal/browser/terminalUri.ts index 09a5cc77bcd..eb44e80d2f1 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalUri.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalUri.ts @@ -6,6 +6,7 @@ import { DataTransfers } from 'vs/base/browser/dnd'; import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; +import { ITerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminal'; export function parseTerminalUri(resource: URI): ITerminalIdentifier { const [, workspaceId, instanceId] = resource.path.split('/'); @@ -44,3 +45,16 @@ export function getTerminalResourcesFromDragEvent(event: IPartialDragEvent): URI } return undefined; } + +export function getInstanceFromResource>(instances: T[], resource: URI | undefined): T | undefined { + if (resource) { + for (const instance of instances) { + // Note that the URI's workspace and instance id might not originally be from this window + // Don't bother checking the scheme and assume instances only contains terminals + if (instance.resource.path === resource.path) { + return instance; + } + } + } + return undefined; +} diff --git a/src/vs/workbench/contrib/terminal/test/browser/terminalUri.test.ts b/src/vs/workbench/contrib/terminal/test/browser/terminalUri.test.ts index ab851b94152..1a5430116a2 100644 --- a/src/vs/workbench/contrib/terminal/test/browser/terminalUri.test.ts +++ b/src/vs/workbench/contrib/terminal/test/browser/terminalUri.test.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { deepStrictEqual } from 'assert'; -import { getTerminalResourcesFromDragEvent, IPartialDragEvent } from 'vs/workbench/contrib/terminal/browser/terminalUri'; +import { deepStrictEqual, strictEqual } from 'assert'; +import { getInstanceFromResource, getTerminalResourcesFromDragEvent, getTerminalUri, IPartialDragEvent } from 'vs/workbench/contrib/terminal/browser/terminalUri'; function fakeDragEvent(data: string): IPartialDragEvent { return { @@ -16,29 +16,63 @@ function fakeDragEvent(data: string): IPartialDragEvent { }; } -suite('getTerminalResourcesFromDragEvent', () => { - test('should give undefined when no terminal resources is in event', () => { - deepStrictEqual( - getTerminalResourcesFromDragEvent(fakeDragEvent(''))?.map(e => e.toString()), - undefined - ); +suite('terminalUri', () => { + suite('getTerminalResourcesFromDragEvent', () => { + test('should give undefined when no terminal resources is in event', () => { + deepStrictEqual( + getTerminalResourcesFromDragEvent(fakeDragEvent(''))?.map(e => e.toString()), + undefined + ); + }); + test('should give undefined when an empty terminal resources array is in event', () => { + deepStrictEqual( + getTerminalResourcesFromDragEvent(fakeDragEvent('[]'))?.map(e => e.toString()), + undefined + ); + }); + test('should return terminal resource when event contains one', () => { + deepStrictEqual( + getTerminalResourcesFromDragEvent(fakeDragEvent('["vscode-terminal:/1626874386474/3"]'))?.map(e => e.toString()), + ['vscode-terminal:/1626874386474/3'] + ); + }); + test('should return multiple terminal resources when event contains multiple', () => { + deepStrictEqual( + getTerminalResourcesFromDragEvent(fakeDragEvent('["vscode-terminal:/foo/1","vscode-terminal:/bar/2"]'))?.map(e => e.toString()), + ['vscode-terminal:/foo/1', 'vscode-terminal:/bar/2'] + ); + }); }); - test('should give undefined when an empty terminal resources array is in event', () => { - deepStrictEqual( - getTerminalResourcesFromDragEvent(fakeDragEvent('[]'))?.map(e => e.toString()), - undefined - ); - }); - test('should return terminal resource when event contains one', () => { - deepStrictEqual( - getTerminalResourcesFromDragEvent(fakeDragEvent('["vscode-terminal:/1626874386474/3"]'))?.map(e => e.toString()), - ['vscode-terminal:/1626874386474/3'] - ); - }); - test('should return multiple terminal resources when event contains multiple', () => { - deepStrictEqual( - getTerminalResourcesFromDragEvent(fakeDragEvent('["vscode-terminal:/foo/1","vscode-terminal:/bar/2"]'))?.map(e => e.toString()), - ['vscode-terminal:/foo/1', 'vscode-terminal:/bar/2'] - ); + suite('getInstanceFromResource', () => { + test('should return undefined if there is no match', () => { + strictEqual( + getInstanceFromResource([ + { resource: getTerminalUri('workspace', 2, 'title') } + ], getTerminalUri('workspace', 1)), + undefined + ); + }); + test('should return a result if there is a match', () => { + const instance = { resource: getTerminalUri('workspace', 2, 'title') }; + strictEqual( + getInstanceFromResource([ + { resource: getTerminalUri('workspace', 1, 'title') }, + instance, + { resource: getTerminalUri('workspace', 3, 'title') } + ], getTerminalUri('workspace', 2)), + instance + ); + }); + test('should ignore the fragment', () => { + const instance = { resource: getTerminalUri('workspace', 2, 'title') }; + strictEqual( + getInstanceFromResource([ + { resource: getTerminalUri('workspace', 1, 'title') }, + instance, + { resource: getTerminalUri('workspace', 3, 'title') } + ], getTerminalUri('workspace', 2, 'does not match!')), + instance + ); + }); }); });