workbenchTestServices.ts 30.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';

B
Benjamin Pasero 已提交
8
import 'vs/workbench/parts/files/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';
J
Johannes Rieken 已提交
12
import { EventEmitter } from 'vs/base/common/eventEmitter';
13
import * as paths from 'vs/base/common/paths';
E
Erich Gamma 已提交
14
import URI from 'vs/base/common/uri';
15 16
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils';
17
import { StorageService, InMemoryLocalStorage } from 'vs/platform/storage/common/storageService';
18
import { IEditorGroup, ConfirmResult } from 'vs/workbench/common/editor';
J
Johannes Rieken 已提交
19
import Event, { Emitter } from 'vs/base/common/event';
E
Erich Gamma 已提交
20
import Severity from 'vs/base/common/severity';
21
import { IBackupFileService } from 'vs/workbench/services/backup/common/backup';
22
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
J
Johannes Rieken 已提交
23
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
24
import { IPartService, Parts } from 'vs/workbench/services/part/common/partService';
25
import { TextModelResolverService } from 'vs/workbench/services/textmodelResolver/common/textModelResolverService';
26
import { ITextModelService } from 'vs/editor/common/services/resolverService';
27
import { IEditorInput, IEditorOptions, Position, Direction, IEditor, IResourceInput } from 'vs/platform/editor/common/editor';
J
Johannes Rieken 已提交
28
import { IUntitledEditorService, UntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService';
T
t-amqi 已提交
29
import { IChoiceService, IMessageService, IConfirmation } from 'vs/platform/message/common/message';
30
import { ILegacyWorkspace, IWorkspaceContextService, IWorkspace } from 'vs/platform/workspace/common/workspace';
31
import { ILifecycleService, ShutdownEvent, ShutdownReason, StartupKind, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle';
J
Johannes Rieken 已提交
32 33 34
import { EditorStacksModel } from 'vs/workbench/common/editor/editorStacksModel';
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService';
35
import { IEditorGroupService, GroupArrangement, GroupOrientation, ITabOptions, IMoveOptions } from 'vs/workbench/services/group/common/groupService';
36
import { TextFileService } from 'vs/workbench/services/textfile/common/textFileService';
37
import { FileOperationEvent, IFileService, IResolveContentOptions, IFileOperationResult, IFileStat, IImportResult, FileChangesEvent, IResolveFileOptions, IContent, IUpdateContentOptions, IStreamContent } from 'vs/platform/files/common/files';
38
import { IModelService } from 'vs/editor/common/services/modelService';
39
import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl';
J
Johannes Rieken 已提交
40 41 42 43 44 45 46 47
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 } from 'vs/workbench/services/editor/common/editorService';
import { IHistoryService } from 'vs/workbench/services/history/common/history';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
48
import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService';
49
import { IWindowsService, IWindowService } from 'vs/platform/windows/common/windows';
S
Sandeep Somavarapu 已提交
50
import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace';
A
Alex Dima 已提交
51
import { RawTextSource, IRawTextSource } from 'vs/editor/common/model/textSource';
B
Benjamin Pasero 已提交
52
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
53
import { IThemeService } from 'vs/platform/theme/common/themeService';
54
import { isLinux } from 'vs/base/common/platform';
55
import { generateUuid } from "vs/base/common/uuid";
56
import { TestThemeService } from "vs/platform/theme/test/common/testThemeService";
B
Benjamin Pasero 已提交
57

S
Sandeep Somavarapu 已提交
58 59 60 61
export function createFileInput(instantiationService: IInstantiationService, resource: URI): FileEditorInput {
	return instantiationService.createInstance(FileEditorInput, resource, void 0);
}

62
export const TestEnvironmentService = new EnvironmentService(parseArgs(process.argv), process.execPath);
63

64
export class TestContextService implements IWorkspaceContextService {
65
	public _serviceBrand: any;
E
Erich Gamma 已提交
66

B
Benjamin Pasero 已提交
67
	private workspace: IWorkspace;
68
	private id: string;
E
Erich Gamma 已提交
69 70
	private options: any;

71
	private _onDidChangeWorkspaceRoots: Emitter<void>;
72

73
	constructor(workspace: any = TestWorkspace, options: any = null) {
E
Erich Gamma 已提交
74
		this.workspace = workspace;
75
		this.id = generateUuid();
76
		this.options = options || Object.create(null);
77
		this._onDidChangeWorkspaceRoots = new Emitter<void>();
78 79
	}

80
	public get onDidChangeWorkspaceRoots(): Event<void> {
81
		return this._onDidChangeWorkspaceRoots.event;
82 83 84
	}

	public getFolders(): URI[] {
B
Benjamin Pasero 已提交
85
		return this.workspace ? this.workspace.roots : [];
E
Erich Gamma 已提交
86 87
	}

B
Benjamin Pasero 已提交
88 89 90 91
	public hasWorkspace(): boolean {
		return !!this.workspace;
	}

92
	public getWorkspace(): ILegacyWorkspace {
B
Benjamin Pasero 已提交
93
		return this.workspace ? { resource: this.workspace.roots[0] } : void 0;
E
Erich Gamma 已提交
94 95
	}

96
	public getWorkspace2(): IWorkspace {
B
Benjamin Pasero 已提交
97
		return this.workspace;
98 99
	}

100
	public getRoot(resource: URI): URI {
B
Benjamin Pasero 已提交
101
		return this.isInsideWorkspace(resource) ? this.workspace.roots[0] : null;
102 103
	}

D
Daniel Imms 已提交
104 105 106 107
	public setWorkspace(workspace: any): void {
		this.workspace = workspace;
	}

E
Erich Gamma 已提交
108 109 110 111 112 113 114 115 116 117
	public getOptions() {
		return this.options;
	}

	public updateOptions() {

	}

	public isInsideWorkspace(resource: URI): boolean {
		if (resource && this.workspace) {
B
Benjamin Pasero 已提交
118
			return paths.isEqualOrParent(resource.fsPath, this.workspace.roots[0].fsPath, !isLinux /* ignorecase */);
E
Erich Gamma 已提交
119 120 121 122 123
		}

		return false;
	}

124
	public toWorkspaceRelativePath(resource: URI, toOSPath?: boolean): string {
B
Benjamin Pasero 已提交
125
		return makePosixAbsolute(paths.normalize(resource.fsPath.substr('c:'.length), toOSPath));
E
Erich Gamma 已提交
126 127 128
	}

	public toResource(workspaceRelativePath: string): URI {
129
		return URI.file(paths.join('C:\\', workspaceRelativePath));
E
Erich Gamma 已提交
130 131 132
	}
}

B
Benjamin Pasero 已提交
133 134 135 136 137 138 139 140
function isPosixAbsolute(path: string): boolean {
	return path && path[0] === '/';
}

function makePosixAbsolute(path: string): string {
	return isPosixAbsolute(paths.normalize(path)) ? path : paths.sep + path;
}

141
export class TestTextFileService extends TextFileService {
142 143
	public cleanupBackupsBeforeShutdownCalled: boolean;

144 145
	private promptPath: string;
	private confirmResult: ConfirmResult;
146
	private resolveTextContentError: IFileOperationResult;
A
Alex Dima 已提交
147 148

	constructor(
149 150
		@ILifecycleService lifecycleService: ILifecycleService,
		@IWorkspaceContextService contextService: IWorkspaceContextService,
A
Alex Dima 已提交
151 152
		@IConfigurationService configurationService: IConfigurationService,
		@ITelemetryService telemetryService: ITelemetryService,
153
		@IWorkbenchEditorService editorService: IWorkbenchEditorService,
A
Alex Dima 已提交
154
		@IFileService fileService: IFileService,
155
		@IUntitledEditorService untitledEditorService: IUntitledEditorService,
156
		@IInstantiationService instantiationService: IInstantiationService,
157 158
		@IMessageService messageService: IMessageService,
		@IBackupFileService backupFileService: IBackupFileService,
B
Benjamin Pasero 已提交
159
		@IWindowsService windowsService: IWindowsService
A
Alex Dima 已提交
160
	) {
B
Benjamin Pasero 已提交
161
		super(lifecycleService, contextService, configurationService, telemetryService, fileService, untitledEditorService, instantiationService, messageService, TestEnvironmentService, backupFileService, windowsService);
A
Alex Dima 已提交
162
	}
163

164 165 166 167 168 169 170 171
	public setPromptPath(path: string): void {
		this.promptPath = path;
	}

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

172 173 174 175
	public setResolveTextContentErrorOnce(error: IFileOperationResult): void {
		this.resolveTextContentError = error;
	}

176
	public resolveTextContent(resource: URI, options?: IResolveContentOptions): TPromise<IRawTextContent> {
177 178 179 180
		if (this.resolveTextContentError) {
			const error = this.resolveTextContentError;
			this.resolveTextContentError = null;

181
			return TPromise.wrapError<IRawTextContent>(error);
182 183
		}

184
		return this.fileService.resolveContent(resource, options).then((content) => {
A
Alex Dima 已提交
185
			const textSource = RawTextSource.fromString(content.value);
186
			return <IRawTextContent>{
187
				resource: content.resource,
188 189 190 191
				name: content.name,
				mtime: content.mtime,
				etag: content.etag,
				encoding: content.encoding,
192
				value: textSource,
193
				valueLogicalHash: null
194 195 196
			};
		});
	}
197 198 199 200 201 202 203 204

	public promptForPath(defaultPath?: string): string {
		return this.promptPath;
	}

	public confirmSave(resources?: URI[]): ConfirmResult {
		return this.confirmResult;
	}
D
Daniel Imms 已提交
205

206 207 208 209 210 211 212 213
	public onConfigurationChange(configuration: any): void {
		super.onConfigurationChange(configuration);
	}

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

216
export function workbenchInstantiationService(): IInstantiationService {
217
	let instantiationService = new TestInstantiationService(new ServiceCollection([ILifecycleService, new TestLifecycleService()]));
218 219 220 221
	instantiationService.stub(IWorkspaceContextService, new TestContextService(TestWorkspace));
	instantiationService.stub(IConfigurationService, new TestConfigurationService());
	instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService));
	instantiationService.stub(IStorageService, new TestStorageService());
222
	instantiationService.stub(IWorkbenchEditorService, new TestEditorService());
223 224
	instantiationService.stub(IPartService, new TestPartService());
	instantiationService.stub(IEditorGroupService, new TestEditorGroupService());
225
	instantiationService.stub(IModeService, ModeServiceImpl);
226
	instantiationService.stub(IHistoryService, {});
227
	instantiationService.stub(IHistoryService, 'getHistory', []);
S
Sandeep Somavarapu 已提交
228
	instantiationService.stub(IModelService, instantiationService.createInstance(ModelServiceImpl));
229
	instantiationService.stub(IFileService, new TestFileService());
230
	instantiationService.stub(IBackupFileService, new TestBackupFileService());
231 232
	instantiationService.stub(ITelemetryService, NullTelemetryService);
	instantiationService.stub(IMessageService, new TestMessageService());
B
Benjamin Pasero 已提交
233
	instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService));
