workbenchTestServices.ts 53.5 KB
Newer Older
E
Erich Gamma 已提交
1 2 3 4 5
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

6
import 'vs/workbench/contrib/files/browser/files.contribution'; // load our contribution into the test
7
import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput';
8
import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock';
9
import { join } from 'vs/base/common/path';
10
import * as resources from 'vs/base/common/resources';
11
import { URI, UriComponents } from 'vs/base/common/uri';
12 13
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils';
14
import { ConfirmResult, IEditorInputWithOptions, CloseDirection, IEditorIdentifier, IUntitledTextResourceInput, IResourceDiffInput, IResourceSideBySideInput, IEditorInput, IEditor, IEditorCloseEvent, IEditorPartOptions } from 'vs/workbench/common/editor';
15
import { IEditorOpeningEvent, EditorServiceImpl, IEditorGroupView } from 'vs/workbench/browser/parts/editor/editor';
M
Matt Bierner 已提交
16
import { Event, Emitter } from 'vs/base/common/event';
E
Erich Gamma 已提交
17
import Severity from 'vs/base/common/severity';
18
import { IBackupFileService, IResolvedBackup } from 'vs/workbench/services/backup/common/backup';
19
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
B
Benjamin Pasero 已提交
20
import { IWorkbenchLayoutService, Parts, Position as PartPosition } from 'vs/workbench/services/layout/browser/layoutService';
21
import { TextModelResolverService } from 'vs/workbench/services/textmodelResolver/common/textModelResolverService';
22
import { ITextModelService } from 'vs/editor/common/services/resolverService';
B
Benjamin Pasero 已提交
23
import { IEditorOptions, IResourceInput } from 'vs/platform/editor/common/editor';
24
import { IUntitledTextEditorService, UntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService';
S
Sandeep Somavarapu 已提交
25
import { IWorkspaceContextService, IWorkspace as IWorkbenchWorkspace, WorkbenchState, IWorkspaceFolder, IWorkspaceFoldersChangeEvent, Workspace } from 'vs/platform/workspace/common/workspace';
26
import { ILifecycleService, BeforeShutdownEvent, ShutdownReason, StartupKind, LifecyclePhase, WillShutdownEvent } from 'vs/platform/lifecycle/common/lifecycle';
J
Johannes Rieken 已提交
27
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
28
import { FileOperationEvent, IFileService, FileOperationError, IFileStat, IResolveFileResult, FileChangesEvent, IResolveFileOptions, ICreateFileOptions, IFileSystemProvider, FileSystemProviderCapabilities, IFileChange, IWatchOptions, IStat, FileType, FileDeleteOptions, FileOverwriteOptions, FileWriteOptions, FileOpenOptions, IFileStatWithMetadata, IResolveMetadataFileOptions, IWriteFileOptions, IReadFileOptions, IFileContent, IFileStreamContent } from 'vs/platform/files/common/files';
29
import { IModelService } from 'vs/editor/common/services/modelService';
30
import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl';
J
Johannes Rieken 已提交
31
import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl';
32
import { ITextFileStreamContent, ITextFileService, IResourceEncoding, IReadTextFileOptions } from 'vs/workbench/services/textfile/common/textfiles';
33
import { parseArgs, OPTIONS } from 'vs/platform/environment/node/argv';
J
Johannes Rieken 已提交
34 35
import { IModeService } from 'vs/editor/common/services/modeService';
import { IHistoryService } from 'vs/workbench/services/history/common/history';
36
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
37
import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService';
38
import { MenuBarVisibility, IWindowConfiguration, IWindowOpenable, IOpenWindowOptions, IOpenEmptyWindowOptions, IOpenedWindow } from 'vs/platform/windows/common/windows';
S
Sandeep Somavarapu 已提交
39
import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace';
B
Benjamin Pasero 已提交
40
import { createTextBufferFactoryFromStream } from 'vs/editor/common/model/textModel';
41
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
42
import { IThemeService } from 'vs/platform/theme/common/themeService';
B
Benjamin Pasero 已提交
43
import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService';
44
import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces';
S
Sandeep Somavarapu 已提交
45
import { ITextResourceConfigurationService, ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration';
46
import { IPosition, Position as EditorPosition } from 'vs/editor/common/core/position';
47
import { IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions';
I
isidor 已提交
48
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
B
Benjamin Pasero 已提交
49
import { MockContextKeyService, MockKeybindingService } from 'vs/platform/keybinding/test/common/mockKeybindingService';
50
import { ITextBufferFactory, DefaultEndOfLine, EndOfLinePreference, IModelDecorationOptions, ITextModel, ITextSnapshot } from 'vs/editor/common/model';
51
import { Range } from 'vs/editor/common/core/range';
52
import { IConfirmation, IConfirmationResult, IDialogService, IDialogOptions, IPickAndOpenOptions, ISaveDialogOptions, IOpenDialogOptions, IFileDialogService, IShowResult } from 'vs/platform/dialogs/common/dialogs';
53 54
import { INotificationService } from 'vs/platform/notification/common/notification';
import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService';
55
import { IExtensionService, NullExtensionService } from 'vs/workbench/services/extensions/common/extensions';
B
Benjamin Pasero 已提交
56
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
B
Benjamin Pasero 已提交
57
import { IDecorationsService, IResourceDecorationChangeEvent, IDecoration, IDecorationData, IDecorationsProvider } from 'vs/workbench/services/decorations/browser/decorations';
J
Joao Moreno 已提交
58
import { IDisposable, toDisposable, Disposable } from 'vs/base/common/lifecycle';
59
import { IEditorGroupsService, IEditorGroup, GroupsOrder, GroupsArrangement, GroupDirection, IAddGroupOptions, IMergeGroupOptions, IMoveEditorOptions, ICopyEditorOptions, IEditorReplacement, IGroupChangeEvent, EditorsOrder, IFindGroupScope, EditorGroupLayout, ICloseEditorOptions } from 'vs/workbench/services/editor/common/editorGroupsService';
60
import { IEditorService, IOpenEditorOverrideHandler, IVisibleEditor } from 'vs/workbench/services/editor/common/editorService';
B
Benjamin Pasero 已提交
61 62 63
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
import { ICodeEditor, IDiffEditor } from 'vs/editor/browser/editorBrowser';
import { IDecorationRenderOptions } from 'vs/editor/common/editorCommon';
B
Benjamin Pasero 已提交
64
import { EditorGroup } from 'vs/workbench/common/editor/editorGroup';
65
import { Dimension } from 'vs/base/browser/dom';
S
Sandeep Somavarapu 已提交
66
import { ILogService, NullLogService } from 'vs/platform/log/common/log';
I
isidor 已提交
67
import { ILabelService } from 'vs/platform/label/common/label';
68
import { timeout } from 'vs/base/common/async';
69
import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
70
import { ViewletDescriptor, Viewlet } from 'vs/workbench/browser/viewlet';
71
import { IViewlet } from 'vs/workbench/common/viewlet';
72
import { IStorageService, InMemoryStorageService } from 'vs/platform/storage/common/storage';
A
Andre Weinand 已提交
73
import { isLinux, isMacintosh } from 'vs/base/common/platform';
I
isidor 已提交
74
import { LabelService } from 'vs/workbench/services/label/common/labelService';
B
Benjamin Pasero 已提交
75
import { IDimension } from 'vs/platform/layout/browser/layoutService';
76
import { Part } from 'vs/workbench/browser/part';
77 78 79
import { IPanelService } from 'vs/workbench/services/panel/common/panelService';
import { IPanel } from 'vs/workbench/common/panel';
import { IBadge } from 'vs/workbench/services/activity/common/activity';
80
import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService';
81
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
82
import { NativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService';
83
import { VSBuffer, VSBufferReadable } from 'vs/base/common/buffer';
84
import { NativeTextFileService } from 'vs/workbench/services/textfile/electron-browser/nativeTextFileService';
85
import { Schemas } from 'vs/base/common/network';
86
import { IProductService } from 'vs/platform/product/common/productService';
87
import product from 'vs/platform/product/common/product';
88
import { IHostService } from 'vs/workbench/services/host/browser/host';
89
import { IElectronService } from 'vs/platform/electron/node/electron';
90
import { INativeOpenDialogOptions } from 'vs/platform/dialogs/node/dialogs';
91 92 93
import { IBackupMainService, IWorkspaceBackupInfo } from 'vs/platform/backup/electron-main/backup';
import { IEmptyWindowBackupInfo } from 'vs/platform/backup/node/backup';
import { IDialogMainService } from 'vs/platform/dialogs/electron-main/dialogs';
94
import { find } from 'vs/base/common/arrays';
95
import { WorkingCopyService, IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService';
96
import { IFilesConfigurationService, FilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService';
B
Benjamin Pasero 已提交
97

S
Sandeep Somavarapu 已提交
98
export function createFileInput(instantiationService: IInstantiationService, resource: URI): FileEditorInput {
99
	return instantiationService.createInstance(FileEditorInput, resource, undefined, undefined);
S
Sandeep Somavarapu 已提交
100 101
}

102
export const TestEnvironmentService = new NativeWorkbenchEnvironmentService(parseArgs(process.argv, OPTIONS) as IWindowConfiguration, process.execPath, 0);
103

104
export class TestContextService implements IWorkspaceContextService {
105
	public _serviceBrand: undefined;
E
Erich Gamma 已提交
106

S
Sandeep Somavarapu 已提交
107
	private workspace: Workspace;
E
Erich Gamma 已提交
108 109
	private options: any;

M
Matt Bierner 已提交
110 111 112
	private readonly _onDidChangeWorkspaceName: Emitter<void>;
	private readonly _onDidChangeWorkspaceFolders: Emitter<IWorkspaceFoldersChangeEvent>;
	private readonly _onDidChangeWorkbenchState: Emitter<WorkbenchState>;
113

114
	constructor(workspace: any = TestWorkspace, options: any = null) {
E
Erich Gamma 已提交
115
		this.workspace = workspace;
116
		this.options = options || Object.create(null);
B
Benjamin Pasero 已提交
117
		this._onDidChangeWorkspaceName = new Emitter<void>();
118
		this._onDidChangeWorkspaceFolders = new Emitter<IWorkspaceFoldersChangeEvent>();
S
Sandeep Somavarapu 已提交
119
		this._onDidChangeWorkbenchState = new Emitter<WorkbenchState>();
120 121
	}

S
Sandeep Somavarapu 已提交
122 123 124 125
	public get onDidChangeWorkspaceName(): Event<void> {
		return this._onDidChangeWorkspaceName.event;
	}

126
	public get onDidChangeWorkspaceFolders(): Event<IWorkspaceFoldersChangeEvent> {
S
Sandeep Somavarapu 已提交
127
		return this._onDidChangeWorkspaceFolders.event;
128 129
	}

130 131 132 133
	public get onDidChangeWorkbenchState(): Event<WorkbenchState> {
		return this._onDidChangeWorkbenchState.event;
	}

S
Sandeep Somavarapu 已提交
134
	public getFolders(): IWorkspaceFolder[] {
S
Sandeep Somavarapu 已提交
135
		return this.workspace ? this.workspace.folders : [];
E
Erich Gamma 已提交
136 137
	}

138
	public getWorkbenchState(): WorkbenchState {
B
Benjamin Pasero 已提交
139 140 141 142 143
		if (this.workspace.configuration) {
			return WorkbenchState.WORKSPACE;
		}

		if (this.workspace.folders.length) {
144
			return WorkbenchState.FOLDER;
145
		}
B
Benjamin Pasero 已提交
146

147
		return WorkbenchState.EMPTY;
S
Sandeep Somavarapu 已提交
148 149
	}

150 151 152 153
	getCompleteWorkspace(): Promise<IWorkbenchWorkspace> {
		return Promise.resolve(this.getWorkspace());
	}

154
	public getWorkspace(): IWorkbenchWorkspace {
B
Benjamin Pasero 已提交
155
		return this.workspace;
156 157
	}

158
	public getWorkspaceFolder(resource: URI): IWorkspaceFolder | null {
S
Sandeep Somavarapu 已提交
159
		return this.workspace.getFolder(resource);
160 161
	}

D
Daniel Imms 已提交
162 163 164 165
	public setWorkspace(workspace: any): void {
		this.workspace = workspace;
	}

E
Erich Gamma 已提交
166 167 168 169 170 171 172 173 174 175
	public getOptions() {
		return this.options;
	}

	public updateOptions() {

	}

	public isInsideWorkspace(resource: URI): boolean {
		if (resource && this.workspace) {
176
			return resources.isEqualOrParent(resource, this.workspace.folders[0].uri);
E
Erich Gamma 已提交
177 178 179 180 181 182
		}

		return false;
	}

	public toResource(workspaceRelativePath: string): URI {
183
		return URI.file(join('C:\\', workspaceRelativePath));
E
Erich Gamma 已提交
184
	}
185

186
	public isCurrentWorkspace(workspaceIdentifier: ISingleFolderWorkspaceIdentifier | IWorkspaceIdentifier): boolean {
187
		return isSingleFolderWorkspaceIdentifier(workspaceIdentifier) && resources.isEqual(this.workspace.folders[0].uri, workspaceIdentifier);
188
	}
E
Erich Gamma 已提交
189 190
}

191
export class TestTextFileService extends NativeTextFileService {
192
	public cleanupBackupsBeforeShutdownCalled!: boolean;
193

194 195 196
	private promptPath!: URI;
	private confirmResult!: ConfirmResult;
	private resolveTextContentError!: FileOperationError | null;
A
Alex Dima 已提交
197 198

	constructor(
199
		@IWorkspaceContextService contextService: IWorkspaceContextService,
200
		@IFileService protected fileService: IFileService,
201
		@IUntitledTextEditorService untitledTextEditorService: IUntitledTextEditorService,
202
		@ILifecycleService lifecycleService: ILifecycleService,
203
		@IInstantiationService instantiationService: IInstantiationService,
204 205
		@IModeService modeService: IModeService,
		@IModelService modelService: IModelService,
206
		@IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService,
207
		@INotificationService notificationService: INotificationService,
208
		@IBackupFileService backupFileService: IBackupFileService,
I
isidor 已提交
209
		@IHistoryService historyService: IHistoryService,
210 211
		@IDialogService dialogService: IDialogService,
		@IFileDialogService fileDialogService: IFileDialogService,
B
Benjamin Pasero 已提交
212
		@IEditorService editorService: IEditorService,
213
		@ITextResourceConfigurationService textResourceConfigurationService: ITextResourceConfigurationService,
214
		@IElectronService electronService: IElectronService,
215
		@IProductService productService: IProductService,
216
		@IFilesConfigurationService filesConfigurationService: IFilesConfigurationService
A
Alex Dima 已提交
217
	) {
218 219 220
		super(
			contextService,
			fileService,
221
			untitledTextEditorService,
222 223 224 225 226 227 228 229 230 231
			lifecycleService,
			instantiationService,
			modeService,
			modelService,
			environmentService,
			notificationService,
			backupFileService,
			historyService,
			dialogService,
			fileDialogService,
B
Benjamin Pasero 已提交
232
			editorService,
233
			textResourceConfigurationService,
234
			electronService,
235
			productService,
236
			filesConfigurationService
237
		);
A
Alex Dima 已提交
238
	}
239

M
Martin Aeschlimann 已提交
240
	public setPromptPath(path: URI): void {
241 242 243 244 245 246 247
		this.promptPath = path;
	}

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

248
	public setResolveTextContentErrorOnce(error: FileOperationError): void {
249 250 251
		this.resolveTextContentError = error;
	}

252
	public readStream(resource: URI, options?: IReadTextFileOptions): Promise<ITextFileStreamContent> {
253 254 255 256
		if (this.resolveTextContentError) {
			const error = this.resolveTextContentError;
			this.resolveTextContentError = null;

B
Benjamin Pasero 已提交
257
			return Promise.reject(error);
258 259
		}

B
Benjamin Pasero 已提交
260
		return this.fileService.readFileStream(resource, options).then(async (content): Promise<ITextFileStreamContent> => {
261
			return {
262
				resource: content.resource,
263 264
				name: content.name,
				mtime: content.mtime,
265
				ctime: content.ctime,
266
				etag: content.etag,
B
Benjamin Pasero 已提交
267 268 269
				encoding: 'utf8',
				value: await createTextBufferFactoryFromStream(content.value),
				size: 10
270 271 272
			};
		});
	}
273

J
Johannes Rieken 已提交
274
	public promptForPath(_resource: URI, _defaultPath: URI): Promise<URI> {
B
Benjamin Pasero 已提交
275
		return Promise.resolve(this.promptPath);
276 277
	}

J
Johannes Rieken 已提交
278
	public confirmSave(_resources?: URI[]): Promise<ConfirmResult> {
B
Benjamin Pasero 已提交
279
		return Promise.resolve(this.confirmResult);
280 281
	}

B
Benjamin Pasero 已提交
282 283
	public confirmOverwrite(_resource: URI): Promise<boolean> {
		return Promise.resolve(true);
284
	}
D
Daniel Imms 已提交
285

J
Johannes Rieken 已提交
286
	protected cleanupBackupsBeforeShutdown(): Promise<void> {
287
		this.cleanupBackupsBeforeShutdownCalled = true;
B
Benjamin Pasero 已提交
288
		return Promise.resolve();
289
	}
A
Alex Dima 已提交
290 291
}

292
export function workbenchInstantiationService(): IInstantiationService {
293
	let instantiationService = new TestInstantiationService(new ServiceCollection([ILifecycleService, new TestLifecycleService()]));
294
	instantiationService.stub(IEnvironmentService, TestEnvironmentService);
295 296
	const contextKeyService = <IContextKeyService>instantiationService.createInstance(MockContextKeyService);
	instantiationService.stub(IContextKeyService, contextKeyService);
I
isidor 已提交
297 298
	const workspaceContextService = new TestContextService(TestWorkspace);
	instantiationService.stub(IWorkspaceContextService, workspaceContextService);
299 300
	const configService = new TestConfigurationService();
	instantiationService.stub(IConfigurationService, configService);
301
	instantiationService.stub(IFilesConfigurationService, new TestFilesConfigurationService(contextKeyService, configService, TestEnvironmentService));
302
	instantiationService.stub(ITextResourceConfigurationService, new TestTextResourceConfigurationService(configService));
303
	instantiationService.stub(IUntitledTextEditorService, instantiationService.createInstance(UntitledTextEditorService));
304
	instantiationService.stub(IStorageService, new TestStorageService());
305
	instantiationService.stub(IWorkbenchLayoutService, new TestLayoutService());
306
	instantiationService.stub(IElectronService, new TestElectronService());
J
Johannes Rieken 已提交
307
	instantiationService.stub(IModeService, instantiationService.createInstance(ModeServiceImpl));
B
Benjamin Pasero 已提交
308
	instantiationService.stub(IHistoryService, new TestHistoryService());
S
Sandeep Somavarapu 已提交
309
	instantiationService.stub(ITextResourcePropertiesService, new TestTextResourcePropertiesService(configService));
S
Sandeep Somavarapu 已提交
310
	instantiationService.stub(IModelService, instantiationService.createInstance(ModelServiceImpl));
311
	instantiationService.stub(IFileService, new TestFileService());
312
	instantiationService.stub(IBackupFileService, new TestBackupFileService());
313
	instantiationService.stub(ITelemetryService, NullTelemetryService);
314
	instantiationService.stub(INotificationService, new TestNotificationService());
315
	instantiationService.stub(IUntitledTextEditorService, instantiationService.createInstance(UntitledTextEditorService));
B
Benjamin Pasero 已提交
316 317 318 319
	instantiationService.stub(IMenuService, new TestMenuService());
	instantiationService.stub(IKeybindingService, new MockKeybindingService());
	instantiationService.stub(IDecorationsService, new TestDecorationsService());
	instantiationService.stub(IExtensionService, new TestExtensionService());
320
	instantiationService.stub(IHostService, <IHostService>instantiationService.createInstance(TestHostService));
321
	instantiationService.stub(ITextFileService, <ITextFileService>instantiationService.createInstance(TestTextFileService));
322
	instantiationService.stub(ITextModelService, <ITextModelService>instantiationService.createInstance(TextModelResolverService));
B
Benjamin Pasero 已提交
323
	instantiationService.stub(IThemeService, new TestThemeService());
S
Sandeep Somavarapu 已提交
324
	instantiationService.stub(ILogService, new NullLogService());
325
	instantiationService.stub(IEditorGroupsService, new TestEditorGroupsService([new TestEditorGroup(0)]));
M
Martin Aeschlimann 已提交
326
	instantiationService.stub(ILabelService, <ILabelService>instantiationService.createInstance(LabelService));
B
Benjamin Pasero 已提交
327
	const editorService = new TestEditorService();
328
	instantiationService.stub(IEditorService, editorService);
B
Benjamin Pasero 已提交
329
	instantiationService.stub(ICodeEditorService, new TestCodeEditorService());
330
	instantiationService.stub(IViewletService, new TestViewletService());
331
	instantiationService.stub(IWorkingCopyService, new TestWorkingCopyService());
332 333 334 335

	return instantiationService;
}

B
Benjamin Pasero 已提交
336
export class TestDecorationsService implements IDecorationsService {
337
	_serviceBrand: undefined;
B
Benjamin Pasero 已提交
338
	onDidChangeDecorations: Event<IResourceDecorationChangeEvent> = Event.None;
339
	registerDecorationsProvider(_provider: IDecorationsProvider): IDisposable { return Disposable.None; }
340
	getDecoration(_uri: URI, _includeChildren: boolean, _overwrite?: IDecorationData): IDecoration | undefined { return undefined; }
B
Benjamin Pasero 已提交
341 342
}

343
export class TestExtensionService extends NullExtensionService { }
B
Benjamin Pasero 已提交
344 345 346

export class TestMenuService implements IMenuService {

347
	public _serviceBrand: undefined;
B
Benjamin Pasero 已提交
348

349
	createMenu(_id: MenuId, _scopedKeybindingService: IContextKeyService): IMenu {
B
Benjamin Pasero 已提交
350 351
		return {
			onDidChange: Event.None,
R
Rob Lourens 已提交
352
			dispose: () => undefined,
B
Benjamin Pasero 已提交
353 354 355 356 357
			getActions: () => []
		};
	}
}

B
Benjamin Pasero 已提交
358 359
export class TestHistoryService implements IHistoryService {

360
	public _serviceBrand: undefined;
B
Benjamin Pasero 已提交
361 362 363 364 365 366 367

	constructor(private root?: URI) {
	}

	public reopenLastClosedEditor(): void {
	}

368
	public forward(_acrossEditors?: boolean): void {
B
Benjamin Pasero 已提交
369 370
	}

371
	public back(_acrossEditors?: boolean): void {
B
Benjamin Pasero 已提交
372 373
	}

374 375 376
	public last(): void {
	}

377
	public remove(_input: IEditorInput | IResourceInput): void {
B
Benjamin Pasero 已提交
378 379 380 381 382
	}

	public clear(): void {
	}

B
Benjamin Pasero 已提交
383 384 385
	public clearRecentlyOpened(): void {
	}

386
	public getHistory(): Array<IEditorInput | IResourceInput> {
B
Benjamin Pasero 已提交
387 388 389
		return [];
	}

390
	public getLastActiveWorkspaceRoot(_schemeFilter: string): URI | undefined {
B
Benjamin Pasero 已提交
391 392
		return this.root;
	}
393

394
	public getLastActiveFile(_schemeFilter: string): URI | undefined {
R
Rob Lourens 已提交
395
		return undefined;
396
	}
B
Benjamin Pasero 已提交
397 398 399

	public openLastEditLocation(): void {
	}
B
Benjamin Pasero 已提交
400 401
}

402
export class TestDialogService implements IDialogService {
403

404
	public _serviceBrand: undefined;
E
Erich Gamma 已提交
405

J
Johannes Rieken 已提交
406
	public confirm(_confirmation: IConfirmation): Promise<IConfirmationResult> {
B
Benjamin Pasero 已提交
407
		return Promise.resolve({ confirmed: false });
408
	}
409

410 411
	public show(_severity: Severity, _message: string, _buttons: string[], _options?: IDialogOptions): Promise<IShowResult> {
		return Promise.resolve({ choice: 0 });
412
	}
413 414 415 416

	public about(): Promise<void> {
		return Promise.resolve();
	}
E
Erich Gamma 已提交
417 418
}

M
Martin Aeschlimann 已提交
419 420
export class TestFileDialogService implements IFileDialogService {

421
	public _serviceBrand: undefined;
M
Martin Aeschlimann 已提交
422

423
	public defaultFilePath(_schemeFilter?: string): URI | undefined {
R
Rob Lourens 已提交
424
		return undefined;
M
Martin Aeschlimann 已提交
425
	}
426
	public defaultFolderPath(_schemeFilter?: string): URI | undefined {
R
Rob Lourens 已提交
427
		return undefined;
M
Martin Aeschlimann 已提交
428
	}
429
	public defaultWorkspacePath(_schemeFilter?: string): URI | undefined {
R
Rob Lourens 已提交
430
		return undefined;
M
Martin Aeschlimann 已提交
431
	}
J
Johannes Rieken 已提交
432
	public pickFileFolderAndOpen(_options: IPickAndOpenOptions): Promise<any> {
B
Benjamin Pasero 已提交
433
		return Promise.resolve(0);
M
Martin Aeschlimann 已提交
434
	}
J
Johannes Rieken 已提交
435
	public pickFileAndOpen(_options: IPickAndOpenOptions): Promise<any> {
B
Benjamin Pasero 已提交
436
		return Promise.resolve(0);
M
Martin Aeschlimann 已提交
437
	}
J
Johannes Rieken 已提交
438
	public pickFolderAndOpen(_options: IPickAndOpenOptions): Promise<any> {
B
Benjamin Pasero 已提交
439
		return Promise.resolve(0);
M
Martin Aeschlimann 已提交
440
	}
J
Johannes Rieken 已提交
441
	public pickWorkspaceAndOpen(_options: IPickAndOpenOptions): Promise<any> {
B
Benjamin Pasero 已提交
442
		return Promise.resolve(0);
M
Martin Aeschlimann 已提交
443
	}
444 445 446
	public pickFileToSave(_options: ISaveDialogOptions): Promise<URI | undefined> {
		return Promise.resolve(undefined);
	}
447
	public showSaveDialog(_options: ISaveDialogOptions): Promise<URI | undefined> {
J
Johannes Rieken 已提交
448
		return Promise.resolve(undefined);
M
Martin Aeschlimann 已提交
449
	}
450
	public showOpenDialog(_options: IOpenDialogOptions): Promise<URI[] | undefined> {
J
Johannes Rieken 已提交
451
		return Promise.resolve(undefined);
M
Martin Aeschlimann 已提交
452 453 454
	}
}

455
export class TestLayoutService implements IWorkbenchLayoutService {
B
Benjamin Pasero 已提交
456

457
	public _serviceBrand: undefined;
E
Erich Gamma 已提交
458

459 460
	dimension: IDimension = { width: 800, height: 600 };

461 462
	container: HTMLElement = window.document.body;

B
Benjamin Pasero 已提交
463
	onZenModeChange: Event<boolean> = Event.None;
S
SteVen Batten 已提交
464 465
	onCenteredLayoutChange: Event<boolean> = Event.None;
	onFullscreenChange: Event<boolean> = Event.None;
466
	onMaximizeChange: Event<boolean> = Event.None;
467
	onPanelPositionChange: Event<string> = Event.None;
468
	onPartVisibilityChange: Event<void> = Event.None;
469
	onLayout = Event.None;
B
Benjamin Pasero 已提交
470

471
	private readonly _onMenubarVisibilityChange = new Emitter<Dimension>();
472

473 474 475 476
	public get onMenubarVisibilityChange(): Event<Dimension> {
		return this._onMenubarVisibilityChange.event;
	}

B
Benjamin Pasero 已提交
477
	public isRestored(): boolean {
E
Erich Gamma 已提交
478 479 480
		return true;
	}

481
	public hasFocus(_part: Parts): boolean {
E
Erich Gamma 已提交
482 483 484
		return false;
	}

E
Eric Amodio 已提交
485 486 487 488 489 490 491 492
	public hasWindowBorder(): boolean {
		return false;
	}

	public getWindowBorderRadius(): string | undefined {
		return undefined;
	}

493
	public isVisible(_part: Parts): boolean {
E
Erich Gamma 已提交
494 495 496
		return true;
	}

497 498 499 500
	getDimension(_part: Parts): Dimension {
		return new Dimension(0, 0);
	}

501
	public getContainer(_part: Parts): HTMLElement {
B
Benjamin Pasero 已提交
502
		return null!;
503 504
	}

B
Benjamin Pasero 已提交
505 506 507 508
	public isTitleBarHidden(): boolean {
		return false;
	}

509 510 511 512
	public getTitleBarOffset(): number {
		return 0;
	}

513 514 515 516
	public isStatusBarHidden(): boolean {
		return false;
	}

S
Sanders Lauture 已提交
517 518 519 520
	public isActivityBarHidden(): boolean {
		return false;
	}

521
	public setActivityBarHidden(_hidden: boolean): void { }
S
Sanders Lauture 已提交
522

E
Erich Gamma 已提交
523 524 525 526
	public isSideBarHidden(): boolean {
		return false;
	}

527
	public setEditorHidden(_hidden: boolean): Promise<void> { return Promise.resolve(); }
S
SteVen Batten 已提交
528

529
	public setSideBarHidden(_hidden: boolean): Promise<void> { return Promise.resolve(); }
E
Erich Gamma 已提交
530

I
isidor 已提交
531
	public isPanelHidden(): boolean {
I
isidor 已提交
532 533 534
		return false;
	}

535
	public setPanelHidden(_hidden: boolean): Promise<void> { return Promise.resolve(); }
I
isidor 已提交
536

I
isidor 已提交
537 538
	public toggleMaximizedPanel(): void { }

B
Benjamin Pasero 已提交
539 540 541 542
	public isPanelMaximized(): boolean {
		return false;
	}

S
SteVen Batten 已提交
543
	public getMenubarVisibility(): MenuBarVisibility {
544
		throw new Error('not implemented');
S
SteVen Batten 已提交
545 546
	}

E
Erich Gamma 已提交
547 548 549 550
	public getSideBarPosition() {
		return 0;
	}

I
isidor 已提交
551 552 553 554
	public getPanelPosition() {
		return 0;
	}

J
Johannes Rieken 已提交
555
	public setPanelPosition(_position: PartPosition): Promise<void> {
556
		return Promise.resolve();
I
isidor 已提交
557 558
	}

559 560
	public addClass(_clazz: string): void { }
	public removeClass(_clazz: string): void { }
561

562 563
	public getMaximumEditorDimensions(): Dimension { throw new Error('not implemented'); }

564
	public getWorkbenchContainer(): HTMLElement { throw new Error('not implemented'); }
565
	public getWorkbenchElement(): HTMLElement { throw new Error('not implemented'); }
B
Benjamin Pasero 已提交
566

I
isidor 已提交
567
	public toggleZenMode(): void { }
568

B
Benjamin Pasero 已提交
569
	public isEditorLayoutCentered(): boolean { return false; }
570
	public centerEditorLayout(_active: boolean): void { }
S
SrTobi 已提交
571 572


573
	public resizePart(_part: Parts, _sizeChange: number): void { }
574 575

	public registerPart(part: Part): void { }
576 577 578 579 580 581

	isWindowMaximized() {
		return false;
	}

	public updateWindowMaximizedState(maximized: boolean): void { }
E
Erich Gamma 已提交
582 583
}

584
let activeViewlet: Viewlet = {} as any;
585

586
export class TestViewletService implements IViewletService {
587
	public _serviceBrand: undefined;
588 589 590 591 592 593 594 595 596 597 598

	onDidViewletRegisterEmitter = new Emitter<ViewletDescriptor>();
	onDidViewletDeregisterEmitter = new Emitter<ViewletDescriptor>();
	onDidViewletOpenEmitter = new Emitter<IViewlet>();
	onDidViewletCloseEmitter = new Emitter<IViewlet>();

	onDidViewletRegister = this.onDidViewletRegisterEmitter.event;
	onDidViewletDeregister = this.onDidViewletDeregisterEmitter.event;
	onDidViewletOpen = this.onDidViewletOpenEmitter.event;
	onDidViewletClose = this.onDidViewletCloseEmitter.event;

B
Benjamin Pasero 已提交
599 600
	public openViewlet(id: string, focus?: boolean): Promise<IViewlet | undefined> {
		return Promise.resolve(undefined);
601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626
	}

	public getViewlets(): ViewletDescriptor[] {
		return [];
	}

	public getAllViewlets(): ViewletDescriptor[] {
		return [];
	}

	public getActiveViewlet(): IViewlet {
		return activeViewlet;
	}

	public dispose() {
	}

	public getDefaultViewletId(): string {
		return 'workbench.view.explorer';
	}

	public getViewlet(id: string): ViewletDescriptor | undefined {
		return undefined;
	}

	public getProgressIndicator(id: string) {
B
Benjamin Pasero 已提交
627
		return undefined;
628
	}
629 630 631 632

	public hideActiveViewlet(): void { }

	public getLastActiveViewletId(): string {
M
Matt Bierner 已提交
633
		return undefined!;
634
	}
635 636 637
}

export class TestPanelService implements IPanelService {
638
	public _serviceBrand: undefined;
639 640 641 642

	onDidPanelOpen = new Emitter<{ panel: IPanel, focus: boolean }>().event;
	onDidPanelClose = new Emitter<IPanel>().event;

643 644
	public openPanel(id: string, focus?: boolean): undefined {
		return undefined;
645 646
	}

B
Benjamin Pasero 已提交
647 648 649 650
	public getPanel(id: string): any {
		return activeViewlet;
	}

651
	public getPanels() {
652 653 654
		return [];
	}

655
	public getPinnedPanels() {
656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671
		return [];
	}

	public getActivePanel(): IViewlet {
		return activeViewlet;
	}

	public setPanelEnablement(id: string, enabled: boolean): void { }

	public dispose() {
	}

	public showActivity(panelId: string, badge: IBadge, clazz?: string): IDisposable {
		throw new Error('Method not implemented.');
	}

B
Benjamin Pasero 已提交
672 673 674 675
	public getProgressIndicator(id: string) {
		return null!;
	}

676 677 678
	public hideActivePanel(): void { }

	public getLastActivePanelId(): string {
M
Matt Bierner 已提交
679
		return undefined!;
680 681 682
	}
}

683
export class TestStorageService extends InMemoryStorageService { }
684

685 686
export class TestEditorGroupsService implements IEditorGroupsService {

687
	_serviceBrand: undefined;
688

B
Benjamin Pasero 已提交
689
	constructor(public groups: TestEditorGroup[] = []) { }
690

691
	onDidActiveGroupChange: Event<IEditorGroup> = Event.None;
B
Benjamin Pasero 已提交
692
	onDidActivateGroup: Event<IEditorGroup> = Event.None;
693 694 695
	onDidAddGroup: Event<IEditorGroup> = Event.None;
	onDidRemoveGroup: Event<IEditorGroup> = Event.None;
	onDidMoveGroup: Event<IEditorGroup> = Event.None;
696
	onDidGroupIndexChange: Event<IEditorGroup> = Event.None;
697
	onDidLayout: Event<IDimension> = Event.None;
698 699

	orientation: any;
R
Rob Lourens 已提交
700
	whenRestored: Promise<void> = Promise.resolve(undefined);
B
Benjamin Pasero 已提交
701
	willRestoreEditors = false;
702

J
Joao Moreno 已提交
703
	contentDimension = { width: 800, height: 600 };
704

705
	get activeGroup(): IEditorGroup {
706 707 708 709 710 711 712
		return this.groups[0];
	}

	get count(): number {
		return this.groups.length;
	}

713
	getGroups(_order?: GroupsOrder): ReadonlyArray<IEditorGroup> {
714 715 716
		return this.groups;
	}

717 718
	getGroup(identifier: number): IEditorGroup | undefined {
		return find(this.groups, group => group.id === identifier);
719 720
	}

721
	getLabel(_identifier: number): string {
722 723 724
		return 'Group 1';
	}

725
	findGroup(_scope: IFindGroupScope, _source?: number | IEditorGroup, _wrap?: boolean): IEditorGroup {
726
		throw new Error('not implemented');
727 728
	}

729
	activateGroup(_group: number | IEditorGroup): IEditorGroup {
730
		throw new Error('not implemented');
731 732
	}

B
Benjamin Pasero 已提交
733 734 735 736
	restoreGroup(_group: number | IEditorGroup): IEditorGroup {
		throw new Error('not implemented');
	}

737 738
	getSize(_group: number | IEditorGroup): { width: number, height: number } {
		return { width: 100, height: 100 };
739 740
	}

741
	setSize(_group: number | IEditorGroup, _size: { width: number, height: number }): void { }
742

743
	arrangeGroups(_arrangement: GroupsArrangement): void { }
744

745
	applyLayout(_layout: EditorGroupLayout): void { }
746

747
	setGroupOrientation(_orientation: any): void { }
748

749
	addGroup(_location: number | IEditorGroup, _direction: GroupDirection, _options?: IAddGroupOptions): IEditorGroup {
750
		throw new Error('not implemented');
751 752
	}

753
	removeGroup(_group: number | IEditorGroup): void { }
754

755
	moveGroup(_group: number | IEditorGroup, _location: number | IEditorGroup, _direction: GroupDirection): IEditorGroup {
756
		throw new Error('not implemented');
757 758
	}

759
	mergeGroup(_group: number | IEditorGroup, _target: number | IEditorGroup, _options?: IMergeGroupOptions): IEditorGroup {
760
		throw new Error('not implemented');
761 762
	}

763
	copyGroup(_group: number | IEditorGroup, _location: number | IEditorGroup, _direction: GroupDirection): IEditorGroup {
764
		throw new Error('not implemented');
765
	}
766 767 768 769 770 771 772

	centerLayout(active: boolean): void { }

	isLayoutCentered(): boolean {
		return false;
	}

773
	partOptions!: IEditorPartOptions;
774 775
	enforcePartOptions(options: IEditorPartOptions): IDisposable {
		return Disposable.None;
776 777 778
	}
}

B
Benjamin Pasero 已提交
779
export class TestEditorGroup implements IEditorGroupView {
780 781 782

	constructor(public id: number) { }

783
	get group(): EditorGroup { throw new Error('not implemented'); }
784 785 786 787 788
	activeControl!: IVisibleEditor;
	activeEditor!: IEditorInput;
	previewEditor!: IEditorInput;
	count!: number;
	disposed!: boolean;
B
Benjamin Pasero 已提交
789
	editors: ReadonlyArray<IEditorInput> = [];
790 791
	label!: string;
	index!: number;
R
Rob Lourens 已提交
792
	whenRestored: Promise<void> = Promise.resolve(undefined);
793 794 795 796 797
	element!: HTMLElement;
	minimumWidth!: number;
	maximumWidth!: number;
	minimumHeight!: number;
	maximumHeight!: number;
798

799 800 801
	isEmpty = true;
	isMinimized = false;

802
	onWillDispose: Event<void> = Event.None;
803
	onDidGroupChange: Event<IGroupChangeEvent> = Event.None;
B
Benjamin Pasero 已提交
804 805
	onWillCloseEditor: Event<IEditorCloseEvent> = Event.None;
	onDidCloseEditor: Event<IEditorCloseEvent> = Event.None;
806 807
	onWillOpenEditor: Event<IEditorOpeningEvent> = Event.None;
	onDidOpenEditorFail: Event<IEditorInput> = Event.None;
B
Benjamin Pasero 已提交
808 809
	onDidFocus: Event<void> = Event.None;
	onDidChange: Event<{ width: number; height: number; }> = Event.None;
810

811
	getEditors(_order?: EditorsOrder): ReadonlyArray<IEditorInput> {
B
Benjamin Pasero 已提交
812 813 814
		return [];
	}

815
	getEditor(_index: number): IEditorInput {
816
		throw new Error('not implemented');
817 818
	}

819
	getIndexOfEditor(_editor: IEditorInput): number {
820 821 822
		return -1;
	}

J
Johannes Rieken 已提交
823
	openEditor(_editor: IEditorInput, _options?: IEditorOptions): Promise<IEditor> {
824
		throw new Error('not implemented');
825 826
	}

J
Johannes Rieken 已提交
827
	openEditors(_editors: IEditorInputWithOptions[]): Promise<IEditor> {
828
		throw new Error('not implemented');
829 830
	}

831
	isOpened(_editor: IEditorInput): boolean {
832 833 834
		return false;
	}

835
	isPinned(_editor: IEditorInput): boolean {
836 837 838
		return false;
	}

839
	isActive(_editor: IEditorInput): boolean {
840 841 842
		return false;
	}

843
	moveEditor(_editor: IEditorInput, _target: IEditorGroup, _options?: IMoveEditorOptions): void { }
844

845
	copyEditor(_editor: IEditorInput, _target: IEditorGroup, _options?: ICopyEditorOptions): void { }
846

847
	closeEditor(_editor?: IEditorInput, options?: ICloseEditorOptions): Promise<void> {
B
Benjamin Pasero 已提交
848
		return Promise.resolve();
849 850
	}

851
	closeEditors(_editors: IEditorInput[] | { except?: IEditorInput; direction?: CloseDirection; savedOnly?: boolean; }, options?: ICloseEditorOptions): Promise<void> {
B
Benjamin Pasero 已提交
852
		return Promise.resolve();
853 854
	}

J
Johannes Rieken 已提交
855
	closeAllEditors(): Promise<void> {
B
Benjamin Pasero 已提交
856
		return Promise.resolve();
857 858
	}

J
Johannes Rieken 已提交
859
	replaceEditors(_editors: IEditorReplacement[]): Promise<void> {
B
Benjamin Pasero 已提交
860
		return Promise.resolve();
861 862
	}

863
	pinEditor(_editor?: IEditorInput): void { }
864 865 866 867

	focus(): void { }

	invokeWithinContext<T>(fn: (accessor: ServicesAccessor) => T): T {
868
		throw new Error('not implemented');
869
	}
B
Benjamin Pasero 已提交
870

871
	setActive(_isActive: boolean): void { }
B
Benjamin Pasero 已提交
872
	notifyIndexChanged(_index: number): void { }
B
Benjamin Pasero 已提交
873 874
	dispose(): void { }
	toJSON(): object { return Object.create(null); }
875
	layout(_width: number, _height: number): void { }
876
	relayout() { }
877 878
}

B
Benjamin Pasero 已提交
879
export class TestEditorService implements EditorServiceImpl {
880

881
	_serviceBrand: undefined;
882 883 884

	onDidActiveEditorChange: Event<void> = Event.None;
	onDidVisibleEditorsChange: Event<void> = Event.None;
B
Benjamin Pasero 已提交
885
	onDidCloseEditor: Event<IEditorCloseEvent> = Event.None;
886 887
	onDidOpenEditorFail: Event<IEditorIdentifier> = Event.None;

888
	activeControl!: IVisibleEditor;
889
	activeTextEditorWidget: any;
890
	activeEditor!: IEditorInput;
891
	editors: ReadonlyArray<IEditorInput> = [];
M
Matt Bierner 已提交
892
	visibleControls: ReadonlyArray<IVisibleEditor> = [];
893
	visibleTextEditorWidgets = [];
B
Benjamin Pasero 已提交
894
	visibleEditors: ReadonlyArray<IEditorInput> = [];
895

896
	overrideOpenEditor(_handler: IOpenEditorOverrideHandler): IDisposable {
R
Rob Lourens 已提交
897
		return toDisposable(() => undefined);
898 899
	}

900 901
	openEditor(_editor: any, _options?: any, _group?: any): Promise<any> {
		throw new Error('not implemented');
902 903
	}

904 905
	openEditors(_editors: any, _group?: any): Promise<IEditor[]> {
		throw new Error('not implemented');
906 907
	}

908
	isOpen(_editor: IEditorInput | IResourceInput | IUntitledTextResourceInput): boolean {
909 910 911
		return false;
	}

912
	getOpened(_editor: IEditorInput | IResourceInput | IUntitledTextResourceInput): IEditorInput {
913
		throw new Error('not implemented');
914 915
	}

916
	replaceEditors(_editors: any, _group: any) {
R
Rob Lourens 已提交
917
		return Promise.resolve(undefined);
918 919
	}

920
	invokeWithinEditorContext<T>(fn: (accessor: ServicesAccessor) => T): T {
921
		throw new Error('not implemented');
922 923
	}

924
	createInput(_input: IResourceInput | IUntitledTextResourceInput | IResourceDiffInput | IResourceSideBySideInput): IEditorInput {
925
		throw new Error('not implemented');
926 927 928
	}
}

929 930
export class TestFileService implements IFileService {

931
	public _serviceBrand: undefined;
932

M
Matt Bierner 已提交
933 934
	private readonly _onFileChanges: Emitter<FileChangesEvent>;
	private readonly _onAfterOperation: Emitter<FileOperationEvent>;
935

936
	readonly onWillActivateFileSystemProvider = Event.None;
937
	readonly onError: Event<Error> = Event.None;
938

939
	private content = 'Hello Html';
940
	private lastReadFileUri!: URI;
941

942 943 944 945 946
	constructor() {
		this._onFileChanges = new Emitter<FileChangesEvent>();
		this._onAfterOperation = new Emitter<FileOperationEvent>();
	}

947 948 949 950 951 952 953 954
	public setContent(content: string): void {
		this.content = content;
	}

	public getContent(): string {
		return this.content;
	}

955 956 957 958
	public getLastReadFileUri(): URI {
		return this.lastReadFileUri;
	}

959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974
	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);
	}

B
Benjamin Pasero 已提交
975 976 977
	resolve(resource: URI, _options?: IResolveFileOptions): Promise<IFileStat>;
	resolve(resource: URI, _options: IResolveMetadataFileOptions): Promise<IFileStatWithMetadata>;
	resolve(resource: URI, _options?: IResolveFileOptions): Promise<IFileStat> {
B
Benjamin Pasero 已提交
978
		return Promise.resolve({
979 980
			resource,
			etag: Date.now().toString(),
B
Benjamin Pasero 已提交
981
			encoding: 'utf8',
B
Benjamin Pasero 已提交
982
			mtime: Date.now(),
983
			size: 42,
984
			isFile: true,
985
			isDirectory: false,
986
			isSymbolicLink: false,
B
Benjamin Pasero 已提交
987
			name: resources.basename(resource)
B
Benjamin Pasero 已提交
988
		});
989
	}
B
Benjamin Pasero 已提交
990

B
Benjamin Pasero 已提交
991 992
	resolveAll(toResolve: { resource: URI, options?: IResolveFileOptions }[]): Promise<IResolveFileResult[]> {
		return Promise.all(toResolve.map(resourceAndOption => this.resolve(resourceAndOption.resource, resourceAndOption.options))).then(stats => stats.map(stat => ({ stat, success: true })));
I
isidor 已提交
993 994
	}

B
Benjamin Pasero 已提交
995
	exists(_resource: URI): Promise<boolean> {
B
Benjamin Pasero 已提交
996
		return Promise.resolve(true);
997
	}
B
Benjamin Pasero 已提交
998

999
	readFile(resource: URI, options?: IReadFileOptions | undefined): Promise<IFileContent> {
1000 1001
		this.lastReadFileUri = resource;

1002
		return Promise.resolve({
B
Benjamin Pasero 已提交
1003
			resource: resource,
1004
			value: VSBuffer.fromString(this.content),
1005
			etag: 'index.txt',
B
Benjamin Pasero 已提交
1006 1007
			encoding: 'utf8',
			mtime: Date.now(),
1008
			ctime: Date.now(),
1009 1010
			name: resources.basename(resource),
			size: 1
E
Erich Gamma 已提交
1011
		});
1012
	}
E
Erich Gamma 已提交
1013

1014
	readFileStream(resource: URI, options?: IReadFileOptions | undefined): Promise<IFileStreamContent> {
1015 1016
		this.lastReadFileUri = resource;

1017
		return Promise.resolve({
A
Alex Dima 已提交
1018 1019
			resource: resource,
			value: {
1020
				on: (event: string, callback: Function): void => {
A
Alex Dima 已提交
1021
					if (event === 'data') {
1022
						callback(this.content);
A
Alex Dima 已提交
1023 1024 1025 1026
					}
					if (event === 'end') {
						callback();
					}
B
Benjamin Pasero 已提交
1027 1028 1029 1030
				},
				resume: () => { },
				pause: () => { },
				destroy: () => { }
A
Alex Dima 已提交
1031 1032 1033
			},
			etag: 'index.txt',
			encoding: 'utf8',
B
Benjamin Pasero 已提交
1034
			mtime: Date.now(),
1035
			ctime: Date.now(),
1036 1037
			size: 1,
			name: resources.basename(resource)
A
Alex Dima 已提交
1038
		});
1039 1040
	}

1041
	writeFile(resource: URI, bufferOrReadable: VSBuffer | VSBufferReadable, options?: IWriteFileOptions): Promise<IFileStatWithMetadata> {
B
Benjamin Pasero 已提交
1042
		return timeout(0).then(() => ({
1043 1044 1045 1046
			resource,
			etag: 'index.txt',
			encoding: 'utf8',
			mtime: Date.now(),
1047
			ctime: Date.now(),
1048
			size: 42,
1049
			isFile: true,
1050
			isDirectory: false,
1051
			isSymbolicLink: false,
B
Benjamin Pasero 已提交
1052
			name: resources.basename(resource)
B
Benjamin Pasero 已提交
1053
		}));
1054
	}
D
Daniel Imms 已提交
1055

B
Benjamin Pasero 已提交
1056
	move(_source: URI, _target: URI, _overwrite?: boolean): Promise<IFileStatWithMetadata> {
1057
		return Promise.resolve(null!);
1058
	}
D
Daniel Imms 已提交
1059

B
Benjamin Pasero 已提交
1060
	copy(_source: URI, _target: URI, _overwrite?: boolean): Promise<IFileStatWithMetadata> {
1061
		throw new Error('not implemented');
1062
	}
D
Daniel Imms 已提交
1063

1064
	createFile(_resource: URI, _content?: VSBuffer | VSBufferReadable, _options?: ICreateFileOptions): Promise<IFileStatWithMetadata> {
1065
		throw new Error('not implemented');
E
Erich Gamma 已提交
1066
	}
1067

1068
	createFolder(_resource: URI): Promise<IFileStatWithMetadata> {
1069
		throw new Error('not implemented');
1070 1071
	}

1072 1073
	onDidChangeFileSystemProviderRegistrations = Event.None;

1074 1075 1076 1077 1078 1079
	private providers = new Map<string, IFileSystemProvider>();

	registerProvider(scheme: string, provider: IFileSystemProvider) {
		this.providers.set(scheme, provider);

		return toDisposable(() => this.providers.delete(scheme));
1080 1081
	}

1082 1083
	activateProvider(_scheme: string): Promise<void> {
		throw new Error('not implemented');
1084 1085
	}

1086
	canHandleResource(resource: URI): boolean {
1087
		return resource.scheme === 'file' || this.providers.has(resource.scheme);
1088 1089
	}

1090
	hasCapability(resource: URI, capability: FileSystemProviderCapabilities): boolean { return false; }
1091

J
Johannes Rieken 已提交
1092
	del(_resource: URI, _options?: { useTrash?: boolean, recursive?: boolean }): Promise<void> {
1093
		return Promise.resolve();
1094 1095
	}

1096 1097
	watch(_resource: URI): IDisposable {
		return Disposable.None;
1098 1099
	}

1100 1101
	getWriteEncoding(_resource: URI): IResourceEncoding {
		return { encoding: 'utf8', hasBOM: false };
1102
	}
D
Daniel Imms 已提交
1103

1104
	dispose(): void {
E
Erich Gamma 已提交
1105
	}
1106
}
1107

1108
export class TestBackupFileService implements IBackupFileService {
1109
	public _serviceBrand: undefined;
1110

J
Johannes Rieken 已提交
1111
	public hasBackups(): Promise<boolean> {
B
Benjamin Pasero 已提交
1112
		return Promise.resolve(false);
1113 1114
	}

J
Johannes Rieken 已提交
1115
	public hasBackup(_resource: URI): Promise<boolean> {
B
Benjamin Pasero 已提交
1116
		return Promise.resolve(false);
1117 1118
	}

1119 1120 1121 1122
	public hasBackupSync(resource: URI, versionId?: number): boolean {
		return false;
	}

1123
	public loadBackupResource(resource: URI): Promise<URI | undefined> {
B
Benjamin Pasero 已提交
1124 1125
		return this.hasBackup(resource).then(hasBackup => {
			if (hasBackup) {
1126
				return this.toBackupResource(resource);
B
Benjamin Pasero 已提交
1127 1128
			}

R
Rob Lourens 已提交
1129
			return undefined;
B
Benjamin Pasero 已提交
1130 1131 1132
		});
	}

J
Johannes Rieken 已提交
1133
	public registerResourceForBackup(_resource: URI): Promise<void> {
B
Benjamin Pasero 已提交
1134
		return Promise.resolve();
D
Daniel Imms 已提交
1135 1136
	}

J
Johannes Rieken 已提交
1137
	public deregisterResourceForBackup(_resource: URI): Promise<void> {
B
Benjamin Pasero 已提交
1138
		return Promise.resolve();
D
Daniel Imms 已提交
1139 1140
	}

1141
	public toBackupResource(_resource: URI): URI {
1142
		throw new Error('not implemented');
D
Daniel Imms 已提交
1143
	}
1144

1145
	public backupResource<T extends object>(_resource: URI, _content: ITextSnapshot, versionId?: number, meta?: T): Promise<void> {
B
Benjamin Pasero 已提交
1146
		return Promise.resolve();
1147 1148
	}

J
Johannes Rieken 已提交
1149
	public getWorkspaceFileBackups(): Promise<URI[]> {
B
Benjamin Pasero 已提交
1150
		return Promise.resolve([]);
1151 1152
	}

1153 1154 1155 1156 1157
	public parseBackupContent(textBufferFactory: ITextBufferFactory): string {
		const textBuffer = textBufferFactory.create(DefaultEndOfLine.LF);
		const lineCount = textBuffer.getLineCount();
		const range = new Range(1, 1, lineCount, textBuffer.getLineLength(lineCount) + 1);
		return textBuffer.getValueInRange(range, EndOfLinePreference.TextDefined);
1158 1159
	}

1160
	public resolveBackupContent<T extends object>(_backup: URI): Promise<IResolvedBackup<T>> {
1161
		throw new Error('not implemented');
1162 1163
	}

J
Johannes Rieken 已提交
1164
	public discardResourceBackup(_resource: URI): Promise<void> {
B
Benjamin Pasero 已提交
1165
		return Promise.resolve();
1166 1167
	}

J
Johannes Rieken 已提交
1168
	public discardAllWorkspaceBackups(): Promise<void> {
B
Benjamin Pasero 已提交
1169
		return Promise.resolve();
1170
	}
1171
}
D
Daniel Imms 已提交
1172

B
Benjamin Pasero 已提交
1173
export class TestCodeEditorService implements ICodeEditorService {
1174
	_serviceBrand: undefined;
B
Benjamin Pasero 已提交
1175 1176 1177 1178 1179

	onCodeEditorAdd: Event<ICodeEditor> = Event.None;
	onCodeEditorRemove: Event<ICodeEditor> = Event.None;
	onDiffEditorAdd: Event<IDiffEditor> = Event.None;
	onDiffEditorRemove: Event<IDiffEditor> = Event.None;
A
Alex Dima 已提交
1180
	onDidChangeTransientModelProperty: Event<ITextModel> = Event.None;
B
Benjamin Pasero 已提交
1181

1182 1183
	addCodeEditor(_editor: ICodeEditor): void { }
	removeCodeEditor(_editor: ICodeEditor): void { }
B
Benjamin Pasero 已提交
1184
	listCodeEditors(): ICodeEditor[] { return []; }
1185 1186
	addDiffEditor(_editor: IDiffEditor): void { }
	removeDiffEditor(_editor: IDiffEditor): void { }
B
Benjamin Pasero 已提交
1187
	listDiffEditors(): IDiffEditor[] { return []; }
1188
	getFocusedCodeEditor(): ICodeEditor | null { return null; }
1189 1190 1191 1192 1193
	registerDecorationType(_key: string, _options: IDecorationRenderOptions, _parentTypeKey?: string): void { }
	removeDecorationType(_key: string): void { }
	resolveDecorationOptions(_typeKey: string, _writable: boolean): IModelDecorationOptions { return Object.create(null); }
	setTransientModelProperty(_model: ITextModel, _key: string, _value: any): void { }
	getTransientModelProperty(_model: ITextModel, _key: string) { }
1194 1195
	getActiveCodeEditor(): ICodeEditor | null { return null; }
	openCodeEditor(_input: IResourceInput, _source: ICodeEditor, _sideBySide?: boolean): Promise<ICodeEditor | null> { return Promise.resolve(null); }
B
Benjamin Pasero 已提交
1196 1197
}

1198 1199
export class TestLifecycleService implements ILifecycleService {

1200
	public _serviceBrand: undefined;
1201

1202 1203
	public phase!: LifecyclePhase;
	public startupKind!: StartupKind;
1204

1205 1206 1207
	private readonly _onBeforeShutdown = new Emitter<BeforeShutdownEvent>();
	private readonly _onWillShutdown = new Emitter<WillShutdownEvent>();
	private readonly _onShutdown = new Emitter<void>();
1208

J
Johannes Rieken 已提交
1209
	when(): Promise<void> {
B
Benjamin Pasero 已提交
1210
		return Promise.resolve();
B
Benjamin Pasero 已提交
1211
	}
1212

1213
	public fireShutdown(reason = ShutdownReason.QUIT): void {
1214
		this._onWillShutdown.fire({
1215 1216 1217
			join: () => { },
			reason
		});
1218 1219
	}

1220 1221 1222 1223 1224 1225
	public fireWillShutdown(event: BeforeShutdownEvent): void {
		this._onBeforeShutdown.fire(event);
	}

	public get onBeforeShutdown(): Event<BeforeShutdownEvent> {
		return this._onBeforeShutdown.event;
1226 1227
	}

1228
	public get onWillShutdown(): Event<WillShutdownEvent> {
1229 1230 1231
		return this._onWillShutdown.event;
	}

1232
	public get onShutdown(): Event<void> {
1233 1234
		return this._onShutdown.event;
	}
1235 1236
}

1237 1238
export class TestTextResourceConfigurationService implements ITextResourceConfigurationService {

1239
	_serviceBrand: undefined;
1240 1241 1242 1243

	constructor(private configurationService = new TestConfigurationService()) {
	}

1244
	public onDidChangeConfiguration() {
1245 1246 1247
		return { dispose() { } };
	}

1248
	getValue<T>(resource: URI, arg2?: any, arg3?: any): T {
1249 1250
		const position: IPosition | null = EditorPosition.isIPosition(arg2) ? arg2 : null;
		const section: string | undefined = position ? (typeof arg3 === 'string' ? arg3 : undefined) : (typeof arg2 === 'string' ? arg2 : undefined);
1251
		return this.configurationService.getValue(section, { resource });
1252
	}
B
Benjamin Pasero 已提交
1253 1254
}

S
Sandeep Somavarapu 已提交
1255 1256
export class TestTextResourcePropertiesService implements ITextResourcePropertiesService {

1257
	_serviceBrand: undefined;
S
Sandeep Somavarapu 已提交
1258 1259

	constructor(
1260
		@IConfigurationService private readonly configurationService: IConfigurationService,
S
Sandeep Somavarapu 已提交
1261 1262 1263
	) {
	}

1264 1265 1266 1267
	getEOL(resource: URI, language?: string): string {
		const eol = this.configurationService.getValue<string>('files.eol', { overrideIdentifier: language, resource });
		if (eol && eol !== 'auto') {
			return eol;
S
Sandeep Somavarapu 已提交
1268 1269 1270 1271 1272 1273
		}
		return (isLinux || isMacintosh) ? '\n' : '\r\n';
	}
}


1274
export class TestSharedProcessService implements ISharedProcessService {
1275

1276
	_serviceBrand: undefined;
1277

1278 1279 1280
	getChannel(channelName: string): any {
		return undefined;
	}
1281

1282
	registerChannel(channelName: string, channel: any): void { }
1283 1284 1285

	async toggleSharedProcessWindow(): Promise<void> { }
	async whenSharedProcessReady(): Promise<void> { }
1286 1287
}

1288 1289 1290 1291 1292 1293 1294
export class RemoteFileSystemProvider implements IFileSystemProvider {

	constructor(private readonly diskFileSystemProvider: IFileSystemProvider, private readonly remoteAuthority: string) { }

	readonly capabilities: FileSystemProviderCapabilities = this.diskFileSystemProvider.capabilities;
	readonly onDidChangeCapabilities: Event<void> = this.diskFileSystemProvider.onDidChangeCapabilities;

M
Matt Bierner 已提交
1295 1296 1297 1298 1299 1300
	readonly onDidChangeFile: Event<readonly IFileChange[]> = Event.map(this.diskFileSystemProvider.onDidChangeFile, changes => changes.map((c): IFileChange => {
		return {
			type: c.type,
			resource: c.resource.with({ scheme: Schemas.vscodeRemote, authority: this.remoteAuthority }),
		};
	}));
1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319
	watch(resource: URI, opts: IWatchOptions): IDisposable { return this.diskFileSystemProvider.watch(this.toFileResource(resource), opts); }

	stat(resource: URI): Promise<IStat> { return this.diskFileSystemProvider.stat(this.toFileResource(resource)); }
	mkdir(resource: URI): Promise<void> { return this.diskFileSystemProvider.mkdir(this.toFileResource(resource)); }
	readdir(resource: URI): Promise<[string, FileType][]> { return this.diskFileSystemProvider.readdir(this.toFileResource(resource)); }
	delete(resource: URI, opts: FileDeleteOptions): Promise<void> { return this.diskFileSystemProvider.delete(this.toFileResource(resource), opts); }

	rename(from: URI, to: URI, opts: FileOverwriteOptions): Promise<void> { return this.diskFileSystemProvider.rename(this.toFileResource(from), this.toFileResource(to), opts); }
	copy(from: URI, to: URI, opts: FileOverwriteOptions): Promise<void> { return this.diskFileSystemProvider.copy!(this.toFileResource(from), this.toFileResource(to), opts); }

	readFile(resource: URI): Promise<Uint8Array> { return this.diskFileSystemProvider.readFile!(this.toFileResource(resource)); }
	writeFile(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise<void> { return this.diskFileSystemProvider.writeFile!(this.toFileResource(resource), content, opts); }

	open(resource: URI, opts: FileOpenOptions): Promise<number> { return this.diskFileSystemProvider.open!(this.toFileResource(resource), opts); }
	close(fd: number): Promise<void> { return this.diskFileSystemProvider.close!(fd); }
	read(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise<number> { return this.diskFileSystemProvider.read!(fd, pos, data, offset, length); }
	write(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise<number> { return this.diskFileSystemProvider.write!(fd, pos, data, offset, length); }

	private toFileResource(resource: URI): URI { return resource.with({ scheme: Schemas.file, authority: '' }); }
J
Joao Moreno 已提交
1320
}
1321 1322

export const productService: IProductService = { _serviceBrand: undefined, ...product };
1323 1324 1325 1326 1327

export class TestHostService implements IHostService {

	_serviceBrand: undefined;

1328 1329 1330
	readonly hasFocus: boolean = true;
	readonly onDidChangeFocus: Event<boolean> = Event.None;

1331 1332
	async restart(): Promise<void> { }
	async reload(): Promise<void> { }
1333

1334 1335
	async focus(): Promise<void> { }

1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360
	async openWindow(arg1?: IOpenEmptyWindowOptions | IWindowOpenable[], arg2?: IOpenWindowOptions): Promise<void> { }

	async toggleFullScreen(): Promise<void> { }
}

export class TestElectronService implements IElectronService {
	_serviceBrand: undefined;

	onWindowOpen: Event<number> = Event.None;
	onWindowMaximize: Event<number> = Event.None;
	onWindowUnmaximize: Event<number> = Event.None;
	onWindowFocus: Event<number> = Event.None;
	onWindowBlur: Event<number> = Event.None;

	windowCount = Promise.resolve(1);
	getWindowCount(): Promise<number> { return this.windowCount; }

	async getWindows(): Promise<IOpenedWindow[]> { return []; }
	async getActiveWindowId(): Promise<number | undefined> { return undefined; }

	openWindow(options?: IOpenEmptyWindowOptions): Promise<void>;
	openWindow(toOpen: IWindowOpenable[], options?: IOpenWindowOptions): Promise<void>;
	openWindow(arg1?: IOpenEmptyWindowOptions | IWindowOpenable[], arg2?: IOpenWindowOptions): Promise<void> {
		throw new Error('Method not implemented.');
	}
1361

1362
	async toggleFullScreen(): Promise<void> { }
1363 1364 1365 1366 1367 1368 1369
	async handleTitleDoubleClick(): Promise<void> { }
	async isMaximized(): Promise<boolean> { return true; }
	async maximizeWindow(): Promise<void> { }
	async unmaximizeWindow(): Promise<void> { }
	async minimizeWindow(): Promise<void> { }
	async isWindowFocused(): Promise<boolean> { return true; }
	async focusWindow(options?: { windowId?: number | undefined; } | undefined): Promise<void> { }
1370 1371 1372
	async showMessageBox(options: Electron.MessageBoxOptions): Promise<Electron.MessageBoxReturnValue> { throw new Error('Method not implemented.'); }
	async showSaveDialog(options: Electron.SaveDialogOptions): Promise<Electron.SaveDialogReturnValue> { throw new Error('Method not implemented.'); }
	async showOpenDialog(options: Electron.OpenDialogOptions): Promise<Electron.OpenDialogReturnValue> { throw new Error('Method not implemented.'); }
1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395
	async pickFileFolderAndOpen(options: INativeOpenDialogOptions): Promise<void> { }
	async pickFileAndOpen(options: INativeOpenDialogOptions): Promise<void> { }
	async pickFolderAndOpen(options: INativeOpenDialogOptions): Promise<void> { }
	async pickWorkspaceAndOpen(options: INativeOpenDialogOptions): Promise<void> { }
	async showItemInFolder(path: string): Promise<void> { }
	async setRepresentedFilename(path: string): Promise<void> { }
	async setDocumentEdited(edited: boolean): Promise<void> { }
	async openExternal(url: string): Promise<boolean> { return false; }
	async updateTouchBar(items: { id: string; title: string | { value: string; original: string; }; category?: string | { value: string; original: string; } | undefined; iconLocation?: { dark: UriComponents; light?: { readonly scheme: string; readonly authority: string; readonly path: string; readonly query: string; readonly fragment: string; readonly fsPath: string; with: {}; toString: {}; toJSON: {}; } | undefined; } | undefined; precondition?: { getType: {}; equals: {}; evaluate: {}; serialize: {}; keys: {}; map: {}; negate: {}; } | undefined; toggled?: { getType: {}; equals: {}; evaluate: {}; serialize: {}; keys: {}; map: {}; negate: {}; } | undefined; }[][]): Promise<void> { }
	async newWindowTab(): Promise<void> { }
	async showPreviousWindowTab(): Promise<void> { }
	async showNextWindowTab(): Promise<void> { }
	async moveWindowTabToNewWindow(): Promise<void> { }
	async mergeAllWindowTabs(): Promise<void> { }
	async toggleWindowTabsBar(): Promise<void> { }
	async relaunch(options?: { addArgs?: string[] | undefined; removeArgs?: string[] | undefined; } | undefined): Promise<void> { }
	async reload(): Promise<void> { }
	async closeWindow(): Promise<void> { }
	async quit(): Promise<void> { }
	async openDevTools(options?: Electron.OpenDevToolsOptions | undefined): Promise<void> { }
	async toggleDevTools(): Promise<void> { }
	async startCrashReporter(options: Electron.CrashReporterStartOptions): Promise<void> { }
	async resolveProxy(url: string): Promise<string | undefined> { return undefined; }
1396
}
1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460

export class TestBackupMainService implements IBackupMainService {
	_serviceBrand: undefined;

	isHotExitEnabled(): boolean {
		throw new Error('Method not implemented.');
	}

	getWorkspaceBackups(): IWorkspaceBackupInfo[] {
		throw new Error('Method not implemented.');
	}

	getFolderBackupPaths(): URI[] {
		throw new Error('Method not implemented.');
	}

	getEmptyWindowBackupPaths(): IEmptyWindowBackupInfo[] {
		throw new Error('Method not implemented.');
	}

	registerWorkspaceBackupSync(workspace: IWorkspaceBackupInfo, migrateFrom?: string | undefined): string {
		throw new Error('Method not implemented.');
	}

	registerFolderBackupSync(folderUri: URI): string {
		throw new Error('Method not implemented.');
	}

	registerEmptyWindowBackupSync(backupFolder?: string | undefined, remoteAuthority?: string | undefined): string {
		throw new Error('Method not implemented.');
	}

	unregisterWorkspaceBackupSync(workspace: IWorkspaceIdentifier): void {
		throw new Error('Method not implemented.');
	}

	unregisterFolderBackupSync(folderUri: URI): void {
		throw new Error('Method not implemented.');
	}

	unregisterEmptyWindowBackupSync(backupFolder: string): void {
		throw new Error('Method not implemented.');
	}
}

export class TestDialogMainService implements IDialogMainService {
	_serviceBrand: undefined;

	pickFileFolder(options: INativeOpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise<string[] | undefined> {
		throw new Error('Method not implemented.');
	}

	pickFolder(options: INativeOpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise<string[] | undefined> {
		throw new Error('Method not implemented.');
	}

	pickFile(options: INativeOpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise<string[] | undefined> {
		throw new Error('Method not implemented.');
	}

	pickWorkspace(options: INativeOpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise<string[] | undefined> {
		throw new Error('Method not implemented.');
	}

1461
	showMessageBox(options: Electron.MessageBoxOptions, window?: Electron.BrowserWindow | undefined): Promise<Electron.MessageBoxReturnValue> {
1462 1463 1464
		throw new Error('Method not implemented.');
	}

1465
	showSaveDialog(options: Electron.SaveDialogOptions, window?: Electron.BrowserWindow | undefined): Promise<Electron.SaveDialogReturnValue> {
1466 1467 1468
		throw new Error('Method not implemented.');
	}

1469
	showOpenDialog(options: Electron.OpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise<Electron.OpenDialogReturnValue> {
1470 1471 1472
		throw new Error('Method not implemented.');
	}
}
1473

1474
export class TestWorkingCopyService extends WorkingCopyService { }
1475 1476 1477 1478 1479 1480 1481

export class TestFilesConfigurationService extends FilesConfigurationService {

	onFilesConfigurationChange(configuration: any): void {
		super.onFilesConfigurationChange(configuration);
	}
}