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 } 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 { IEditorInputWithOptions, CloseDirection, IEditorIdentifier, IUntitledTextResourceInput, IResourceDiffInput, IResourceSideBySideInput, IEditorInput, IEditor, IEditorCloseEvent, IEditorPartOptions, IRevertOptions } 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, ConfirmResult } 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';
B
Benjamin Pasero 已提交
60
import { IEditorService, IOpenEditorOverrideHandler, IVisibleEditor, ISaveEditorsOptions, IRevertAllEditorsOptions } 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
	private promptPath!: URI;
	private resolveTextContentError!: FileOperationError | null;
A
Alex Dima 已提交
196 197

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

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

243
	public setResolveTextContentErrorOnce(error: FileOperationError): void {
244 245 246
		this.resolveTextContentError = error;
	}

247
	public readStream(resource: URI, options?: IReadTextFileOptions): Promise<ITextFileStreamContent> {
248 249 250 251
		if (this.resolveTextContentError) {
			const error = this.resolveTextContentError;
			this.resolveTextContentError = null;

B
Benjamin Pasero 已提交
252
			return Promise.reject(error);
253 254
		}

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

J
Johannes Rieken 已提交
269
	public promptForPath(_resource: URI, _defaultPath: URI): Promise<URI> {
B
Benjamin Pasero 已提交
270
		return Promise.resolve(this.promptPath);
271 272
	}

J
Johannes Rieken 已提交
273
	protected cleanupBackupsBeforeShutdown(): Promise<void> {
274
		this.cleanupBackupsBeforeShutdownCalled = true;
B
Benjamin Pasero 已提交
275
		return Promise.resolve();
276
	}
A
Alex Dima 已提交
277 278
}

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

	return instantiationService;
}

B
Benjamin Pasero 已提交
325
export class TestDecorationsService implements IDecorationsService {
326
	_serviceBrand: undefined;
B
Benjamin Pasero 已提交
327
	onDidChangeDecorations: Event<IResourceDecorationChangeEvent> = Event.None;
328
	registerDecorationsProvider(_provider: IDecorationsProvider): IDisposable { return Disposable.None; }
329
	getDecoration(_uri: URI, _includeChildren: boolean, _overwrite?: IDecorationData): IDecoration | undefined { return undefined; }
B
Benjamin Pasero 已提交
330 331
}

332
export class TestExtensionService extends NullExtensionService { }
B
Benjamin Pasero 已提交
333 334 335

export class TestMenuService implements IMenuService {

336
	public _serviceBrand: undefined;
B
Benjamin Pasero 已提交
337

338
	createMenu(_id: MenuId, _scopedKeybindingService: IContextKeyService): IMenu {
B
Benjamin Pasero 已提交
339 340
		return {
			onDidChange: Event.None,
R
Rob Lourens 已提交
341
			dispose: () => undefined,
B
Benjamin Pasero 已提交
342 343 344 345 346
			getActions: () => []
		};
	}
}

B
Benjamin Pasero 已提交
347 348
export class TestHistoryService implements IHistoryService {

349
	public _serviceBrand: undefined;
B
Benjamin Pasero 已提交
350 351 352 353 354 355 356

	constructor(private root?: URI) {
	}

	public reopenLastClosedEditor(): void {
	}

357
	public forward(_acrossEditors?: boolean): void {
B
Benjamin Pasero 已提交
358 359
	}

360
	public back(_acrossEditors?: boolean): void {
B
Benjamin Pasero 已提交
361 362
	}

363 364 365
	public last(): void {
	}

366
	public remove(_input: IEditorInput | IResourceInput): void {
B
Benjamin Pasero 已提交
367 368 369 370 371
	}

	public clear(): void {
	}

B
Benjamin Pasero 已提交
372 373 374
	public clearRecentlyOpened(): void {
	}

375
	public getHistory(): Array<IEditorInput | IResourceInput> {
B
Benjamin Pasero 已提交
376 377 378
		return [];
	}

379
	public getLastActiveWorkspaceRoot(_schemeFilter: string): URI | undefined {
B
Benjamin Pasero 已提交
380 381
		return this.root;
	}
382

383
	public getLastActiveFile(_schemeFilter: string): URI | undefined {
R
Rob Lourens 已提交
384
		return undefined;
385
	}
B
Benjamin Pasero 已提交
386 387 388

