workbenchTestServices.ts 29.9 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 { ITextModelResolverService } from 'vs/editor/common/services/resolverService';
27
import { IEditorInput, IEditorOptions, Position, Direction, IEditor, IResourceInput } from 'vs/platform/editor/common/editor';
J
Johannes Rieken 已提交
28 29 30
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, StartupKind } 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';
B
Benjamin Pasero 已提交
37
import { FileOperationEvent, IFileService, IResolveContentOptions, IFileOperationResult, IFileStat, IImportResult, FileChangesEvent, IResolveFileOptions, IContent, IUpdateContentOptions, IStreamContent, isEqualOrParent } 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, ITheme, DARK } from 'vs/platform/theme/common/themeService';
54
import { Color } from 'vs/base/common/color';
55
import { isLinux } from 'vs/base/common/platform';
B
Benjamin Pasero 已提交
56

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

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

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

	private workspace: any;
	private options: any;

69
	constructor(workspace: any = TestWorkspace, options: any = null) {
E
Erich Gamma 已提交
70
		this.workspace = workspace;
71
		this.options = options || Object.create(null);
E
Erich Gamma 已提交
72 73
	}

B
Benjamin Pasero 已提交
74 75 76 77
	public hasWorkspace(): boolean {
		return !!this.workspace;
	}

E
Erich Gamma 已提交
78 79 80 81
	public getWorkspace(): IWorkspace {
		return this.workspace;
	}

D
Daniel Imms 已提交
82 83 84 85
	public setWorkspace(workspace: any): void {
		this.workspace = workspace;
	}

E
Erich Gamma 已提交
86 87 88 89 90 91 92 93 94 95
	public getOptions() {
		return this.options;
	}

	public updateOptions() {

	}

	public isInsideWorkspace(resource: URI): boolean {
		if (resource && this.workspace) {
96
			return isEqualOrParent(resource.fsPath, this.workspace.resource.fsPath, !isLinux /* ignorecase */);
E
Erich Gamma 已提交
97 98 99 100 101
		}

		return false;
	}

102
	public toWorkspaceRelativePath(resource: URI, toOSPath?: boolean): string {
B
Benjamin Pasero 已提交
103
		return makePosixAbsolute(paths.normalize(resource.fsPath.substr('c:'.length), toOSPath));
E
Erich Gamma 已提交
104 105 106
	}

	public toResource(workspaceRelativePath: string): URI {
107
		return URI.file(paths.join('C:\\', workspaceRelativePath));
E
Erich Gamma 已提交
108 109 110
	}
}

B
Benjamin Pasero 已提交
111 112 113 114 115 116 117 118
function isPosixAbsolute(path: string): boolean {
	return path && path[0] === '/';
}

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

119
export class TestTextFileService extends TextFileService {
120 121
	public cleanupBackupsBeforeShutdownCalled: boolean;

122 123
	private promptPath: string;
	private confirmResult: ConfirmResult;
124
	private resolveTextContentError: IFileOperationResult;
A
Alex Dima 已提交
125 126