234
	instantiationService.stub(IWindowsService, new TestWindowsService());
235
	instantiationService.stub(ITextFileService, <ITextFileService>instantiationService.createInstance(TestTextFileService));
236
	instantiationService.stub(ITextModelService, <ITextModelService>instantiationService.createInstance(TextModelResolverService));
B
Benjamin Pasero 已提交
237
	instantiationService.stub(IEnvironmentService, TestEnvironmentService);
B
Benjamin Pasero 已提交
238
	instantiationService.stub(IThemeService, new TestThemeService());
T
t-amqi 已提交
239 240 241 242 243
	instantiationService.stub(IChoiceService, {
		choose: (severity, message, options, cancelId): TPromise<number> => {
			return TPromise.as(cancelId);
		}
	});
244 245 246 247

	return instantiationService;
}

E
Erich Gamma 已提交
248
export class TestMessageService implements IMessageService {
249
	public _serviceBrand: any;
E
Erich Gamma 已提交
250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275

	private counter: number;

	constructor() {
		this.counter = 0;
	}

	public show(sev: Severity, message: any): () => void {
		this.counter++;

		return null;
	}

	public getCounter() {
		return this.counter;
	}

	public hideAll(): void {
		// No-op
	}

	public confirm(confirmation: IConfirmation): boolean {
		return false;
	}
}

