workbenchTestServices.ts 26.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';
J
Johannes Rieken 已提交
15
import { ITelemetryService, NullTelemetryService } from 'vs/platform/telemetry/common/telemetry';
16
import { StorageService, InMemoryLocalStorage } from 'vs/platform/storage/common/storageService';
17
import { IEditorGroup, ConfirmResult } from 'vs/workbench/common/editor';
J
Johannes Rieken 已提交
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 23
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
import { IPartService } from 'vs/workbench/services/part/common/partService';
24
import { TextModelResolverService } from 'vs/workbench/services/textmodelResolver/common/textModelResolverService';
25
import { ITextModelResolverService } from 'vs/editor/common/services/resolverService';
26
import { IEditorInput, IEditorOptions, Position, Direction, IEditor, IResourceInput } from 'vs/platform/editor/common/editor';
J
Johannes Rieken 已提交
27 28 29
import { IUntitledEditorService, UntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService';
import { IMessageService, IConfirmation } from 'vs/platform/message/common/message';
import { IWorkspace, IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
30
import { ILifecycleService, ShutdownEvent, ShutdownReason } from 'vs/platform/lifecycle/common/lifecycle';
J
Johannes Rieken 已提交
31 32 33
import { EditorStacksModel } from 'vs/workbench/common/editor/editorStacksModel';
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService';
I
isidor 已提交
34
import { IEditorGroupService, GroupArrangement, GroupOrientation, ITabOptions } from 'vs/workbench/services/group/common/groupService';
35
import { TextFileService } from 'vs/workbench/services/textfile/common/textFileService';
36
import { FileOperationEvent, IFileService, IResolveContentOptions, IFileOperationResult, IFileStat, IImportResult, FileChangesEvent, IResolveFileOptions, IContent, IUpdateContentOptions, IStreamContent } from 'vs/platform/files/common/files';
S
Sandeep Somavarapu 已提交
37
import { IModelService } from 'vs/editor/common/services/modelService';
38
import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl';
J
Johannes Rieken 已提交
39 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 { RawText } from 'vs/editor/common/model/textModel';
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';
B
Benjamin Pasero 已提交
51

S
Sandeep Somavarapu 已提交
52 53 54 55
export function createFileInput(instantiationService: IInstantiationService, resource: URI): FileEditorInput {
	return instantiationService.createInstance(FileEditorInput, resource, void 0);
}

56
export const TestEnvironmentService = new EnvironmentService(parseArgs(process.argv), process.execPath);
57

58
export class TestContextService implements IWorkspaceContextService {
59
	public _serviceBrand: any;
E
Erich Gamma 已提交
60 61 62 63

	private workspace: any;
	private options: any;

64
	constructor(workspace: any = TestWorkspace, options: any = null) {
E
Erich Gamma 已提交
65
		this.workspace = workspace;
66
		this.options = options || Object.create(null);
E
Erich Gamma 已提交
67 68
	}

B
Benjamin Pasero 已提交
69 70 71 72
	public hasWorkspace(): boolean {
		return !!this.workspace;
	}

E
Erich Gamma 已提交
73 74 75 76 77 78 79 80 81 82 83 84 85 86
	public getWorkspace(): IWorkspace {
		return this.workspace;
	}

	public getOptions() {
		return this.options;
	}

	public updateOptions() {

	}

	public isInsideWorkspace(resource: URI): boolean {
		if (resource && this.workspace) {
87
			return paths.isEqualOrParent(resource.fsPath, this.workspace.resource.fsPath);
E
Erich Gamma 已提交
88 89 90 91 92 93
		}

		return false;
	}

	public toWorkspaceRelativePath(resource: URI): string {
94
		return paths.makePosixAbsolute(paths.normalize(resource.fsPath.substr('c:'.length)));
E
Erich Gamma 已提交
95 96 97
	}

	public toResource(workspaceRelativePath: string): URI {
98
		return URI.file(paths.join('C:\\', workspaceRelativePath));
E
Erich Gamma 已提交
99 100 101
	}
}

102 103 104
export class TestTextFileService extends TextFileService {
	private promptPath: string;
	private confirmResult: ConfirmResult;
105
	private resolveTextContentError: IFileOperationResult;
A
Alex Dima 已提交
106 107

	constructor(
108 109
		@ILifecycleService lifecycleService: ILifecycleService,
		@IWorkspaceContextService contextService: IWorkspaceContextService,
A
Alex Dima 已提交
110 111
		@IConfigurationService configurationService: IConfigurationService,
		@ITelemetryService telemetryService: ITelemetryService,
112
		@IWorkbenchEditorService editorService: IWorkbenchEditorService,
A
Alex Dima 已提交
113
		@IFileService fileService: IFileService,
114
		@IUntitledEditorService untitledEditorService: IUntitledEditorService,
115
		@IInstantiationService instantiationService: IInstantiationService,
116 117 118
		@IMessageService messageService: IMessageService,
		@IBackupFileService backupFileService: IBackupFileService,
		@IWindowsService windowsService: IWindowsService
A
Alex Dima 已提交
119
	) {
B
Benjamin Pasero 已提交
120
		super(lifecycleService, contextService, configurationService, telemetryService, fileService, untitledEditorService, instantiationService, messageService, TestEnvironmentService, backupFileService, windowsService);
A
Alex Dima 已提交
121
	}
122

123 124 125 126 127 128 129 130
	public setPromptPath(path: string): void {
		this.promptPath = path;
	}

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

131 132 133 134
	public setResolveTextContentErrorOnce(error: IFileOperationResult): void {
		this.resolveTextContentError = error;
	}

135
	public resolveTextContent(resource: URI, options?: IResolveContentOptions): TPromise<IRawTextContent> {
136 137 138 139 140 141 142
		if (this.resolveTextContentError) {
			const error = this.resolveTextContentError;
			this.resolveTextContentError = null;

			return TPromise.wrapError(error);
		}

143 144 145
		return this.fileService.resolveContent(resource, options).then((content) => {
			const raw = RawText.fromString(content.value, { defaultEOL: 1, detectIndentation: false, insertSpaces: false, tabSize: 4, trimAutoWhitespace: false });

146
			return <IRawTextContent>{
147
				resource: content.resource,
148 149 150 151 152 153
				name: content.name,
				mtime: content.mtime,
				etag: content.etag,
				encoding: content.encoding,
				value: raw,
				valueLogicalHash: null
154 155 156
			};
		});
	}
157 158 159 160 161 162 163 164

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

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

	public showHotExitMessage(): void { }
A
Alex Dima 已提交
167 168
}

169
export function workbenchInstantiationService(): IInstantiationService {
170
	let instantiationService = new TestInstantiationService(new ServiceCollection([ILifecycleService, new TestLifecycleService()]));
171 172 173 174 175 176 177
	instantiationService.stub(IWorkspaceContextService, new TestContextService(TestWorkspace));
	instantiationService.stub(IConfigurationService, new TestConfigurationService());
	instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService));
	instantiationService.stub(IStorageService, new TestStorageService());
	instantiationService.stub(IWorkbenchEditorService, new TestEditorService(function () { }));
	instantiationService.stub(IPartService, new TestPartService());
	instantiationService.stub(IEditorGroupService, new TestEditorGroupService());
178
	instantiationService.stub(IModeService, ModeServiceImpl);
179
	instantiationService.stub(IHistoryService, {});
180
	instantiationService.stub(IHistoryService, 'getHistory', []);
S
Sandeep Somavarapu 已提交
181
	instantiationService.stub(IModelService, instantiationService.createInstance(ModelServiceImpl));
182
	instantiationService.stub(IFileService, new TestFileService());
183
	instantiationService.stub(IBackupFileService, new TestBackupFileService());
184 185
	instantiationService.stub(ITelemetryService, NullTelemetryService);
	instantiationService.stub(IMessageService, new TestMessageService());
B
Benjamin Pasero 已提交
186
	instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService));
