workbenchTestServices.ts 24.7 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 30
import { IEventService } from 'vs/platform/event/common/event';
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';
31
import { ILifecycleService, ShutdownEvent, ShutdownReason } 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 } from 'vs/workbench/services/group/common/groupService';
36
import { TextFileService } from 'vs/workbench/services/textfile/common/textFileService';
J
Johannes Rieken 已提交
37
import { IFileService, IResolveContentOptions, IFileOperationResult } from 'vs/platform/files/common/files';
S
Sandeep Somavarapu 已提交
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 48
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';
49
import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService';
50
import { IWindowsService, IWindowService } from 'vs/platform/windows/common/windows';
S
Sandeep Somavarapu 已提交
51
import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace';
B
Benjamin Pasero 已提交
52

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

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

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

	private workspace: any;
	private options: any;

65
	constructor(workspace: any = TestWorkspace, options: any = null) {
E
Erich Gamma 已提交
66
		this.workspace = workspace;
67
		this.options = options || Object.create(null);
E
Erich Gamma 已提交
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
	}

	public getWorkspace(): IWorkspace {
		return this.workspace;
	}

	public getOptions() {
		return this.options;
	}

	public updateOptions() {

	}

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

		return false;
	}

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

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

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

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

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

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

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

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

			return TPromise.wrapError(error);
		}

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

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

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

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

	public showHotExitMessage(): void { }
A
Alex Dima 已提交
165 166
}

167
export function workbenchInstantiationService(): IInstantiationService {
168
	let instantiationService = new TestInstantiationService(new ServiceCollection([ILifecycleService, new TestLifecycleService()]));
169 170 171 172 173 174 175 176
	instantiationService.stub(IEventService, new TestEventService());
	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());
177
	instantiationService.stub(IModeService, ModeServiceImpl);
178
	instantiationService.stub(IHistoryService, {});
179
	instantiationService.stub(IHistoryService, 'getHistory', []);
S
Sandeep Somavarapu 已提交
180
	instantiationService.stub(IModelService, instantiationService.createInstance(ModelServiceImpl));
181
	instantiationService.stub(IFileService, TestFileService);
182
	instantiationService.stub(IBackupFileService, new TestBackupFileService());
183 184
	instantiationService.stub(ITelemetryService, NullTelemetryService);
	instantiationService.stub(IMessageService, new TestMessageService());
B
Benjamin Pasero 已提交
185
	instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService));
186
	instantiationService.stub(ITextFileService, <ITextFileService>instantiationService.createInstance(TestTextFileService));
B
Benjamin Pasero 已提交
187
	instantiationService.stub(ITextModelResolverService, <ITextModelResolverService>instantiationService.createInstance(TextModelResolverService));
188
	instantiationService.stub(IWindowsService, new TestWindowsService());
189 190 191 192

	return instantiationService;
}

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

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

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

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

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

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

	public isCreated(): boolean {
		return true;
	}

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

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

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

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

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

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

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

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

	public setActivityBarHidden(hidden: boolean): void { }

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

	public setSideBarHidden(hidden: boolean): void { }

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

I
isidor 已提交
280
	public setPanelHidden(hidden: boolean): void { }
I
isidor 已提交
281

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

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

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

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

295
export class TestEventService extends EventEmitter implements IEventService {
296
	public _serviceBrand: any;
E
Erich Gamma 已提交
297 298
}

299
export class TestStorageService extends EventEmitter implements IStorageService {
300
	public _serviceBrand: any;
E
Erich Gamma 已提交
301

B
Benjamin Pasero 已提交
302
	private storage: StorageService;
E
Erich Gamma 已提交
303 304 305 306 307

