workbenchTestServices.ts 31.8 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';
B
Benjamin Pasero 已提交
27
import { IEditorInput, IEditorOptions, Position, Direction, IEditor, IResourceInput, ITextEditorOptions } 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 { IMessageService, IConfirmation } from 'vs/platform/message/common/message';
30
import { ILegacyWorkspace, IWorkspaceContextService, IWorkspace as IWorkbenchWorkspace } 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';
I
isidor 已提交
37
import { FileOperationEvent, IFileService, IResolveContentOptions, FileOperationError, IFileStat, IResolveFileResult, 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';
B
Benjamin Pasero 已提交
55 56
import { generateUuid } from 'vs/base/common/uuid';
import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService';
57 58
import { IWorkspaceIdentifier } from "vs/platform/workspaces/common/workspaces";
import { IRecentlyOpened, IRecentlyOpenedFile } from "vs/platform/history/common/history";
B
Benjamin Pasero 已提交
59

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

64
export const TestEnvironmentService = new EnvironmentService(parseArgs(process.argv), process.execPath);
65

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

69
	private workspace: IWorkbenchWorkspace;
I
isidor 已提交
70
	private id: string;
E
Erich Gamma 已提交
71 72
	private options: any;

73
	private _onDidChangeWorkspaceRoots: Emitter<void>;
74

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

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

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

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

S
Sandeep Somavarapu 已提交
94 95 96 97 98 99 100 101
	public hasFolderWorkspace(): boolean {
		return this.hasWorkspace();
	}

	public hasMultiFolderWorkspace(): boolean {
		return false;
	}

B
Benjamin Pasero 已提交
102
	public getLegacyWorkspace(): ILegacyWorkspace {
B
Benjamin Pasero 已提交
103
		return this.workspace ? { resource: this.workspace.roots[0] } : void 0;
E
Erich Gamma 已提交
104 105
	}

106
	public getWorkspace(): IWorkbenchWorkspace {
B
Benjamin Pasero 已提交
107
		return this.workspace;
108 109
	}

110
	public getRoot(resource: URI): URI {
B
Benjamin Pasero 已提交
111
		return this.isInsideWorkspace(resource) ? this.workspace.roots[0] : null;
112 113
	}

D
Daniel Imms 已提交
114 115 116 117
	public setWorkspace(workspace: any): void {
		this.workspace = workspace;
	}

E
Erich Gamma 已提交
118 119 120 121 122 123 124 125 126 127
	public getOptions() {
		return this.options;
	}

	public updateOptions() {

	}

	public isInsideWorkspace(resource: URI): boolean {
		if (resource && this.workspace) {
B
Benjamin Pasero 已提交
128
			return paths.isEqualOrParent(resource.fsPath, this.workspace.roots[0].fsPath, !isLinux /* ignorecase */);
E
Erich Gamma 已提交
129 130 131 132 133
		}

		return false;
	}

134
	public toWorkspaceRelativePath(resource: URI, toOSPath?: boolean): string {
B
Benjamin Pasero 已提交
135
		return makePosixAbsolute(paths.normalize(resource.fsPath.substr('c:'.length), toOSPath));
E
Erich Gamma 已提交
136 137 138
	}

	public toResource(workspaceRelativePath: string): URI {
139
		return URI.file(paths.join('C:\\', workspaceRelativePath));
E
Erich Gamma 已提交
140 141 142
	}
}

B
Benjamin Pasero 已提交
143 144 145 146 147 148 149 150
function isPosixAbsolute(path: string): boolean {
	return path && path[0] === '/';
}

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

151
export class TestTextFileService extends TextFileService {
152 153
	public cleanupBackupsBeforeShutdownCalled: boolean;

154 155
	private promptPath: string;
	private confirmResult: ConfirmResult;
156
	private resolveTextContentError: FileOperationError;
A
Alex Dima 已提交
157 158

