workbenchTestServices.ts 57.3 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 15
import { IEditorInputWithOptions, CloseDirection, IEditorIdentifier, IUntitledTextResourceInput, IResourceDiffInput, IResourceSideBySideInput, IEditorInput, IEditor, IEditorCloseEvent, IEditorPartOptions, IRevertOptions, EditorInput, IFileEditorInput, GroupIdentifier, ISaveOptions } from 'vs/workbench/common/editor';
import { IEditorOpeningEvent, EditorServiceImpl, IEditorGroupView, IEditorGroupsAccessor } 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, ConfigurationTarget } 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';
23
import { IEditorOptions, IResourceInput, IEditorModel } 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
rename  
Sandeep Somavarapu 已提交
45
import { ITextResourceConfigurationService, ITextResourcePropertiesService } from 'vs/editor/common/services/textResourceConfigurationService';
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, IWillSaveStateEvent } 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,
S
rename  
Sandeep Somavarapu 已提交
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));
S
rename  
Sandeep Somavarapu 已提交
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 TestEditorGroupView(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
	_serviceBrand: undefined;
B
Benjamin Pasero 已提交
350

351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366
	constructor(private root?: URI) { }

	reopenLastClosedEditor(): void { }
	forward(): void { }
	back(): void { }
	last(): void { }
	remove(_input: IEditorInput | IResourceInput): void { }
	clear(): void { }
	clearRecentlyOpened(): void { }
	getHistory(): Array<IEditorInput | IResourceInput> { return []; }
	openNextRecentlyUsedEditor(group?: GroupIdentifier): void { }
	openPreviouslyUsedEditor(group?: GroupIdentifier): void { }
	getMostRecentlyUsedOpenEditors(): Array<IEditorIdentifier> { return []; }
	getLastActiveWorkspaceRoot(_schemeFilter: string): URI | undefined { return this.root; }
	getLastActiveFile(_schemeFilter: string): URI | undefined { return undefined; }
	openLastEditLocation(): void { }
B
Benjamin Pasero 已提交
367 368
}

