workbenchTestServices.ts 45.2 KB
Newer Older
E
Erich Gamma 已提交
1 2 3 4 5 6 7
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

'use strict';

8
import 'vs/workbench/parts/files/electron-browser/files.contribution'; // load our contribution into the test
S
Sandeep Somavarapu 已提交
9
import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput';
J
Johannes Rieken 已提交
10
import { Promise, TPromise } from 'vs/base/common/winjs.base';
11
import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock';
12
import * as paths from 'vs/base/common/paths';
E
Erich Gamma 已提交
13
import URI from 'vs/base/common/uri';
14 15
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils';
16
import { StorageService, InMemoryLocalStorage } from 'vs/platform/storage/common/storageService';
17
import { IEditorGroup, ConfirmResult, IEditorOpeningEvent, IEditorInputWithOptions, CloseDirection, IEditorIdentifier } from 'vs/workbench/common/editor';
M
Matt Bierner 已提交
18
import { Event, Emitter } from 'vs/base/common/event';
E
Erich Gamma 已提交
19
import Severity from 'vs/base/common/severity';
20
import { IBackupFileService } from 'vs/workbench/services/backup/common/backup';
21
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
J
Johannes Rieken 已提交
22
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
23
import { IPartService, Parts, Position as PartPosition, IDimension } from 'vs/workbench/services/part/common/partService';
24
import { TextModelResolverService } from 'vs/workbench/services/textmodelResolver/common/textModelResolverService';
25
import { ITextModelService } from 'vs/editor/common/services/resolverService';
26
import { IEditorInput, IEditorOptions, Position, IEditor, IResourceInput, IUntitledResourceInput, IResourceDiffInput, IResourceSideBySideInput } from 'vs/platform/editor/common/editor';
J
Johannes Rieken 已提交
27
import { IUntitledEditorService, UntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService';
S
Sandeep Somavarapu 已提交
28
import { IWorkspaceContextService, IWorkspace as IWorkbenchWorkspace, WorkbenchState, IWorkspaceFolder, IWorkspaceFoldersChangeEvent } from 'vs/platform/workspace/common/workspace';
29
import { ILifecycleService, ShutdownEvent, ShutdownReason, StartupKind, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle';
J
Johannes Rieken 已提交
30
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
31
import { IEditorGroupService, GroupArrangement, GroupOrientation, IEditorTabOptions, IMoveOptions } from 'vs/workbench/services/group/common/groupService';
32
import { TextFileService } from 'vs/workbench/services/textfile/common/textFileService';
33
import { FileOperationEvent, IFileService, IResolveContentOptions, FileOperationError, IFileStat, IResolveFileResult, FileChangesEvent, IResolveFileOptions, IContent, IUpdateContentOptions, IStreamContent, ICreateFileOptions, ITextSnapshot, IResourceEncodings } from 'vs/platform/files/common/files';
34
import { IModelService } from 'vs/editor/common/services/modelService';
35
import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl';
J
Johannes Rieken 已提交
36 37 38 39 40
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';
B
Benjamin Pasero 已提交
41
import { IWorkbenchEditorService, ICloseEditorsFilter, NoOpEditorStacksModel } from 'vs/workbench/services/editor/common/editorService';
J
Johannes Rieken 已提交
42
import { IHistoryService } from 'vs/workbench/services/history/common/history';
43
import { IInstantiationService, ServicesAccessor, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation';
44
import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService';
45
import { IWindowsService, IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, IWindowConfiguration } from 'vs/platform/windows/common/windows';
S
Sandeep Somavarapu 已提交
46
import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace';
47
import { createTextBufferFactory } from 'vs/editor/common/model/textModel';
B
Benjamin Pasero 已提交
48
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
49
import { IThemeService } from 'vs/platform/theme/common/themeService';
50
import { isLinux } from 'vs/base/common/platform';
B
Benjamin Pasero 已提交
51 52
import { generateUuid } from 'vs/base/common/uuid';
import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService';
53
import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, IWorkspaceFolderCreationData } from 'vs/platform/workspaces/common/workspaces';
B
Benjamin Pasero 已提交
54
import { IRecentlyOpened } from 'vs/platform/history/common/history';
55
import { ITextResourceConfigurationService } from 'vs/editor/common/services/resourceConfiguration';
56
import { IPosition, Position as EditorPosition } from 'vs/editor/common/core/position';
B
Benjamin Pasero 已提交
57
import { ICommandAction, IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions';
R
Ramya Achutha Rao 已提交
58
import { IHashService } from 'vs/workbench/services/hash/common/hashService';
I
isidor 已提交
59
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
B
Benjamin Pasero 已提交
60
import { MockContextKeyService, MockKeybindingService } from 'vs/platform/keybinding/test/common/mockKeybindingService';
61 62
import { ITextBufferFactory, DefaultEndOfLine, EndOfLinePreference } from 'vs/editor/common/model';
import { Range } from 'vs/editor/common/core/range';
63
import { IConfirmation, IConfirmationResult, IDialogService, IDialogOptions } from 'vs/platform/dialogs/common/dialogs';
64 65
import { INotificationService } from 'vs/platform/notification/common/notification';
import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService';
B
Benjamin Pasero 已提交
66 67 68 69 70
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';
71
import { INextEditorGroupsService, INextEditorGroup, GroupsOrder, GroupsArrangement, GroupDirection, IAddGroupOptions, IMergeGroupOptions, IMoveEditorOptions, ICopyEditorOptions, IEditorReplacement } from 'vs/workbench/services/group/common/nextEditorGroupsService';
72
import { INextEditorService } from 'vs/workbench/services/editor/common/nextEditorService';
B
Benjamin Pasero 已提交
73

S
Sandeep Somavarapu 已提交
74 75 76 77
export function createFileInput(instantiationService: IInstantiationService, resource: URI): FileEditorInput {
	return instantiationService.createInstance(FileEditorInput, resource, void 0);
}

78
export const TestEnvironmentService = new EnvironmentService(parseArgs(process.argv), process.execPath);
79

80
export class TestContextService implements IWorkspaceContextService {
81
	public _serviceBrand: any;
E
Erich Gamma 已提交
82

83
	private workspace: IWorkbenchWorkspace;
E
Erich Gamma 已提交
84 85
	private options: any;

M
Matt Bierner 已提交
86 87 88
	private readonly _onDidChangeWorkspaceName: Emitter<void>;
	private readonly _onDidChangeWorkspaceFolders: Emitter<IWorkspaceFoldersChangeEvent>;
	private readonly _onDidChangeWorkbenchState: Emitter<WorkbenchState>;
89

90
	constructor(workspace: any = TestWorkspace, options: any = null) {
E
Erich Gamma 已提交
91
		this.workspace = workspace;
92
		this.options = options || Object.create(null);
93
		this._onDidChangeWorkspaceFolders = new Emitter<IWorkspaceFoldersChangeEvent>();
S
Sandeep Somavarapu 已提交
94
		this._onDidChangeWorkbenchState = new Emitter<WorkbenchState>();
95 96
	}

S
Sandeep Somavarapu 已提交
97 98 99 100
	public get onDidChangeWorkspaceName(): Event<void> {
		return this._onDidChangeWorkspaceName.event;
	}

101
	public get onDidChangeWorkspaceFolders(): Event<IWorkspaceFoldersChangeEvent> {
S
Sandeep Somavarapu 已提交
102
		return this._onDidChangeWorkspaceFolders.event;
103 104
	}

105 106 107 108
	public get onDidChangeWorkbenchState(): Event<WorkbenchState> {
		return this._onDidChangeWorkbenchState.event;
	}

S
Sandeep Somavarapu 已提交
109
	public getFolders(): IWorkspaceFolder[] {
S
Sandeep Somavarapu 已提交
110
		return this.workspace ? this.workspace.folders : [];
E
Erich Gamma 已提交
111 112
	}

113
	public getWorkbenchState(): WorkbenchState {
B
Benjamin Pasero 已提交
114 115 116 117 118
		if (this.workspace.configuration) {
			return WorkbenchState.WORKSPACE;
		}

		if (this.workspace.folders.length) {
119
			return WorkbenchState.FOLDER;
120
		}
B
Benjamin Pasero 已提交
121

122
		return WorkbenchState.EMPTY;
S
Sandeep Somavarapu 已提交
123 124
	}

125
	public getWorkspace(): IWorkbenchWorkspace {
B
Benjamin Pasero 已提交
126
		return this.workspace;
127 128
	}

S
Sandeep Somavarapu 已提交
129
	public getWorkspaceFolder(resource: URI): IWorkspaceFolder {
S
Sandeep Somavarapu 已提交
130
		return this.isInsideWorkspace(resource) ? this.workspace.folders[0] : null;
131 132
	}

D
Daniel Imms 已提交
133 134 135 136
	public setWorkspace(workspace: any): void {
		this.workspace = workspace;
	}

E
Erich Gamma 已提交
137 138 139 140 141 142 143 144 145 146
	public getOptions() {
		return this.options;
	}

	public updateOptions() {

	}

	public isInsideWorkspace(resource: URI): boolean {
		if (resource && this.workspace) {
147
			return paths.isEqualOrParent(resource.fsPath, this.workspace.folders[0].uri.fsPath, !isLinux /* ignorecase */);
E
Erich Gamma 已提交
148 149 150 151 152 153
		}

		return false;
	}

	public toResource(workspaceRelativePath: string): URI {
154
		return URI.file(paths.join('C:\\', workspaceRelativePath));
E
Erich Gamma 已提交
155
	}
156 157

	public isCurrentWorkspace(workspaceIdentifier: ISingleFolderWorkspaceIdentifier | IWorkspaceIdentifier): boolean {
158
		return isSingleFolderWorkspaceIdentifier(workspaceIdentifier) && this.pathEquals(this.workspace.folders[0].uri.fsPath, workspaceIdentifier);
159 160 161 162 163 164 165 166 167 168
	}

	private pathEquals(path1: string, path2: string): boolean {
		if (!isLinux) {
			path1 = path1.toLowerCase();
			path2 = path2.toLowerCase();
		}

		return path1 === path2;
	}
E
Erich Gamma 已提交
169 170
}

171
export class TestTextFileService extends TextFileService {
172 173
	public cleanupBackupsBeforeShutdownCalled: boolean;

174 175
	private promptPath: string;
	private confirmResult: ConfirmResult;
176
	private resolveTextContentError: FileOperationError;
A
Alex Dima 已提交
177 178

	constructor(
179 180
		@ILifecycleService lifecycleService: ILifecycleService,
		@IWorkspaceContextService contextService: IWorkspaceContextService,
A
Alex Dima 已提交
181
		@IConfigurationService configurationService: IConfigurationService,
182
		@IWorkbenchEditorService editorService: IWorkbenchEditorService,
A
Alex Dima 已提交
183
		@IFileService fileService: IFileService,
184
		@IUntitledEditorService untitledEditorService: IUntitledEditorService,
185
		@IInstantiationService instantiationService: IInstantiationService,
186
		@INotificationService notificationService: INotificationService,
187
		@IBackupFileService backupFileService: IBackupFileService,
188
		@IWindowsService windowsService: IWindowsService,
I
isidor 已提交
189
		@IHistoryService historyService: IHistoryService,
B
Benjamin Pasero 已提交
190 191
		@IContextKeyService contextKeyService: IContextKeyService,
		@IModelService modelService: IModelService
A
Alex Dima 已提交
192
	) {
193
		super(lifecycleService, contextService, configurationService, fileService, untitledEditorService, instantiationService, notificationService, TestEnvironmentService, backupFileService, windowsService, historyService, contextKeyService, modelService);
A
Alex Dima 已提交
194
	}
195

196 197 198 199 200 201 202 203
	public setPromptPath(path: string): void {
		this.promptPath = path;
	}

	public setConfirmResult(result: ConfirmResult): void {
		this.confirmResult = result;
	}

204
	public setResolveTextContentErrorOnce(error: FileOperationError): void {
205 206 207
		this.resolveTextContentError = error;
	}

208
	public resolveTextContent(resource: URI, options?: IResolveContentOptions): TPromise<IRawTextContent> {
209 210 211 212
		if (this.resolveTextContentError) {
			const error = this.resolveTextContentError;
			this.resolveTextContentError = null;

213
			return TPromise.wrapError<IRawTextContent>(error);
214 215
		}

216 217
		return this.fileService.resolveContent(resource, options).then((content): IRawTextContent => {
			return {
218
				resource: content.resource,
219 220 221 222
				name: content.name,
				mtime: content.mtime,
				etag: content.etag,
				encoding: content.encoding,
223
				value: createTextBufferFactory(content.value)
224 225 226
			};
		});
	}
227

228 229
	public promptForPath(defaultPath: string): TPromise<string> {
		return TPromise.wrap(this.promptPath);
230 231
	}

232 233
	public confirmSave(resources?: URI[]): TPromise<ConfirmResult> {
		return TPromise.wrap(this.confirmResult);
234
	}
D
Daniel Imms 已提交
235

236 237
	public onFilesConfigurationChange(configuration: any): void {
		super.onFilesConfigurationChange(configuration);
238 239 240 241 242 243
	}

	protected cleanupBackupsBeforeShutdown(): TPromise<void> {
		this.cleanupBackupsBeforeShutdownCalled = true;
		return TPromise.as(void 0);
	}
A
Alex Dima 已提交
244 245
}

246
export function workbenchInstantiationService(): IInstantiationService {
247
	let instantiationService = new TestInstantiationService(new ServiceCollection([ILifecycleService, new TestLifecycleService()]));
I
isidor 已提交
248
	instantiationService.stub(IContextKeyService, <IContextKeyService>instantiationService.createInstance(MockContextKeyService));
249
	instantiationService.stub(IWorkspaceContextService, new TestContextService(TestWorkspace));
250 251 252
	const configService = new TestConfigurationService();
	instantiationService.stub(IConfigurationService, configService);
	instantiationService.stub(ITextResourceConfigurationService, new TestTextResourceConfigurationService(configService));
253 254
	instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService));
	instantiationService.stub(IStorageService, new TestStorageService());
255
	instantiationService.stub(IWorkbenchEditorService, new TestEditorService());
256 257
	instantiationService.stub(IPartService, new TestPartService());
	instantiationService.stub(IEditorGroupService, new TestEditorGroupService());
258
	instantiationService.stub(IModeService, ModeServiceImpl);
B
Benjamin Pasero 已提交
259
	instantiationService.stub(IHistoryService, new TestHistoryService());
S
Sandeep Somavarapu 已提交
260
	instantiationService.stub(IModelService, instantiationService.createInstance(ModelServiceImpl));
261
	instantiationService.stub(IFileService, new TestFileService());
262
	instantiationService.stub(IBackupFileService, new TestBackupFileService());
263
	instantiationService.stub(ITelemetryService, NullTelemetryService);
264
	instantiationService.stub(INotificationService, new TestNotificationService());
B
Benjamin Pasero 已提交
265
	instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService));