	constructor(
159 160
		@ILifecycleService lifecycleService: ILifecycleService,
		@IWorkspaceContextService contextService: IWorkspaceContextService,
A
Alex Dima 已提交
161 162
		@IConfigurationService configurationService: IConfigurationService,
		@ITelemetryService telemetryService: ITelemetryService,
163
		@IWorkbenchEditorService editorService: IWorkbenchEditorService,
A
Alex Dima 已提交
164
		@IFileService fileService: IFileService,
165
		@IUntitledEditorService untitledEditorService: IUntitledEditorService,
166
		@IInstantiationService instantiationService: IInstantiationService,
167 168
		@IMessageService messageService: IMessageService,
		@IBackupFileService backupFileService: IBackupFileService,
169 170
		@IWindowsService windowsService: IWindowsService,
		@IHistoryService historyService: IHistoryService
A
Alex Dima 已提交
171
	) {
172
		super(lifecycleService, contextService, configurationService, telemetryService, fileService, untitledEditorService, instantiationService, messageService, TestEnvironmentService, backupFileService, windowsService, historyService);
A
Alex Dima 已提交
173
	}
174

175 176 177 178 179 180 181 182
	public setPromptPath(path: string): void {
		this.promptPath = path;
	}

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

183
	public setResolveTextContentErrorOnce(error: FileOperationError): void {
184 185 186
		this.resolveTextContentError = error;
	}

187
	public resolveTextContent(resource: URI, options?: IResolveContentOptions): TPromise<IRawTextContent> {
188 189 190 191
		if (this.resolveTextContentError) {
			const error = this.resolveTextContentError;
			this.resolveTextContentError = null;

192
			return TPromise.wrapError<IRawTextContent>(error);
193 194
		}

195
		return this.fileService.resolveContent(resource, options).then((content) => {
A
Alex Dima 已提交
196
			const textSource = RawTextSource.fromString(content.value);
197
			return <IRawTextContent>{
198
				resource: content.resource,
199 200 201 202
				name: content.name,
				mtime: content.mtime,
				etag: content.etag,
				encoding: content.encoding,
203
				value: textSource,
204
				valueLogicalHash: null
205 206 207
			};
		});
	}
208 209 210 211 212 213 214 215

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

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

217 218 219 220 221 222 223 224
	public onConfigurationChange(configuration: any): void {
		super.onConfigurationChange(configuration);
	}

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

227
export function workbenchInstantiationService(): IInstantiationService {
228
	let instantiationService = new TestInstantiationService(new ServiceCollection([ILifecycleService, new TestLifecycleService()]));
229 230 231 232
	instantiationService.stub(IWorkspaceContextService, new TestContextService(TestWorkspace));
	instantiationService.stub(IConfigurationService, new TestConfigurationService());
	instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService));
	instantiationService.stub(IStorageService, new TestStorageService());
233
	instantiationService.stub(IWorkbenchEditorService, new TestEditorService());
234 235
	instantiationService.stub(IPartService, new TestPartService());
	instantiationService.stub(IEditorGroupService, new TestEditorGroupService());
236
	instantiationService.stub(IModeService, ModeServiceImpl);
B
Benjamin Pasero 已提交
237
	instantiationService.stub(IHistoryService, new TestHistoryService());
S
Sandeep Somavarapu 已提交
238
	instantiationService.stub(IModelService, instantiationService.createInstance(ModelServiceImpl));
239
	instantiationService.stub(IFileService, new TestFileService());
240
	instantiationService.stub(IBackupFileService, new TestBackupFileService());
241 242
	instantiationService.stub(ITelemetryService, NullTelemetryService);
	instantiationService.stub(IMessageService, new TestMessageService());
B
Benjamin Pasero 已提交
243
	instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService));
244
	instantiationService.stub(IWindowsService, new TestWindowsService());
245
	instantiationService.stub(ITextFileService, <ITextFileService>instantiationService.createInstance(TestTextFileService));
246
	instantiationService.stub(ITextModelService, <ITextModelService>instantiationService.createInstance(TextModelResolverService));
B
Benjamin Pasero 已提交
247
	instantiationService.stub(IEnvironmentService, TestEnvironmentService);
B
Benjamin Pasero 已提交
248
	instantiationService.stub(IThemeService, new TestThemeService());
249 250 251 252

	return instantiationService;
}

B
Benjamin Pasero 已提交
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
export class TestHistoryService implements IHistoryService {

	public _serviceBrand: any;

	constructor(private root?: URI) {
	}

	public reopenLastClosedEditor(): void {
	}

	public add(input: IEditorInput, options?: ITextEditorOptions): void {
	}

	public forward(acrossEditors?: boolean): void {
	}

	public back(acrossEditors?: boolean): void {
	}

	public remove(input: IEditorInput | IResourceInput): void {
	}