	public openLastEditLocation(): void {
	}
B
Benjamin Pasero 已提交
389 390
}

391
export class TestDialogService implements IDialogService {
392

393
	public _serviceBrand: undefined;
E
Erich Gamma 已提交
394

J
Johannes Rieken 已提交
395
	public confirm(_confirmation: IConfirmation): Promise<IConfirmationResult> {
B
Benjamin Pasero 已提交
396
		return Promise.resolve({ confirmed: false });
397
	}
398

399 400
	public show(_severity: Severity, _message: string, _buttons: string[], _options?: IDialogOptions): Promise<IShowResult> {
		return Promise.resolve({ choice: 0 });
401
	}
402 403 404 405

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

M
Martin Aeschlimann 已提交
408 409
export class TestFileDialogService implements IFileDialogService {

410
	public _serviceBrand: undefined;
M
Martin Aeschlimann 已提交
411

412 413
	private confirmResult!: ConfirmResult;

414
	public defaultFilePath(_schemeFilter?: string): URI | undefined {
R
Rob Lourens 已提交
415
		return undefined;
M
Martin Aeschlimann 已提交
416
	}
417
	public defaultFolderPath(_schemeFilter?: string): URI | undefined {
R
Rob Lourens 已提交
418
		return undefined;
M
Martin Aeschlimann 已提交
419
	}
420
	public defaultWorkspacePath(_schemeFilter?: string): URI | undefined {
R
Rob Lourens 已提交
421
		return undefined;
M
Martin Aeschlimann 已提交
422
	}
J
Johannes Rieken 已提交
423
	public pickFileFolderAndOpen(_options: IPickAndOpenOptions): Promise<any> {
B
Benjamin Pasero 已提交
424
		return Promise.resolve(0);
M
Martin Aeschlimann 已提交
425
	}
J
Johannes Rieken 已提交
426
	public pickFileAndOpen(_options: IPickAndOpenOptions): Promise<any> {
B
Benjamin Pasero 已提交
427
		return Promise.resolve(0);
M
Martin Aeschlimann 已提交
428
	}
J
Johannes Rieken 已提交
429
	public pickFolderAndOpen(_options: IPickAndOpenOptions): Promise<any> {
B
Benjamin Pasero 已提交
430
		return Promise.resolve(0);
M
Martin Aeschlimann 已提交
431
	}
J
Johannes Rieken 已提交
432
	public pickWorkspaceAndOpen(_options: IPickAndOpenOptions): Promise<any> {
B
Benjamin Pasero 已提交
433
		return Promise.resolve(0);
M
Martin Aeschlimann 已提交
434
	}
435 436 437
	public pickFileToSave(_options: ISaveDialogOptions): Promise<URI | undefined> {
		return Promise.resolve(undefined);
	}
438
	public showSaveDialog(_options: ISaveDialogOptions): Promise<URI | undefined> {
J
Johannes Rieken 已提交
439
		return Promise.resolve(undefined);
M
Martin Aeschlimann 已提交
440
	}
441
	public showOpenDialog(_options: IOpenDialogOptions): Promise<URI[] | undefined> {
J
Johannes Rieken 已提交
442
		return Promise.resolve(undefined);
M
Martin Aeschlimann 已提交
443
	}
444 445 446
	public setConfirmResult(result: ConfirmResult): void {
		this.confirmResult = result;
	}
447
	public showSaveConfirm(fileNamesOrResources: (string | URI)[]): Promise<ConfirmResult> {
448 449
		return Promise.resolve(this.confirmResult);
	}
M
Martin Aeschlimann 已提交
450 451
}

452
export class TestLayoutService implements IWorkbenchLayoutService {
B
Benjamin Pasero 已提交
453

454
	public _serviceBrand: undefined;
E
Erich Gamma 已提交
455

456 457
	dimension: IDimension = { width: 800, height: 600 };

458 459
	container: HTMLElement = window.document.body;

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

468
	private readonly _onMenubarVisibilityChange = new Emitter<Dimension>();
469

470 471 472 473
	public get onMenubarVisibilityChange(): Event<Dimension> {
		return this._onMenubarVisibilityChange.event;
	}

B
Benjamin Pasero 已提交
474
	public isRestored(): boolean {
E
Erich Gamma 已提交
475 476 477
		return true;
	}

478
	public hasFocus(_part: Parts): boolean {
E
Erich Gamma 已提交
479 480 481
		return false;
	}

E
Eric Amodio 已提交
482 483 484 485 486 487 488 489
	public hasWindowBorder(): boolean {
		return false;
	}

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

490
	public isVisible(_part: Parts): boolean {
E
Erich Gamma 已提交
491 492 493
		return true;
	}

494 495 496 497
	getDimension(_part: Parts): Dimension {
		return new Dimension(0, 0);
	}

498
	public getContainer(_part: Parts): HTMLElement {
B
Benjamin Pasero 已提交
499
		return null!;
500 501
	}

B
Benjamin Pasero 已提交
502 503 504 505
	public isTitleBarHidden(): boolean {
		return false;
	}

506 507 508 509
	public getTitleBarOffset(): number {
		return 0;
	}

510 511 512 513
	public isStatusBarHidden(): boolean {
		return false;
	}

S
Sanders Lauture 已提交
514 515 516 517
	public isActivityBarHidden(): boolean {
		return false;
	}

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

E
Erich Gamma 已提交
520 521 522 523
	public isSideBarHidden(): boolean {
		return false;
	}

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

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

I
isidor 已提交
528
	public isPanelHidden(): boolean {
I
isidor 已提交
529 530 531
		return false;
	}

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

I
isidor 已提交
534 535
	public toggleMaximizedPanel(): void { }

B
Benjamin Pasero 已提交
536 537 538 539
	public isPanelMaximized(): boolean {
		return false;
	}

S
SteVen Batten 已提交
540
	public getMenubarVisibility(): MenuBarVisibility {
541
		throw new Error('not implemented');
S
SteVen Batten 已提交
542 543
	}

E
Erich Gamma 已提交
544 545 546 547
	public getSideBarPosition() {
		return 0;
	}

I
isidor 已提交
548 549 550 551
	public getPanelPosition() {
		return 0;
	}

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

556 557
	public addClass(_clazz: string): void { }
	public removeClass(_clazz: string): void { }
558

559 560
	public getMaximumEditorDimensions(): Dimension { throw new Error('not implemented'); }

561
	public getWorkbenchContainer(): HTMLElement { throw new Error('not implemented'); }
562
	public getWorkbenchElement(): HTMLElement { throw new Error('not implemented'); }
B
Benjamin Pasero 已提交
563

I
isidor 已提交
564
	public toggleZenMode(): void { }
565

B
Benjamin Pasero 已提交
566
	public isEditorLayoutCentered(): boolean { return false; }
567
	public centerEditorLayout(_active: boolean): void { }
S
SrTobi 已提交
568 569


570
	public resizePart(_part: Parts, _sizeChange: number): void { }
571 572