187
	instantiationService.stub(ITextFileService, <ITextFileService>instantiationService.createInstance(TestTextFileService));
B
Benjamin Pasero 已提交
188
	instantiationService.stub(ITextModelResolverService, <ITextModelResolverService>instantiationService.createInstance(TextModelResolverService));
189
	instantiationService.stub(IWindowsService, new TestWindowsService());
190 191 192 193

	return instantiationService;
}

E
Erich Gamma 已提交
194
export class TestMessageService implements IMessageService {
195
	public _serviceBrand: any;
E
Erich Gamma 已提交
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221

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

222
export class TestPartService implements IPartService {
223
	public _serviceBrand: any;
E
Erich Gamma 已提交
224

225 226 227 228 229 230
	private _onTitleBarVisibilityChange = new Emitter<void>();

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

E
Erich Gamma 已提交
231 232 233 234 235 236 237
	public layout(): void { }

	public isCreated(): boolean {
		return true;
	}

	public joinCreation(): Promise {
A
Alex Dima 已提交
238
		return TPromise.as(null);
E
Erich Gamma 已提交
239 240 241 242 243 244 245 246 247 248
	}

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

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

249 250 251 252
	public getContainer(part): HTMLElement {
		return null;
	}

B
Benjamin Pasero 已提交
253 254 255 256
	public isTitleBarHidden(): boolean {
		return false;
	}

257 258 259 260
	public getTitleBarOffset(): number {
		return 0;
	}

261 262 263 264
	public isStatusBarHidden(): boolean {
		return false;
	}

S
Sanders Lauture 已提交
265 266 267 268 269 270
	public isActivityBarHidden(): boolean {
		return false;
	}