	public clear(): void {
	}

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

	public getLastActiveWorkspaceRoot(): URI {
		return this.root;
	}
}

E
Erich Gamma 已提交
287
export class TestMessageService implements IMessageService {
288
	public _serviceBrand: any;
E
Erich Gamma 已提交
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

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

315
export class TestPartService implements IPartService {
B
Benjamin Pasero 已提交
316

317
	public _serviceBrand: any;
E
Erich Gamma 已提交
318

319
	private _onTitleBarVisibilityChange = new Emitter<void>();
320
	private _onEditorLayout = new Emitter<void>();
321 322 323 324 325

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

326 327 328 329
	public get onEditorLayout(): Event<void> {
		return this._onEditorLayout.event;
	}

E
Erich Gamma 已提交
330 331 332 333 334 335 336
	public layout(): void { }

	public isCreated(): boolean {
		return true;
	}

	public joinCreation(): Promise {
A
Alex Dima 已提交
337
		return TPromise.as(null);
E
Erich Gamma 已提交
338 339 340 341 342 343 344 345 346 347
	}

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

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

348 349 350 351
	public getContainer(part): HTMLElement {
		return null;
	}

B
Benjamin Pasero 已提交
352 353 354 355
	public isTitleBarHidden(): boolean {
		return false;
	}

356 357 358 359
	public getTitleBarOffset(): number {
		return 0;
	}

360 361 362 363
	public isStatusBarHidden(): boolean {
		return false;
	}

S
Sanders Lauture 已提交
364 365 366 367 368 369
	public isActivityBarHidden(): boolean {
		return false;
	}

	public setActivityBarHidden(hidden: boolean): void { }

E
Erich Gamma 已提交
370 371 372 373
	public isSideBarHidden(): boolean {
		return false;
	}

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

I
isidor 已提交
376
	public isPanelHidden(): boolean {
I
isidor 已提交
377 378 379
		return false;
	}

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

I
isidor 已提交
382 383
	public toggleMaximizedPanel(): void { }

B
Benjamin Pasero 已提交
384 385 386 387
	public isPanelMaximized(): boolean {
		return false;
	}

E
Erich Gamma 已提交
388 389 390 391 392 393
	public getSideBarPosition() {
		return 0;
	}

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

I
isidor 已提交
396
	public toggleZenMode(): void { }
397 398

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

401
export class TestStorageService extends EventEmitter implements IStorageService {
402
	public _serviceBrand: any;
E
Erich Gamma 已提交
403

B
Benjamin Pasero 已提交
404
	private storage: StorageService;
E
Erich Gamma 已提交
405 406 407 408 409

	constructor() {
		super();

		let context = new TestContextService();
410
		this.storage = new StorageService(new InMemoryLocalStorage(), null, context.getWorkspace().id);
E
Erich Gamma 已提交
411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437
	}

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

438
export class TestEditorGroupService implements IEditorGroupService {
439
	public _serviceBrand: any;
440 441

	private stacksModel: EditorStacksModel;
442 443 444

	private _onEditorsChanged: Emitter<void>;
	private _onEditorOpenFail: Emitter<IEditorInput>;
445
	private _onEditorsMoved: Emitter<void>;
446
	private _onGroupOrientationChanged: Emitter<void>;
I
isidor 已提交
447
	private _onTabOptionsChanged: Emitter<ITabOptions>;
448 449