266
	instantiationService.stub(IWindowService, new TestWindowService());
B
Benjamin Pasero 已提交
267 268 269 270
	instantiationService.stub(IMenuService, new TestMenuService());
	instantiationService.stub(IKeybindingService, new MockKeybindingService());
	instantiationService.stub(IDecorationsService, new TestDecorationsService());
	instantiationService.stub(IExtensionService, new TestExtensionService());
271
	instantiationService.stub(IWindowsService, new TestWindowsService());
272
	instantiationService.stub(ITextFileService, <ITextFileService>instantiationService.createInstance(TestTextFileService));
273
	instantiationService.stub(ITextModelService, <ITextModelService>instantiationService.createInstance(TextModelResolverService));
B
Benjamin Pasero 已提交
274
	instantiationService.stub(IEnvironmentService, TestEnvironmentService);
B
Benjamin Pasero 已提交
275
	instantiationService.stub(IThemeService, new TestThemeService());
R
Ramya Achutha Rao 已提交
276
	instantiationService.stub(IHashService, new TestHashService());
277
	instantiationService.stub(INextEditorGroupsService, new TestNextEditorGroupsService([new TestNextEditorGroup(0)]));
278
	instantiationService.stub(INextEditorService, new TestNextEditorService());
279 280 281 282

	return instantiationService;
}