276
export class TestPartService implements IPartService {
B
Benjamin Pasero 已提交
277

278
	public _serviceBrand: any;
E
Erich Gamma 已提交
279

280
	private _onTitleBarVisibilityChange = new Emitter<void>();
281
	private _onEditorLayout = new Emitter<void>();
282 283 284 285 286

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

287 288 289 290
	public get onEditorLayout(): Event<void> {
		return this._onEditorLayout.event;
	}

E
Erich Gamma 已提交
291 292 293 294 295 296 297
	public layout(): void { }

	public isCreated(): boolean {
		return true;
	}

	public joinCreation(): Promise {
A
Alex Dima 已提交
298
		return TPromise.as(null);
E
Erich Gamma 已提交
299 300 301 302 303 304 305 306 307 308
	}

	public hasFocus(part): boolean {
		return false;
	}

	public isVisible(part): boolean {
		return true;
	}

309 310 311 312
	public getContainer(part): HTMLElement {
		return null;
	}

B
Benjamin Pasero 已提交
313 314 315 316
	public isTitleBarHidden(): boolean {
		return false;
	}

317 318 319 320
	public getTitleBarOffset(): number {
		return 0;
	}

321 322 323 324
	public isStatusBarHidden(): boolean {
		return false;
	}

S
Sanders Lauture 已提交
325 326 327 328 329 330
	public isActivityBarHidden(): boolean {
		return false;
	}