	public registerPart(part: Part): void { }
573 574 575 576 577 578

	isWindowMaximized() {
		return false;
	}

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

581
let activeViewlet: Viewlet = {} as any;
582

583
export class TestViewletService implements IViewletService {
584
	public _serviceBrand: undefined;
585 586 587 588 589 590 591 592 593 594 595

	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 已提交
596 597
	public openViewlet(id: string, focus?: boolean): Promise<IViewlet | undefined> {
		return Promise.resolve(undefined);
598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623
	}

	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 已提交
624
		return undefined;
625
	}
626 627 628 629

	public hideActiveViewlet(): void { }

	public getLastActiveViewletId(): string {
M
Matt Bierner 已提交
630
		return undefined!;
631
	}
632 633 634
}

export class TestPanelService implements IPanelService {
635
	public _serviceBrand: undefined;
636 637 638 639

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

640 641
	public openPanel(id: string, focus?: boolean): undefined {
		return undefined;
642 643
	}

B
Benjamin Pasero 已提交
644 645 646 647
	public getPanel(id: string): any {
		return activeViewlet;
	}

648
	public getPanels() {
649 650 651
		return [];
	}

652
	public getPinnedPanels() {
653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668
		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 已提交
669 670 671 672
	public getProgressIndicator(id: string) {
		return null!;
	}

673 674 675
	public hideActivePanel(): void { }

	public getLastActivePanelId(): string {
M
Matt Bierner 已提交
676
		return undefined!;
677 678 679
	}
}

680
export class TestStorageService extends InMemoryStorageService { }
681

682 683
export class TestEditorGroupsService implements IEditorGroupsService {

684
	_serviceBrand: undefined;
685

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

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

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

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

702
	get activeGroup(): IEditorGroup {
703 704 705 706 707 708 709
		return this.groups[0];
	}

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

710
	getGroups(_order?: GroupsOrder): ReadonlyArray<IEditorGroup> {
711 712 713
		return this.groups;
	}

714 715
	getGroup(identifier: number): IEditorGroup | undefined {
		return find(this.groups, group => group.id === identifier);
716 717
	}

718
	getLabel(_identifier: number): string {
719 720 721
		return 'Group 1';
	}

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

726
	activateGroup(_group: number | IEditorGroup): IEditorGroup {
727
		throw new Error('not implemented');
728 729
	}

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

734 735
	getSize(_group: number | IEditorGroup): { width: number, height: number } {
		return { width: 100, height: 100 };
736 737
	}

738
	setSize(_group: number | IEditorGroup, _size: { width: number, height: number }): void { }
739

740
	arrangeGroups(_arrangement: GroupsArrangement): void { }
741

742
	applyLayout(_layout: EditorGroupLayout): void { }
743

744
	setGroupOrientation(_orientation: any): void { }
745

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

750
	removeGroup(_group: number | IEditorGroup): void { }
751

752
	moveGroup(_group: number | IEditorGroup, _location: number | IEditorGroup, _direction: GroupDirection): IEditorGroup {
753
		throw new Error('not implemented');
754 755
	}

756
	mergeGroup(_group: number | IEditorGroup, _target: number | IEditorGroup, _options?: IMergeGroupOptions): IEditorGroup {
757
		throw new Error('not implemented');
758 759
	}

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

