workbenchTestServices.ts 29.3 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 24
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
import { IPartService } 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 } 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';
B
Benjamin Pasero 已提交
53 54
import { IThemeService, ITheme, IThemingParticipant } from 'vs/platform/theme/common/themeService';
import { IDisposable } from 'vs/base/common/lifecycle';
55
import { Color } from 'vs/base/common/color';
56
import { isLinux } from 'vs/base/common/platform';
B
Benjamin Pasero 已提交
57

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

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

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

	private workspace: any;
	private options: any;

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

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

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

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

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

	public updateOptions() {

	}

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

		return false;
	}

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

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

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

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

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

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

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

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

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

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

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

			return TPromise.wrapError(error);
		}

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

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

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

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

	protected cleanupBackupsBeforeShutdown(): TPromise<void> {
		this.cleanupBackupsBeforeShutdownCalled = true;
		return TPromise.as(void 0);
	}

D
Daniel Imms 已提交
195
	public showHotExitMessage(): void { }
A
Alex Dima 已提交
196 197
}

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

	return instantiationService;
}

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

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

253
export class TestPartService implements IPartService {
B
Benjamin Pasero 已提交
254

255
	public _serviceBrand: any;
E
Erich Gamma 已提交
256

257
	private _onTitleBarVisibilityChange = new Emitter<void>();
258
	private _onEditorLayout = new Emitter<void>();
259 260 261 262 263

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

264 265 266 267
	public get onEditorLayout(): Event<void> {
		return this._onEditorLayout.event;
	}

E
Erich Gamma 已提交
268 269 270 271 272 273 274
	public layout(): void { }

	public isCreated(): boolean {
		return true;
	}

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

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

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

286 287 288 289
	public getContainer(part): HTMLElement {
		return null;
	}

B
Benjamin Pasero 已提交
290 291 292 293
	public isTitleBarHidden(): boolean {
		return false;
	}

294 295 296 297
	public getTitleBarOffset(): number {
		return 0;
	}

298 299 300 301
	public isStatusBarHidden(): boolean {
		return false;
	}

S
Sanders Lauture 已提交
302 303 304 305 306 307
	public isActivityBarHidden(): boolean {
		return false;
	}

	public setActivityBarHidden(hidden: boolean): void { }

E
Erich Gamma 已提交
308 309 310 311
	public isSideBarHidden(): boolean {
		return false;
	}

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

I
isidor 已提交
314
	public isPanelHidden(): boolean {
I
isidor 已提交
315 316 317
		return false;
	}

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

I
isidor 已提交
320 321
	public toggleMaximizedPanel(): void { }

B
Benjamin Pasero 已提交
322 323 324 325
	public isPanelMaximized(): boolean {
		return false;
	}

E
Erich Gamma 已提交
326 327 328 329 330 331
	public getSideBarPosition() {
		return 0;
	}

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

I
isidor 已提交
334
	public toggleZenMode(): void { }
E
Erich Gamma 已提交
335 336
}

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

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

	constructor() {
		super();

		let context = new TestContextService();
B
Benjamin Pasero 已提交
346
		this.storage = new StorageService(new InMemoryLocalStorage(), null, context);
E
Erich Gamma 已提交
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 373
	}

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

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

	private stacksModel: EditorStacksModel;
378 379 380

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

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

392 393 394
		let services = new ServiceCollection();

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

		let inst = new InstantiationService(services);

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

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

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

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

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

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

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

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

	}

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

	}

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

	}

	public arrangeGroups(arrangement: GroupArrangement): void {

	}

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

	}

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

460 461 462
	public pinEditor(group: IEditorGroup, input: IEditorInput): void;
	public pinEditor(position: Position, input: IEditorInput): void;
	public pinEditor(arg1: any, input: IEditorInput): void {
463 464
	}

465 466 467
	public unpinEditor(group: IEditorGroup, input: IEditorInput): void;
	public unpinEditor(position: Position, input: IEditorInput): void;
	public unpinEditor(arg1: any, input: IEditorInput): void {
468 469
	}

470 471 472
	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 {
473 474 475 476 477
	}

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

I
isidor 已提交
479 480
	public getTabOptions(): ITabOptions {
		return {};
481
	}
482 483
}

484
export class TestEditorService implements IWorkbenchEditorService {
485
	public _serviceBrand: any;
E
Erich Gamma 已提交
486

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

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

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

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

503 504 505 506
	public replaceEditors(editors): TPromise<IEditor[]> {
		return TPromise.as([]);
	}

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

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

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

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

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

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

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

	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 已提交
556
		return TPromise.as(null);
E
Erich Gamma 已提交
557 558
	}

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

		return TPromise.as(null);
	}