	public setActivityBarHidden(hidden: boolean): void { }

E
Erich Gamma 已提交
271 272 273 274
	public isSideBarHidden(): boolean {
		return false;
	}

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

I
isidor 已提交
277
	public isPanelHidden(): boolean {
I
isidor 已提交
278 279 280
		return false;
	}

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

I
isidor 已提交
283 284
	public toggleMaximizedPanel(): void { }

E
Erich Gamma 已提交
285 286 287 288 289 290
	public getSideBarPosition() {
		return 0;
	}

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

I
isidor 已提交
293
	public toggleZenMode(): void { }
E
Erich Gamma 已提交
294 295
}

296
export class TestStorageService extends EventEmitter implements IStorageService {
297
	public _serviceBrand: any;
E
Erich Gamma 已提交
298

B
Benjamin Pasero 已提交
299
	private storage: StorageService;
E
Erich Gamma 已提交
300 301 302 303 304

	constructor() {
		super();

		let context = new TestContextService();
B
Benjamin Pasero 已提交
305
		this.storage = new StorageService(new InMemoryLocalStorage(), null, context);
E
Erich Gamma 已提交
306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
	}

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

333
export class TestEditorGroupService implements IEditorGroupService {
334
	public _serviceBrand: any;
335 336

	private stacksModel: EditorStacksModel;
337 338 339

	private _onEditorsChanged: Emitter<void>;
	private _onEditorOpenFail: Emitter<IEditorInput>;
340
	private _onEditorsMoved: Emitter<void>;
341
	private _onGroupOrientationChanged: Emitter<void>;
I
isidor 已提交
342
	private _onTabOptionsChanged: Emitter<ITabOptions>;
343 344