	constructor(callback?: (method: string) => void) {
450
		this._onEditorsMoved = new Emitter<void>();
451
		this._onEditorsChanged = new Emitter<void>();
452
		this._onGroupOrientationChanged = new Emitter<void>();
453
		this._onEditorOpenFail = new Emitter<IEditorInput>();
I
isidor 已提交
454
		this._onTabOptionsChanged = new Emitter<ITabOptions>();
455

456 457 458
		let services = new ServiceCollection();

		services.set(IStorageService, new TestStorageService());
459
		services.set(IConfigurationService, new TestConfigurationService());
460
		services.set(IWorkspaceContextService, new TestContextService());
461 462
		const lifecycle = new TestLifecycleService();
		services.set(ILifecycleService, lifecycle);
463
		services.set(ITelemetryService, NullTelemetryService);
464 465 466

		let inst = new InstantiationService(services);

467
		this.stacksModel = inst.createInstance(EditorStacksModel, true);
468 469
	}

470 471 472 473 474 475 476 477 478 479 480 481
	public fireChange(): void {
		this._onEditorsChanged.fire();
	}

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

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

482 483 484 485
	public get onEditorsMoved(): Event<void> {
		return this._onEditorsMoved.event;
	}

486 487 488 489
	public get onGroupOrientationChanged(): Event<void> {
		return this._onGroupOrientationChanged.event;
	}

I
isidor 已提交
490 491
	public get onTabOptionsChanged(): Event<ITabOptions> {
		return this._onTabOptionsChanged.event;
492 493
	}

494 495 496
	public focusGroup(group: IEditorGroup): void;
	public focusGroup(position: Position): void;
	public focusGroup(arg1: any): void {
497 498 499

	}

500 501 502
	public activateGroup(group: IEditorGroup): void;
	public activateGroup(position: Position): void;
	public activateGroup(arg1: any): void {
503 504 505

	}

506 507 508
	public moveGroup(from: IEditorGroup, to: IEditorGroup): void;
	public moveGroup(from: Position, to: Position): void;
	public moveGroup(arg1: any, arg2: any): void {
509 510 511 512 513 514 515

	}

	public arrangeGroups(arrangement: GroupArrangement): void {

	}

516 517 518 519 520 521 522 523
	public setGroupOrientation(orientation: GroupOrientation): void {

	}

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

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

526 527
	}

528 529 530
	public pinEditor(group: IEditorGroup, input: IEditorInput): void;
	public pinEditor(position: Position, input: IEditorInput): void;
	public pinEditor(arg1: any, input: IEditorInput): void {
531 532
	}

533 534 535
	public unpinEditor(group: IEditorGroup, input: IEditorInput): void;
	public unpinEditor(position: Position, input: IEditorInput): void;
	public unpinEditor(arg1: any, input: IEditorInput): void {
536 537
	}

538 539 540
	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 {
541 542 543 544 545
	}

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

I
isidor 已提交
547 548
	public getTabOptions(): ITabOptions {
		return {};
549
	}
550 551
}

552
export class TestEditorService implements IWorkbenchEditorService {
553
	public _serviceBrand: any;
E
Erich Gamma 已提交
554

B
Benjamin Pasero 已提交
555 556 557
	public activeEditorInput: IEditorInput;
	public activeEditorOptions: IEditorOptions;
	public activeEditorPosition: Position;
558
	public mockLineNumber: number;
E
Erich Gamma 已提交
559 560 561 562 563

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

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

B
Benjamin Pasero 已提交
567
	public openEditors(inputs): Promise {
A
Alex Dima 已提交
568
		return TPromise.as([]);
E
Erich Gamma 已提交
569 570
	}

571 572 573 574
	public replaceEditors(editors): TPromise<IEditor[]> {
		return TPromise.as([]);
	}

I
isidor 已提交
575
	public closeEditors(position: Position, filter?: { except?: IEditorInput, direction?: Direction, unmodifiedOnly?: boolean }): TPromise<void> {
576 577 578
		return TPromise.as(null);
	}

579
	public closeAllEditors(except?: Position): TPromise<void> {
A
Alex Dima 已提交
580
		return TPromise.as(null);
E
Erich Gamma 已提交
581 582 583 584 585 586 587 588 589
	}

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

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

590 591 592 593 594 595 596
		return {
			input: null,
			options: null,
			position: null,
			getId: () => { return null; },
			getControl: () => {
				return {
597
					getSelection: () => { return { positionLineNumber: this.mockLineNumber }; }
598 599 600 601 602
				};
			},
			focus: () => { },
			isVisible: () => { return true; }
		};
E
Erich Gamma 已提交
603 604 605 606 607
	}

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

B
Benjamin Pasero 已提交
608
		return this.activeEditorInput;
E
Erich Gamma 已提交
609 610 611 612 613 614 615 616 617 618 619 620 621 622 623
	}

	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 已提交
624
		return TPromise.as(null);
E
Erich Gamma 已提交
625 626
	}

627
	public closeEditor(position: Position, input: IEditorInput): TPromise<void> {
E
Erich Gamma 已提交
628 629 630 631 632
		this.callback('closeEditor');

		return TPromise.as(null);
	}