369
export class TestDialogService implements IDialogService {
370

371
	public _serviceBrand: undefined;
E
Erich Gamma 已提交
372

J
Johannes Rieken 已提交
373
	public confirm(_confirmation: IConfirmation): Promise<IConfirmationResult> {
B
Benjamin Pasero 已提交
374
		return Promise.resolve({ confirmed: false });
375
	}
376

377 378
	public show(_severity: Severity, _message: string, _buttons: string[], _options?: IDialogOptions): Promise<IShowResult> {
		return Promise.resolve({ choice: 0 });
379
	}
380 381 382 383

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

M
Martin Aeschlimann 已提交
386 387
export class TestFileDialogService implements IFileDialogService {

388
	public _serviceBrand: undefined;
M
Martin Aeschlimann 已提交
389

390 391
	private confirmResult!: ConfirmResult;

392
	public defaultFilePath(_schemeFilter?: string): URI | undefined {
R
Rob Lourens 已提交
393
		return undefined;
M
Martin Aeschlimann 已提交
394
	}
395
	public defaultFolderPath(_schemeFilter?: string): URI | undefined {
R
Rob Lourens 已提交
396
		return undefined;
M
Martin Aeschlimann 已提交
397
	}
398
	public defaultWorkspacePath(_schemeFilter?: string): URI | undefined {
R
Rob Lourens 已提交
399
		return undefined;
M
Martin Aeschlimann 已提交
400
	}
J
Johannes Rieken 已提交
401
	public pickFileFolderAndOpen(_options: IPickAndOpenOptions): Promise<any> {
B
Benjamin Pasero 已提交
402
		return Promise.resolve(0);
M
Martin Aeschlimann 已提交
403
	}
J
Johannes Rieken 已提交
404
	public pickFileAndOpen(_options: IPickAndOpenOptions): Promise<any> {
B
Benjamin Pasero 已提交
405
		return Promise.resolve(0);
M
Martin Aeschlimann 已提交
406
	}
J
Johannes Rieken 已提交
407
	public pickFolderAndOpen(_options: IPickAndOpenOptions): Promise<any> {
B
Benjamin Pasero 已提交
408
		return Promise.resolve(0);
M
Martin Aeschlimann 已提交
409
	}
J
Johannes Rieken 已提交
410
	public pickWorkspaceAndOpen(_options: IPickAndOpenOptions): Promise<any> {
B
Benjamin Pasero 已提交
411
		return Promise.resolve(0);
M
Martin Aeschlimann 已提交
412
	}
413 414 415
	public pickFileToSave(_options: ISaveDialogOptions): Promise<URI | undefined> {
		return Promise.resolve(undefined);
	}
416
	public showSaveDialog(_options: ISaveDialogOptions): Promise<URI | undefined> {
J
Johannes Rieken 已提交
417
		return Promise.resolve(undefined);
M
Martin Aeschlimann 已提交
418
	}
419
	public showOpenDialog(_options: IOpenDialogOptions): Promise<URI[] | undefined> {
J
Johannes Rieken 已提交
420
		return Promise.resolve(undefined);
M
Martin Aeschlimann 已提交
421
	}
422 423 424
	public setConfirmResult(result: ConfirmResult): void {
		this.confirmResult = result;
	}
425
	public showSaveConfirm(fileNamesOrResources: (string | URI)[]): Promise<ConfirmResult> {
426 427
		return Promise.resolve(this.confirmResult);
	}
M
Martin Aeschlimann 已提交
428 429
}

430
export class TestLayoutService implements IWorkbenchLayoutService {
B
Benjamin Pasero 已提交
431

432
	public _serviceBrand: undefined;
E
Erich Gamma 已提交
433

434 435
	dimension: IDimension = { width: 800, height: 600 };

436 437
	container: HTMLElement = window.document.body;

B
Benjamin Pasero 已提交
438
	onZenModeChange: Event<boolean> = Event.None;
S
SteVen Batten 已提交
439 440
	onCenteredLayoutChange: Event<boolean> = Event.None;
	onFullscreenChange: Event<boolean> = Event.None;
441
	onMaximizeChange: Event<boolean> = Event.None;
442
	onPanelPositionChange: Event<string> = Event.None;
443
	onPartVisibilityChange: Event<void> = Event.None;
444
	onLayout = Event.None;
B
Benjamin Pasero 已提交
445

446
	private readonly _onMenubarVisibilityChange = new Emitter<Dimension>();
447

448 449 450 451
	public get onMenubarVisibilityChange(): Event<Dimension> {
		return this._onMenubarVisibilityChange.event;
	}

B
Benjamin Pasero 已提交
452
	public isRestored(): boolean {
E
Erich Gamma 已提交
453 454 455
		return true;
	}

456
	public hasFocus(_part: Parts): boolean {
E
Erich Gamma 已提交
457 458 459
		return false;
	}

E
Eric Amodio 已提交
460 461 462 463 464 465 466 467
	public hasWindowBorder(): boolean {
		return false;
	}

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

468
	public isVisible(_part: Parts): boolean {
E
Erich Gamma 已提交
469 470 471
		return true;
	}

472 473 474 475
	getDimension(_part: Parts): Dimension {
		return new Dimension(0, 0);
	}

476
	public getContainer(_part: Parts): HTMLElement {
B
Benjamin Pasero 已提交
477
		return null!;
478 479
	}

B
Benjamin Pasero 已提交
480 481 482 483
	public isTitleBarHidden(): boolean {
		return false;
	}

484 485 486 487
	public getTitleBarOffset(): number {
		return 0;
	}

488 489 490 491
	public isStatusBarHidden(): boolean {
		return false;
	}

S
Sanders Lauture 已提交
492 493 494 495
	public isActivityBarHidden(): boolean {
		return false;
	}

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

E
Erich Gamma 已提交
498 499 500 501
	public isSideBarHidden(): boolean {
		return false;
	}

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

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

I
isidor 已提交
506
	public isPanelHidden(): boolean {
I
isidor 已提交
507 508 509
		return false;
	}

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

I
isidor 已提交
512 513
	public toggleMaximizedPanel(): void { }

B
Benjamin Pasero 已提交
514 515 516 517
	public isPanelMaximized(): boolean {
		return false;
	}

S
SteVen Batten 已提交
518
	public getMenubarVisibility(): MenuBarVisibility {
519
		throw new Error('not implemented');
S
SteVen Batten 已提交
520 521
	}

E
Erich Gamma 已提交
522 523 524 525
	public getSideBarPosition() {
		return 0;
	}

I
isidor 已提交
526 527 528 529
	public getPanelPosition() {
		return 0;
	}

J
Johannes Rieken 已提交
530
	public setPanelPosition(_position: PartPosition): Promise<void> {
531
		return Promise.resolve();
I
isidor 已提交
532 533
	}

534 535
	public addClass(_clazz: string): void { }
	public removeClass(_clazz: string): void { }
536

537 538
	public getMaximumEditorDimensions(): Dimension { throw new Error('not implemented'); }

539
	public getWorkbenchContainer(): HTMLElement { throw new Error('not implemented'); }
540
	public getWorkbenchElement(): HTMLElement { throw new Error('not implemented'); }
B
Benjamin Pasero 已提交
541

I
isidor 已提交
542
	public toggleZenMode(): void { }
543

B
Benjamin Pasero 已提交
544
	public isEditorLayoutCentered(): boolean { return false; }
545
	public centerEditorLayout(_active: boolean): void { }
S
SrTobi 已提交
546 547


548
	public resizePart(_part: Parts, _sizeChange: number): void { }
549 550

	public registerPart(part: Part): void { }
551 552 553 554 555 556

	isWindowMaximized() {
		return false;
	}

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

559
let activeViewlet: Viewlet = {} as any;
560

561
export class TestViewletService implements IViewletService {
562
	public _serviceBrand: undefined;
563 564 565 566 567 568 569 570 571 572 573

	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 已提交
574 575
	public openViewlet(id: string, focus?: boolean): Promise<IViewlet | undefined> {
		return Promise.resolve(undefined);
576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601
	}

	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 已提交
602
		return undefined;
603
	}
604 605 606 607

