workbenchTestServices.ts 29.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';
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 } 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
		if (this.resolveTextContentError) {
			const error = this.resolveTextContentError;
			this.resolveTextContentError = null;

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

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
	public onConfigurationChange(configuration: any): void {
		super.onConfigurationChange(configuration);
	}

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

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

	return instantiationService;
}

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

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

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

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

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

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

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

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

	public isCreated(): boolean {
		return true;
	}

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

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

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

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

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

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

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

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

	public setActivityBarHidden(hidden: boolean): void { }

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

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

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

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

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

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

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

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

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

	public resizePart(part: Parts, sizeChange: number): 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';
	}

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

462 463
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

		return TPromise.as(null);
	}

569 570
	public createInput(input: IResourceInput): IEditorInput {
		return null;
E
Erich Gamma 已提交
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 602
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 已提交
603
		return TPromise.as({
604 605
			resource,
			etag: Date.now().toString(),
B
Benjamin Pasero 已提交
606
			encoding: 'utf8',
B
Benjamin Pasero 已提交
607
			mtime: Date.now(),
608 609
			isDirectory: false,
			hasChildren: false,
B
Benjamin Pasero 已提交
610 611
			name: paths.basename(resource.fsPath)
		});
612
	}
B
Benjamin Pasero 已提交
613

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

			return void 0;
		});
	}

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

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

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

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

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

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

772 773 774 775
export class TestWindowService implements IWindowService {

	public _serviceBrand: any;

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

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

853 854
export class TestLifecycleService implements ILifecycleService {

855
	public _serviceBrand: any;
856

857
	public willShutdown: boolean;
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 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015
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 已提交
1016 1017 1018 1019 1020
export class TestThemeService implements IThemeService {

	_serviceBrand: any;

	getTheme(): ITheme {
B
Benjamin Pasero 已提交
1021
		return testTheme;
B
Benjamin Pasero 已提交
1022 1023 1024 1025 1026 1027
	}

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