	centerLayout(active: boolean): void { }

	isLayoutCentered(): boolean {
		return false;
	}

770
	partOptions!: IEditorPartOptions;
771 772
	enforcePartOptions(options: IEditorPartOptions): IDisposable {
		return Disposable.None;
773 774 775
	}
}

B
Benjamin Pasero 已提交
776
export class TestEditorGroup implements IEditorGroupView {
777 778 779

	constructor(public id: number) { }

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

796 797 798
	isEmpty = true;
	isMinimized = false;

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

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

B
Benjamin Pasero 已提交
812
	getEditorByIndex(_index: number): IEditorInput {
813
		throw new Error('not implemented');
814 815
	}

816
	getIndexOfEditor(_editor: IEditorInput): number {
817 818 819
		return -1;
	}

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

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

828
	isOpened(_editor: IEditorInput): boolean {
829 830 831
		return false;
	}

832
	isPinned(_editor: IEditorInput): boolean {
833 834 835
		return false;
	}

836
	isActive(_editor: IEditorInput): boolean {
837 838 839
		return false;
	}

840
	moveEditor(_editor: IEditorInput, _target: IEditorGroup, _options?: IMoveEditorOptions): void { }
841

842
	copyEditor(_editor: IEditorInput, _target: IEditorGroup, _options?: ICopyEditorOptions): void { }
843

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

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

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

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

860
	pinEditor(_editor?: IEditorInput): void { }
861 862 863 864

	focus(): void { }

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

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

B
Benjamin Pasero 已提交
876
export class TestEditorService implements EditorServiceImpl {
877

878
	_serviceBrand: undefined;
879 880 881