	constructor(
127 128
		@ILifecycleService lifecycleService: ILifecycleService,
		@IWorkspaceContextService contextService: IWorkspaceContextService,
A
Alex Dima 已提交
129 130
		@IConfigurationService configurationService: IConfigurationService,
		@ITelemetryService telemetryService: ITelemetryService,
131
		@IWorkbenchEditorService editorService: IWorkbenchEditorService,
A
Alex Dima 已提交
132
		@IFileService fileService: IFileService,
133
		@IUntitledEditorService untitledEditorService: IUntitledEditorService,
134
		@IInstantiationService instantiationService: IInstantiationService,
135 136
		@IMessageService messageService: IMessageService,
		@IBackupFileService backupFileService: IBackupFileService,
B
Benjamin Pasero 已提交
137 138
		@IWindowsService windowsService: IWindowsService,
		@IEditorGroupService editorGroupService: IEditorGroupService
A
Alex Dima 已提交
139
	) {
B
Benjamin Pasero 已提交
140
		super(lifecycleService, contextService, configurationService, telemetryService, fileService, untitledEditorService, instantiationService, messageService, TestEnvironmentService, backupFileService, editorGroupService, windowsService);
A
Alex Dima 已提交
141
	}
142

143 144 145 146 147 148 149 150
	public setPromptPath(path: string): void {
		this.promptPath = path;
	}

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

151 152 153 154
	public setResolveTextContentErrorOnce(error: IFileOperationResult): void {
		this.resolveTextContentError = error;
	}

155
	public resolveTextContent(resource: URI, options?: IResolveContentOptions): TPromise<IRawTextContent> {
156 157 158 159
		if (this.resolveTextContentError) {
			const error = this.resolveTextContentError;
			this.resolveTextContentError = null;

160
			return TPromise.wrapError<IRawTextContent>(error);
161 162
		}

163
		return this.fileService.resolveContent(resource, options).then((content) => {
A
Alex Dima 已提交
164
			const textSource = RawTextSource.fromString(content.value);
165
			return <IRawTextContent>{
166
				resource: content.resource,
167 168 169 170
				name: content.name,
				mtime: content.mtime,
				etag: content.etag,
				encoding: content.encoding,
171
				value: textSource,
172
				valueLogicalHash: null
173 174 175
			};
		});
	}
176 177 178 179 180 181 182 183

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

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

185 186 187 188 189 190 191 192
	public onConfigurationChange(configuration: any): void {
		super.onConfigurationChange(configuration);
	}

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

195
export function workbenchInstantiationService(): IInstantiationService {
196
	let instantiationService = new TestInstantiationService(new ServiceCollection([ILifecycleService, new TestLifecycleService()]));
197 198 199 200
	instantiationService.stub(IWorkspaceContextService, new TestContextService(TestWorkspace));
	instantiationService.stub(IConfigurationService, new TestConfigurationService());
	instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService));
	instantiationService.stub(IStorageService, new TestStorageService());
201
	instantiationService.stub(IWorkbenchEditorService, new TestEditorService());
202 203
	instantiationService.stub(IPartService, new TestPartService());
	instantiationService.stub(IEditorGroupService, new TestEditorGroupService());
204
	instantiationService.stub(IModeService, ModeServiceImpl);
205
	instantiationService.stub(IHistoryService, {});
206
	instantiationService.stub(IHistoryService, 'getHistory', []);
S
Sandeep Somavarapu 已提交
207
	instantiationService.stub(IModelService, instantiationService.createInstance(ModelServiceImpl));
208
	instantiationService.stub(IFileService, new TestFileService());
209
	instantiationService.stub(IBackupFileService, new TestBackupFileService());
210 211
	instantiationService.stub(ITelemetryService, NullTelemetryService);
	instantiationService.stub(IMessageService, new TestMessageService());
B
Benjamin Pasero 已提交
212
	instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService));
213
	instantiationService.stub(IWindowsService, new TestWindowsService());
214
	instantiationService.stub(ITextFileService, <ITextFileService>instantiationService.createInstance(TestTextFileService));
B
Benjamin Pasero 已提交
215
	instantiationService.stub(ITextModelResolverService, <ITextModelResolverService>instantiationService.createInstance(TextModelResolverService));
B
Benjamin Pasero 已提交
216
	instantiationService.stub(IEnvironmentService, TestEnvironmentService);
B
Benjamin Pasero 已提交
217
	instantiationService.stub(IThemeService, new TestThemeService());
218 219 220 221

	return instantiationService;
}

E
Erich Gamma 已提交
222
export class TestMessageService implements IMessageService {
223
	public _serviceBrand: any;
E
Erich Gamma 已提交
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249

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

250
export class TestPartService implements IPartService {
B
Benjamin Pasero 已提交
251

252
	public _serviceBrand: any;
E
Erich Gamma 已提交
253

254
	private _onTitleBarVisibilityChange = new Emitter<void>();
255
	private _onEditorLayout = new Emitter<void>();
256 257 258 259 260

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

261 262 263 264
	public get onEditorLayout(): Event<void> {
		return this._onEditorLayout.event;
	}

E
Erich Gamma 已提交
265 266 267 268 269 270 271
	public layout(): void { }

	public isCreated(): boolean {
		return true;
	}

	public joinCreation(): Promise {
A
Alex Dima 已提交
272
		return TPromise.as(null);
E
Erich Gamma 已提交
273 274 275 276 277 278 279 280 281 282
	}

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

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

283 284 285 286
	public getContainer(part): HTMLElement {
		return null;
	}

B
Benjamin Pasero 已提交
287 288 289 290
	public isTitleBarHidden(): boolean {
		return false;
	}

291 292 293 294
	public getTitleBarOffset(): number {
		return 0;
	}

295 296 297 298
	public isStatusBarHidden(): boolean {
		return false;
	}

S
Sanders Lauture 已提交
299 300 301 302 303 304
	public isActivityBarHidden(): boolean {
		return false;
	}