	constructor(callback?: (method: string) => void) {
345
		this._onEditorsMoved = new Emitter<void>();
346
		this._onEditorsChanged = new Emitter<void>();
347
		this._onGroupOrientationChanged = new Emitter<void>();
348
		this._onEditorOpenFail = new Emitter<IEditorInput>();
I
isidor 已提交
349
		this._onTabOptionsChanged = new Emitter<ITabOptions>();
350

351 352 353
		let services = new ServiceCollection();

		services.set(IStorageService, new TestStorageService());
354
		services.set(IConfigurationService, new TestConfigurationService());
355
		services.set(IWorkspaceContextService, new TestContextService());
356 357
		const lifecycle = new TestLifecycleService();
		services.set(ILifecycleService, lifecycle);
358
		services.set(ITelemetryService, NullTelemetryService);
359 360 361

		let inst = new InstantiationService(services);

362
		this.stacksModel = inst.createInstance(EditorStacksModel, true);
363 364
	}

365 366 367 368 369 370 371 372 373 374 375 376
	public fireChange(): void {
		this._onEditorsChanged.fire();
	}

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

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

377 378 379 380
	public get onEditorsMoved(): Event<void> {
		return this._onEditorsMoved.event;
	}

381 382 383 384
	public get onGroupOrientationChanged(): Event<void> {
		return this._onGroupOrientationChanged.event;
	}

I
isidor 已提交
385 386
	public get onTabOptionsChanged(): Event<ITabOptions> {
		return this._onTabOptionsChanged.event;
387 388
	}

389 390 391
	public focusGroup(group: IEditorGroup): void;
	public focusGroup(position: Position): void;
	public focusGroup(arg1: any): void {
392 393 394

	}

395 396 397
	public activateGroup(group: IEditorGroup): void;
	public activateGroup(position: Position): void;
	public activateGroup(arg1: any): void {
398 399 400

	}

401 402 403
	public moveGroup(from: IEditorGroup, to: IEditorGroup): void;
	public moveGroup(from: Position, to: Position): void;
	public moveGroup(arg1: any, arg2: any): void {
404 405 406 407 408 409 410

	}

	public arrangeGroups(arrangement: GroupArrangement): void {

	}

411 412 413 414 415 416 417 418
	public setGroupOrientation(orientation: GroupOrientation): void {

	}

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

419 420 421
	public pinEditor(group: IEditorGroup, input: IEditorInput): void;
	public pinEditor(position: Position, input: IEditorInput): void;
	public pinEditor(arg1: any, input: IEditorInput): void {
422 423
	}

424 425 426
	public unpinEditor(group: IEditorGroup, input: IEditorInput): void;
	public unpinEditor(position: Position, input: IEditorInput): void;
	public unpinEditor(arg1: any, input: IEditorInput): void {
427 428
	}

429 430 431
	public moveEditor(input: IEditorInput, from: IEditorGroup, to: IEditorGroup, index?: number): void;
	public moveEditor(input: IEditorInput, from: Position, to: Position, index?: number): void;
	public moveEditor(input: IEditorInput, from: any, to: any, index?: number): void {
432 433 434 435 436
	}

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

I
isidor 已提交
438 439
	public getTabOptions(): ITabOptions {
		return {};
440
	}
441 442
}

443
export class TestEditorService implements IWorkbenchEditorService {
444
	public _serviceBrand: any;
E
Erich Gamma 已提交
445

B
Benjamin Pasero 已提交
446 447 448
	public activeEditorInput: IEditorInput;
	public activeEditorOptions: IEditorOptions;
	public activeEditorPosition: Position;
E
Erich Gamma 已提交
449 450 451 452 453

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

	constructor(callback?: (method: string) => void) {
		this.callback = callback || ((s: string) => { });
B
Benjamin Pasero 已提交
454 455
	}

B
Benjamin Pasero 已提交
456
	public openEditors(inputs): Promise {
A
Alex Dima 已提交
457
		return TPromise.as([]);
E
Erich Gamma 已提交
458 459
	}

460 461 462 463
	public replaceEditors(editors): TPromise<IEditor[]> {
		return TPromise.as([]);
	}

464 465 466 467
	public closeEditors(position: Position, except?: IEditorInput, direction?: Direction): TPromise<void> {
		return TPromise.as(null);
	}

468
	public closeAllEditors(except?: Position): TPromise<void> {
A
Alex Dima 已提交
469
		return TPromise.as(null);
E
Erich Gamma 已提交
470 471 472 473 474 475 476 477 478 479 480 481 482 483 484
	}

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

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