	onDidActiveEditorChange: Event<void> = Event.None;
	onDidVisibleEditorsChange: Event<void> = Event.None;
B
Benjamin Pasero 已提交
882
	onDidCloseEditor: Event<IEditorCloseEvent> = Event.None;
883 884
	onDidOpenEditorFail: Event<IEditorIdentifier> = Event.None;

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

893
	overrideOpenEditor(_handler: IOpenEditorOverrideHandler): IDisposable {
R
Rob Lourens 已提交
894
		return toDisposable(() => undefined);
895 896
	}

897 898
	openEditor(_editor: any, _options?: any, _group?: any): Promise<any> {
		throw new Error('not implemented');
899 900
	}

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

905
	isOpen(_editor: IEditorInput | IResourceInput | IUntitledTextResourceInput): boolean {
906 907 908
		return false;
	}

909
	getOpened(_editor: IEditorInput | IResourceInput | IUntitledTextResourceInput): IEditorInput {
910
		throw new Error('not implemented');
911 912
	}

913
	replaceEditors(_editors: any, _group: any) {
R
Rob Lourens 已提交
914
		return Promise.resolve(undefined);
915 916
	}

917
	invokeWithinEditorContext<T>(fn: (accessor: ServicesAccessor) => T): T {
918
		throw new Error('not implemented');
919 920
	}

921
	createInput(_input: IResourceInput | IUntitledTextResourceInput | IResourceDiffInput | IResourceSideBySideInput): IEditorInput {
922
		throw new Error('not implemented');
923
	}
924 925 926 927 928 929 930 931 932

	save(editors: IEditorIdentifier[], options?: ISaveEditorsOptions): Promise<boolean> {
		throw new Error('Method not implemented.');
	}

	saveAll(options?: ISaveEditorsOptions): Promise<boolean> {
		throw new Error('Method not implemented.');
	}

B
Benjamin Pasero 已提交
933 934 935 936 937
	revert(editors: IEditorIdentifier[], options?: IRevertOptions): Promise<boolean> {
		throw new Error('Method not implemented.');
	}

	revertAll(options?: IRevertAllEditorsOptions): Promise<boolean> {
938 939
		throw new Error('Method not implemented.');
	}
940 941
}

942 943
export class TestFileService implements IFileService {

944
	public _serviceBrand: undefined;
945

M
Matt Bierner 已提交
946 947
	private readonly _onFileChanges: Emitter<FileChangesEvent>;
	private readonly _onAfterOperation: Emitter<FileOperationEvent>;
948

949
	readonly onWillActivateFileSystemProvider = Event.None;
950
	readonly onError: Event<Error> = Event.None;
951

952
	private content = 'Hello Html';
953
	private lastReadFileUri!: URI;
954

955 956 957 958 959
	constructor() {
		this._onFileChanges = new Emitter<FileChangesEvent>();
		this._onAfterOperation = new Emitter<FileOperationEvent>();
	}

960 961 962 963 964 965 966 967
	public setContent(content: string): void {
		this.content = content;
	}

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

968 969 970 971
	public getLastReadFileUri(): URI {
		return this.lastReadFileUri;
	}

972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987
	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 已提交
988 989 990
	resolve(resource: URI, _options?: IResolveFileOptions): Promise<IFileStat>;
	resolve(resource: URI, _options: IResolveMetadataFileOptions): Promise<IFileStatWithMetadata>;
	resolve(resource: URI, _options?: IResolveFileOptions): Promise<IFileStat> {
B
Benjamin Pasero 已提交
991
		return Promise.resolve({
992 993
			resource,
			etag: Date.now().toString(),
B
Benjamin Pasero 已提交
994
			encoding: 'utf8',
B
Benjamin Pasero 已提交
995
			mtime: Date.now(),
996
			size: 42,
997
			isFile: true,
998
			isDirectory: false,
999
			isSymbolicLink: false,
B
Benjamin Pasero 已提交
1000
			name: resources.basename(resource)
B
Benjamin Pasero 已提交
1001
		});
1002
	}
B
Benjamin Pasero 已提交
1003

B
Benjamin Pasero 已提交
1004 1005
	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 已提交
1006 1007
	}

B
Benjamin Pasero 已提交
1008
	exists(_resource: URI): Promise<boolean> {
B
Benjamin Pasero 已提交
1009
		return Promise.resolve(true);
1010
	}
B
Benjamin Pasero 已提交
1011

1012
	readFile(resource: URI, options?: IReadFileOptions | undefined): Promise<IFileContent> {
1013 1014
		this.lastReadFileUri = resource;

1015
		return Promise.resolve({
B
Benjamin Pasero 已提交
1016
			resource: resource,
1017
			value: VSBuffer.fromString(this.content),
1018
			etag: 'index.txt',
B
Benjamin Pasero 已提交
1019 1020
			encoding: 'utf8',
			mtime: Date.now(),
1021
			ctime: Date.now(),
1022 1023
			name: resources.basename(resource),
			size: 1
E
Erich Gamma 已提交
1024
		});
1025
	}
E
Erich Gamma 已提交
1026

1027
	readFileStream(resource: URI, options?: IReadFileOptions | undefined): Promise<IFileStreamContent> {
1028 1029
		this.lastReadFileUri = resource;

1030
		return Promise.resolve({
A
Alex Dima 已提交
1031 1032
			resource: resource,
			value: {
1033
				on: (event: string, callback: Function): void => {
A
Alex Dima 已提交
1034
					if (event === 'data') {
1035
						callback(this.content);
A
Alex Dima 已提交
1036 1037 1038 1039
					}
					if (event === 'end') {
						callback();
					}
B
Benjamin Pasero 已提交
1040 1041 1042 1043
				},
				resume: () => { },
				pause: () => { },
				destroy: () => { }
A
Alex Dima 已提交
1044 1045 1046
			},
			etag: 'index.txt',
			encoding: 'utf8',
B
Benjamin Pasero 已提交
1047
			mtime: Date.now(),
1048
			ctime: Date.now(),
1049 1050
			size: 1,
			name: resources.basename(resource)
A
Alex Dima 已提交
1051
		});
1052 1053
	}

1054
	writeFile(resource: URI, bufferOrReadable: VSBuffer | VSBufferReadable, options?: IWriteFileOptions): Promise<IFileStatWithMetadata> {
B
Benjamin Pasero 已提交
1055
		return timeout(0).then(() => ({
1056 1057 1058 1059
			resource,
			etag: 'index.txt',
			encoding: 'utf8',
			mtime: Date.now(),
1060
			ctime: Date.now(),
1061
			size: 42,
1062
			isFile: true,
1063
			isDirectory: false,
1064
			isSymbolicLink: false,
B
Benjamin Pasero 已提交
1065
			name: resources.basename(resource)
B
Benjamin Pasero 已提交
1066
		}));
1067
	}
D
Daniel Imms 已提交
1068

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

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

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

1081
	createFolder(_resource: URI): Promise<IFileStatWithMetadata> {
1082
		throw new Error('not implemented');
1083 1084
	}

1085 1086
	onDidChangeFileSystemProviderRegistrations = Event.None;

1087 1088 1089 1090 1091 1092
	private providers = new Map<string, IFileSystemProvider>();

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