	public hideActiveViewlet(): void { }

	public getLastActiveViewletId(): string {
M
Matt Bierner 已提交
608
		return undefined!;
609
	}
610 611 612
}

export class TestPanelService implements IPanelService {
613
	public _serviceBrand: undefined;
614 615 616 617

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

618 619
	public openPanel(id: string, focus?: boolean): undefined {
		return undefined;
620 621
	}

B
Benjamin Pasero 已提交
622 623 624 625
	public getPanel(id: string): any {
		return activeViewlet;
	}

626
	public getPanels() {
627 628 629
		return [];
	}

630
	public getPinnedPanels() {
631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646
		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 已提交
647 648 649 650
	public getProgressIndicator(id: string) {
		return null!;
	}

651 652 653
	public hideActivePanel(): void { }

	public getLastActivePanelId(): string {
M
Matt Bierner 已提交
654
		return undefined!;
655 656 657
	}
}

658 659 660 661
export class TestStorageService extends InMemoryStorageService {
	readonly _onWillSaveState: Emitter<IWillSaveStateEvent> = this._register(new Emitter<IWillSaveStateEvent>());
	readonly onWillSaveState: Event<IWillSaveStateEvent> = this._onWillSaveState.event;
}
662

663 664
export class TestEditorGroupsService implements IEditorGroupsService {

665
	_serviceBrand: undefined;
666

667
	constructor(public groups: TestEditorGroupView[] = []) { }
668

669
	onDidActiveGroupChange: Event<IEditorGroup> = Event.None;
B
Benjamin Pasero 已提交
670
	onDidActivateGroup: Event<IEditorGroup> = Event.None;
671 672 673
	onDidAddGroup: Event<IEditorGroup> = Event.None;
	onDidRemoveGroup: Event<IEditorGroup> = Event.None;
	onDidMoveGroup: Event<IEditorGroup> = Event.None;
674
	onDidGroupIndexChange: Event<IEditorGroup> = Event.None;
675
	onDidLayout: Event<IDimension> = Event.None;
676 677

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

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

683
	get activeGroup(): IEditorGroup {
684 685 686 687 688 689 690
		return this.groups[0];
	}

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

691
	getGroups(_order?: GroupsOrder): ReadonlyArray<IEditorGroup> {
692 693 694
		return this.groups;
	}

695 696
	getGroup(identifier: number): IEditorGroup | undefined {
		return find(this.groups, group => group.id === identifier);
697 698
	}

699
	getLabel(_identifier: number): string {
700 701 702
		return 'Group 1';
	}

703
	findGroup(_scope: IFindGroupScope, _source?: number | IEditorGroup, _wrap?: boolean): IEditorGroup {
704
		throw new Error('not implemented');
705 706
	}

707
	activateGroup(_group: number | IEditorGroup): IEditorGroup {
708
		throw new Error('not implemented');
709 710
	}

B
Benjamin Pasero 已提交
711 712 713 714
	restoreGroup(_group: number | IEditorGroup): IEditorGroup {
		throw new Error('not implemented');
	}

715 716
	getSize(_group: number | IEditorGroup): { width: number, height: number } {
		return { width: 100, height: 100 };
717 718
	}

719
	setSize(_group: number | IEditorGroup, _size: { width: number, height: number }): void { }
720

721
	arrangeGroups(_arrangement: GroupsArrangement): void { }
722

723
	applyLayout(_layout: EditorGroupLayout): void { }
724

725
	setGroupOrientation(_orientation: any): void { }
726

727
	addGroup(_location: number | IEditorGroup, _direction: GroupDirection, _options?: IAddGroupOptions): IEditorGroup {
728
		throw new Error('not implemented');
729 730
	}

731
	removeGroup(_group: number | IEditorGroup): void { }
732

733
	moveGroup(_group: number | IEditorGroup, _location: number | IEditorGroup, _direction: GroupDirection): IEditorGroup {
734
		throw new Error('not implemented');
735 736
	}

737
	mergeGroup(_group: number | IEditorGroup, _target: number | IEditorGroup, _options?: IMergeGroupOptions): IEditorGroup {
738
		throw new Error('not implemented');
739 740
	}

741
	copyGroup(_group: number | IEditorGroup, _location: number | IEditorGroup, _direction: GroupDirection): IEditorGroup {
742
		throw new Error('not implemented');
743
	}
744 745 746 747 748 749 750

	centerLayout(active: boolean): void { }

	isLayoutCentered(): boolean {
		return false;
	}

751
	partOptions!: IEditorPartOptions;
752 753
	enforcePartOptions(options: IEditorPartOptions): IDisposable {
		return Disposable.None;
754 755 756
	}
}

757
export class TestEditorGroupView implements IEditorGroupView {
758 759 760