B
Benjamin Pasero 已提交
283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318
export class TestDecorationsService implements IDecorationsService {
	_serviceBrand: any;
	onDidChangeDecorations: Event<IResourceDecorationChangeEvent> = 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<void> = Event.None;
	onDidChangeExtensionsStatus: Event<string[]> = Event.None;
	activateByEvent(activationEvent: string): Promise<void> { return TPromise.as(void 0); }
	whenInstalledExtensionsRegistered(): Promise<boolean> { return TPromise.as(true); }
	getExtensions(): Promise<IExtensionDescription[]> { return TPromise.as([]); }
	readExtensionPointContributions<T>(extPoint: IExtensionPoint<T>): Promise<ExtensionPointContribution<T>[]> { return TPromise.as(Object.create(null)); }
	getExtensionsStatus(): { [id: string]: IExtensionsStatus; } { return Object.create(null); }
	canProfileExtensionHost(): boolean { return false; }
	startExtensionHostProfile(): Promise<ProfileSession> { 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: () => []
		};
	}
}

B
Benjamin Pasero 已提交
319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334
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 {
	}

335 336 337
	public last(): void {
	}

B
Benjamin Pasero 已提交
338 339 340 341 342 343 344 345 346 347
	public remove(input: IEditorInput | IResourceInput): void {
	}

	public clear(): void {
	}

	public getHistory(): (IEditorInput | IResourceInput)[] {
		return [];
	}

348
	public getLastActiveWorkspaceRoot(schemeFilter?: string): URI {
B
Benjamin Pasero 已提交
349 350
		return this.root;
	}
351 352 353 354

	public getLastActiveFile(): URI {
		return void 0;
	}
B
Benjamin Pasero 已提交
355 356
}

357
export class TestDialogService implements IDialogService {
358 359

	public _serviceBrand: any;
E
Erich Gamma 已提交
360

361
	public confirm(confirmation: IConfirmation): Promise<IConfirmationResult> {
362 363
		return TPromise.as({ confirmed: false });
	}
364

365
	public show(severity: Severity, message: string, buttons: string[], options?: IDialogOptions): Promise<number, any> {
366 367
		return TPromise.as(0);
	}
E
Erich Gamma 已提交
368 369
}

370
export class TestPartService implements IPartService {
B
Benjamin Pasero 已提交
371

372
	public _serviceBrand: any;
E
Erich Gamma 已提交
373

374
	private _onTitleBarVisibilityChange = new Emitter<void>();
375
	private _onEditorLayout = new Emitter<IDimension>();
376 377 378 379 380

	public get onTitleBarVisibilityChange(): Event<void> {
		return this._onTitleBarVisibilityChange.event;
	}

381
	public get onEditorLayout(): Event<IDimension> {
382 383 384
		return this._onEditorLayout.event;
	}

E
Erich Gamma 已提交
385 386 387 388 389 390
	public layout(): void { }

	public isCreated(): boolean {
		return true;
	}

M
Matt Bierner 已提交
391
	public hasFocus(part: Parts): boolean {
E
Erich Gamma 已提交
392 393 394
		return false;
	}

M
Matt Bierner 已提交
395
	public isVisible(part: Parts): boolean {
E
Erich Gamma 已提交
396 397 398
		return true;
	}

M
Matt Bierner 已提交
399
	public getContainer(part: Parts): HTMLElement {
400 401 402
		return null;
	}

B
Benjamin Pasero 已提交
403 404 405 406
	public isTitleBarHidden(): boolean {
		return false;
	}

407 408 409 410
	public getTitleBarOffset(): number {
		return 0;
	}

411 412 413 414
	public isStatusBarHidden(): boolean {
		return false;
	}

S
Sanders Lauture 已提交
415 416 417 418 419 420
	public isActivityBarHidden(): boolean {
		return false;
	}