633 634
	public createInput(input: IResourceInput): IEditorInput {
		return null;
E
Erich Gamma 已提交
635 636 637
	}
}

638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666
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 已提交
667
		return TPromise.as({
668 669
			resource,
			etag: Date.now().toString(),
B
Benjamin Pasero 已提交
670
			encoding: 'utf8',
B
Benjamin Pasero 已提交
671
			mtime: Date.now(),
672 673
			isDirectory: false,
			hasChildren: false,
B
Benjamin Pasero 已提交
674 675
			name: paths.basename(resource.fsPath)
		});
676
	}
B
Benjamin Pasero 已提交
677

I
isidor 已提交
678 679
	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 已提交
680 681
	}

682 683 684
	existsFile(resource: URI): TPromise<boolean> {
		return TPromise.as(null);
	}
B
Benjamin Pasero 已提交
685

686
	resolveContent(resource: URI, options?: IResolveContentOptions): TPromise<IContent> {
B
Benjamin Pasero 已提交
687 688
		return TPromise.as({
			resource: resource,
689 690
			value: 'Hello Html',
			etag: 'index.txt',
B
Benjamin Pasero 已提交
691 692
			encoding: 'utf8',
			mtime: Date.now(),
693
			name: paths.basename(resource.fsPath)
E
Erich Gamma 已提交
694
		});
695
	}
E
Erich Gamma 已提交
696

697
	resolveStreamContent(resource: URI, options?: IResolveContentOptions): TPromise<IStreamContent> {
A
Alex Dima 已提交
698 699 700
		return TPromise.as({
			resource: resource,
			value: {
701
				on: (event: string, callback: Function): void => {
A
Alex Dima 已提交
702 703 704 705 706 707 708 709 710 711
					if (event === 'data') {
						callback('Hello Html');
					}
					if (event === 'end') {
						callback();
					}
				}
			},
			etag: 'index.txt',
			encoding: 'utf8',
B
Benjamin Pasero 已提交
712
			mtime: Date.now(),
713
			name: paths.basename(resource.fsPath)
A
Alex Dima 已提交
714
		});
715 716 717 718 719
	}

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

721
	updateContent(resource: URI, value: string, options?: IUpdateContentOptions): TPromise<IFileStat> {
722
		return TPromise.timeout(1).then(() => {
E
Erich Gamma 已提交
723
			return {
724
				resource,
E
Erich Gamma 已提交
725
				etag: 'index.txt',
B
Benjamin Pasero 已提交
726
				encoding: 'utf8',
B
Benjamin Pasero 已提交
727
				mtime: Date.now(),
728 729 730
				isDirectory: false,
				hasChildren: false,
				name: paths.basename(resource.fsPath)
E
Erich Gamma 已提交
731 732
			};
		});
733
	}
D
Daniel Imms 已提交
734

735 736 737
	moveFile(source: URI, target: URI, overwrite?: boolean): TPromise<IFileStat> {
		return TPromise.as(null);
	}
D
Daniel Imms 已提交
738

739 740 741
	copyFile(source: URI, target: URI, overwrite?: boolean): TPromise<IFileStat> {
		return TPromise.as(null);
	}
D
Daniel Imms 已提交
742

743 744
	createFile(resource: URI, content?: string): TPromise<IFileStat> {
		return TPromise.as(null);
E
Erich Gamma 已提交
745
	}
746 747 748 749 750 751 752 753

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

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

755 756 757 758 759 760 761 762 763 764 765
	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 已提交
766

767 768 769 770 771 772 773 774 775 776 777 778 779 780
	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 已提交
781

782
	dispose(): void {
E
Erich Gamma 已提交
783
	}
784
}
785

786 787
export class TestBackupFileService implements IBackupFileService {
	public _serviceBrand: any;
788

789 790
	public backupEnabled: boolean;

791 792 793 794
	public hasBackups(): TPromise<boolean> {
		return TPromise.as(false);
	}

795
	public hasBackup(resource: URI): TPromise<boolean> {
796 797 798
		return TPromise.as(false);
	}

B
Benjamin Pasero 已提交
799 800 801 802 803 804 805 806 807 808
	public loadBackupResource(resource: URI): TPromise<URI> {
		return this.hasBackup(resource).then(hasBackup => {
			if (hasBackup) {
				return this.getBackupResource(resource);
			}

			return void 0;
		});
	}

D
Daniel Imms 已提交
809 810 811 812 813 814 815 816 817 818 819
	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;
	}