		return toDisposable(() => this.providers.delete(scheme));
1093 1094
	}

1095 1096
	activateProvider(_scheme: string): Promise<void> {
		throw new Error('not implemented');
1097 1098
	}

1099
	canHandleResource(resource: URI): boolean {
1100
		return resource.scheme === 'file' || this.providers.has(resource.scheme);
1101 1102
	}

1103
	hasCapability(resource: URI, capability: FileSystemProviderCapabilities): boolean { return false; }
1104

J
Johannes Rieken 已提交
1105
	del(_resource: URI, _options?: { useTrash?: boolean, recursive?: boolean }): Promise<void> {
1106
		return Promise.resolve();
1107 1108
	}

1109 1110
	watch(_resource: URI): IDisposable {
		return Disposable.None;
1111 1112
	}

1113 1114
	getWriteEncoding(_resource: URI): IResourceEncoding {
		return { encoding: 'utf8', hasBOM: false };
1115
	}
D
Daniel Imms 已提交
1116

1117
	dispose(): void {
E
Erich Gamma 已提交
1118
	}
1119
}
1120

1121
export class TestBackupFileService implements IBackupFileService {
1122
	public _serviceBrand: undefined;
1123

J
Johannes Rieken 已提交
1124
	public hasBackups(): Promise<boolean> {
B
Benjamin Pasero 已提交
1125
		return Promise.resolve(false);
1126 1127
	}

J
Johannes Rieken 已提交
1128
	public hasBackup(_resource: URI): Promise<boolean> {
B
Benjamin Pasero 已提交
1129
		return Promise.resolve(false);
1130 1131
	}

1132 1133 1134 1135
	public hasBackupSync(resource: URI, versionId?: number): boolean {
		return false;
	}

1136
	public loadBackupResource(resource: URI): Promise<URI | undefined> {
B
Benjamin Pasero 已提交
1137 1138
		return this.hasBackup(resource).then(hasBackup => {
			if (hasBackup) {
1139
				return this.toBackupResource(resource);
B
Benjamin Pasero 已提交
1140 1141
			}

R
Rob Lourens 已提交
1142
			return undefined;
B
Benjamin Pasero 已提交
1143 1144 1145
		});
	}

J
Johannes Rieken 已提交
1146
	public registerResourceForBackup(_resource: URI): Promise<void> {
B
Benjamin Pasero 已提交
1147
		return Promise.resolve();
D
Daniel Imms 已提交
1148 1149
	}

J
Johannes Rieken 已提交
1150
	public deregisterResourceForBackup(_resource: URI): Promise<void> {
B
Benjamin Pasero 已提交
1151
		return Promise.resolve();
D
Daniel Imms 已提交
1152 1153
	}

1154
	public toBackupResource(_resource: URI): URI {
1155
		throw new Error('not implemented');
D
Daniel Imms 已提交
1156
	}
1157

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

J
Johannes Rieken 已提交
1162
	public getWorkspaceFileBackups(): Promise<URI[]> {
B
Benjamin Pasero 已提交
1163
		return Promise.resolve([]);
1164 1165
	}

1166 1167 1168 1169 1170
	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);
1171 1172
	}