		return null;
	}

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

B
Benjamin Pasero 已提交
485
		return this.activeEditorInput;
E
Erich Gamma 已提交
486 487 488 489 490 491 492 493 494 495 496 497 498 499 500
	}

	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 已提交
501
		return TPromise.as(null);
E
Erich Gamma 已提交
502 503
	}

504
	public closeEditor(position: Position, input: IEditorInput): TPromise<void> {
E
Erich Gamma 已提交
505 506 507 508 509
		this.callback('closeEditor');

		return TPromise.as(null);
	}

510
	public createInput(input: IResourceInput): TPromise<IEditorInput> {
A
Alex Dima 已提交
511
		return TPromise.as(null);
E
Erich Gamma 已提交
512 513 514
	}
}

515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543
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 已提交
544
		return TPromise.as({
545 546
			resource,
			etag: Date.now().toString(),
B
Benjamin Pasero 已提交
547
			encoding: 'utf8',
B
Benjamin Pasero 已提交
548
			mtime: Date.now(),
549 550
			isDirectory: false,
			hasChildren: false,
B
Benjamin Pasero 已提交
551 552
			name: paths.basename(resource.fsPath)
		});
553
	}
B
Benjamin Pasero 已提交
554

555 556 557
	existsFile(resource: URI): TPromise<boolean> {
		return TPromise.as(null);
	}
B
Benjamin Pasero 已提交
558

559
	resolveContent(resource: URI, options?: IResolveContentOptions): TPromise<IContent> {
B
Benjamin Pasero 已提交
560 561
		return TPromise.as({
			resource: resource,
562 563
			value: 'Hello Html',
			etag: 'index.txt',
B
Benjamin Pasero 已提交
564 565
			encoding: 'utf8',
			mtime: Date.now(),
566
			name: paths.basename(resource.fsPath)
E
Erich Gamma 已提交
567
		});
568
	}
E
Erich Gamma 已提交
569

570
	resolveStreamContent(resource: URI, options?: IResolveContentOptions): TPromise<IStreamContent> {
A
Alex Dima 已提交
571 572 573
		return TPromise.as({
			resource: resource,
			value: {
574
				on: (event: string, callback: Function): void => {
A
Alex Dima 已提交
575 576 577 578 579 580 581 582 583 584
					if (event === 'data') {
						callback('Hello Html');
					}
					if (event === 'end') {
						callback();
					}
				}
			},
			etag: 'index.txt',
			encoding: 'utf8',
B
Benjamin Pasero 已提交
585
			mtime: Date.now(),
586
			name: paths.basename(resource.fsPath)
A
Alex Dima 已提交
587
		});
588 589 590 591 592
	}

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

594
	updateContent(resource: URI, value: string, options?: IUpdateContentOptions): TPromise<IFileStat> {
595
		return TPromise.timeout(1).then(() => {
E
Erich Gamma 已提交
596
			return {
597
				resource,
E
Erich Gamma 已提交
598
				etag: 'index.txt',
B
Benjamin Pasero 已提交
599
				encoding: 'utf8',
B
Benjamin Pasero 已提交
600
				mtime: Date.now(),
601 602 603
				isDirectory: false,
				hasChildren: false,
				name: paths.basename(resource.fsPath)
E
Erich Gamma 已提交
604 605
			};
		});
606
	}
D
Daniel Imms 已提交
607

608 609 610
	moveFile(source: URI, target: URI, overwrite?: boolean): TPromise<IFileStat> {
		return TPromise.as(null);
	}
D
Daniel Imms 已提交
611

612 613 614
	copyFile(source: URI, target: URI, overwrite?: boolean): TPromise<IFileStat> {
		return TPromise.as(null);
	}