	public setActivityBarHidden(hidden: boolean): void { }

E
Erich Gamma 已提交
421 422 423 424
	public isSideBarHidden(): boolean {
		return false;
	}

425
	public setSideBarHidden(hidden: boolean): TPromise<void> { return TPromise.as(null); }
E
Erich Gamma 已提交
426

I
isidor 已提交
427
	public isPanelHidden(): boolean {
I
isidor 已提交
428 429 430
		return false;
	}

431
	public setPanelHidden(hidden: boolean): TPromise<void> { return TPromise.as(null); }
I
isidor 已提交
432

I
isidor 已提交
433 434
	public toggleMaximizedPanel(): void { }

B
Benjamin Pasero 已提交
435 436 437 438
	public isPanelMaximized(): boolean {
		return false;
	}

E
Erich Gamma 已提交
439 440 441 442
	public getSideBarPosition() {
		return 0;
	}

I
isidor 已提交
443 444 445 446
	public getPanelPosition() {
		return 0;
	}

I
isidor 已提交
447 448 449 450
	public setPanelPosition(position: PartPosition): TPromise<void> {
		return TPromise.as(null);
	}

E
Erich Gamma 已提交
451 452
	public addClass(clazz: string): void { }
	public removeClass(clazz: string): void { }
453
	public getWorkbenchElementId(): string { return ''; }
B
Benjamin Pasero 已提交
454

I
isidor 已提交
455
	public toggleZenMode(): void { }
456

B
Benjamin Pasero 已提交
457
	public isEditorLayoutCentered(): boolean { return false; }
458
	public centerEditorLayout(active: boolean): void { }
S
SrTobi 已提交
459 460


461
	public resizePart(part: Parts, sizeChange: number): void { }
E
Erich Gamma 已提交
462 463
}

464
export class TestStorageService implements IStorageService {
465
	public _serviceBrand: any;
E
Erich Gamma 已提交
466

B
Benjamin Pasero 已提交
467
	private storage: StorageService;
E
Erich Gamma 已提交
468 469 470

	constructor() {
		let context = new TestContextService();
471
		this.storage = new StorageService(new InMemoryLocalStorage(), null, context.getWorkspace().id);
E
Erich Gamma 已提交
472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494
	}

	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);
	}
}

495
export class TestEditorGroupService implements IEditorGroupService {
496
	public _serviceBrand: any;
497

B
Benjamin Pasero 已提交
498
	private stacksModel;
499

M
Matt Bierner 已提交
500 501 502 503 504 505
	private readonly _onEditorsChanged: Emitter<void>;
	private readonly _onEditorOpening: Emitter<IEditorOpeningEvent>;
	private readonly _onEditorOpenFail: Emitter<IEditorInput>;
	private readonly _onEditorsMoved: Emitter<void>;
	private readonly _onGroupOrientationChanged: Emitter<void>;
	private readonly _onTabOptionsChanged: Emitter<IEditorTabOptions>;
506 507

	constructor(callback?: (method: string) => void) {
508
		this._onEditorsMoved = new Emitter<void>();
509
		this._onEditorsChanged = new Emitter<void>();
510
		this._onEditorOpening = new Emitter<IEditorOpeningEvent>();
511
		this._onGroupOrientationChanged = new Emitter<void>();
512
		this._onEditorOpenFail = new Emitter<IEditorInput>();
513
		this._onTabOptionsChanged = new Emitter<IEditorTabOptions>();
514

515 516 517
		let services = new ServiceCollection();

		services.set(IStorageService, new TestStorageService());
518
		services.set(IConfigurationService, new TestConfigurationService());
519
		services.set(IWorkspaceContextService, new TestContextService());
520 521
		const lifecycle = new TestLifecycleService();
		services.set(ILifecycleService, lifecycle);
522
		services.set(ITelemetryService, NullTelemetryService);
523

B
Benjamin Pasero 已提交
524
		this.stacksModel = new NoOpEditorStacksModel();
525 526
	}

527 528 529 530 531 532 533 534
	public fireChange(): void {
		this._onEditorsChanged.fire();
	}

	public get onEditorsChanged(): Event<void> {
		return this._onEditorsChanged.event;
	}

535 536 537 538
	public get onEditorOpening(): Event<IEditorOpeningEvent> {
		return this._onEditorOpening.event;
	}

539 540 541 542
	public get onEditorOpenFail(): Event<IEditorInput> {
		return this._onEditorOpenFail.event;
	}

543
	public get onEditorGroupMoved(): Event<void> {
544 545 546
		return this._onEditorsMoved.event;
	}

547 548 549 550
	public get onGroupOrientationChanged(): Event<void> {
		return this._onGroupOrientationChanged.event;
	}

551
	public get onTabOptionsChanged(): Event<IEditorTabOptions> {
I
isidor 已提交
552
		return this._onTabOptionsChanged.event;
553 554
	}

555 556 557
	public focusGroup(group: IEditorGroup): void;
	public focusGroup(position: Position): void;
	public focusGroup(arg1: any): void {
558 559 560

	}

561 562 563
	public activateGroup(group: IEditorGroup): void;
	public activateGroup(position: Position): void;
	public activateGroup(arg1: any): void {
564 565 566

	}

567 568 569
	public moveGroup(from: IEditorGroup, to: IEditorGroup): void;
	public moveGroup(from: Position, to: Position): void;
	public moveGroup(arg1: any, arg2: any): void {
570 571 572 573 574 575 576

	}

	public arrangeGroups(arrangement: GroupArrangement): void {

	}

577 578 579 580 581 582 583 584
	public setGroupOrientation(orientation: GroupOrientation): void {

	}

	public getGroupOrientation(): GroupOrientation {
		return 'vertical';
	}

B
Benjamin Pasero 已提交
585 586
	public resizeGroup(position: Position, groupSizeChange: number): void {

587 588
	}

589 590 591
	public pinEditor(group: IEditorGroup, input: IEditorInput): void;
	public pinEditor(position: Position, input: IEditorInput): void;
	public pinEditor(arg1: any, input: IEditorInput): void {
592 593
	}

594 595 596
	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 {
597 598
	}

B
Benjamin Pasero 已提交
599
	public getStacksModel() {
600 601
		return this.stacksModel;
	}
602

603
	public getTabOptions(): IEditorTabOptions {
I
isidor 已提交
604
		return {};
605
	}
606 607 608 609

	public invokeWithinEditorContext<T>(fn: (accessor: ServicesAccessor) => T): T {
		return fn(null);
	}
610 611
}

612
export class TestEditorService implements IWorkbenchEditorService {
613
	public _serviceBrand: any;
E
Erich Gamma 已提交
614

B
Benjamin Pasero 已提交
615 616 617
	public activeEditorInput: IEditorInput;
	public activeEditorOptions: IEditorOptions;
	public activeEditorPosition: Position;
618
	public mockLineNumber: number;
Y
Yitong 已提交
619
	public mockSelectedText: string;
E
Erich Gamma 已提交
620 621 622 623 624