	public setActivityBarHidden(hidden: boolean): void { }

E
Erich Gamma 已提交
305 306 307 308
	public isSideBarHidden(): boolean {
		return false;
	}

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

I
isidor 已提交
311
	public isPanelHidden(): boolean {
I
isidor 已提交
312 313 314
		return false;
	}

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

I
isidor 已提交
317 318
	public toggleMaximizedPanel(): void { }

B
Benjamin Pasero 已提交
319 320 321 322
	public isPanelMaximized(): boolean {
		return false;
	}

E
Erich Gamma 已提交
323 324 325 326 327 328
	public getSideBarPosition() {
		return 0;
	}

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

I
isidor 已提交
331
	public toggleZenMode(): void { }
332 333

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

336
export class TestStorageService extends EventEmitter implements IStorageService {
337
	public _serviceBrand: any;
E
Erich Gamma 已提交
338

B
Benjamin Pasero 已提交
339
	private storage: StorageService;
E
Erich Gamma 已提交
340 341 342 343 344

	constructor() {
		super();

		let context = new TestContextService();
B
Benjamin Pasero 已提交
345
		this.storage = new StorageService(new InMemoryLocalStorage(), null, context);
E
Erich Gamma 已提交
346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372
	}

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

373
export class TestEditorGroupService implements IEditorGroupService {
374
	public _serviceBrand: any;
375 376

	private stacksModel: EditorStacksModel;
377 378 379

	private _onEditorsChanged: Emitter<void>;
	private _onEditorOpenFail: Emitter<IEditorInput>;
380
	private _onEditorsMoved: Emitter<void>;
381
	private _onGroupOrientationChanged: Emitter<void>;
I
isidor 已提交
382
	private _onTabOptionsChanged: Emitter<ITabOptions>;
383 384

	constructor(callback?: (method: string) => void) {
385
		this._onEditorsMoved = new Emitter<void>();
386
		this._onEditorsChanged = new Emitter<void>();
387
		this._onGroupOrientationChanged = new Emitter<void>();
388
		this._onEditorOpenFail = new Emitter<IEditorInput>();
I
isidor 已提交
389
		this._onTabOptionsChanged = new Emitter<ITabOptions>();
390

391 392 393
		let services = new ServiceCollection();

		services.set(IStorageService, new TestStorageService());
394
		services.set(IConfigurationService, new TestConfigurationService());
395
		services.set(IWorkspaceContextService, new TestContextService());
396 397
		const lifecycle = new TestLifecycleService();
		services.set(ILifecycleService, lifecycle);
398
		services.set(ITelemetryService, NullTelemetryService);
399 400 401

		let inst = new InstantiationService(services);

402
		this.stacksModel = inst.createInstance(EditorStacksModel, true);
403 404
	}

405 406 407 408 409 410 411 412 413 414 415 416
	public fireChange(): void {
		this._onEditorsChanged.fire();
	}

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

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

417 418 419 420
	public get onEditorsMoved(): Event<void> {
		return this._onEditorsMoved.event;
	}

421 422 423 424
	public get onGroupOrientationChanged(): Event<void> {
		return this._onGroupOrientationChanged.event;
	}

I
isidor 已提交
425 426
	public get onTabOptionsChanged(): Event<ITabOptions> {
		return this._onTabOptionsChanged.event;
427 428
	}

429 430 431
	public focusGroup(group: IEditorGroup): void;
	public focusGroup(position: Position): void;
	public focusGroup(arg1: any): void {
432 433 434

	}

435 436 437
	public activateGroup(group: IEditorGroup): void;
	public activateGroup(position: Position): void;
	public activateGroup(arg1: any): void {
438 439 440

	}

441 442 443
	public moveGroup(from: IEditorGroup, to: IEditorGroup): void;
	public moveGroup(from: Position, to: Position): void;
	public moveGroup(arg1: any, arg2: any): void {
444 445 446 447 448 449 450

	}