	constructor(public id: number) { }

761
	get group(): EditorGroup { throw new Error('not implemented'); }
762 763 764 765 766
	activeControl!: IVisibleEditor;
	activeEditor!: IEditorInput;
	previewEditor!: IEditorInput;
	count!: number;
	disposed!: boolean;
B
Benjamin Pasero 已提交
767
	editors: ReadonlyArray<IEditorInput> = [];
768 769
	label!: string;
	index!: number;
R
Rob Lourens 已提交
770
	whenRestored: Promise<void> = Promise.resolve(undefined);
771 772 773 774 775
	element!: HTMLElement;
	minimumWidth!: number;
	maximumWidth!: number;
	minimumHeight!: number;
	maximumHeight!: number;
776

777 778 779
	isEmpty = true;
	isMinimized = false;

780
	onWillDispose: Event<void> = Event.None;
781
	onDidGroupChange: Event<IGroupChangeEvent> = Event.None;
B
Benjamin Pasero 已提交
782 783
	onWillCloseEditor: Event<IEditorCloseEvent> = Event.None;
	onDidCloseEditor: Event<IEditorCloseEvent> = Event.None;
784 785
	onWillOpenEditor: Event<IEditorOpeningEvent> = Event.None;
	onDidOpenEditorFail: Event<IEditorInput> = Event.None;
B
Benjamin Pasero 已提交
786 787
	onDidFocus: Event<void> = Event.None;
	onDidChange: Event<{ width: number; height: number; }> = Event.None;
788

789
	getEditors(_order?: EditorsOrder): ReadonlyArray<IEditorInput> {
B
Benjamin Pasero 已提交
790 791 792
		return [];
	}

B
Benjamin Pasero 已提交
793
	getEditorByIndex(_index: number): IEditorInput {
794
		throw new Error('not implemented');
795 796
	}

797
	getIndexOfEditor(_editor: IEditorInput): number {
798 799 800
		return -1;
	}

J
Johannes Rieken 已提交
801
	openEditor(_editor: IEditorInput, _options?: IEditorOptions): Promise<IEditor> {
802
		throw new Error('not implemented');
803 804
	}

J
Johannes Rieken 已提交
805
	openEditors(_editors: IEditorInputWithOptions[]): Promise<IEditor> {
806
		throw new Error('not implemented');
807 808
	}

809
	isOpened(_editor: IEditorInput | IResourceInput): boolean {
810 811 812
		return false;
	}

813
	isPinned(_editor: IEditorInput): boolean {
814 815 816
		return false;
	}

817
	isActive(_editor: IEditorInput): boolean {
818 819 820
		return false;
	}

821
	moveEditor(_editor: IEditorInput, _target: IEditorGroup, _options?: IMoveEditorOptions): void { }
822

823
	copyEditor(_editor: IEditorInput, _target: IEditorGroup, _options?: ICopyEditorOptions): void { }
824

825
	closeEditor(_editor?: IEditorInput, options?: ICloseEditorOptions): Promise<void> {
B
Benjamin Pasero 已提交
826
		return Promise.resolve();
827 828
	}

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

J
Johannes Rieken 已提交
833
	closeAllEditors(): Promise<void> {
B
Benjamin Pasero 已提交
834
		return Promise.resolve();
835 836
	}

J
Johannes Rieken 已提交
837
	replaceEditors(_editors: IEditorReplacement[]): Promise<void> {
B
Benjamin Pasero 已提交
838
		return Promise.resolve();
839 840
	}

841
	pinEditor(_editor?: IEditorInput): void { }
842 843 844 845

	focus(): void { }

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

849
	setActive(_isActive: boolean): void { }
B
Benjamin Pasero 已提交
850
	notifyIndexChanged(_index: number): void { }
B
Benjamin Pasero 已提交
851 852
	dispose(): void { }
	toJSON(): object { return Object.create(null); }
853
	layout(_width: number, _height: number): void { }
854
	relayout() { }
855 856
}

857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885
export class TestEditorGroupAccessor implements IEditorGroupsAccessor {

	groups: IEditorGroupView[] = [];
	activeGroup!: IEditorGroupView;

	partOptions: IEditorPartOptions = {};

	onDidEditorPartOptionsChange = Event.None;
	onDidVisibilityChange = Event.None;

	getGroup(identifier: number): IEditorGroupView | undefined { throw new Error('Method not implemented.'); }
	getGroups(order: GroupsOrder): IEditorGroupView[] { throw new Error('Method not implemented.'); }
	activateGroup(identifier: number | IEditorGroupView): IEditorGroupView { throw new Error('Method not implemented.'); }
	restoreGroup(identifier: number | IEditorGroupView): IEditorGroupView { throw new Error('Method not implemented.'); }
	addGroup(location: number | IEditorGroupView, direction: GroupDirection, options?: IAddGroupOptions | undefined): IEditorGroupView { throw new Error('Method not implemented.'); }
	mergeGroup(group: number | IEditorGroupView, target: number | IEditorGroupView, options?: IMergeGroupOptions | undefined): IEditorGroupView { throw new Error('Method not implemented.'); }
	moveGroup(group: number | IEditorGroupView, location: number | IEditorGroupView, direction: GroupDirection): IEditorGroupView { throw new Error('Method not implemented.'); }
	copyGroup(group: number | IEditorGroupView, location: number | IEditorGroupView, direction: GroupDirection): IEditorGroupView { throw new Error('Method not implemented.'); }
	removeGroup(group: number | IEditorGroupView): void { throw new Error('Method not implemented.'); }
	arrangeGroups(arrangement: GroupsArrangement, target?: number | IEditorGroupView | undefined): void { throw new Error('Method not implemented.'); }
}

export class TestEditorInput extends EditorInput implements IFileEditorInput {
	public gotDisposed = false;
	public gotSaved = false;
	public gotSavedAs = false;
	public gotReverted = false;
	public dirty = false;
	private fails = false;
886
	constructor(public resource: URI) { super(); }
887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926