	public setActivityBarHidden(hidden: boolean): void { }

E
Erich Gamma 已提交
331 332 333 334
	public isSideBarHidden(): boolean {
		return false;
	}

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

I
isidor 已提交
337
	public isPanelHidden(): boolean {
I
isidor 已提交
338 339 340
		return false;
	}

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

I
isidor 已提交
343 344
	public toggleMaximizedPanel(): void { }

B
Benjamin Pasero 已提交
345 346 347 348
	public isPanelMaximized(): boolean {
		return false;
	}

E
Erich Gamma 已提交
349 350 351 352 353 354
	public getSideBarPosition() {
		return 0;
	}

	public addClass(clazz: string): void { }
	public removeClass(clazz: string): void { }
355
	public getWorkbenchElementId(): string { return ''; }
B
Benjamin Pasero 已提交
356

I
isidor 已提交
357
	public toggleZenMode(): void { }
358 359

	public resizePart(part: Parts, sizeChange: number): void { }
E
Erich Gamma 已提交
360 361
}

362
export class TestStorageService extends EventEmitter implements IStorageService {
363
	public _serviceBrand: any;
E
Erich Gamma 已提交
364

B
Benjamin Pasero 已提交
365
	private storage: StorageService;
E
Erich Gamma 已提交
366 367 368 369 370

	constructor() {
		super();

		let context = new TestContextService();
B
Benjamin Pasero 已提交
371
		this.storage = new StorageService(new InMemoryLocalStorage(), null, context.getWorkspace2());
E
Erich Gamma 已提交
372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398
	}

	store(key: string, value: any, scope: StorageScope = StorageScope.GLOBAL): void {
		this.storage.store(key, value, scope);
	}

	swap(key: string, valueA: any, valueB: any, scope: StorageScope = StorageScope.GLOBAL, defaultValue?: any): void {
		this.storage.swap(key, valueA, valueB, scope, defaultValue);
	}

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

399
export class TestEditorGroupService implements IEditorGroupService {
400
	public _serviceBrand: any;
401 402

	private stacksModel: EditorStacksModel;
403 404 405

	private _onEditorsChanged: Emitter<void>;
	private _onEditorOpenFail: Emitter<IEditorInput>;
406
	private _onEditorsMoved: Emitter<void>;
407
	private _onGroupOrientationChanged: Emitter<void>;
I
isidor 已提交
408
	private _onTabOptionsChanged: Emitter<ITabOptions>;
409 410

	constructor(callback?: (method: string) => void) {
411
		this._onEditorsMoved = new Emitter<void>();
412
		this._onEditorsChanged = new Emitter<void>();
413
		this._onGroupOrientationChanged = new Emitter<void>();
414
		this._onEditorOpenFail = new Emitter<IEditorInput>();
I
isidor 已提交
415
		this._onTabOptionsChanged = new Emitter<ITabOptions>();
416

417 418 419
		let services = new ServiceCollection();

		services.set(IStorageService, new TestStorageService());
420
		services.set(IConfigurationService, new TestConfigurationService());
421
		services.set(IWorkspaceContextService, new TestContextService());
422 423
		const lifecycle = new TestLifecycleService();
		services.set(ILifecycleService, lifecycle);
424
		services.set(ITelemetryService, NullTelemetryService);
425 426 427

		let inst = new InstantiationService(services);

428
		this.stacksModel = inst.createInstance(EditorStacksModel, true);
429 430
	}

431 432 433 434 435 436 437 438 439 440 441 442
	public fireChange(): void {
		this._onEditorsChanged.fire();
	}

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

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

443 444 445 446
	public get onEditorsMoved(): Event<void> {
		return this._onEditorsMoved.event;
	}

447 448 449 450
	public get onGroupOrientationChanged(): Event<void> {
		return this._onGroupOrientationChanged.event;
	}

I
isidor 已提交
451 452
	public get onTabOptionsChanged(): Event<ITabOptions> {
		return this._onTabOptionsChanged.event;
453 454
	}

455 456 457
	public focusGroup(group: IEditorGroup): void;
	public focusGroup(position: Position): void;
	public focusGroup(arg1: any): void {
458 459 460

	}

461 462 463
	public activateGroup(group: IEditorGroup): void;
	public activateGroup(position: Position): void;
	public activateGroup(arg1: any): void {
464 465 466

	}

467 468 469
	public moveGroup(from: IEditorGroup, to: IEditorGroup): void;
	public moveGroup(from: Position, to: Position): void;
	public moveGroup(arg1: any, arg2: any): void {
470 471 472 473 474 475 476

	}