	private callback: (method: string) => void;

	constructor(callback?: (method: string) => void) {
		this.callback = callback || ((s: string) => { });
625
		this.mockLineNumber = 15;
Y
Yitong 已提交
626
		this.mockSelectedText = 'selected text';
B
Benjamin Pasero 已提交
627 628
	}

M
Matt Bierner 已提交
629
	public openEditors(inputs: any[]): Promise {
A
Alex Dima 已提交
630
		return TPromise.as([]);
E
Erich Gamma 已提交
631 632
	}

M
Matt Bierner 已提交
633
	public replaceEditors(editors: any[]): TPromise<IEditor[]> {
634 635 636
		return TPromise.as([]);
	}

B
Benjamin Pasero 已提交
637
	public closeEditors(positions?: Position[]): TPromise<void>;
638
	public closeEditors(position: Position, filter?: ICloseEditorsFilter): TPromise<void>;
639
	public closeEditors(position: Position, editors: IEditorInput[]): TPromise<void>;
640 641 642
	public closeEditors(editors: { positionOne?: ICloseEditorsFilter, positionTwo?: ICloseEditorsFilter, positionThree?: ICloseEditorsFilter }): TPromise<void>;
	public closeEditors(editors: { positionOne?: IEditorInput[], positionTwo?: IEditorInput[], positionThree?: IEditorInput[] }): TPromise<void>;
	public closeEditors(positionOrEditors: any, filterOrEditors?: any): TPromise<void> {
643 644 645
		return TPromise.as(null);
	}

E
Erich Gamma 已提交
646 647 648
	public getActiveEditor(): IEditor {
		this.callback('getActiveEditor');

649 650 651
		return {
			input: null,
			options: null,
652
			group: null,
653 654 655
			getId: () => { return null; },
			getControl: () => {
				return {
Y
Yitong 已提交
656 657
					getSelection: () => { return { positionLineNumber: this.mockLineNumber }; },
					getModel: () => { return { getValueInRange: () => this.mockSelectedText }; }
658 659 660 661 662
				};
			},
			focus: () => { },
			isVisible: () => { return true; }
		};
E
Erich Gamma 已提交
663 664 665 666 667
	}

	public getActiveEditorInput(): IEditorInput {
		this.callback('getActiveEditorInput');

B
Benjamin Pasero 已提交
668
		return this.activeEditorInput;
E
Erich Gamma 已提交
669 670 671 672 673 674 675 676 677 678 679 680 681 682 683
	}

	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;

A
Alex Dima 已提交
684
		return TPromise.as(null);
E
Erich Gamma 已提交
685 686
	}

687
	public closeEditor(position: Position, input: IEditorInput): TPromise<void> {
E
Erich Gamma 已提交
688 689 690 691 692
		this.callback('closeEditor');

		return TPromise.as(null);
	}

693 694
	public createInput(input: IResourceInput): IEditorInput {
		return null;
E
Erich Gamma 已提交
695 696 697
	}
}

698 699 700 701 702 703 704 705 706
export class TestNextEditorGroupsService implements INextEditorGroupsService {
	_serviceBrand: ServiceIdentifier<any>;

	constructor(public groups: TestNextEditorGroup[] = []) { }

	onDidActiveGroupChange: Event<INextEditorGroup> = Event.None;
	onDidAddGroup: Event<INextEditorGroup> = Event.None;
	onDidRemoveGroup: Event<INextEditorGroup> = Event.None;
	onDidMoveGroup: Event<INextEditorGroup> = Event.None;
707
	onDidGroupLabelChange: Event<INextEditorGroup> = Event.None;
708 709

	orientation: any;
710
	whenRestored: Thenable<void> = TPromise.as(void 0);
711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733

	get activeGroup(): INextEditorGroup {
		return this.groups[0];
	}

	get count(): number {
		return this.groups.length;
	}

	getGroups(order?: GroupsOrder): ReadonlyArray<INextEditorGroup> {
		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;
	}

734 735 736 737
	getLabel(identifier: number): string {
		return 'Group 1';
	}

738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825
	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<IEditorInput>;

	onWillDispose: Event<void> = Event.None;
	onDidActiveEditorChange: Event<void> = Event.None;
	onWillCloseEditor: Event<IEditorInput> = Event.None;
	onDidCloseEditor: Event<IEditorInput> = Event.None;
	onWillOpenEditor: Event<IEditorOpeningEvent> = Event.None;
	onDidOpenEditorFail: Event<IEditorInput> = Event.None;

	getEditor(index: number): IEditorInput {
		return null;
	}

	getIndexOfEditor(editor: IEditorInput): number {
		return -1;
	}

	openEditor(editor: IEditorInput, options?: IEditorOptions): Thenable<void> {
		return TPromise.as(void 0);
	}

	openEditors(editors: IEditorInputWithOptions[]): Thenable<void> {
		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<void> {
		return TPromise.as(void 0);
	}

B
Benjamin Pasero 已提交
826
	closeEditors(editors: IEditorInput[] | { except?: IEditorInput; direction?: CloseDirection; savedOnly?: boolean; }): Thenable<void> {
827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846
		return TPromise.as(void 0);
	}

	closeAllEditors(): Thenable<void> {
		return TPromise.as(void 0);
	}

	replaceEditors(editors: IEditorReplacement[]): Thenable<void> {
		return TPromise.as(void 0);
	}

	pinEditor(editor?: IEditorInput): void { }

	focus(): void { }

	invokeWithinContext<T>(fn: (accessor: ServicesAccessor) => T): T {
		return fn(null);
	}
}

847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889
export class TestNextEditorService implements INextEditorService {

	_serviceBrand: ServiceIdentifier<any>;

	onDidActiveEditorChange: Event<void> = Event.None;
	onDidVisibleEditorsChange: Event<void> = Event.None;
	onWillCloseEditor: Event<IEditorIdentifier> = Event.None;
	onDidCloseEditor: Event<IEditorIdentifier> = Event.None;
	onWillOpenEditor: Event<IEditorOpeningEvent> = Event.None;
	onDidOpenEditorFail: Event<IEditorIdentifier> = Event.None;

	activeControl: IEditor;
	activeTextEditorControl: any;
	activeEditor: IEditorInput;
	visibleControls: ReadonlyArray<IEditor>;
	visibleTextEditorControls = [];
	visibleEditors: ReadonlyArray<IEditorInput>;

	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<void> {
		return TPromise.as(null);
	}

	invokeWithinEditorContext<T>(fn: (accessor: ServicesAccessor) => T): T {
		return fn(null);
	}

	createInput(input: IResourceInput | IUntitledResourceInput | IResourceDiffInput | IResourceSideBySideInput): IEditorInput {
		return null;
	}
}

890 891 892 893
export class TestFileService implements IFileService {