1173
	public resolveBackupContent<T extends object>(_backup: URI): Promise<IResolvedBackup<T>> {
1174
		throw new Error('not implemented');
1175 1176
	}

J
Johannes Rieken 已提交
1177
	public discardResourceBackup(_resource: URI): Promise<void> {
B
Benjamin Pasero 已提交
1178
		return Promise.resolve();
1179 1180
	}

J
Johannes Rieken 已提交
1181
	public discardAllWorkspaceBackups(): Promise<void> {
B
Benjamin Pasero 已提交
1182
		return Promise.resolve();
1183
	}
1184
}
D
Daniel Imms 已提交
1185

B
Benjamin Pasero 已提交
1186
export class TestCodeEditorService implements ICodeEditorService {
1187
	_serviceBrand: undefined;
B
Benjamin Pasero 已提交
1188 1189 1190 1191 1192

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

1195 1196
	addCodeEditor(_editor: ICodeEditor): void { }
	removeCodeEditor(_editor: ICodeEditor): void { }
B
Benjamin Pasero 已提交
1197
	listCodeEditors(): ICodeEditor[] { return []; }
1198 1199
	addDiffEditor(_editor: IDiffEditor): void { }
	removeDiffEditor(_editor: IDiffEditor): void { }
B
Benjamin Pasero 已提交
1200
	listDiffEditors(): IDiffEditor[] { return []; }
1201
	getFocusedCodeEditor(): ICodeEditor | null { return null; }
1202 1203 1204 1205 1206
	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) { }
1207 1208
	getActiveCodeEditor(): ICodeEditor | null { return null; }
	openCodeEditor(_input: IResourceInput, _source: ICodeEditor, _sideBySide?: boolean): Promise<ICodeEditor | null> { return Promise.resolve(null); }
B
Benjamin Pasero 已提交
1209 1210
}

1211 1212
export class TestLifecycleService implements ILifecycleService {

1213
	public _serviceBrand: undefined;
1214

1215 1216
	public phase!: LifecyclePhase;
	public startupKind!: StartupKind;
1217

1218 1219 1220
	private readonly _onBeforeShutdown = new Emitter<BeforeShutdownEvent>();
	private readonly _onWillShutdown = new Emitter<WillShutdownEvent>();
	private readonly _onShutdown = new Emitter<void>();
1221

J
Johannes Rieken 已提交
1222
	when(): Promise<void> {
B
Benjamin Pasero 已提交
1223
		return Promise.resolve();
B
Benjamin Pasero 已提交
1224
	}
1225

1226
	public fireShutdown(reason = ShutdownReason.QUIT): void {
1227
		this._onWillShutdown.fire({
1228 1229 1230
			join: () => { },
			reason
		});
1231 1232
	}

1233 1234 1235 1236 1237 1238
	public fireWillShutdown(event: BeforeShutdownEvent): void {
		this._onBeforeShutdown.fire(event);
	}

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

1241
	public get onWillShutdown(): Event<WillShutdownEvent> {
1242 1243 1244
		return this._onWillShutdown.event;
	}

1245
	public get onShutdown(): Event<void> {
1246 1247
		return this._onShutdown.event;
	}
1248 1249
}