	public arrangeGroups(arrangement: GroupArrangement): void {

	}

451 452 453 454 455 456 457 458
	public setGroupOrientation(orientation: GroupOrientation): void {

	}

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

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

461 462
	}

463 464 465
	public pinEditor(group: IEditorGroup, input: IEditorInput): void;
	public pinEditor(position: Position, input: IEditorInput): void;
	public pinEditor(arg1: any, input: IEditorInput): void {
466 467
	}

468 469 470
	public unpinEditor(group: IEditorGroup, input: IEditorInput): void;
	public unpinEditor(position: Position, input: IEditorInput): void;
	public unpinEditor(arg1: any, input: IEditorInput): void {
471 472
	}

473 474 475
	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 {
476 477 478 479 480
	}

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

I
isidor 已提交
482 483
	public getTabOptions(): ITabOptions {
		return {};
484
	}
485 486
}

487
export class TestEditorService implements IWorkbenchEditorService {
488
	public _serviceBrand: any;
E
Erich Gamma 已提交
489

B
Benjamin Pasero 已提交
490 491 492
	public activeEditorInput: IEditorInput;
	public activeEditorOptions: IEditorOptions;
	public activeEditorPosition: Position;
493
	public mockLineNumber: number;
E
Erich Gamma 已提交
494 495 496 497 498

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

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

B
Benjamin Pasero 已提交
502
	public openEditors(inputs): Promise {
A
Alex Dima 已提交
503
		return TPromise.as([]);
E
Erich Gamma 已提交
504 505
	}

506 507 508 509
	public replaceEditors(editors): TPromise<IEditor[]> {
		return TPromise.as([]);
	}

510 511 512 513
	public closeEditors(position: Position, except?: IEditorInput, direction?: Direction): TPromise<void> {
		return TPromise.as(null);
	}

514
	public closeAllEditors(except?: Position): TPromise<void> {
A
Alex Dima 已提交
515
		return TPromise.as(null);
E
Erich Gamma 已提交
516 517 518 519 520 521 522 523 524
	}

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

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

525 526 527 528 529 530 531
		return {
			input: null,
			options: null,
			position: null,
			getId: () => { return null; },
			getControl: () => {
				return {
532
					getSelection: () => { return { positionLineNumber: this.mockLineNumber }; }
533 534 535 536 537
				};
			},
			focus: () => { },
			isVisible: () => { return true; }
		};
E
Erich Gamma 已提交
538 539 540 541 542
	}

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

B
Benjamin Pasero 已提交
543
		return this.activeEditorInput;
E
Erich Gamma 已提交
544 545 546 547 548 549 550 551 552 553 554 555 556 557 558
	}

	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 已提交
559
		return TPromise.as(null);
E
Erich Gamma 已提交
560 561
	}

562
	public closeEditor(position: Position, input: IEditorInput): TPromise<void> {
E
Erich Gamma 已提交
563 564 565 566 567
		this.callback('closeEditor');

		return TPromise.as(null);
	}

568 569
	public createInput(input: IResourceInput): IEditorInput {
		return null;
E
Erich Gamma 已提交
570 571 572
	}
}

573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601
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 已提交
602
		return TPromise.as({
603 604
			resource,
			etag: Date.now().toString(),
B
Benjamin Pasero 已提交
605
			encoding: 'utf8',
B
Benjamin Pasero 已提交
606
			mtime: Date.now(),
607 608
			isDirectory: false,
			hasChildren: false,
B
Benjamin Pasero 已提交
609 610
			name: paths.basename(resource.fsPath)
		});
611
	}
B
Benjamin Pasero 已提交
612

613 614 615
	existsFile(resource: URI): TPromise<boolean> {
		return TPromise.as(null);
	}
B
Benjamin Pasero 已提交
616

617
	resolveContent(resource: URI, options?: IResolveContentOptions): TPromise<IContent> {
B
Benjamin Pasero 已提交
618 619
		return TPromise.as({
			resource: resource,
620 621
			value: 'Hello Html',
			etag: 'index.txt',
B
Benjamin Pasero 已提交
622 623
			encoding: 'utf8',
			mtime: Date.now(),
624
			name: paths.basename(resource.fsPath)
E
Erich Gamma 已提交
625
		});
626
	}
E
Erich Gamma 已提交
627