	public _serviceBrand: any;

894 895
	public encoding: IResourceEncodings;

M
Matt Bierner 已提交
896 897
	private readonly _onFileChanges: Emitter<FileChangesEvent>;
	private readonly _onAfterOperation: Emitter<FileOperationEvent>;
898

899 900
	private content = 'Hello Html';

901 902 903 904 905
	constructor() {
		this._onFileChanges = new Emitter<FileChangesEvent>();
		this._onAfterOperation = new Emitter<FileOperationEvent>();
	}

906 907 908 909 910 911 912 913
	public setContent(content: string): void {
		this.content = content;
	}

	public getContent(): string {
		return this.content;
	}

914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930
	public get onFileChanges(): Event<FileChangesEvent> {
		return this._onFileChanges.event;
	}

	public fireFileChanges(event: FileChangesEvent): void {
		this._onFileChanges.fire(event);
	}

	public get onAfterOperation(): Event<FileOperationEvent> {
		return this._onAfterOperation.event;
	}

	public fireAfterOperation(event: FileOperationEvent): void {
		this._onAfterOperation.fire(event);
	}

	resolveFile(resource: URI, options?: IResolveFileOptions): TPromise<IFileStat> {
A
Alex Dima 已提交
931
		return TPromise.as({
932 933
			resource,
			etag: Date.now().toString(),
B
Benjamin Pasero 已提交
934
			encoding: 'utf8',
B
Benjamin Pasero 已提交
935
			mtime: Date.now(),
936
			isDirectory: false,
B
Benjamin Pasero 已提交
937 938
			name: paths.basename(resource.fsPath)
		});
939
	}
B
Benjamin Pasero 已提交
940

I
isidor 已提交
941 942
	resolveFiles(toResolve: { resource: URI, options?: IResolveFileOptions }[]): TPromise<IResolveFileResult[]> {
		return TPromise.join(toResolve.map(resourceAndOption => this.resolveFile(resourceAndOption.resource, resourceAndOption.options))).then(stats => stats.map(stat => ({ stat, success: true })));
I
isidor 已提交
943 944
	}

945 946 947
	existsFile(resource: URI): TPromise<boolean> {
		return TPromise.as(null);
	}
B
Benjamin Pasero 已提交
948

949
	resolveContent(resource: URI, options?: IResolveContentOptions): TPromise<IContent> {
B
Benjamin Pasero 已提交
950 951
		return TPromise.as({
			resource: resource,
952
			value: this.content,
953
			etag: 'index.txt',
B
Benjamin Pasero 已提交
954 955
			encoding: 'utf8',
			mtime: Date.now(),
956
			name: paths.basename(resource.fsPath)
E
Erich Gamma 已提交
957
		});
958
	}
E
Erich Gamma 已提交
959

960
	resolveStreamContent(resource: URI, options?: IResolveContentOptions): TPromise<IStreamContent> {
A
Alex Dima 已提交
961 962 963
		return TPromise.as({
			resource: resource,
			value: {
964
				on: (event: string, callback: Function): void => {
A
Alex Dima 已提交
965
					if (event === 'data') {
966
						callback(this.content);
A
Alex Dima 已提交
967 968 969 970 971 972 973 974
					}
					if (event === 'end') {
						callback();
					}
				}
			},
			etag: 'index.txt',
			encoding: 'utf8',
B
Benjamin Pasero 已提交
975
			mtime: Date.now(),
976
			name: paths.basename(resource.fsPath)
A
Alex Dima 已提交
977
		});
978 979
	}

980
	updateContent(resource: URI, value: string | ITextSnapshot, options?: IUpdateContentOptions): TPromise<IFileStat> {
981
		return TPromise.timeout(1).then(() => {
E
Erich Gamma 已提交
982
			return {
983
				resource,
E
Erich Gamma 已提交
984
				etag: 'index.txt',
B
Benjamin Pasero 已提交
985
				encoding: 'utf8',
B
Benjamin Pasero 已提交
986
				mtime: Date.now(),
987 988
				isDirectory: false,
				name: paths.basename(resource.fsPath)
E
Erich Gamma 已提交
989 990
			};
		});
991
	}
D
Daniel Imms 已提交
992

993 994 995
	moveFile(source: URI, target: URI, overwrite?: boolean): TPromise<IFileStat> {
		return TPromise.as(null);
	}
D
Daniel Imms 已提交
996

997 998 999
	copyFile(source: URI, target: URI, overwrite?: boolean): TPromise<IFileStat> {
		return TPromise.as(null);
	}
D
Daniel Imms 已提交
1000

1001
	createFile(resource: URI, content?: string, options?: ICreateFileOptions): TPromise<IFileStat> {
1002
		return TPromise.as(null);
E
Erich Gamma 已提交
1003
	}
1004 1005 1006 1007 1008 1009 1010 1011

	createFolder(resource: URI): TPromise<IFileStat> {
		return TPromise.as(null);
	}

	rename(resource: URI, newName: string): TPromise<IFileStat> {
		return TPromise.as(null);
	}
D
Daniel Imms 已提交
1012

1013 1014 1015 1016 1017 1018
	onDidChangeFileSystemProviderRegistrations = Event.None;

	registerProvider(scheme: string, provider) {
		return { dispose() { } };
	}

1019 1020 1021 1022
	canHandleResource(resource: URI): boolean {
		return resource.scheme === 'file';
	}

1023 1024 1025 1026 1027 1028 1029
	del(resource: URI, useTrash?: boolean): TPromise<void> {
		return TPromise.as(null);
	}

	watchFileChanges(resource: URI): void {
	}

J
Johannes Rieken 已提交
1030
	unwatchFileChanges(resource: URI): void {
1031 1032
	}

1033
	getWriteEncoding(resource: URI): string {
1034 1035
		return 'utf8';
	}
D
Daniel Imms 已提交
1036

1037
	dispose(): void {
E
Erich Gamma 已提交
1038
	}
1039
}
1040

1041 1042
export class TestBackupFileService implements IBackupFileService {
	public _serviceBrand: any;
1043

1044 1045
	public backupEnabled: boolean;

1046 1047 1048 1049
	public hasBackups(): TPromise<boolean> {
		return TPromise.as(false);
	}

1050
	public hasBackup(resource: URI): TPromise<boolean> {
1051 1052 1053
		return TPromise.as(false);
	}

B
Benjamin Pasero 已提交
1054 1055 1056
	public loadBackupResource(resource: URI): TPromise<URI> {
		return this.hasBackup(resource).then(hasBackup => {
			if (hasBackup) {
1057
				return this.toBackupResource(resource);
B
Benjamin Pasero 已提交
1058 1059 1060 1061 1062 1063
			}

			return void 0;
		});
	}

D
Daniel Imms 已提交
1064 1065 1066 1067 1068 1069 1070 1071
	public registerResourceForBackup(resource: URI): TPromise<void> {
		return TPromise.as(void 0);
	}