820

821
	public backupResource(resource: URI, content: string): TPromise<void> {
822 823 824
		return TPromise.as(void 0);
	}

825
	public getWorkspaceFileBackups(): TPromise<URI[]> {
826 827 828
		return TPromise.as([]);
	}

A
Alex Dima 已提交
829
	public parseBackupContent(rawText: IRawTextSource): string {
830
		return rawText.lines.join('\n');
831 832
	}

833
	public discardResourceBackup(resource: URI): TPromise<void> {
834 835 836
		return TPromise.as(void 0);
	}

837
	public discardAllWorkspaceBackups(): TPromise<void> {
838 839
		return TPromise.as(void 0);
	}
D
Daniel Imms 已提交
840 841
};

842 843 844 845
export class TestWindowService implements IWindowService {

	public _serviceBrand: any;

846 847 848 849
	isFocused(): TPromise<boolean> {
		return TPromise.as(false);
	}

850 851 852 853
	getCurrentWindowId(): number {
		return 0;
	}

B
renames  
Benjamin Pasero 已提交
854
	pickFileFolderAndOpen(forceNewWindow?: boolean): TPromise<void> {
855 856 857
		return TPromise.as(void 0);
	}

B
renames  
Benjamin Pasero 已提交
858
	pickFileAndOpen(forceNewWindow?: boolean, path?: string): TPromise<void> {
859 860 861
		return TPromise.as(void 0);
	}

B
renames  
Benjamin Pasero 已提交
862
	pickFolderAndOpen(forceNewWindow?: boolean): TPromise<void> {
863 864 865
		return TPromise.as(void 0);
	}

B
Benjamin Pasero 已提交
866
	pickFolder(options?: { buttonLabel: string; title: string; }): TPromise<string[]> {
867 868 869
		return TPromise.as([]);
	}

870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893
	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);
	}

894
	getRecentlyOpened(): TPromise<IRecentlyOpened> {
895 896 897 898 899 900 901
		return TPromise.as(void 0);
	}

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

902 903 904 905
	closeWindow(): TPromise<void> {
		return TPromise.as(void 0);
	}

906 907 908 909 910 911 912 913 914 915 916 917 918 919 920
	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);
	}
921 922 923 924

	onWindowTitleDoubleClick(): TPromise<void> {
		return TPromise.as(void 0);
	}
925 926 927 928 929 930 931 932

	showMessageBox(options: Electron.ShowMessageBoxOptions): number {
		return 0;
	}

	showSaveDialog(options: Electron.SaveDialogOptions, callback?: (fileName: string) => void): string {
		return void 0;
	}
933 934
}

935 936
export class TestLifecycleService implements ILifecycleService {

937
	public _serviceBrand: any;
938

939
	public phase: LifecyclePhase;
940
	public startupKind: StartupKind;
941

942
	private _onDidChangePhase = new Emitter<LifecyclePhase>();
943
	private _onWillShutdown = new Emitter<ShutdownEvent>();
944
	private _onShutdown = new Emitter<ShutdownReason>();
945 946


947 948
	public fireShutdown(reason = ShutdownReason.QUIT): void {
		this._onShutdown.fire(reason);
949 950
	}

951 952 953 954
	public fireWillShutdown(event: ShutdownEvent): void {
		this._onWillShutdown.fire(event);
	}

955 956 957 958
	public get onDidChangePhase(): Event<LifecyclePhase> {
		return this._onDidChangePhase.event;
	}

959 960 961 962
	public get onWillShutdown(): Event<ShutdownEvent> {
		return this._onWillShutdown.event;
	}

963
	public get onShutdown(): Event<ShutdownReason> {
964 965
		return this._onShutdown.event;
	}
966 967
}

968 969 970 971
export class TestWindowsService implements IWindowsService {