628
	resolveStreamContent(resource: URI, options?: IResolveContentOptions): TPromise<IStreamContent> {
A
Alex Dima 已提交
629 630 631
		return TPromise.as({
			resource: resource,
			value: {
632
				on: (event: string, callback: Function): void => {
A
Alex Dima 已提交
633 634 635 636 637 638 639 640 641 642
					if (event === 'data') {
						callback('Hello Html');
					}
					if (event === 'end') {
						callback();
					}
				}
			},
			etag: 'index.txt',
			encoding: 'utf8',
B
Benjamin Pasero 已提交
643
			mtime: Date.now(),
644
			name: paths.basename(resource.fsPath)
A
Alex Dima 已提交
645
		});
646 647 648 649 650
	}

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

652
	updateContent(resource: URI, value: string, options?: IUpdateContentOptions): TPromise<IFileStat> {
653
		return TPromise.timeout(1).then(() => {
E
Erich Gamma 已提交
654
			return {
655
				resource,
E
Erich Gamma 已提交
656
				etag: 'index.txt',
B
Benjamin Pasero 已提交
657
				encoding: 'utf8',
B
Benjamin Pasero 已提交
658
				mtime: Date.now(),
659 660 661
				isDirectory: false,
				hasChildren: false,
				name: paths.basename(resource.fsPath)
E
Erich Gamma 已提交
662 663
			};
		});
664
	}
D
Daniel Imms 已提交
665

666 667 668
	moveFile(source: URI, target: URI, overwrite?: boolean): TPromise<IFileStat> {
		return TPromise.as(null);
	}
D
Daniel Imms 已提交
669

670 671 672
	copyFile(source: URI, target: URI, overwrite?: boolean): TPromise<IFileStat> {
		return TPromise.as(null);
	}
D
Daniel Imms 已提交
673

674 675
	createFile(resource: URI, content?: string): TPromise<IFileStat> {
		return TPromise.as(null);
E
Erich Gamma 已提交
676
	}
677 678 679 680 681 682 683 684

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

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

686 687 688 689 690 691 692 693 694 695 696
	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 已提交
697

698 699 700 701 702 703 704 705 706 707 708 709 710 711
	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 已提交
712

713
	dispose(): void {
E
Erich Gamma 已提交
714
	}
715
}
716

717 718
export class TestBackupFileService implements IBackupFileService {
	public _serviceBrand: any;
719 720 721 722 723

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

724
	public hasBackup(resource: URI): TPromise<boolean> {
725 726 727
		return TPromise.as(false);
	}

B
Benjamin Pasero 已提交
728 729 730 731 732 733 734 735 736 737
	public loadBackupResource(resource: URI): TPromise<URI> {
		return this.hasBackup(resource).then(hasBackup => {
			if (hasBackup) {
				return this.getBackupResource(resource);
			}

			return void 0;
		});
	}

D
Daniel Imms 已提交
738 739 740 741 742 743 744 745 746 747 748
	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;
	}
749

750
	public backupResource(resource: URI, content: string): TPromise<void> {
751 752 753
		return TPromise.as(void 0);
	}

754
	public getWorkspaceFileBackups(): TPromise<URI[]> {
755 756 757
		return TPromise.as([]);
	}

A
Alex Dima 已提交
758
	public parseBackupContent(rawText: IRawTextSource): string {
759
		return rawText.lines.join('\n');
760 761
	}

762
	public discardResourceBackup(resource: URI): TPromise<void> {
763 764 765
		return TPromise.as(void 0);
	}

766
	public discardAllWorkspaceBackups(): TPromise<void> {
767 768
		return TPromise.as(void 0);
	}
D
Daniel Imms 已提交
769 770
};

771 772 773 774
export class TestWindowService implements IWindowService {

	public _serviceBrand: any;

775 776 777 778
	isFocused(): TPromise<boolean> {
		return TPromise.as(false);
	}

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 844 845 846 847 848 849 850 851
	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);
	}
}

852 853
export class TestLifecycleService implements ILifecycleService {

854
	public _serviceBrand: any;
855

856
	public willShutdown: boolean;
857
	public startupKind: StartupKind;
858

859
	private _onWillShutdown = new Emitter<ShutdownEvent>();
860
	private _onShutdown = new Emitter<ShutdownReason>();
861 862 863 864

	constructor() {
	}

865 866
	public fireShutdown(reason = ShutdownReason.QUIT): void {
		this._onShutdown.fire(reason);
867 868
	}

869 870 871 872
	public fireWillShutdown(event: ShutdownEvent): void {
		this._onWillShutdown.fire(event);
	}

873 874 875 876
	public get onWillShutdown(): Event<ShutdownEvent> {
		return this._onWillShutdown.event;
	}

877
	public get onShutdown(): Event<ShutdownReason> {
878 879
		return this._onShutdown.event;
	}
880 881
}