	getTypeId() { return 'testEditorInputForEditorService'; }
	resolve(): Promise<IEditorModel | null> { return !this.fails ? Promise.resolve(null) : Promise.reject(new Error('fails')); }
	matches(other: TestEditorInput): boolean { return other && other.resource && this.resource.toString() === other.resource.toString() && other instanceof TestEditorInput; }
	setEncoding(encoding: string) { }
	getEncoding() { return undefined; }
	setPreferredEncoding(encoding: string) { }
	setMode(mode: string) { }
	setPreferredMode(mode: string) { }
	getResource(): URI { return this.resource; }
	setForceOpenAsBinary(): void { }
	setFailToOpen(): void {
		this.fails = true;
	}
	save(groupId: GroupIdentifier, options?: ISaveOptions): Promise<boolean> {
		this.gotSaved = true;
		return Promise.resolve(true);
	}
	saveAs(groupId: GroupIdentifier, options?: ISaveOptions): Promise<boolean> {
		this.gotSavedAs = true;
		return Promise.resolve(true);
	}
	revert(options?: IRevertOptions): Promise<boolean> {
		this.gotReverted = true;
		this.gotSaved = false;
		this.gotSavedAs = false;
		return Promise.resolve(true);
	}
	isDirty(): boolean {
		return this.dirty;
	}
	isReadonly(): boolean {
		return false;
	}
	dispose(): void {
		super.dispose();
		this.gotDisposed = true;
	}
}

B
Benjamin Pasero 已提交
927
export class TestEditorService implements EditorServiceImpl {
928

929
	_serviceBrand: undefined;
930 931 932

	onDidActiveEditorChange: Event<void> = Event.None;
	onDidVisibleEditorsChange: Event<void> = Event.None;
B
Benjamin Pasero 已提交
933
	onDidCloseEditor: Event<IEditorCloseEvent> = Event.None;
934 935
	onDidOpenEditorFail: Event<IEditorIdentifier> = Event.None;

936
	activeControl!: IVisibleEditor;
937
	activeTextEditorWidget: any;
938
	activeEditor!: IEditorInput;
939
	editors: ReadonlyArray<IEditorInput> = [];
M
Matt Bierner 已提交
940
	visibleControls: ReadonlyArray<IVisibleEditor> = [];
941
	visibleTextEditorWidgets = [];
B
Benjamin Pasero 已提交
942
	visibleEditors: ReadonlyArray<IEditorInput> = [];
943

944
	overrideOpenEditor(_handler: IOpenEditorOverrideHandler): IDisposable {
R
Rob Lourens 已提交
945
		return toDisposable(() => undefined);
946 947
	}

948 949
	openEditor(_editor: any, _options?: any, _group?: any): Promise<any> {
		throw new Error('not implemented');
950 951
	}

952 953
	openEditors(_editors: any, _group?: any): Promise<IEditor[]> {
		throw new Error('not implemented');
954 955
	}

956
	isOpen(_editor: IEditorInput | IResourceInput | IUntitledTextResourceInput): boolean {
957 958 959
		return false;
	}

960
	getOpened(_editor: IEditorInput | IResourceInput | IUntitledTextResourceInput): IEditorInput {
961
		throw new Error('not implemented');
962 963
	}

964
	replaceEditors(_editors: any, _group: any) {
R
Rob Lourens 已提交
965
		return Promise.resolve(undefined);
966 967
	}

968
	invokeWithinEditorContext<T>(fn: (accessor: ServicesAccessor) => T): T {
969
		throw new Error('not implemented');
970 971
	}

972
	createInput(_input: IResourceInput | IUntitledTextResourceInput | IResourceDiffInput | IResourceSideBySideInput): IEditorInput {
973
		throw new Error('not implemented');
974
	}
975 976 977 978 979 980 981 982 983

	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 已提交
984 985 986 987 988
	revert(editors: IEditorIdentifier[], options?: IRevertOptions): Promise<boolean> {
		throw new Error('Method not implemented.');
	}