	_serviceBrand: any;

972 973
	public windowCount = 1;

974 975 976
	onWindowOpen: Event<number>;
	onWindowFocus: Event<number>;

977 978 979 980
	isFocused(windowId: number): TPromise<boolean> {
		return TPromise.as(false);
	}

B
renames  
Benjamin Pasero 已提交
981
	pickFileFolderAndOpen(windowId: number, forceNewWindow?: boolean): TPromise<void> {
982 983
		return TPromise.as(void 0);
	}
984

B
renames  
Benjamin Pasero 已提交
985
	pickFileAndOpen(windowId: number, forceNewWindow?: boolean, path?: string): TPromise<void> {
986 987
		return TPromise.as(void 0);
	}
988

B
renames  
Benjamin Pasero 已提交
989
	pickFolderAndOpen(windowId: number, forceNewWindow?: boolean): TPromise<void> {
990 991
		return TPromise.as(void 0);
	}
992

993
	pickFolder(windowId: number, options?: { buttonLabel: string; title: string; }): TPromise<string[]> {
994 995 996
		return TPromise.as([]);
	}

997 998 999
	reloadWindow(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
1000

1001 1002 1003
	openDevTools(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
1004

1005 1006 1007
	toggleDevTools(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
1008

1009 1010 1011 1012
	// TODO@joao: rename, shouldn't this be closeWindow?
	closeFolder(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
1013

1014 1015 1016
	toggleFullScreen(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
1017

1018 1019 1020
	setRepresentedFilename(windowId: number, fileName: string): TPromise<void> {
		return TPromise.as(void 0);
	}
1021

1022
	addToRecentlyOpened(recent: (IWorkspaceIdentifier | IRecentlyOpenedFile)[]): TPromise<void> {
1023 1024
		return TPromise.as(void 0);
	}
1025

1026
	removeFromRecentlyOpened(arg1: (IWorkspaceIdentifier | string)[]): TPromise<void> {
1027 1028
		return TPromise.as(void 0);
	}
1029

B
Benjamin Pasero 已提交
1030
	clearRecentlyOpened(): TPromise<void> {
C
22768  
Cristian 已提交
1031 1032
		return TPromise.as(void 0);
	}
1033

1034
	getRecentlyOpened(windowId: number): TPromise<IRecentlyOpened> {
1035 1036
		return TPromise.as(void 0);
	}
1037

1038 1039 1040
	focusWindow(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
1041

1042 1043 1044 1045
	closeWindow(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}

1046 1047 1048
	isMaximized(windowId: number): TPromise<boolean> {
		return TPromise.as(void 0);
	}
1049

1050 1051 1052
	maximizeWindow(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
1053

1054 1055 1056
	unmaximizeWindow(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
1057

1058 1059 1060
	onWindowTitleDoubleClick(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
1061

1062 1063 1064
	setDocumentEdited(windowId: number, flag: boolean): TPromise<void> {
		return TPromise.as(void 0);
	}
1065

1066 1067 1068
	quit(): TPromise<void> {
		return TPromise.as(void 0);
	}
1069

J
Johannes Rieken 已提交
1070 1071 1072
	relaunch(options: { addArgs?: string[], removeArgs?: string[] }): TPromise<void> {
		return TPromise.as(void 0);
	}
1073

1074 1075 1076
	whenSharedProcessReady(): TPromise<void> {
		return TPromise.as(void 0);
	}
1077

1078 1079 1080
	toggleSharedProcess(): TPromise<void> {
		return TPromise.as(void 0);
	}
1081

1082
	// Global methods
1083
	openWindow(paths: string[], options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean }): TPromise<void> {
1084 1085
		return TPromise.as(void 0);
	}
1086

1087 1088 1089
	openNewWindow(): TPromise<void> {
		return TPromise.as(void 0);
	}
1090

1091 1092 1093
	showWindow(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
1094

1095
	getWindows(): TPromise<{ id: number; workspace?: IWorkspaceIdentifier; folderPath?: string; title: string; filename?: string; }[]> {
1096 1097
		return TPromise.as(void 0);
	}
1098

1099
	getWindowCount(): TPromise<number> {
1100
		return TPromise.as(this.windowCount);
1101
	}
1102

1103 1104 1105
	log(severity: string, ...messages: string[]): TPromise<void> {
		return TPromise.as(void 0);
	}
1106

1107
	// TODO@joao: what?
B
Benjamin Pasero 已提交
1108
	closeExtensionHostWindow(extensionDevelopmentPaths: string[]): TPromise<void> {
1109 1110
		return TPromise.as(void 0);
	}
1111

1112 1113 1114 1115 1116 1117
	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
1118 1119
	openExternal(url: string): TPromise<boolean> {
		return TPromise.as(true);
1120 1121 1122 1123 1124 1125
	}

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