	public arrangeGroups(arrangement: GroupArrangement): void {

	}

477 478 479 480 481 482 483 484
	public setGroupOrientation(orientation: GroupOrientation): void {

	}

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

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

487 488
	}

489 490 491
	public pinEditor(group: IEditorGroup, input: IEditorInput): void;
	public pinEditor(position: Position, input: IEditorInput): void;
	public pinEditor(arg1: any, input: IEditorInput): void {
492 493
	}

494 495 496
	public unpinEditor(group: IEditorGroup, input: IEditorInput): void;
	public unpinEditor(position: Position, input: IEditorInput): void;
	public unpinEditor(arg1: any, input: IEditorInput): void {
497 498
	}

499 500 501
	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 {
502 503 504 505 506
	}

	public getStacksModel(): EditorStacksModel {
		return this.stacksModel;
	}
507

I
isidor 已提交
508 509
	public getTabOptions(): ITabOptions {
		return {};
510
	}
511 512
}

513
export class TestEditorService implements IWorkbenchEditorService {
514
	public _serviceBrand: any;
E
Erich Gamma 已提交
515

B
Benjamin Pasero 已提交
516 517 518
	public activeEditorInput: IEditorInput;
	public activeEditorOptions: IEditorOptions;
	public activeEditorPosition: Position;
519
	public mockLineNumber: number;
E
Erich Gamma 已提交
520 521 522 523 524

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

	constructor(callback?: (method: string) => void) {
		this.callback = callback || ((s: string) => { });
525
		this.mockLineNumber = 15;
B
Benjamin Pasero 已提交
526 527
	}

B
Benjamin Pasero 已提交
528
	public openEditors(inputs): Promise {
A
Alex Dima 已提交
529
		return TPromise.as([]);
E
Erich Gamma 已提交
530 531
	}

532 533 534 535
	public replaceEditors(editors): TPromise<IEditor[]> {
		return TPromise.as([]);
	}

B
Benjamin Pasero 已提交
536
	public closeEditors(position: Position, filter?: { except?: IEditorInput, direction?: Direction, unmodifiedOnly?: boolean }): TPromise<void> {
537 538 539
		return TPromise.as(null);
	}

540
	public closeAllEditors(except?: Position): TPromise<void> {
A
Alex Dima 已提交
541
		return TPromise.as(null);
E
Erich Gamma 已提交
542 543 544 545 546 547 548 549 550
	}

	public isVisible(input: IEditorInput, includeDiff: boolean): boolean {
		return false;
	}

	public getActiveEditor(): IEditor {
		this.callback('getActiveEditor');

551 552 553 554 555 556 557
		return {
			input: null,
			options: null,
			position: null,
			getId: () => { return null; },
			getControl: () => {
				return {
558
					getSelection: () => { return { positionLineNumber: this.mockLineNumber }; }
559 560 561 562 563
				};
			},
			focus: () => { },
			isVisible: () => { return true; }
		};
E
Erich Gamma 已提交
564 565 566 567 568
	}

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

B
Benjamin Pasero 已提交
569
		return this.activeEditorInput;
E
Erich Gamma 已提交
570 571 572 573 574 575 576 577 578 579 580 581 582 583 584
	}

	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 已提交
585
		return TPromise.as(null);
E
Erich Gamma 已提交
586 587
	}