	public deregisterResourceForBackup(resource: URI): TPromise<void> {
		return TPromise.as(void 0);
	}

1072
	public toBackupResource(resource: URI): URI {
D
Daniel Imms 已提交
1073 1074
		return null;
	}
1075

1076
	public backupResource(resource: URI, content: ITextSnapshot): TPromise<void> {
1077 1078 1079
		return TPromise.as(void 0);
	}

1080
	public getWorkspaceFileBackups(): TPromise<URI[]> {
1081 1082 1083
		return TPromise.as([]);
	}

1084 1085 1086 1087 1088
	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);
1089 1090
	}

1091 1092 1093 1094
	public resolveBackupContent(backup: URI): TPromise<ITextBufferFactory> {
		return TPromise.as(null);
	}

1095
	public discardResourceBackup(resource: URI): TPromise<void> {
1096 1097 1098
		return TPromise.as(void 0);
	}

1099
	public discardAllWorkspaceBackups(): TPromise<void> {
1100 1101
		return TPromise.as(void 0);
	}
1102
}
D
Daniel Imms 已提交
1103

1104 1105 1106 1107
export class TestWindowService implements IWindowService {

	public _serviceBrand: any;

1108
	onDidChangeFocus: Event<boolean> = new Emitter<boolean>().event;
1109

1110 1111 1112 1113
	isFocused(): TPromise<boolean> {
		return TPromise.as(false);
	}

1114 1115 1116 1117
	getConfiguration(): IWindowConfiguration {
		return Object.create(null);
	}

1118 1119 1120 1121
	getCurrentWindowId(): number {
		return 0;
	}

B
Benjamin Pasero 已提交
1122
	pickFileFolderAndOpen(options: INativeOpenDialogOptions): TPromise<void> {
1123 1124 1125
		return TPromise.as(void 0);
	}

B
Benjamin Pasero 已提交
1126
	pickFileAndOpen(options: INativeOpenDialogOptions): TPromise<void> {
1127 1128 1129
		return TPromise.as(void 0);
	}

B
Benjamin Pasero 已提交
1130
	pickFolderAndOpen(options: INativeOpenDialogOptions): TPromise<void> {
1131 1132 1133
		return TPromise.as(void 0);
	}

1134 1135 1136 1137
	pickWorkspaceAndOpen(options: INativeOpenDialogOptions): TPromise<void> {
		return TPromise.as(void 0);
	}

1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149
	reloadWindow(): TPromise<void> {
		return TPromise.as(void 0);
	}

	openDevTools(): TPromise<void> {
		return TPromise.as(void 0);
	}

	toggleDevTools(): TPromise<void> {
		return TPromise.as(void 0);
	}

1150
	closeWorkspace(): TPromise<void> {
1151 1152 1153
		return TPromise.as(void 0);
	}

1154
	createAndEnterWorkspace(folders?: IWorkspaceFolderCreationData[], path?: string): TPromise<IEnterWorkspaceResult> {
1155 1156 1157
		return TPromise.as(void 0);
	}

1158
	saveAndEnterWorkspace(path: string): TPromise<IEnterWorkspaceResult> {
1159 1160 1161
		return TPromise.as(void 0);
	}

1162 1163 1164 1165 1166 1167 1168 1169
	toggleFullScreen(): TPromise<void> {
		return TPromise.as(void 0);
	}

	setRepresentedFilename(fileName: string): TPromise<void> {
		return TPromise.as(void 0);
	}

1170
	getRecentlyOpened(): TPromise<IRecentlyOpened> {
1171 1172 1173 1174 1175 1176 1177
		return TPromise.as(void 0);
	}

	focusWindow(): TPromise<void> {
		return TPromise.as(void 0);
	}

1178 1179 1180 1181
	closeWindow(): TPromise<void> {
		return TPromise.as(void 0);
	}

1182 1183 1184 1185
	setDocumentEdited(flag: boolean): TPromise<void> {
		return TPromise.as(void 0);
	}

1186 1187 1188
	onWindowTitleDoubleClick(): TPromise<void> {
		return TPromise.as(void 0);
	}
1189

J
Joao 已提交
1190 1191 1192 1193
	show(): TPromise<void> {
		return TPromise.as(void 0);
	}

1194 1195
	showMessageBox(options: Electron.MessageBoxOptions): TPromise<IMessageBoxResult> {
		return TPromise.wrap({ button: 0 });
1196 1197
	}

1198 1199
	showSaveDialog(options: Electron.SaveDialogOptions): TPromise<string> {
		return TPromise.wrap(void 0);
1200
	}
1201

1202 1203
	showOpenDialog(options: Electron.OpenDialogOptions): TPromise<string[]> {
		return TPromise.wrap(void 0);
1204
	}
1205 1206 1207 1208

	updateTouchBar(items: ICommandAction[][]): Promise<void> {
		return TPromise.as(void 0);
	}
1209 1210
}

1211 1212
export class TestLifecycleService implements ILifecycleService {

1213
	public _serviceBrand: any;
1214

1215
	public phase: LifecyclePhase;
1216
	public startupKind: StartupKind;
1217

1218
	private _onWillShutdown = new Emitter<ShutdownEvent>();
1219
	private _onShutdown = new Emitter<ShutdownReason>();
1220

1221
	when(): Thenable<void> {
1222
		return TPromise.as(void 0);
B
Benjamin Pasero 已提交
1223
	}
1224

1225 1226
	public fireShutdown(reason = ShutdownReason.QUIT): void {
		this._onShutdown.fire(reason);
1227 1228
	}

1229 1230 1231 1232
	public fireWillShutdown(event: ShutdownEvent): void {
		this._onWillShutdown.fire(event);
	}

1233 1234 1235 1236
	public get onWillShutdown(): Event<ShutdownEvent> {
		return this._onWillShutdown.event;
	}

1237
	public get onShutdown(): Event<ShutdownReason> {
1238 1239
		return this._onShutdown.event;
	}
1240 1241
}

1242 1243 1244 1245
export class TestWindowsService implements IWindowsService {