1250 1251
export class TestTextResourceConfigurationService implements ITextResourceConfigurationService {

1252
	_serviceBrand: undefined;
1253 1254 1255 1256

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

1257
	public onDidChangeConfiguration() {
1258 1259 1260
		return { dispose() { } };
	}

1261
	getValue<T>(resource: URI, arg2?: any, arg3?: any): T {
1262 1263
		const position: IPosition | null = EditorPosition.isIPosition(arg2) ? arg2 : null;
		const section: string | undefined = position ? (typeof arg3 === 'string' ? arg3 : undefined) : (typeof arg2 === 'string' ? arg2 : undefined);
1264
		return this.configurationService.getValue(section, { resource });
1265
	}
B
Benjamin Pasero 已提交
1266 1267
}

S
Sandeep Somavarapu 已提交
1268 1269
export class TestTextResourcePropertiesService implements ITextResourcePropertiesService {

1270
	_serviceBrand: undefined;
S
Sandeep Somavarapu 已提交
1271 1272

	constructor(
1273
		@IConfigurationService private readonly configurationService: IConfigurationService,
S
Sandeep Somavarapu 已提交
1274 1275 1276
	) {
	}

1277 1278 1279 1280
	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 已提交
1281 1282 1283 1284 1285 1286
		}
		return (isLinux || isMacintosh) ? '\n' : '\r\n';
	}
}


1287
export class TestSharedProcessService implements ISharedProcessService {
1288

1289
	_serviceBrand: undefined;
1290

1291 1292 1293
	getChannel(channelName: string): any {
		return undefined;
	}
1294

1295
	registerChannel(channelName: string, channel: any): void { }
1296 1297 1298

	async toggleSharedProcessWindow(): Promise<void> { }
	async whenSharedProcessReady(): Promise<void> { }
1299 1300
}

1301 1302 1303 1304 1305 1306 1307
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 已提交
1308 1309 1310 1311 1312 1313
	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 }),
		};
	}));
1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332
	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 已提交
1333
}
1334 1335

export const productService: IProductService = { _serviceBrand: undefined, ...product };
1336 1337 1338 1339 1340

export class TestHostService implements IHostService {

	_serviceBrand: undefined;

1341 1342 1343
	readonly hasFocus: boolean = true;
	readonly onDidChangeFocus: Event<boolean> = Event.None;

1344 1345
	async restart(): Promise<void> { }
	async reload(): Promise<void> { }
1346

1347 1348
	async focus(): Promise<void> { }

1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373
	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.');
	}
1374

1375
	async toggleFullScreen(): Promise<void> { }
1376 1377 1378 1379 1380 1381 1382
	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> { }
1383 1384 1385
	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.'); }
1386 1387 1388 1389 1390 1391 1392 1393
	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; }
1394
	async updateTouchBar(): Promise<void> { }
1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408
	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; }
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 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473

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

1474
	showMessageBox(options: Electron.MessageBoxOptions, window?: Electron.BrowserWindow | undefined): Promise<Electron.MessageBoxReturnValue> {
1475 1476 1477
		throw new Error('Method not implemented.');
	}

1478
	showSaveDialog(options: Electron.SaveDialogOptions, window?: Electron.BrowserWindow | undefined): Promise<Electron.SaveDialogReturnValue> {
1479 1480 1481
		throw new Error('Method not implemented.');
	}

1482
	showOpenDialog(options: Electron.OpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise<Electron.OpenDialogReturnValue> {
1483 1484 1485
		throw new Error('Method not implemented.');
	}
}
1486

1487
export class TestWorkingCopyService extends WorkingCopyService { }
1488 1489 1490 1491 1492 1493 1494

export class TestFilesConfigurationService extends FilesConfigurationService {

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