	revertAll(options?: IRevertAllEditorsOptions): Promise<boolean> {
989 990
		throw new Error('Method not implemented.');
	}
991 992
}

993 994
export class TestFileService implements IFileService {

995
	public _serviceBrand: undefined;
996

M
Matt Bierner 已提交
997 998
	private readonly _onFileChanges: Emitter<FileChangesEvent>;
	private readonly _onAfterOperation: Emitter<FileOperationEvent>;
999

1000
	readonly onWillActivateFileSystemProvider = Event.None;
1001
	readonly onError: Event<Error> = Event.None;
1002

1003
	private content = 'Hello Html';
1004
	private lastReadFileUri!: URI;
1005

1006 1007 1008 1009 1010
	constructor() {
		this._onFileChanges = new Emitter<FileChangesEvent>();
		this._onAfterOperation = new Emitter<FileOperationEvent>();
	}

1011 1012 1013 1014 1015 1016 1017 1018
	public setContent(content: string): void {
		this.content = content;
	}

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

1019 1020 1021 1022
	public getLastReadFileUri(): URI {
		return this.lastReadFileUri;
	}

1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038
	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 已提交
1039 1040 1041
	resolve(resource: URI, _options?: IResolveFileOptions): Promise<IFileStat>;
	resolve(resource: URI, _options: IResolveMetadataFileOptions): Promise<IFileStatWithMetadata>;
	resolve(resource: URI, _options?: IResolveFileOptions): Promise<IFileStat> {
B
Benjamin Pasero 已提交
1042
		return Promise.resolve({
1043 1044
			resource,
			etag: Date.now().toString(),
B
Benjamin Pasero 已提交
1045
			encoding: 'utf8',
B
Benjamin Pasero 已提交
1046
			mtime: Date.now(),
1047
			size: 42,
1048
			isFile: true,
1049
			isDirectory: false,
1050
			isSymbolicLink: false,
B
Benjamin Pasero 已提交
1051
			name: resources.basename(resource)
B
Benjamin Pasero 已提交
1052
		});
1053
	}
B
Benjamin Pasero 已提交
1054

B
Benjamin Pasero 已提交
1055 1056
	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 已提交
1057 1058
	}

B
Benjamin Pasero 已提交
1059
	exists(_resource: URI): Promise<boolean> {
B
Benjamin Pasero 已提交
1060
		return Promise.resolve(true);
1061
	}
B
Benjamin Pasero 已提交
1062

1063
	readFile(resource: URI, options?: IReadFileOptions | undefined): Promise<IFileContent> {
1064 1065
		this.lastReadFileUri = resource;

1066
		return Promise.resolve({
B
Benjamin Pasero 已提交
1067
			resource: resource,
1068
			value: VSBuffer.fromString(this.content),
1069
			etag: 'index.txt',
B
Benjamin Pasero 已提交
1070 1071
			encoding: 'utf8',
			mtime: Date.now(),
1072
			ctime: Date.now(),
1073 1074
			name: resources.basename(resource),
			size: 1
E
Erich Gamma 已提交
1075
		});
1076
	}
E
Erich Gamma 已提交
1077

1078
	readFileStream(resource: URI, options?: IReadFileOptions | undefined): Promise<IFileStreamContent> {
1079 1080
		this.lastReadFileUri = resource;

1081
		return Promise.resolve({
A
Alex Dima 已提交
1082 1083
			resource: resource,
			value: {
1084
				on: (event: string, callback: Function): void => {
A
Alex Dima 已提交
1085
					if (event === 'data') {
1086
						callback(this.content);
A
Alex Dima 已提交
1087 1088 1089 1090
					}
					if (event === 'end') {
						callback();
					}
B
Benjamin Pasero 已提交
1091 1092 1093 1094
				},
				resume: () => { },
				pause: () => { },
				destroy: () => { }
A
Alex Dima 已提交
1095 1096 1097
			},
			etag: 'index.txt',
			encoding: 'utf8',
B
Benjamin Pasero 已提交
1098
			mtime: Date.now(),
1099
			ctime: Date.now(),
1100 1101
			size: 1,
			name: resources.basename(resource)
A
Alex Dima 已提交
1102
		});
1103 1104
	}

1105
	writeFile(resource: URI, bufferOrReadable: VSBuffer | VSBufferReadable, options?: IWriteFileOptions): Promise<IFileStatWithMetadata> {
B
Benjamin Pasero 已提交
1106
		return timeout(0).then(() => ({
1107 1108 1109 1110
			resource,
			etag: 'index.txt',
			encoding: 'utf8',
			mtime: Date.now(),
1111
			ctime: Date.now(),
1112
			size: 42,
1113
			isFile: true,
1114
			isDirectory: false,
1115
			isSymbolicLink: false,
B
Benjamin Pasero 已提交
1116
			name: resources.basename(resource)
B
Benjamin Pasero 已提交
1117
		}));
1118
	}
D
Daniel Imms 已提交
1119

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

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

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

1132
	createFolder(_resource: URI): Promise<IFileStatWithMetadata> {
1133
		throw new Error('not implemented');
1134 1135
	}

1136 1137
	onDidChangeFileSystemProviderRegistrations = Event.None;

1138 1139 1140 1141 1142 1143
	private providers = new Map<string, IFileSystemProvider>();

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