	_serviceBrand: any;

1246 1247
	public windowCount = 1;

1248 1249
	onWindowOpen: Event<number>;
	onWindowFocus: Event<number>;
1250
	onWindowBlur: Event<number>;
1251

1252 1253 1254 1255
	isFocused(windowId: number): TPromise<boolean> {
		return TPromise.as(false);
	}

B
Benjamin Pasero 已提交
1256
	pickFileFolderAndOpen(options: INativeOpenDialogOptions): TPromise<void> {
1257 1258
		return TPromise.as(void 0);
	}
1259

B
Benjamin Pasero 已提交
1260
	pickFileAndOpen(options: INativeOpenDialogOptions): TPromise<void> {
1261 1262
		return TPromise.as(void 0);
	}
1263

B
Benjamin Pasero 已提交
1264
	pickFolderAndOpen(options: INativeOpenDialogOptions): TPromise<void> {
1265 1266
		return TPromise.as(void 0);
	}
1267

1268 1269 1270 1271
	pickWorkspaceAndOpen(options: INativeOpenDialogOptions): TPromise<void> {
		return TPromise.as(void 0);
	}

1272 1273 1274
	reloadWindow(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
1275

1276 1277 1278
	openDevTools(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
1279

1280 1281 1282
	toggleDevTools(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
1283

1284
	closeWorkspace(windowId: number): TPromise<void> {
1285 1286
		return TPromise.as(void 0);
	}
1287

1288
	createAndEnterWorkspace(windowId: number, folders?: IWorkspaceFolderCreationData[], path?: string): TPromise<IEnterWorkspaceResult> {
1289 1290 1291
		return TPromise.as(void 0);
	}

1292
	saveAndEnterWorkspace(windowId: number, path: string): TPromise<IEnterWorkspaceResult> {
1293 1294 1295
		return TPromise.as(void 0);
	}

1296 1297 1298
	toggleFullScreen(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
1299

1300 1301 1302
	setRepresentedFilename(windowId: number, fileName: string): TPromise<void> {
		return TPromise.as(void 0);
	}
1303

1304
	addRecentlyOpened(files: string[]): TPromise<void> {
1305 1306
		return TPromise.as(void 0);
	}
1307

1308
	removeFromRecentlyOpened(paths: string[]): TPromise<void> {
1309 1310
		return TPromise.as(void 0);
	}
1311

B
Benjamin Pasero 已提交
1312
	clearRecentlyOpened(): TPromise<void> {
C
22768  
Cristian 已提交
1313 1314
		return TPromise.as(void 0);
	}
1315

1316
	getRecentlyOpened(windowId: number): TPromise<IRecentlyOpened> {
1317 1318
		return TPromise.as(void 0);
	}
1319

1320 1321 1322
	focusWindow(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
1323

1324 1325 1326 1327
	closeWindow(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}

1328 1329 1330
	isMaximized(windowId: number): TPromise<boolean> {
		return TPromise.as(void 0);
	}
1331

1332 1333 1334
	maximizeWindow(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
1335

1336 1337 1338
	unmaximizeWindow(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
1339

1340 1341 1342
	onWindowTitleDoubleClick(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
1343

1344 1345 1346
	setDocumentEdited(windowId: number, flag: boolean): TPromise<void> {
		return TPromise.as(void 0);
	}
1347

1348 1349 1350
	quit(): TPromise<void> {
		return TPromise.as(void 0);
	}
1351

J
Johannes Rieken 已提交
1352 1353 1354
	relaunch(options: { addArgs?: string[], removeArgs?: string[] }): TPromise<void> {
		return TPromise.as(void 0);
	}
1355

1356 1357 1358
	whenSharedProcessReady(): TPromise<void> {
		return TPromise.as(void 0);
	}
1359

1360 1361 1362
	toggleSharedProcess(): TPromise<void> {
		return TPromise.as(void 0);
	}
1363

1364
	// Global methods
1365
	openWindow(paths: string[], options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean, forceOpenWorkspaceAsFile?: boolean }): TPromise<void> {
1366 1367
		return TPromise.as(void 0);
	}
1368

1369 1370 1371
	openNewWindow(): TPromise<void> {
		return TPromise.as(void 0);
	}
1372

1373 1374 1375
	showWindow(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
1376

1377
	getWindows(): TPromise<{ id: number; workspace?: IWorkspaceIdentifier; folderPath?: string; title: string; filename?: string; }[]> {
1378 1379
		return TPromise.as(void 0);
	}
1380

1381
	getWindowCount(): TPromise<number> {
1382
		return TPromise.as(this.windowCount);
1383
	}
1384

1385 1386 1387
	log(severity: string, ...messages: string[]): TPromise<void> {
		return TPromise.as(void 0);
	}
1388

1389 1390 1391 1392
	showItemInFolder(path: string): TPromise<void> {
		return TPromise.as(void 0);
	}

1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410
	showPreviousWindowTab(): Promise<void> {
		return TPromise.as(void 0);
	}

	showNextWindowTab(): Promise<void> {
		return TPromise.as(void 0);
	}

	moveWindowTabToNewWindow(): Promise<void> {
		return TPromise.as(void 0);
	}

	mergeAllWindowTabs(): Promise<void> {
		return TPromise.as(void 0);
	}

	toggleWindowTabsBar(): Promise<void> {
		return TPromise.as(void 0);
1411 1412 1413 1414
	}

	updateTouchBar(windowId: number, items: ICommandAction[][]): Promise<void> {
		return TPromise.as(void 0);
1415 1416
	}

1417 1418
	// This needs to be handled from browser process to prevent
	// foreground ordering issues on Windows
1419 1420
	openExternal(url: string): TPromise<boolean> {
		return TPromise.as(true);
1421 1422 1423 1424 1425 1426
	}

	// TODO: this is a bit backwards
	startCrashReporter(config: Electron.CrashReporterStartOptions): TPromise<void> {
		return TPromise.as(void 0);
	}
1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438

	showMessageBox(windowId: number, options: Electron.MessageBoxOptions): TPromise<IMessageBoxResult> {
		return TPromise.as(void 0);
	}

	showSaveDialog(windowId: number, options: Electron.SaveDialogOptions): TPromise<string> {
		return TPromise.as(void 0);
	}

	showOpenDialog(windowId: number, options: Electron.OpenDialogOptions): TPromise<string[]> {
		return TPromise.as(void 0);
	}
J
Joao Moreno 已提交
1439 1440 1441 1442

	openAboutDialog(): TPromise<void> {
		return TPromise.as(void 0);
	}
1443
}
B
Benjamin Pasero 已提交
1444

1445 1446 1447 1448 1449 1450 1451
export class TestTextResourceConfigurationService implements ITextResourceConfigurationService {

	_serviceBrand: any;

	constructor(private configurationService = new TestConfigurationService()) {
	}

1452
	public onDidChangeConfiguration() {
1453 1454 1455
		return { dispose() { } };
	}

1456 1457 1458 1459
	getValue<T>(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 });
1460
	}
B
Benjamin Pasero 已提交
1461 1462
}

R
Ramya Achutha Rao 已提交
1463 1464 1465 1466 1467 1468 1469 1470
export class TestHashService implements IHashService {
	_serviceBrand: any;

	createSHA1(content: string): string {
		return content;
	}
}

B
Benjamin Pasero 已提交
1471 1472
export function getRandomTestPath(tmpdir: string, ...segments: string[]): string {
	return paths.join(tmpdir, ...segments, generateUuid());
1473
}