	constructor() {
		super();

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

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

336
export class TestEditorGroupService implements IEditorGroupService {
337
	public _serviceBrand: any;
338 339

	private stacksModel: EditorStacksModel;
340 341 342

	private _onEditorsChanged: Emitter<void>;
	private _onEditorOpenFail: Emitter<IEditorInput>;
343
	private _onEditorsMoved: Emitter<void>;
344
	private _onGroupOrientationChanged: Emitter<void>;
345 346

	constructor(callback?: (method: string) => void) {
347
		this._onEditorsMoved = new Emitter<void>();
348
		this._onEditorsChanged = new Emitter<void>();
349
		this._onGroupOrientationChanged = new Emitter<void>();
350 351
		this._onEditorOpenFail = new Emitter<IEditorInput>();

352 353 354
		let services = new ServiceCollection();

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

		let inst = new InstantiationService(services);

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

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

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

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

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

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

386 387 388
	public focusGroup(group: IEditorGroup): void;
	public focusGroup(position: Position): void;
	public focusGroup(arg1: any): void {
389 390 391

	}

392 393 394
	public activateGroup(group: IEditorGroup): void;
	public activateGroup(position: Position): void;
	public activateGroup(arg1: any): void {
395 396 397

	}

398 399 400
	public moveGroup(from: IEditorGroup, to: IEditorGroup): void;
	public moveGroup(from: Position, to: Position): void;
	public moveGroup(arg1: any, arg2: any): void {
401 402 403 404 405 406 407

	}

	public arrangeGroups(arrangement: GroupArrangement): void {

	}

408 409 410 411 412 413 414 415
	public setGroupOrientation(orientation: GroupOrientation): void {

	}

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

416 417 418
	public pinEditor(group: IEditorGroup, input: IEditorInput): void;
	public pinEditor(position: Position, input: IEditorInput): void;
	public pinEditor(arg1: any, input: IEditorInput): void {
419 420
	}

421 422 423
	public unpinEditor(group: IEditorGroup, input: IEditorInput): void;
	public unpinEditor(position: Position, input: IEditorInput): void;
	public unpinEditor(arg1: any, input: IEditorInput): void {
424 425
	}

426 427 428
	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 {
429 430 431 432 433 434 435
	}

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

436
export class TestEditorService implements IWorkbenchEditorService {
437
	public _serviceBrand: any;
E
Erich Gamma 已提交
438

B
Benjamin Pasero 已提交
439 440 441
	public activeEditorInput: IEditorInput;
	public activeEditorOptions: IEditorOptions;
	public activeEditorPosition: Position;
E
Erich Gamma 已提交
442 443 444 445 446

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

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

B
Benjamin Pasero 已提交
449
	public openEditors(inputs): Promise {
A
Alex Dima 已提交
450
		return TPromise.as([]);
E
Erich Gamma 已提交
451 452
	}

453 454 455 456
	public replaceEditors(editors): TPromise<IEditor[]> {
		return TPromise.as([]);
	}

457 458 459 460
	public closeEditors(position: Position, except?: IEditorInput, direction?: Direction): TPromise<void> {
		return TPromise.as(null);
	}

461
	public closeAllEditors(except?: Position): TPromise<void> {
A
Alex Dima 已提交
462
		return TPromise.as(null);
E
Erich Gamma 已提交
463 464 465 466 467 468 469 470 471 472 473 474 475 476 477
	}

	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 已提交
478
		return this.activeEditorInput;
E
Erich Gamma 已提交
479 480 481 482 483 484 485 486 487 488 489 490 491 492 493
	}

	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 已提交
494
		return TPromise.as(null);
E
Erich Gamma 已提交
495 496
	}

497
	public closeEditor(position: Position, input: IEditorInput): TPromise<void> {
E
Erich Gamma 已提交
498 499 500 501 502
		this.callback('closeEditor');

		return TPromise.as(null);
	}

503
	public createInput(input: IResourceInput): TPromise<IEditorInput> {
A
Alex Dima 已提交
504
		return TPromise.as(null);
E
Erich Gamma 已提交
505 506 507 508
	}
}

export const TestFileService = {
B
Benjamin Pasero 已提交
509
	resolveContent: function (resource) {
A
Alex Dima 已提交
510
		return TPromise.as({
E
Erich Gamma 已提交
511 512 513
			resource: resource,
			value: 'Hello Html',
			etag: 'index.txt',
B
Benjamin Pasero 已提交
514
			encoding: 'utf8',
B
Benjamin Pasero 已提交
515 516 517 518 519 520 521 522 523 524 525
			mtime: Date.now(),
			name: paths.basename(resource.fsPath)
		});
	},

	resolveFile: function (resource) {
		return TPromise.as({
			resource: resource,
			etag: Date.now(),
			encoding: 'utf8',
			mtime: Date.now(),
526
			name: paths.basename(resource.fsPath)
E
Erich Gamma 已提交
527 528 529
		});
	},

A
Alex Dima 已提交
530 531 532 533
	resolveStreamContent: function (resource) {
		return TPromise.as({
			resource: resource,
			value: {
534
				on: (event: string, callback: Function): void => {
A
Alex Dima 已提交
535 536 537 538 539 540 541 542 543 544
					if (event === 'data') {
						callback('Hello Html');
					}
					if (event === 'end') {
						callback();
					}
				}
			},
			etag: 'index.txt',
			encoding: 'utf8',
B
Benjamin Pasero 已提交
545
			mtime: Date.now(),
546
			name: paths.basename(resource.fsPath)
A
Alex Dima 已提交
547 548 549
		});
	},

B
Benjamin Pasero 已提交
550
	updateContent: function (res) {
551
		return TPromise.timeout(1).then(() => {
E
Erich Gamma 已提交
552 553 554
			return {
				resource: res,
				etag: 'index.txt',
B
Benjamin Pasero 已提交
555
				encoding: 'utf8',
B
Benjamin Pasero 已提交
556
				mtime: Date.now(),
557
				name: paths.basename(res.fsPath)
E
Erich Gamma 已提交
558 559
			};
		});
D
Daniel Imms 已提交
560 561
	},

D
Daniel Imms 已提交
562 563 564 565
	backupFile: function (resource: URI, content: string) {
		return TPromise.as(void 0);
	},

D
Daniel Imms 已提交
566 567 568 569
	discardBackup: function (resource: URI) {
		return TPromise.as(void 0);
	},

D
Daniel Imms 已提交
570 571
	discardBackups: function () {
		return TPromise.as(void 0);
E
Erich Gamma 已提交
572
	}
B
linting  
Benjamin Pasero 已提交
573
};
574

575 576
export class TestBackupFileService implements IBackupFileService {
	public _serviceBrand: any;
577 578 579 580 581

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

582
	public hasBackup(resource: URI): TPromise<boolean> {
583 584 585
		return TPromise.as(false);
	}

B
Benjamin Pasero 已提交
586 587 588 589 590 591 592 593 594 595
	public loadBackupResource(resource: URI): TPromise<URI> {
		return this.hasBackup(resource).then(hasBackup => {
			if (hasBackup) {
				return this.getBackupResource(resource);
			}

			return void 0;
		});
	}

D
Daniel Imms 已提交
596 597 598 599 600 601 602 603 604 605 606
	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;
	}
607

608
	public backupResource(resource: URI, content: string): TPromise<void> {
609 610 611
		return TPromise.as(void 0);
	}

612
	public getWorkspaceFileBackups(): TPromise<URI[]> {
613 614 615
		return TPromise.as([]);
	}

616 617 618 619
	public parseBackupContent(rawText: IRawTextContent): string {
		return rawText.value.lines.join('\n');
	}

620
	public discardResourceBackup(resource: URI): TPromise<void> {
621 622 623
		return TPromise.as(void 0);
	}

624
	public discardAllWorkspaceBackups(): TPromise<void> {
625 626
		return TPromise.as(void 0);
	}
D
Daniel Imms 已提交
627 628
};

629 630 631 632 633 634 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 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709
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);
	}

	toggleMenuBar(): 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);
	}
}

710 711
export class TestLifecycleService implements ILifecycleService {

712
	public _serviceBrand: any;
713

714
	public willShutdown: boolean;
715

716
	private _onWillShutdown = new Emitter<ShutdownEvent>();
717
	private _onShutdown = new Emitter<ShutdownReason>();
718 719 720 721

	constructor() {
	}

722 723
	public fireShutdown(reason = ShutdownReason.QUIT): void {
		this._onShutdown.fire(reason);
724 725
	}

726 727 728 729
	public fireWillShutdown(event: ShutdownEvent): void {
		this._onWillShutdown.fire(event);
	}

730 731 732 733
	public get onWillShutdown(): Event<ShutdownEvent> {
		return this._onWillShutdown.event;
	}

734
	public get onShutdown(): Event<ShutdownReason> {
735 736
		return this._onShutdown.event;
	}
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 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843
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);
	}
	toggleMenuBar(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
	quit(): TPromise<void> {
		return TPromise.as(void 0);
	}

	// Global methods
	// TODO@joao: rename, shouldn't this be openWindow?
	windowOpen(paths: string[], forceNewWindow?: boolean): TPromise<void> {
		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);
	}
}