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 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 { }
335 336

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

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

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

	constructor() {
		super();

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

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

376
export class TestEditorGroupService implements IEditorGroupService {
377
	public _serviceBrand: any;
378 379

	private stacksModel: EditorStacksModel;
380 381 382

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

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

394 395 396
		let services = new ServiceCollection();

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

		let inst = new InstantiationService(services);

405
		this.stacksModel = inst.createInstance(EditorStacksModel, true);
406 407
	}

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

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

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

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

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

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

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

	}

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

	}

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

	}

	public arrangeGroups(arrangement: GroupArrangement): void {

	}

454 455 456 457 458 459 460 461
	public setGroupOrientation(orientation: GroupOrientation): void {

	}

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

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

464 465
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

		return TPromise.as(null);
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

716
	dispose(): void {
E
Erich Gamma 已提交
717
	}
718
}
719

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

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

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

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

			return void 0;
		});
	}

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

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

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

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

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

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

774 775 776 777
export class TestWindowService implements IWindowService {

	public _serviceBrand: any;

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

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

855 856
export class TestLifecycleService implements ILifecycleService {

857
	public _serviceBrand: any;
858

859
	public willShutdown: boolean;
860

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

	constructor() {
	}

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

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

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

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

884 885 886 887
export class TestWindowsService implements IWindowsService {

	_serviceBrand: any;

888 889
	public windowCount = 1;

890 891 892
	onWindowOpen: Event<number>;
	onWindowFocus: Event<number>;

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

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
	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 已提交
931 932 933
	clearRecentPathsList(): TPromise<void> {
		return TPromise.as(void 0);
	}
934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954
	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 已提交
955 956 957
	relaunch(options: { addArgs?: string[], removeArgs?: string[] }): TPromise<void> {
		return TPromise.as(void 0);
	}
958 959 960
	whenSharedProcessReady(): TPromise<void> {
		return TPromise.as(void 0);
	}
961 962 963
	toggleSharedProcess(): TPromise<void> {
		return TPromise.as(void 0);
	}
964
	// Global methods
965
	openWindow(paths: string[], options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean }): TPromise<void> {
966 967 968 969 970 971 972 973 974 975 976 977
		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> {
978
		return TPromise.as(this.windowCount);
979 980 981 982 983 984 985 986 987 988 989 990 991 992
	}
	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
993 994
	openExternal(url: string): TPromise<boolean> {
		return TPromise.as(true);
995 996 997 998 999 1000
	}

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

B
Benjamin Pasero 已提交
1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
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 已提交
1018 1019 1020 1021 1022
export class TestThemeService implements IThemeService {

	_serviceBrand: any;

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

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