D
Daniel Imms 已提交
615

616 617
	createFile(resource: URI, content?: string): TPromise<IFileStat> {
		return TPromise.as(null);
E
Erich Gamma 已提交
618
	}
619 620 621 622 623 624 625 626

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

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

628 629 630 631 632 633 634 635 636 637 638
	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 已提交
639

640 641 642 643 644 645 646 647 648 649 650 651 652 653
	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 已提交
654

655
	dispose(): void {
E
Erich Gamma 已提交
656
	}
657
}
658

659 660
export class TestBackupFileService implements IBackupFileService {
	public _serviceBrand: any;
661 662 663 664 665

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

666
	public hasBackup(resource: URI): TPromise<boolean> {
667 668 669
		return TPromise.as(false);
	}

B
Benjamin Pasero 已提交
670 671 672 673 674 675 676 677 678 679
	public loadBackupResource(resource: URI): TPromise<URI> {
		return this.hasBackup(resource).then(hasBackup => {
			if (hasBackup) {
				return this.getBackupResource(resource);
			}

			return void 0;
		});
	}

D
Daniel Imms 已提交
680 681 682 683 684 685 686 687 688 689 690
	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;
	}
691

692
	public backupResource(resource: URI, content: string): TPromise<void> {
693 694 695
		return TPromise.as(void 0);
	}

696
	public getWorkspaceFileBackups(): TPromise<URI[]> {
697 698 699
		return TPromise.as([]);
	}

700 701 702 703
	public parseBackupContent(rawText: IRawTextContent): string {
		return rawText.value.lines.join('\n');
	}

704
	public discardResourceBackup(resource: URI): TPromise<void> {
705 706 707
		return TPromise.as(void 0);
	}

708
	public discardAllWorkspaceBackups(): TPromise<void> {
709 710
		return TPromise.as(void 0);
	}
D
Daniel Imms 已提交
711 712
};

713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 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
export class TestWindowService implements IWindowService {

	public _serviceBrand: any;

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

790 791
export class TestLifecycleService implements ILifecycleService {

792
	public _serviceBrand: any;
793

794
	public willShutdown: boolean;
795

796
	private _onWillShutdown = new Emitter<ShutdownEvent>();
797
	private _onShutdown = new Emitter<ShutdownReason>();
798 799 800 801

	constructor() {
	}

802 803
	public fireShutdown(reason = ShutdownReason.QUIT): void {
		this._onShutdown.fire(reason);
804 805
	}

806 807 808 809
	public fireWillShutdown(event: ShutdownEvent): void {
		this._onWillShutdown.fire(event);
	}

810 811 812 813
	public get onWillShutdown(): Event<ShutdownEvent> {
		return this._onWillShutdown.event;
	}

814
	public get onShutdown(): Event<ShutdownReason> {
815 816
		return this._onShutdown.event;
	}
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 878 879 880 881 882
export class TestWindowsService implements IWindowsService {

	_serviceBrand: any;

	onWindowOpen: Event<number>;
	onWindowFocus: Event<number>;

	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);
	}
	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);
	}
	setDocumentEdited(windowId: number, flag: boolean): TPromise<void> {
		return TPromise.as(void 0);
	}
	quit(): TPromise<void> {
		return TPromise.as(void 0);
	}

	// Global methods
883
	openWindow(paths: string[], options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean }): TPromise<void> {
884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918
		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> {
		return TPromise.as(void 0);
	}
	log(severity: string, ...messages: string[]): TPromise<void> {
		return TPromise.as(void 0);
	}
	// TODO@joao: what?
	closeExtensionHostWindow(extensionDevelopmentPath: string): TPromise<void> {
		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
	openExternal(url: string): TPromise<void> {
		return TPromise.as(void 0);
	}

	// TODO: this is a bit backwards
	startCrashReporter(config: Electron.CrashReporterStartOptions): TPromise<void> {
		return TPromise.as(void 0);
	}
919
}