882 883 884 885
export class TestWindowsService implements IWindowsService {

	_serviceBrand: any;

886 887
	public windowCount = 1;

888 889 890
	onWindowOpen: Event<number>;
	onWindowFocus: Event<number>;

891 892 893 894
	isFocused(windowId: number): TPromise<boolean> {
		return TPromise.as(false);
	}

895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928
	openFileFolderPicker(windowId: number, forceNewWindow?: boolean): TPromise<void> {
		return TPromise.as(void 0);
	}
	openFilePicker(windowId: number, forceNewWindow?: boolean, path?: string): TPromise<void> {
		return TPromise.as(void 0);
	}
	openFolderPicker(windowId: number, forceNewWindow?: boolean): TPromise<void> {
		return TPromise.as(void 0);
	}
	reloadWindow(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
	openDevTools(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
	toggleDevTools(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
	// TODO@joao: rename, shouldn't this be closeWindow?
	closeFolder(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
	toggleFullScreen(windowId: number): TPromise<void> {
		return TPromise.as(void 0);
	}
	setRepresentedFilename(windowId: number, fileName: string): TPromise<void> {
		return TPromise.as(void 0);
	}
	addToRecentlyOpen(paths: { path: string, isFile?: boolean }[]): TPromise<void> {
		return TPromise.as(void 0);
	}
	removeFromRecentlyOpen(paths: string[]): TPromise<void> {
		return TPromise.as(void 0);
	}
C
22768  
Cristian 已提交
929 930 931
	clearRecentPathsList(): TPromise<void> {
		return TPromise.as(void 0);
	}
932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952
	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);
	}
J
Johannes Rieken 已提交
953 954 955
	relaunch(options: { addArgs?: string[], removeArgs?: string[] }): TPromise<void> {
		return TPromise.as(void 0);
	}
956 957 958
	whenSharedProcessReady(): TPromise<void> {
		return TPromise.as(void 0);
	}
959 960 961
	toggleSharedProcess(): TPromise<void> {
		return TPromise.as(void 0);
	}
962
	// Global methods
963
	openWindow(paths: string[], options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean }): TPromise<void> {
964 965 966 967 968 969 970 971 972 973 974 975
		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> {
976
		return TPromise.as(this.windowCount);
977 978 979 980 981 982 983 984 985 986 987 988 989 990
	}
	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
991 992
	openExternal(url: string): TPromise<boolean> {
		return TPromise.as(true);
993 994 995 996 997 998
	}

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

B
Benjamin Pasero 已提交
1001
export class TestTheme implements ITheme {
1002 1003 1004

	constructor(private colors: { [id: string]: string; } = {}, public type = DARK) {
	}
B
Benjamin Pasero 已提交
1005 1006

	getColor(color: string, useDefault?: boolean): Color {
1007 1008 1009 1010 1011
		let value = this.colors[color];
		if (value) {
			return Color.fromHex(value);
		}
		return void 0;
B
Benjamin Pasero 已提交
1012 1013
	}

1014
	defines(color: string): boolean {
B
Benjamin Pasero 已提交
1015 1016 1017 1018
		throw new Error('Method not implemented.');
	}
}

B
Benjamin Pasero 已提交
1019 1020 1021
export class TestThemeService implements IThemeService {

	_serviceBrand: any;
1022 1023 1024 1025 1026 1027
	_theme: ITheme;
	_onThemeChange = new Emitter<ITheme>();

	constructor(theme = new TestTheme()) {
		this._theme = theme;
	}
B
Benjamin Pasero 已提交
1028 1029

	getTheme(): ITheme {
1030 1031 1032 1033 1034 1035 1036 1037 1038 1039
		return this._theme;
	}

	setTheme(theme: ITheme) {
		this._theme = theme;
		this.fireThemeChange();
	}

	fireThemeChange() {
		this._onThemeChange.fire(this._theme);
B
Benjamin Pasero 已提交
1040 1041
	}

1042 1043
	public get onThemeChange(): Event<ITheme> {
		return this._onThemeChange.event;
B
Benjamin Pasero 已提交
1044
	}
1045
}