588
	public closeEditor(position: Position, input: IEditorInput): TPromise<void> {
E
Erich Gamma 已提交
589 590 591 592 593
		this.callback('closeEditor');

		return TPromise.as(null);
	}

594 595
	public createInput(input: IResourceInput): IEditorInput {
		return null;
E
Erich Gamma 已提交
596 597 598
	}
}

599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627
export class TestFileService implements IFileService {

	public _serviceBrand: any;

	private _onFileChanges: Emitter<FileChangesEvent>;
	private _onAfterOperation: Emitter<FileOperationEvent>;

	constructor() {
		this._onFileChanges = new Emitter<FileChangesEvent>();
		this._onAfterOperation = new Emitter<FileOperationEvent>();
	}

	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 已提交
628
		return TPromise.as({
629 630
			resource,
			etag: Date.now().toString(),
B
Benjamin Pasero 已提交
631
			encoding: 'utf8',
B
Benjamin Pasero 已提交
632
			mtime: Date.now(),
633 634
			isDirectory: false,
			hasChildren: false,
B
Benjamin Pasero 已提交
635 636
			name: paths.basename(resource.fsPath)
		});
637
	}
B
Benjamin Pasero 已提交
638

639 640 641
	existsFile(resource: URI): TPromise<boolean> {
		return TPromise.as(null);
	}
B
Benjamin Pasero 已提交
642

643
	resolveContent(resource: URI, options?: IResolveContentOptions): TPromise<IContent> {
B
Benjamin Pasero 已提交
644 645
		return TPromise.as({
			resource: resource,
646 647
			value: 'Hello Html',
			etag: 'index.txt',
B
Benjamin Pasero 已提交
648 649
			encoding: 'utf8',
			mtime: Date.now(),
650
			name: paths.basename(resource.fsPath)
E
Erich Gamma 已提交
651
		});
652
	}
E
Erich Gamma 已提交
653

654
	resolveStreamContent(resource: URI, options?: IResolveContentOptions): TPromise<IStreamContent> {
A
Alex Dima 已提交
655 656 657
		return TPromise.as({
			resource: resource,
			value: {
658
				on: (event: string, callback: Function): void => {
A
Alex Dima 已提交
659 660 661 662 663 664 665 666 667 668
					if (event === 'data') {
						callback('Hello Html');
					}
					if (event === 'end') {
						callback();
					}
				}
			},
			etag: 'index.txt',
			encoding: 'utf8',
B
Benjamin Pasero 已提交
669
			mtime: Date.now(),
670
			name: paths.basename(resource.fsPath)
A
Alex Dima 已提交
671
		});
672 673 674 675 676
	}

	resolveContents(resources: URI[]): TPromise<IContent[]> {
		return TPromise.as(null);
	}
A
Alex Dima 已提交
677

678
	updateContent(resource: URI, value: string, options?: IUpdateContentOptions): TPromise<IFileStat> {
679
		return TPromise.timeout(1).then(() => {
E
Erich Gamma 已提交
680
			return {
681
				resource,
E
Erich Gamma 已提交
682
				etag: 'index.txt',
B
Benjamin Pasero 已提交
683
				encoding: 'utf8',
B
Benjamin Pasero 已提交
684
				mtime: Date.now(),
685 686 687
				isDirectory: false,
				hasChildren: false,
				name: paths.basename(resource.fsPath)
E
Erich Gamma 已提交
688 689
			};
		});
690
	}
D
Daniel Imms 已提交
691

692 693 694
	moveFile(source: URI, target: URI, overwrite?: boolean): TPromise<IFileStat> {
		return TPromise.as(null);
	}
D
Daniel Imms 已提交
695

696 697 698
	copyFile(source: URI, target: URI, overwrite?: boolean): TPromise<IFileStat> {
		return TPromise.as(null);
	}
D
Daniel Imms 已提交
699

700 701
	createFile(resource: URI, content?: string): TPromise<IFileStat> {
		return TPromise.as(null);
E
Erich Gamma 已提交
702
	}
703 704 705 706 707 708 709 710

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

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

712 713 714 715 716 717 718 719 720 721 722
	touchFile(resource: URI): TPromise<IFileStat> {
		return TPromise.as(null);
	}

	del(resource: URI, useTrash?: boolean): TPromise<void> {
		return TPromise.as(null);
	}

	importFile(source: URI, targetFolder: URI): TPromise<IImportResult> {
		return TPromise.as(null);
	}
