/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; import 'vs/workbench/parts/files/electron-browser/files.contribution'; // load our contribution into the test import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput'; import { Promise, TPromise } from 'vs/base/common/winjs.base'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import * as paths from 'vs/base/common/paths'; import URI from 'vs/base/common/uri'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { StorageService, InMemoryLocalStorage } from 'vs/platform/storage/common/storageService'; import { IEditorGroup, ConfirmResult, IEditorOpeningEvent, IEditorInputWithOptions, CloseDirection, IEditorIdentifier } from 'vs/workbench/common/editor'; import { Event, Emitter } from 'vs/base/common/event'; import Severity from 'vs/base/common/severity'; import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IPartService, Parts, Position as PartPosition, IDimension } from 'vs/workbench/services/part/common/partService'; import { TextModelResolverService } from 'vs/workbench/services/textmodelResolver/common/textModelResolverService'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IEditorInput, IEditorOptions, Position, IEditor, IResourceInput, IUntitledResourceInput, IResourceDiffInput, IResourceSideBySideInput } from 'vs/platform/editor/common/editor'; import { IUntitledEditorService, UntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { IWorkspaceContextService, IWorkspace as IWorkbenchWorkspace, WorkbenchState, IWorkspaceFolder, IWorkspaceFoldersChangeEvent } from 'vs/platform/workspace/common/workspace'; import { ILifecycleService, ShutdownEvent, ShutdownReason, StartupKind, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IEditorGroupService, GroupArrangement, GroupOrientation, IEditorTabOptions, IMoveOptions } from 'vs/workbench/services/group/common/groupService'; import { TextFileService } from 'vs/workbench/services/textfile/common/textFileService'; import { FileOperationEvent, IFileService, IResolveContentOptions, FileOperationError, IFileStat, IResolveFileResult, FileChangesEvent, IResolveFileOptions, IContent, IUpdateContentOptions, IStreamContent, ICreateFileOptions, ITextSnapshot, IResourceEncodings } from 'vs/platform/files/common/files'; import { IModelService } from 'vs/editor/common/services/modelService'; import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl'; import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; import { IRawTextContent, ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { parseArgs } from 'vs/platform/environment/node/argv'; import { EnvironmentService } from 'vs/platform/environment/node/environmentService'; import { IModeService } from 'vs/editor/common/services/modeService'; import { IWorkbenchEditorService, ICloseEditorsFilter, NoOpEditorStacksModel } from 'vs/workbench/services/editor/common/editorService'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { IInstantiationService, ServicesAccessor, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { IWindowsService, IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, IWindowConfiguration } from 'vs/platform/windows/common/windows'; import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; import { createTextBufferFactory } from 'vs/editor/common/model/textModel'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { isLinux } from 'vs/base/common/platform'; import { generateUuid } from 'vs/base/common/uuid'; import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, IWorkspaceFolderCreationData } from 'vs/platform/workspaces/common/workspaces'; import { IRecentlyOpened } from 'vs/platform/history/common/history'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/resourceConfiguration'; import { IPosition, Position as EditorPosition } from 'vs/editor/common/core/position'; import { ICommandAction, IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions'; import { IHashService } from 'vs/workbench/services/hash/common/hashService'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { MockContextKeyService, MockKeybindingService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; import { ITextBufferFactory, DefaultEndOfLine, EndOfLinePreference } from 'vs/editor/common/model'; import { Range } from 'vs/editor/common/core/range'; import { IConfirmation, IConfirmationResult, IDialogService, IDialogOptions } from 'vs/platform/dialogs/common/dialogs'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; import { IExtensionService, ProfileSession, IExtensionsStatus, ExtensionPointContribution, IExtensionDescription } from '../services/extensions/common/extensions'; import { IExtensionPoint } from 'vs/workbench/services/extensions/common/extensionsRegistry'; import { IKeybindingService } from '../../platform/keybinding/common/keybinding'; import { IDecorationsService, IResourceDecorationChangeEvent, IDecoration, IDecorationData, IDecorationsProvider } from 'vs/workbench/services/decorations/browser/decorations'; import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { INextEditorGroupsService, INextEditorGroup, GroupsOrder, GroupsArrangement, GroupDirection, IAddGroupOptions, IMergeGroupOptions, IMoveEditorOptions, ICopyEditorOptions, IEditorReplacement } from 'vs/workbench/services/group/common/nextEditorGroupsService'; import { INextEditorService } from 'vs/workbench/services/editor/common/nextEditorService'; export function createFileInput(instantiationService: IInstantiationService, resource: URI): FileEditorInput { return instantiationService.createInstance(FileEditorInput, resource, void 0); } export const TestEnvironmentService = new EnvironmentService(parseArgs(process.argv), process.execPath); export class TestContextService implements IWorkspaceContextService { public _serviceBrand: any; private workspace: IWorkbenchWorkspace; private options: any; private readonly _onDidChangeWorkspaceName: Emitter; private readonly _onDidChangeWorkspaceFolders: Emitter; private readonly _onDidChangeWorkbenchState: Emitter; constructor(workspace: any = TestWorkspace, options: any = null) { this.workspace = workspace; this.options = options || Object.create(null); this._onDidChangeWorkspaceFolders = new Emitter(); this._onDidChangeWorkbenchState = new Emitter(); } public get onDidChangeWorkspaceName(): Event { return this._onDidChangeWorkspaceName.event; } public get onDidChangeWorkspaceFolders(): Event { return this._onDidChangeWorkspaceFolders.event; } public get onDidChangeWorkbenchState(): Event { return this._onDidChangeWorkbenchState.event; } public getFolders(): IWorkspaceFolder[] { return this.workspace ? this.workspace.folders : []; } public getWorkbenchState(): WorkbenchState { if (this.workspace.configuration) { return WorkbenchState.WORKSPACE; } if (this.workspace.folders.length) { return WorkbenchState.FOLDER; } return WorkbenchState.EMPTY; } public getWorkspace(): IWorkbenchWorkspace { return this.workspace; } public getWorkspaceFolder(resource: URI): IWorkspaceFolder { return this.isInsideWorkspace(resource) ? this.workspace.folders[0] : null; } public setWorkspace(workspace: any): void { this.workspace = workspace; } public getOptions() { return this.options; } public updateOptions() { } public isInsideWorkspace(resource: URI): boolean { if (resource && this.workspace) { return paths.isEqualOrParent(resource.fsPath, this.workspace.folders[0].uri.fsPath, !isLinux /* ignorecase */); } return false; } public toResource(workspaceRelativePath: string): URI { return URI.file(paths.join('C:\\', workspaceRelativePath)); } public isCurrentWorkspace(workspaceIdentifier: ISingleFolderWorkspaceIdentifier | IWorkspaceIdentifier): boolean { return isSingleFolderWorkspaceIdentifier(workspaceIdentifier) && this.pathEquals(this.workspace.folders[0].uri.fsPath, workspaceIdentifier); } private pathEquals(path1: string, path2: string): boolean { if (!isLinux) { path1 = path1.toLowerCase(); path2 = path2.toLowerCase(); } return path1 === path2; } } export class TestTextFileService extends TextFileService { public cleanupBackupsBeforeShutdownCalled: boolean; private promptPath: string; private confirmResult: ConfirmResult; private resolveTextContentError: FileOperationError; constructor( @ILifecycleService lifecycleService: ILifecycleService, @IWorkspaceContextService contextService: IWorkspaceContextService, @IConfigurationService configurationService: IConfigurationService, @IWorkbenchEditorService editorService: IWorkbenchEditorService, @IFileService fileService: IFileService, @IUntitledEditorService untitledEditorService: IUntitledEditorService, @IInstantiationService instantiationService: IInstantiationService, @INotificationService notificationService: INotificationService, @IBackupFileService backupFileService: IBackupFileService, @IWindowsService windowsService: IWindowsService, @IHistoryService historyService: IHistoryService, @IContextKeyService contextKeyService: IContextKeyService, @IModelService modelService: IModelService ) { super(lifecycleService, contextService, configurationService, fileService, untitledEditorService, instantiationService, notificationService, TestEnvironmentService, backupFileService, windowsService, historyService, contextKeyService, modelService); } public setPromptPath(path: string): void { this.promptPath = path; } public setConfirmResult(result: ConfirmResult): void { this.confirmResult = result; } public setResolveTextContentErrorOnce(error: FileOperationError): void { this.resolveTextContentError = error; } public resolveTextContent(resource: URI, options?: IResolveContentOptions): TPromise { if (this.resolveTextContentError) { const error = this.resolveTextContentError; this.resolveTextContentError = null; return TPromise.wrapError(error); } return this.fileService.resolveContent(resource, options).then((content): IRawTextContent => { return { resource: content.resource, name: content.name, mtime: content.mtime, etag: content.etag, encoding: content.encoding, value: createTextBufferFactory(content.value) }; }); } public promptForPath(defaultPath: string): TPromise { return TPromise.wrap(this.promptPath); } public confirmSave(resources?: URI[]): TPromise { return TPromise.wrap(this.confirmResult); } public onFilesConfigurationChange(configuration: any): void { super.onFilesConfigurationChange(configuration); } protected cleanupBackupsBeforeShutdown(): TPromise { this.cleanupBackupsBeforeShutdownCalled = true; return TPromise.as(void 0); } } export function workbenchInstantiationService(): IInstantiationService { let instantiationService = new TestInstantiationService(new ServiceCollection([ILifecycleService, new TestLifecycleService()])); instantiationService.stub(IContextKeyService, instantiationService.createInstance(MockContextKeyService)); instantiationService.stub(IWorkspaceContextService, new TestContextService(TestWorkspace)); const configService = new TestConfigurationService(); instantiationService.stub(IConfigurationService, configService); instantiationService.stub(ITextResourceConfigurationService, new TestTextResourceConfigurationService(configService)); instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService)); instantiationService.stub(IStorageService, new TestStorageService()); instantiationService.stub(IWorkbenchEditorService, new TestEditorService()); instantiationService.stub(IPartService, new TestPartService()); instantiationService.stub(IEditorGroupService, new TestEditorGroupService()); instantiationService.stub(IModeService, ModeServiceImpl); instantiationService.stub(IHistoryService, new TestHistoryService()); instantiationService.stub(IModelService, instantiationService.createInstance(ModelServiceImpl)); instantiationService.stub(IFileService, new TestFileService()); instantiationService.stub(IBackupFileService, new TestBackupFileService()); instantiationService.stub(ITelemetryService, NullTelemetryService); instantiationService.stub(INotificationService, new TestNotificationService()); instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService)); instantiationService.stub(IWindowService, new TestWindowService()); instantiationService.stub(IMenuService, new TestMenuService()); instantiationService.stub(IKeybindingService, new MockKeybindingService()); instantiationService.stub(IDecorationsService, new TestDecorationsService()); instantiationService.stub(IExtensionService, new TestExtensionService()); instantiationService.stub(IWindowsService, new TestWindowsService()); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); instantiationService.stub(ITextModelService, instantiationService.createInstance(TextModelResolverService)); instantiationService.stub(IEnvironmentService, TestEnvironmentService); instantiationService.stub(IThemeService, new TestThemeService()); instantiationService.stub(IHashService, new TestHashService()); instantiationService.stub(INextEditorGroupsService, new TestNextEditorGroupsService([new TestNextEditorGroup(0)])); instantiationService.stub(INextEditorService, new TestNextEditorService()); return instantiationService; } export class TestDecorationsService implements IDecorationsService { _serviceBrand: any; onDidChangeDecorations: Event = Event.None; registerDecorationsProvider(provider: IDecorationsProvider): IDisposable { return toDisposable(); } getDecoration(uri: URI, includeChildren: boolean, overwrite?: IDecorationData): IDecoration { return void 0; } } export class TestExtensionService implements IExtensionService { _serviceBrand: any; onDidRegisterExtensions: Event = Event.None; onDidChangeExtensionsStatus: Event = Event.None; activateByEvent(activationEvent: string): Promise { return TPromise.as(void 0); } whenInstalledExtensionsRegistered(): Promise { return TPromise.as(true); } getExtensions(): Promise { return TPromise.as([]); } readExtensionPointContributions(extPoint: IExtensionPoint): Promise[]> { return TPromise.as(Object.create(null)); } getExtensionsStatus(): { [id: string]: IExtensionsStatus; } { return Object.create(null); } canProfileExtensionHost(): boolean { return false; } startExtensionHostProfile(): Promise { return TPromise.as(Object.create(null)); } restartExtensionHost(): void { } startExtensionHost(): void { } stopExtensionHost(): void { } } export class TestMenuService implements IMenuService { public _serviceBrand: any; createMenu(id: MenuId, scopedKeybindingService: IContextKeyService): IMenu { return { onDidChange: Event.None, dispose: () => void 0, getActions: () => [] }; } } export class TestHistoryService implements IHistoryService { public _serviceBrand: any; constructor(private root?: URI) { } public reopenLastClosedEditor(): void { } public forward(acrossEditors?: boolean): void { } public back(acrossEditors?: boolean): void { } public last(): void { } public remove(input: IEditorInput | IResourceInput): void { } public clear(): void { } public getHistory(): (IEditorInput | IResourceInput)[] { return []; } public getLastActiveWorkspaceRoot(schemeFilter?: string): URI { return this.root; } public getLastActiveFile(): URI { return void 0; } } export class TestDialogService implements IDialogService { public _serviceBrand: any; public confirm(confirmation: IConfirmation): Promise { return TPromise.as({ confirmed: false }); } public show(severity: Severity, message: string, buttons: string[], options?: IDialogOptions): Promise { return TPromise.as(0); } } export class TestPartService implements IPartService { public _serviceBrand: any; private _onTitleBarVisibilityChange = new Emitter(); private _onEditorLayout = new Emitter(); public get onTitleBarVisibilityChange(): Event { return this._onTitleBarVisibilityChange.event; } public get onEditorLayout(): Event { return this._onEditorLayout.event; } public layout(): void { } public isCreated(): boolean { return true; } public hasFocus(part: Parts): boolean { return false; } public isVisible(part: Parts): boolean { return true; } public getContainer(part: Parts): HTMLElement { return null; } public isTitleBarHidden(): boolean { return false; } public getTitleBarOffset(): number { return 0; } public isStatusBarHidden(): boolean { return false; } public isActivityBarHidden(): boolean { return false; } public setActivityBarHidden(hidden: boolean): void { } public isSideBarHidden(): boolean { return false; } public setSideBarHidden(hidden: boolean): TPromise { return TPromise.as(null); } public isPanelHidden(): boolean { return false; } public setPanelHidden(hidden: boolean): TPromise { return TPromise.as(null); } public toggleMaximizedPanel(): void { } public isPanelMaximized(): boolean { return false; } public getSideBarPosition() { return 0; } public getPanelPosition() { return 0; } public setPanelPosition(position: PartPosition): TPromise { return TPromise.as(null); } public addClass(clazz: string): void { } public removeClass(clazz: string): void { } public getWorkbenchElementId(): string { return ''; } public toggleZenMode(): void { } public isEditorLayoutCentered(): boolean { return false; } public centerEditorLayout(active: boolean): void { } public resizePart(part: Parts, sizeChange: number): void { } } export class TestStorageService implements IStorageService { public _serviceBrand: any; private storage: StorageService; constructor() { let context = new TestContextService(); this.storage = new StorageService(new InMemoryLocalStorage(), null, context.getWorkspace().id); } store(key: string, value: any, scope: StorageScope = StorageScope.GLOBAL): void { this.storage.store(key, value, scope); } remove(key: string, scope: StorageScope = StorageScope.GLOBAL): void { this.storage.remove(key, scope); } get(key: string, scope: StorageScope = StorageScope.GLOBAL, defaultValue?: string): string { return this.storage.get(key, scope, defaultValue); } getInteger(key: string, scope: StorageScope = StorageScope.GLOBAL, defaultValue?: number): number { return this.storage.getInteger(key, scope, defaultValue); } getBoolean(key: string, scope: StorageScope = StorageScope.GLOBAL, defaultValue?: boolean): boolean { return this.storage.getBoolean(key, scope, defaultValue); } } export class TestEditorGroupService implements IEditorGroupService { public _serviceBrand: any; private stacksModel; private readonly _onEditorsChanged: Emitter; private readonly _onEditorOpening: Emitter; private readonly _onEditorOpenFail: Emitter; private readonly _onEditorsMoved: Emitter; private readonly _onGroupOrientationChanged: Emitter; private readonly _onTabOptionsChanged: Emitter; constructor(callback?: (method: string) => void) { this._onEditorsMoved = new Emitter(); this._onEditorsChanged = new Emitter(); this._onEditorOpening = new Emitter(); this._onGroupOrientationChanged = new Emitter(); this._onEditorOpenFail = new Emitter(); this._onTabOptionsChanged = new Emitter(); let services = new ServiceCollection(); services.set(IStorageService, new TestStorageService()); services.set(IConfigurationService, new TestConfigurationService()); services.set(IWorkspaceContextService, new TestContextService()); const lifecycle = new TestLifecycleService(); services.set(ILifecycleService, lifecycle); services.set(ITelemetryService, NullTelemetryService); this.stacksModel = new NoOpEditorStacksModel(); } public fireChange(): void { this._onEditorsChanged.fire(); } public get onEditorsChanged(): Event { return this._onEditorsChanged.event; } public get onEditorOpening(): Event { return this._onEditorOpening.event; } public get onEditorOpenFail(): Event { return this._onEditorOpenFail.event; } public get onEditorGroupMoved(): Event { return this._onEditorsMoved.event; } public get onGroupOrientationChanged(): Event { return this._onGroupOrientationChanged.event; } public get onTabOptionsChanged(): Event { return this._onTabOptionsChanged.event; } public focusGroup(group: IEditorGroup): void; public focusGroup(position: Position): void; public focusGroup(arg1: any): void { } public activateGroup(group: IEditorGroup): void; public activateGroup(position: Position): void; public activateGroup(arg1: any): void { } public moveGroup(from: IEditorGroup, to: IEditorGroup): void; public moveGroup(from: Position, to: Position): void; public moveGroup(arg1: any, arg2: any): void { } public arrangeGroups(arrangement: GroupArrangement): void { } public setGroupOrientation(orientation: GroupOrientation): void { } public getGroupOrientation(): GroupOrientation { return 'vertical'; } public resizeGroup(position: Position, groupSizeChange: number): void { } public pinEditor(group: IEditorGroup, input: IEditorInput): void; public pinEditor(position: Position, input: IEditorInput): void; public pinEditor(arg1: any, input: IEditorInput): void { } public moveEditor(input: IEditorInput, from: IEditorGroup, to: IEditorGroup, moveOptions?: IMoveOptions): void; public moveEditor(input: IEditorInput, from: Position, to: Position, moveOptions?: IMoveOptions): void; public moveEditor(input: IEditorInput, from: any, to: any, moveOptions?: IMoveOptions): void { } public getStacksModel() { return this.stacksModel; } public getTabOptions(): IEditorTabOptions { return {}; } public invokeWithinEditorContext(fn: (accessor: ServicesAccessor) => T): T { return fn(null); } } export class TestEditorService implements IWorkbenchEditorService { public _serviceBrand: any; public activeEditorInput: IEditorInput; public activeEditorOptions: IEditorOptions; public activeEditorPosition: Position; public mockLineNumber: number; public mockSelectedText: string; private callback: (method: string) => void; constructor(callback?: (method: string) => void) { this.callback = callback || ((s: string) => { }); this.mockLineNumber = 15; this.mockSelectedText = 'selected text'; } public openEditors(inputs: any[]): Promise { return TPromise.as([]); } public replaceEditors(editors: any[]): TPromise { return TPromise.as([]); } public closeEditors(positions?: Position[]): TPromise; public closeEditors(position: Position, filter?: ICloseEditorsFilter): TPromise; public closeEditors(position: Position, editors: IEditorInput[]): TPromise; public closeEditors(editors: { positionOne?: ICloseEditorsFilter, positionTwo?: ICloseEditorsFilter, positionThree?: ICloseEditorsFilter }): TPromise; public closeEditors(editors: { positionOne?: IEditorInput[], positionTwo?: IEditorInput[], positionThree?: IEditorInput[] }): TPromise; public closeEditors(positionOrEditors: any, filterOrEditors?: any): TPromise { return TPromise.as(null); } public getActiveEditor(): IEditor { this.callback('getActiveEditor'); return { input: null, options: null, group: null, getId: () => { return null; }, getControl: () => { return { getSelection: () => { return { positionLineNumber: this.mockLineNumber }; }, getModel: () => { return { getValueInRange: () => this.mockSelectedText }; } }; }, focus: () => { }, isVisible: () => { return true; } }; } public getActiveEditorInput(): IEditorInput { this.callback('getActiveEditorInput'); return this.activeEditorInput; } public getVisibleEditors(): IEditor[] { this.callback('getVisibleEditors'); return []; } public openEditor(input: any, options?: any, position?: any): Promise { this.callback('openEditor'); this.activeEditorInput = input; this.activeEditorOptions = options; this.activeEditorPosition = position; return TPromise.as(null); } public closeEditor(position: Position, input: IEditorInput): TPromise { this.callback('closeEditor'); return TPromise.as(null); } public createInput(input: IResourceInput): IEditorInput { return null; } } export class TestNextEditorGroupsService implements INextEditorGroupsService { _serviceBrand: ServiceIdentifier; constructor(public groups: TestNextEditorGroup[] = []) { } onDidActiveGroupChange: Event = Event.None; onDidAddGroup: Event = Event.None; onDidRemoveGroup: Event = Event.None; onDidMoveGroup: Event = Event.None; onDidGroupLabelChange: Event = Event.None; orientation: any; whenRestored: Thenable = TPromise.as(void 0); get activeGroup(): INextEditorGroup { return this.groups[0]; } get count(): number { return this.groups.length; } getGroups(order?: GroupsOrder): ReadonlyArray { return this.groups; } getGroup(identifier: number): INextEditorGroup { for (let i = 0; i < this.groups.length; i++) { if (this.groups[i].id === identifier) { return this.groups[i]; } } return void 0; } getLabel(identifier: number): string { return 'Group 1'; } focusGroup(group: number | INextEditorGroup): INextEditorGroup { return null; } activateGroup(group: number | INextEditorGroup): INextEditorGroup { return null; } resizeGroup(group: number | INextEditorGroup, sizeDelta: number): INextEditorGroup { return null; } arrangeGroups(arrangement: GroupsArrangement): void { } setGroupOrientation(orientation: any): void { } addGroup(location: number | INextEditorGroup, direction: GroupDirection, options?: IAddGroupOptions): INextEditorGroup { return null; } removeGroup(group: number | INextEditorGroup): void { } moveGroup(group: number | INextEditorGroup, location: number | INextEditorGroup, direction: GroupDirection): INextEditorGroup { return null; } mergeGroup(group: number | INextEditorGroup, target: number | INextEditorGroup, options?: IMergeGroupOptions): INextEditorGroup { return null; } copyGroup(group: number | INextEditorGroup, location: number | INextEditorGroup, direction: GroupDirection): INextEditorGroup { return null; } } export class TestNextEditorGroup implements INextEditorGroup { constructor(public id: number) { } activeControl: IEditor; activeEditor: IEditorInput; previewEditor: IEditorInput; count: number; editors: ReadonlyArray; onWillDispose: Event = Event.None; onDidActiveEditorChange: Event = Event.None; onWillCloseEditor: Event = Event.None; onDidCloseEditor: Event = Event.None; onWillOpenEditor: Event = Event.None; onDidOpenEditorFail: Event = Event.None; getEditor(index: number): IEditorInput { return null; } getIndexOfEditor(editor: IEditorInput): number { return -1; } openEditor(editor: IEditorInput, options?: IEditorOptions): Thenable { return TPromise.as(void 0); } openEditors(editors: IEditorInputWithOptions[]): Thenable { return TPromise.as(void 0); } isOpened(editor: IEditorInput): boolean { return false; } isPinned(editor: IEditorInput): boolean { return false; } isActive(editor: IEditorInput): boolean { return false; } moveEditor(editor: IEditorInput, target: INextEditorGroup, options?: IMoveEditorOptions): void { } copyEditor(editor: IEditorInput, target: INextEditorGroup, options?: ICopyEditorOptions): void { } closeEditor(editor?: IEditorInput): Thenable { return TPromise.as(void 0); } closeEditors(editors: IEditorInput[] | { except?: IEditorInput; direction?: CloseDirection; savedOnly?: boolean; }): Thenable { return TPromise.as(void 0); } closeAllEditors(): Thenable { return TPromise.as(void 0); } replaceEditors(editors: IEditorReplacement[]): Thenable { return TPromise.as(void 0); } pinEditor(editor?: IEditorInput): void { } focus(): void { } invokeWithinContext(fn: (accessor: ServicesAccessor) => T): T { return fn(null); } } export class TestNextEditorService implements INextEditorService { _serviceBrand: ServiceIdentifier; onDidActiveEditorChange: Event = Event.None; onDidVisibleEditorsChange: Event = Event.None; onWillCloseEditor: Event = Event.None; onDidCloseEditor: Event = Event.None; onWillOpenEditor: Event = Event.None; onDidOpenEditorFail: Event = Event.None; activeControl: IEditor; activeTextEditorControl: any; activeEditor: IEditorInput; visibleControls: ReadonlyArray; visibleTextEditorControls = []; visibleEditors: ReadonlyArray; openEditor(editor: any, options?: any, group?: any) { return TPromise.as(null); } openEditors(editors: any, group?: any) { return TPromise.as(null); } isOpen(editor: IEditorInput | IResourceInput | IUntitledResourceInput): boolean { return false; } closeEditor(editor: IEditorInput, group: number | INextEditorGroup): Thenable { return TPromise.as(null); } invokeWithinEditorContext(fn: (accessor: ServicesAccessor) => T): T { return fn(null); } createInput(input: IResourceInput | IUntitledResourceInput | IResourceDiffInput | IResourceSideBySideInput): IEditorInput { return null; } } export class TestFileService implements IFileService { public _serviceBrand: any; public encoding: IResourceEncodings; private readonly _onFileChanges: Emitter; private readonly _onAfterOperation: Emitter; private content = 'Hello Html'; constructor() { this._onFileChanges = new Emitter(); this._onAfterOperation = new Emitter(); } public setContent(content: string): void { this.content = content; } public getContent(): string { return this.content; } public get onFileChanges(): Event { return this._onFileChanges.event; } public fireFileChanges(event: FileChangesEvent): void { this._onFileChanges.fire(event); } public get onAfterOperation(): Event { return this._onAfterOperation.event; } public fireAfterOperation(event: FileOperationEvent): void { this._onAfterOperation.fire(event); } resolveFile(resource: URI, options?: IResolveFileOptions): TPromise { return TPromise.as({ resource, etag: Date.now().toString(), encoding: 'utf8', mtime: Date.now(), isDirectory: false, name: paths.basename(resource.fsPath) }); } resolveFiles(toResolve: { resource: URI, options?: IResolveFileOptions }[]): TPromise { return TPromise.join(toResolve.map(resourceAndOption => this.resolveFile(resourceAndOption.resource, resourceAndOption.options))).then(stats => stats.map(stat => ({ stat, success: true }))); } existsFile(resource: URI): TPromise { return TPromise.as(null); } resolveContent(resource: URI, options?: IResolveContentOptions): TPromise { return TPromise.as({ resource: resource, value: this.content, etag: 'index.txt', encoding: 'utf8', mtime: Date.now(), name: paths.basename(resource.fsPath) }); } resolveStreamContent(resource: URI, options?: IResolveContentOptions): TPromise { return TPromise.as({ resource: resource, value: { on: (event: string, callback: Function): void => { if (event === 'data') { callback(this.content); } if (event === 'end') { callback(); } } }, etag: 'index.txt', encoding: 'utf8', mtime: Date.now(), name: paths.basename(resource.fsPath) }); } updateContent(resource: URI, value: string | ITextSnapshot, options?: IUpdateContentOptions): TPromise { return TPromise.timeout(1).then(() => { return { resource, etag: 'index.txt', encoding: 'utf8', mtime: Date.now(), isDirectory: false, name: paths.basename(resource.fsPath) }; }); } moveFile(source: URI, target: URI, overwrite?: boolean): TPromise { return TPromise.as(null); } copyFile(source: URI, target: URI, overwrite?: boolean): TPromise { return TPromise.as(null); } createFile(resource: URI, content?: string, options?: ICreateFileOptions): TPromise { return TPromise.as(null); } createFolder(resource: URI): TPromise { return TPromise.as(null); } rename(resource: URI, newName: string): TPromise { return TPromise.as(null); } onDidChangeFileSystemProviderRegistrations = Event.None; registerProvider(scheme: string, provider) { return { dispose() { } }; } canHandleResource(resource: URI): boolean { return resource.scheme === 'file'; } del(resource: URI, useTrash?: boolean): TPromise { return TPromise.as(null); } watchFileChanges(resource: URI): void { } unwatchFileChanges(resource: URI): void { } getWriteEncoding(resource: URI): string { return 'utf8'; } dispose(): void { } } export class TestBackupFileService implements IBackupFileService { public _serviceBrand: any; public backupEnabled: boolean; public hasBackups(): TPromise { return TPromise.as(false); } public hasBackup(resource: URI): TPromise { return TPromise.as(false); } public loadBackupResource(resource: URI): TPromise { return this.hasBackup(resource).then(hasBackup => { if (hasBackup) { return this.toBackupResource(resource); } return void 0; }); } public registerResourceForBackup(resource: URI): TPromise { return TPromise.as(void 0); } public deregisterResourceForBackup(resource: URI): TPromise { return TPromise.as(void 0); } public toBackupResource(resource: URI): URI { return null; } public backupResource(resource: URI, content: ITextSnapshot): TPromise { return TPromise.as(void 0); } public getWorkspaceFileBackups(): TPromise { return TPromise.as([]); } public parseBackupContent(textBufferFactory: ITextBufferFactory): string { const textBuffer = textBufferFactory.create(DefaultEndOfLine.LF); const lineCount = textBuffer.getLineCount(); const range = new Range(1, 1, lineCount, textBuffer.getLineLength(lineCount) + 1); return textBuffer.getValueInRange(range, EndOfLinePreference.TextDefined); } public resolveBackupContent(backup: URI): TPromise { return TPromise.as(null); } public discardResourceBackup(resource: URI): TPromise { return TPromise.as(void 0); } public discardAllWorkspaceBackups(): TPromise { return TPromise.as(void 0); } } export class TestWindowService implements IWindowService { public _serviceBrand: any; onDidChangeFocus: Event = new Emitter().event; isFocused(): TPromise { return TPromise.as(false); } getConfiguration(): IWindowConfiguration { return Object.create(null); } getCurrentWindowId(): number { return 0; } pickFileFolderAndOpen(options: INativeOpenDialogOptions): TPromise { return TPromise.as(void 0); } pickFileAndOpen(options: INativeOpenDialogOptions): TPromise { return TPromise.as(void 0); } pickFolderAndOpen(options: INativeOpenDialogOptions): TPromise { return TPromise.as(void 0); } pickWorkspaceAndOpen(options: INativeOpenDialogOptions): TPromise { return TPromise.as(void 0); } reloadWindow(): TPromise { return TPromise.as(void 0); } openDevTools(): TPromise { return TPromise.as(void 0); } toggleDevTools(): TPromise { return TPromise.as(void 0); } closeWorkspace(): TPromise { return TPromise.as(void 0); } createAndEnterWorkspace(folders?: IWorkspaceFolderCreationData[], path?: string): TPromise { return TPromise.as(void 0); } saveAndEnterWorkspace(path: string): TPromise { return TPromise.as(void 0); } toggleFullScreen(): TPromise { return TPromise.as(void 0); } setRepresentedFilename(fileName: string): TPromise { return TPromise.as(void 0); } getRecentlyOpened(): TPromise { return TPromise.as(void 0); } focusWindow(): TPromise { return TPromise.as(void 0); } closeWindow(): TPromise { return TPromise.as(void 0); } setDocumentEdited(flag: boolean): TPromise { return TPromise.as(void 0); } onWindowTitleDoubleClick(): TPromise { return TPromise.as(void 0); } show(): TPromise { return TPromise.as(void 0); } showMessageBox(options: Electron.MessageBoxOptions): TPromise { return TPromise.wrap({ button: 0 }); } showSaveDialog(options: Electron.SaveDialogOptions): TPromise { return TPromise.wrap(void 0); } showOpenDialog(options: Electron.OpenDialogOptions): TPromise { return TPromise.wrap(void 0); } updateTouchBar(items: ICommandAction[][]): Promise { return TPromise.as(void 0); } } export class TestLifecycleService implements ILifecycleService { public _serviceBrand: any; public phase: LifecyclePhase; public startupKind: StartupKind; private _onWillShutdown = new Emitter(); private _onShutdown = new Emitter(); when(): Thenable { return TPromise.as(void 0); } public fireShutdown(reason = ShutdownReason.QUIT): void { this._onShutdown.fire(reason); } public fireWillShutdown(event: ShutdownEvent): void { this._onWillShutdown.fire(event); } public get onWillShutdown(): Event { return this._onWillShutdown.event; } public get onShutdown(): Event { return this._onShutdown.event; } } export class TestWindowsService implements IWindowsService { _serviceBrand: any; public windowCount = 1; onWindowOpen: Event; onWindowFocus: Event; onWindowBlur: Event; isFocused(windowId: number): TPromise { return TPromise.as(false); } pickFileFolderAndOpen(options: INativeOpenDialogOptions): TPromise { return TPromise.as(void 0); } pickFileAndOpen(options: INativeOpenDialogOptions): TPromise { return TPromise.as(void 0); } pickFolderAndOpen(options: INativeOpenDialogOptions): TPromise { return TPromise.as(void 0); } pickWorkspaceAndOpen(options: INativeOpenDialogOptions): TPromise { return TPromise.as(void 0); } reloadWindow(windowId: number): TPromise { return TPromise.as(void 0); } openDevTools(windowId: number): TPromise { return TPromise.as(void 0); } toggleDevTools(windowId: number): TPromise { return TPromise.as(void 0); } closeWorkspace(windowId: number): TPromise { return TPromise.as(void 0); } createAndEnterWorkspace(windowId: number, folders?: IWorkspaceFolderCreationData[], path?: string): TPromise { return TPromise.as(void 0); } saveAndEnterWorkspace(windowId: number, path: string): TPromise { return TPromise.as(void 0); } toggleFullScreen(windowId: number): TPromise { return TPromise.as(void 0); } setRepresentedFilename(windowId: number, fileName: string): TPromise { return TPromise.as(void 0); } addRecentlyOpened(files: string[]): TPromise { return TPromise.as(void 0); } removeFromRecentlyOpened(paths: string[]): TPromise { return TPromise.as(void 0); } clearRecentlyOpened(): TPromise { return TPromise.as(void 0); } getRecentlyOpened(windowId: number): TPromise { return TPromise.as(void 0); } focusWindow(windowId: number): TPromise { return TPromise.as(void 0); } closeWindow(windowId: number): TPromise { return TPromise.as(void 0); } isMaximized(windowId: number): TPromise { return TPromise.as(void 0); } maximizeWindow(windowId: number): TPromise { return TPromise.as(void 0); } unmaximizeWindow(windowId: number): TPromise { return TPromise.as(void 0); } onWindowTitleDoubleClick(windowId: number): TPromise { return TPromise.as(void 0); } setDocumentEdited(windowId: number, flag: boolean): TPromise { return TPromise.as(void 0); } quit(): TPromise { return TPromise.as(void 0); } relaunch(options: { addArgs?: string[], removeArgs?: string[] }): TPromise { return TPromise.as(void 0); } whenSharedProcessReady(): TPromise { return TPromise.as(void 0); } toggleSharedProcess(): TPromise { return TPromise.as(void 0); } // Global methods openWindow(paths: string[], options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean, forceOpenWorkspaceAsFile?: boolean }): TPromise { return TPromise.as(void 0); } openNewWindow(): TPromise { return TPromise.as(void 0); } showWindow(windowId: number): TPromise { return TPromise.as(void 0); } getWindows(): TPromise<{ id: number; workspace?: IWorkspaceIdentifier; folderPath?: string; title: string; filename?: string; }[]> { return TPromise.as(void 0); } getWindowCount(): TPromise { return TPromise.as(this.windowCount); } log(severity: string, ...messages: string[]): TPromise { return TPromise.as(void 0); } showItemInFolder(path: string): TPromise { return TPromise.as(void 0); } showPreviousWindowTab(): Promise { return TPromise.as(void 0); } showNextWindowTab(): Promise { return TPromise.as(void 0); } moveWindowTabToNewWindow(): Promise { return TPromise.as(void 0); } mergeAllWindowTabs(): Promise { return TPromise.as(void 0); } toggleWindowTabsBar(): Promise { return TPromise.as(void 0); } updateTouchBar(windowId: number, items: ICommandAction[][]): Promise { return TPromise.as(void 0); } // This needs to be handled from browser process to prevent // foreground ordering issues on Windows openExternal(url: string): TPromise { return TPromise.as(true); } // TODO: this is a bit backwards startCrashReporter(config: Electron.CrashReporterStartOptions): TPromise { return TPromise.as(void 0); } showMessageBox(windowId: number, options: Electron.MessageBoxOptions): TPromise { return TPromise.as(void 0); } showSaveDialog(windowId: number, options: Electron.SaveDialogOptions): TPromise { return TPromise.as(void 0); } showOpenDialog(windowId: number, options: Electron.OpenDialogOptions): TPromise { return TPromise.as(void 0); } openAboutDialog(): TPromise { return TPromise.as(void 0); } } export class TestTextResourceConfigurationService implements ITextResourceConfigurationService { _serviceBrand: any; constructor(private configurationService = new TestConfigurationService()) { } public onDidChangeConfiguration() { return { dispose() { } }; } getValue(resource: URI, arg2?: any, arg3?: any): T { const position: IPosition = EditorPosition.isIPosition(arg2) ? arg2 : null; const section: string = position ? (typeof arg3 === 'string' ? arg3 : void 0) : (typeof arg2 === 'string' ? arg2 : void 0); return this.configurationService.getValue(section, { resource }); } } export class TestHashService implements IHashService { _serviceBrand: any; createSHA1(content: string): string { return content; } } export function getRandomTestPath(tmpdir: string, ...segments: string[]): string { return paths.join(tmpdir, ...segments, generateUuid()); }