		return toDisposable(() => this.providers.delete(scheme));
1144 1145
	}

1146 1147
	activateProvider(_scheme: string): Promise<void> {
		throw new Error('not implemented');
1148 1149
	}

1150
	canHandleResource(resource: URI): boolean {
1151
		return resource.scheme === 'file' || this.providers.has(resource.scheme);
1152 1153
	}

1154
	hasCapability(resource: URI, capability: FileSystemProviderCapabilities): boolean { return false; }
1155

J
Johannes Rieken 已提交
1156
	del(_resource: URI, _options?: { useTrash?: boolean, recursive?: boolean }): Promise<void> {
1157
		return Promise.resolve();
1158 1159
	}

1160 1161
	watch(_resource: URI): IDisposable {
		return Disposable.None;
1162 1163
	}

1164 1165
	getWriteEncoding(_resource: URI): IResourceEncoding {
		return { encoding: 'utf8', hasBOM: false };
1166
	}
D
Daniel Imms 已提交
1167

1168
	dispose(): void {
E
Erich Gamma 已提交
1169
	}
1170
}
1171

1172
export class TestBackupFileService implements IBackupFileService {
1173
	public _serviceBrand: undefined;
1174

J
Johannes Rieken 已提交
1175
	public hasBackups(): Promise<boolean> {
B
Benjamin Pasero 已提交
1176
		return Promise.resolve(false);
1177 1178
	}

J
Johannes Rieken 已提交
1179
	public hasBackup(_resource: URI): Promise<boolean> {
B
Benjamin Pasero 已提交
1180
		return Promise.resolve(false);
1181 1182
	}

1183 1184 1185 1186
	public hasBackupSync(resource: URI, versionId?: number): boolean {
		return false;
	}

1187
	public loadBackupResource(resource: URI): Promise<URI | undefined> {
B
Benjamin Pasero 已提交
1188 1189
		return this.hasBackup(resource).then(hasBackup => {
			if (hasBackup) {
1190
				return this.toBackupResource(resource);
B
Benjamin Pasero 已提交
1191 1192
			}

R
Rob Lourens 已提交
1193
			return undefined;
B
Benjamin Pasero 已提交
1194 1195 1196
		});
	}

J
Johannes Rieken 已提交
1197
	public registerResourceForBackup(_resource: URI): Promise<void> {
B
Benjamin Pasero 已提交
1198
		return Promise.resolve();
D
Daniel Imms 已提交
1199 1200
	}

J
Johannes Rieken 已提交
1201
	public deregisterResourceForBackup(_resource: URI): Promise<void> {
B
Benjamin Pasero 已提交
1202
		return Promise.resolve();
D
Daniel Imms 已提交
1203 1204
	}

1205
	public toBackupResource(_resource: URI): URI {
1206
		throw new Error('not implemented');
D
Daniel Imms 已提交
1207
	}
1208

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

J
Johannes Rieken 已提交
1213
	public getWorkspaceFileBackups(): Promise<URI[]> {
B
Benjamin Pasero 已提交
1214
		return Promise.resolve([]);
1215 1216
	}

1217 1218 1219 1220 1221
	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);
1222 1223
	}

1224
	public resolveBackupContent<T extends object>(_backup: URI): Promise<IResolvedBackup<T>> {
1225
		throw new Error('not implemented');
1226 1227
	}

J
Johannes Rieken 已提交
1228
	public discardResourceBackup(_resource: URI): Promise<void> {
B
Benjamin Pasero 已提交
1229
		return Promise.resolve();
1230 1231
	}

J
Johannes Rieken 已提交
1232
	public discardAllWorkspaceBackups(): Promise<void> {
B
Benjamin Pasero 已提交
1233
		return Promise.resolve();
1234
	}
1235
}
D
Daniel Imms 已提交
1236

B
Benjamin Pasero 已提交
1237
export class TestCodeEditorService implements ICodeEditorService {
1238
	_serviceBrand: undefined;
B
Benjamin Pasero 已提交
1239 1240 1241 1242 1243

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

1246 1247
	addCodeEditor(_editor: ICodeEditor): void { }
	removeCodeEditor(_editor: ICodeEditor): void { }
B
Benjamin Pasero 已提交
1248
	listCodeEditors(): ICodeEditor[] { return []; }
1249 1250
	addDiffEditor(_editor: IDiffEditor): void { }
	removeDiffEditor(_editor: IDiffEditor): void { }
B
Benjamin Pasero 已提交
1251
	listDiffEditors(): IDiffEditor[] { return []; }
1252
	getFocusedCodeEditor(): ICodeEditor | null { return null; }
1253 1254 1255 1256 1257
	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) { }
1258 1259
	getActiveCodeEditor(): ICodeEditor | null { return null; }
	openCodeEditor(_input: IResourceInput, _source: ICodeEditor, _sideBySide?: boolean): Promise<ICodeEditor | null> { return Promise.resolve(null); }
B
Benjamin Pasero 已提交
1260 1261
}