565
	public createInput(input: IResourceInput): TPromise<IEditorInput> {
A
Alex Dima 已提交
566
		return TPromise.as(null);
E
Erich Gamma 已提交
567 568 569
	}
}

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
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 已提交
599
		return TPromise.as({
600 601
			resource,
			etag: Date.now().toString(),
B
Benjamin Pasero 已提交
602
			encoding: 'utf8',
B
Benjamin Pasero 已提交
603
			mtime: Date.now(),
604 605
			isDirectory: false,
			hasChildren: false,
B
Benjamin Pasero 已提交
606 607
			name: paths.basename(resource.fsPath)
		});
608
	}
B
Benjamin Pasero 已提交
609

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

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

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

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

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

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

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

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

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

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

683 684 685 686 687 688 689 690 691 692 693
	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 已提交
694

695 696 697 698 699 700 701 702 703 704 705 706 707 708
	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 已提交
709

710
	dispose(): void {
E
Erich Gamma 已提交
711
	}
712
}
713

714 715
export class TestBackupFileService implements IBackupFileService {
	public _serviceBrand: any;
716 717 718 719 720

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

721
	public hasBackup(resource: URI): TPromise<boolean> {
722 723 724
		return TPromise.as(false);
	}

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

			return void 0;
		});
	}

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

747
	public backupResource(resource: URI, content: string): TPromise<void> {
748 749 750
		return TPromise.as(void 0);
	}

751
	public getWorkspaceFileBackups(): TPromise<URI[]> {
752 753 754
		return TPromise.as([]);
	}

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

759
	public discardResourceBackup(resource: URI): TPromise<void> {
760 761 762
		return TPromise.as(void 0);
	}

763
	public discardAllWorkspaceBackups(): TPromise<void> {
764 765
		return TPromise.as(void 0);
	}
D
Daniel Imms 已提交
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 844
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);
	}
}

845 846
export class TestLifecycleService implements ILifecycleService {

847
	public _serviceBrand: any;
848

849
	public willShutdown: boolean;
850

851
	private _onWillShutdown = new Emitter<ShutdownEvent>();
852
	private _onShutdown = new Emitter<ShutdownReason>();
853 854 855 856

	constructor() {
	}

857 858
	public fireShutdown(reason = ShutdownReason.QUIT): void {
		this._onShutdown.fire(reason);
859 860
	}

861 862 863 864
	public fireWillShutdown(event: ShutdownEvent): void {
		this._onWillShutdown.fire(event);
	}

865 866 867 868
	public get onWillShutdown(): Event<ShutdownEvent> {
		return this._onWillShutdown.event;
	}

869
	public get onShutdown(): Event<ShutdownReason> {
870 871
		return this._onShutdown.event;
	}
872 873
}

874 875 876 877
export class TestWindowsService implements IWindowsService {

	_serviceBrand: any;

878 879
	public windowCount = 1;

880 881 882 883 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 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937
	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);
	}
J
Johannes Rieken 已提交
938 939 940
	relaunch(options: { addArgs?: string[], removeArgs?: string[] }): TPromise<void> {
		return TPromise.as(void 0);
	}
941 942 943
	whenSharedProcessReady(): TPromise<void> {
		return TPromise.as(void 0);
	}
944 945 946
	toggleSharedProcess(): TPromise<void> {
		return TPromise.as(void 0);
	}
947
	// Global methods
948
	openWindow(paths: string[], options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean }): TPromise<void> {
949 950 951 952 953 954 955 956 957 958 959 960
		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> {
961
		return TPromise.as(this.windowCount);
962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983
	}
	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);
	}
984
}
B
Benjamin Pasero 已提交
985

B
Benjamin Pasero 已提交
986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000
export class TestTheme implements ITheme {
	selector: string;
	type: 'light' | 'dark' | 'hc';

	getColor(color: string, useDefault?: boolean): Color {
		throw new Error('Method not implemented.');
	}

	isDefault(color: string): boolean {
		throw new Error('Method not implemented.');
	}
}

const testTheme = new TestTheme();

B
Benjamin Pasero 已提交
1001 1002 1003 1004 1005
export class TestThemeService implements IThemeService {

	_serviceBrand: any;

	getTheme(): ITheme {
B
Benjamin Pasero 已提交
1006
		return testTheme;
B
Benjamin Pasero 已提交
1007 1008 1009 1010 1011 1012
	}

	onThemeChange(participant: IThemingParticipant): IDisposable {
		return { dispose: () => { } };
	}
}