D
Daniel Imms 已提交
723

724 725 726 727 728 729 730 731 732 733 734 735 736 737
	watchFileChanges(resource: URI): void {
	}

	unwatchFileChanges(resource: URI): void;
	unwatchFileChanges(fsPath: string): void;
	unwatchFileChanges(arg1: any): void {
	}

	updateOptions(options: any): void {
	}

	getEncoding(resource: URI): string {
		return 'utf8';
	}
D
Daniel Imms 已提交
738

739
	dispose(): void {
E
Erich Gamma 已提交
740
	}
741
}
742

743 744
export class TestBackupFileService implements IBackupFileService {
	public _serviceBrand: any;
745

746 747
	public backupEnabled: boolean;

748 749 750 751
	public hasBackups(): TPromise<boolean> {
		return TPromise.as(false);
	}

752
	public hasBackup(resource: URI): TPromise<boolean> {
753 754 755
		return TPromise.as(false);
	}

B
Benjamin Pasero 已提交
756 757 758 759 760 761 762 763 764 765
	public loadBackupResource(resource: URI): TPromise<URI> {
		return this.hasBackup(resource).then(hasBackup => {
			if (hasBackup) {
				return this.getBackupResource(resource);
			}

			return void 0;
		});
	}

D
Daniel Imms 已提交
766 767 768 769 770 771 772 773 774 775 776
	public registerResourceForBackup(resource: URI): TPromise<void> {
		return TPromise.as(void 0);
	}

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

	public getBackupResource(resource: URI): URI {
		return null;
	}
777

778
	public backupResource(resource: URI, content: string): TPromise<void> {
779 780 781
		return TPromise.as(void 0);
	}

782
	public getWorkspaceFileBackups(): TPromise<URI[]> {
783 784 785
		return TPromise.as([]);
	}

A
Alex Dima 已提交
786
	public parseBackupContent(rawText: IRawTextSource): string {
787
		return rawText.lines.join('\n');
788 789
	}

790
	public discardResourceBackup(resource: URI): TPromise<void> {
791 792 793
		return TPromise.as(void 0);
	}

794
	public discardAllWorkspaceBackups(): TPromise<void> {
795 796
		return TPromise.as(void 0);
	}
D
Daniel Imms 已提交
797 798
};

799 800 801 802
export class TestWindowService implements IWindowService {

	public _serviceBrand: any;

803 804 805 806
	isFocused(): TPromise<boolean> {
		return TPromise.as(false);
	}

807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 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
	getCurrentWindowId(): number {
		return 0;
	}

	openFileFolderPicker(forceNewWindow?: boolean): TPromise<void> {
		return TPromise.as(void 0);
	}

	openFilePicker(forceNewWindow?: boolean, path?: string): TPromise<void> {
		return TPromise.as(void 0);
	}

	openFolderPicker(forceNewWindow?: boolean): TPromise<void> {
		return TPromise.as(void 0);
	}

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

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

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

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

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

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

	addToRecentlyOpen(paths: { path: string, isFile?: boolean }[]): TPromise<void> {
		return TPromise.as(void 0);
	}

	removeFromRecentlyOpen(paths: string[]): TPromise<void> {
		return TPromise.as(void 0);
	}

	getRecentlyOpen(): TPromise<{ files: string[]; folders: string[]; }> {
		return TPromise.as(void 0);
	}

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

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

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

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

	unmaximizeWindow(): TPromise<void> {
		return TPromise.as(void 0);
	}
878 879 880 881

	onWindowTitleDoubleClick(): TPromise<void> {
		return TPromise.as(void 0);
	}
882 883
}

884 885
export class TestLifecycleService implements ILifecycleService {

886
	public _serviceBrand: any;
887

888
	public phase: LifecyclePhase;
889
	public startupKind: StartupKind;
890

891
	private _onDidChangePhase = new Emitter<LifecyclePhase>();
892
	private _onWillShutdown = new Emitter<ShutdownEvent>();
893
	private _onShutdown = new Emitter<ShutdownReason>();
894 895


896 897
	public fireShutdown(reason = ShutdownReason.QUIT): void {
		this._onShutdown.fire(reason);
898 899
	}

900 901 902 903
	public fireWillShutdown(event: ShutdownEvent): void {
		this._onWillShutdown.fire(event);
	}

904 905 906 907
	public get onDidChangePhase(): Event<LifecyclePhase> {
		return this._onDidChangePhase.event;
	}

908 909 910 911
	public get onWillShutdown(): Event<ShutdownEvent> {
		return this._onWillShutdown.event;
	}

912
	public get onShutdown(): Event<ShutdownReason> {
913 914
		return this._onShutdown.event;
	}
915 916
}