1262 1263
export class TestLifecycleService implements ILifecycleService {

1264
	public _serviceBrand: undefined;
1265

1266 1267
	public phase!: LifecyclePhase;
	public startupKind!: StartupKind;
1268

1269 1270 1271
	private readonly _onBeforeShutdown = new Emitter<BeforeShutdownEvent>();
	private readonly _onWillShutdown = new Emitter<WillShutdownEvent>();
	private readonly _onShutdown = new Emitter<void>();
1272

J
Johannes Rieken 已提交
1273
	when(): Promise<void> {
B
Benjamin Pasero 已提交
1274
		return Promise.resolve();
B
Benjamin Pasero 已提交
1275
	}
1276

1277
	public fireShutdown(reason = ShutdownReason.QUIT): void {
1278
		this._onWillShutdown.fire({
1279 1280 1281
			join: () => { },
			reason
		});
1282 1283
	}

1284 1285 1286 1287 1288 1289
	public fireWillShutdown(event: BeforeShutdownEvent): void {
		this._onBeforeShutdown.fire(event);
	}

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

1292
	public get onWillShutdown(): Event<WillShutdownEvent> {
1293 1294 1295
		return this._onWillShutdown.event;
	}

1296
	public get onShutdown(): Event<void> {
1297 1298
		return this._onShutdown.event;
	}
1299 1300
}

S
rename  
Sandeep Somavarapu 已提交
1301
export class TestTextResourceConfigurationService implements ITextResourceConfigurationService {
1302

1303
	_serviceBrand: undefined;
1304 1305 1306 1307

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

1308
	public onDidChangeConfiguration() {
1309 1310 1311
		return { dispose() { } };
	}

1312
	getValue<T>(resource: URI, arg2?: any, arg3?: any): T {
1313 1314
		const position: IPosition | null = EditorPosition.isIPosition(arg2) ? arg2 : null;
		const section: string | undefined = position ? (typeof arg3 === 'string' ? arg3 : undefined) : (typeof arg2 === 'string' ? arg2 : undefined);
1315
		return this.configurationService.getValue(section, { resource });
1316
	}
1317 1318 1319 1320

	updateValue(resource: URI, key: string, value: any, configurationTarget?: ConfigurationTarget): Promise<void> {
		return this.configurationService.updateValue(key, value);
	}
B
Benjamin Pasero 已提交
1321 1322
}

S
Sandeep Somavarapu 已提交
1323 1324
export class TestTextResourcePropertiesService implements ITextResourcePropertiesService {

1325
	_serviceBrand: undefined;
S
Sandeep Somavarapu 已提交
1326 1327

	constructor(
1328
		@IConfigurationService private readonly configurationService: IConfigurationService,
S
Sandeep Somavarapu 已提交
1329 1330 1331
	) {
	}

1332 1333 1334 1335
	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 已提交
1336 1337 1338 1339 1340 1341
		}
		return (isLinux || isMacintosh) ? '\n' : '\r\n';
	}
}


1342
export class TestSharedProcessService implements ISharedProcessService {
1343

1344
	_serviceBrand: undefined;
1345

1346 1347 1348
	getChannel(channelName: string): any {
		return undefined;
	}
1349

1350
	registerChannel(channelName: string, channel: any): void { }
1351 1352 1353

	async toggleSharedProcessWindow(): Promise<void> { }
	async whenSharedProcessReady(): Promise<void> { }
1354 1355
}

1356 1357 1358 1359 1360 1361 1362
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 已提交
1363 1364 1365 1366 1367 1368
	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 }),
		};
	}));
1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387
	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 已提交
1388
}
1389 1390

export const productService: IProductService = { _serviceBrand: undefined, ...product };
1391 1392 1393 1394 1395

export class TestHostService implements IHostService {

	_serviceBrand: undefined;

1396 1397 1398
	readonly hasFocus: boolean = true;
	readonly onDidChangeFocus: Event<boolean> = Event.None;

1399 1400
	async restart(): Promise<void> { }
	async reload(): Promise<void> { }
1401

1402 1403
	async focus(): Promise<void> { }

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

1430
	async toggleFullScreen(): Promise<void> { }
1431 1432 1433 1434 1435 1436 1437
	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> { }
1438 1439 1440
	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.'); }
1441 1442 1443 1444 1445 1446 1447 1448
	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; }
1449
	async updateTouchBar(): Promise<void> { }
1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463
	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; }
1464
}
1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528

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

1529
	showMessageBox(options: Electron.MessageBoxOptions, window?: Electron.BrowserWindow | undefined): Promise<Electron.MessageBoxReturnValue> {
1530 1531 1532
		throw new Error('Method not implemented.');
	}

1533
	showSaveDialog(options: Electron.SaveDialogOptions, window?: Electron.BrowserWindow | undefined): Promise<Electron.SaveDialogReturnValue> {
1534 1535 1536
		throw new Error('Method not implemented.');
	}

1537
	showOpenDialog(options: Electron.OpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise<Electron.OpenDialogReturnValue> {
1538 1539 1540
		throw new Error('Method not implemented.');
	}
}
1541

1542
export class TestWorkingCopyService extends WorkingCopyService { }
1543 1544 1545 1546 1547 1548 1549

export class TestFilesConfigurationService extends FilesConfigurationService {

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