917 918 919 920
export class TestWindowsService implements IWindowsService {

	_serviceBrand: any;

921 922
	public windowCount = 1;

923 924 925
	onWindowOpen: Event<number>;
	onWindowFocus: Event<number>;

926 927 928 929
	isFocused(windowId: number): TPromise<boolean> {
		return TPromise.as(false);
	}

930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963
	openFileFolderPicker(windowId: number, forceNewWindow?: boolean): TPromise<void> {
		return TPromise.as(void 0);
	}
	openFilePicker(windowId: number, forceNewWindow?: boolean, path?: string): TPromise<void> {
		return TPromise.as(void 0);
	}
	openFolderPicker(windowId: number, forceNewWindow?: boolean): TPromise<void> {
		return TPromise.as(void 0);
	}
	reloadWindow(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
	openDevTools(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
	toggleDevTools(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
	// TODO@joao: rename, shouldn't this be closeWindow?
	closeFolder(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
	toggleFullScreen(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
	setRepresentedFilename(windowId: number, fileName: string): TPromise<void> {
		return TPromise.as(void 0);
	}
	addToRecentlyOpen(paths: { path: string, isFile?: boolean }[]): TPromise<void> {
		return TPromise.as(void 0);
	}
	removeFromRecentlyOpen(paths: string[]): TPromise<void> {
		return TPromise.as(void 0);
	}
C
22768  
Cristian 已提交
964 965 966
	clearRecentPathsList(): TPromise<void> {
		return TPromise.as(void 0);
	}
967 968 969 970 971 972 973 974 975 976 977 978 979 980 981
	getRecentlyOpen(windowId: number): TPromise<{ files: string[]; folders: string[]; }> {
		return TPromise.as(void 0);
	}
	focusWindow(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
	isMaximized(windowId: number): TPromise<boolean> {
		return TPromise.as(void 0);
	}
	maximizeWindow(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
	unmaximizeWindow(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
982 983 984
	onWindowTitleDoubleClick(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
985 986 987 988 989 990
	setDocumentEdited(windowId: number, flag: boolean): TPromise<void> {
		return TPromise.as(void 0);
	}
	quit(): TPromise<void> {
		return TPromise.as(void 0);
	}
J
Johannes Rieken 已提交
991 992 993
	relaunch(options: { addArgs?: string[], removeArgs?: string[] }): TPromise<void> {
		return TPromise.as(void 0);
	}
994 995 996
	whenSharedProcessReady(): TPromise<void> {
		return TPromise.as(void 0);
	}
997 998 999
	toggleSharedProcess(): TPromise<void> {
		return TPromise.as(void 0);
	}
1000
	// Global methods
1001
	openWindow(paths: string[], options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean }): TPromise<void> {
1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013
		return TPromise.as(void 0);
	}
	openNewWindow(): TPromise<void> {
		return TPromise.as(void 0);
	}
	showWindow(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
	getWindows(): TPromise<{ id: number; path: string; title: string; }[]> {
		return TPromise.as(void 0);
	}
	getWindowCount(): TPromise<number> {
1014
		return TPromise.as(this.windowCount);
1015 1016 1017 1018 1019
	}
	log(severity: string, ...messages: string[]): TPromise<void> {
		return TPromise.as(void 0);
	}
	// TODO@joao: what?
B
Benjamin Pasero 已提交
1020
	closeExtensionHostWindow(extensionDevelopmentPaths: string[]): TPromise<void> {
1021 1022 1023 1024 1025 1026 1027 1028
		return TPromise.as(void 0);
	}
	showItemInFolder(path: string): TPromise<void> {
		return TPromise.as(void 0);
	}

	// This needs to be handled from browser process to prevent
	// foreground ordering issues on Windows
1029 1030
	openExternal(url: string): TPromise<boolean> {
		return TPromise.as(true);
1031 1032 1033 1034 1035 1036
	}

	// TODO: this is a bit backwards
	startCrashReporter(config: Electron.CrashReporterStartOptions): TPromise<void> {
		return TPromise.as(void 0);
	}
1037
}
B
Benjamin Pasero 已提交
1038