workbenchTestServices.ts 55.4 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';
B
Benjamin Pasero 已提交
14
import { IEditorInputWithOptions, CloseDirection, IEditorIdentifier, IUntitledTextResourceInput, IResourceDiffInput, IResourceSideBySideInput, IEditorInput, IEditor, IEditorCloseEvent, IEditorPartOptions, IRevertOptions, GroupIdentifier } from 'vs/workbench/common/editor';
15
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';
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, ServiceIdentifier } 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';
97
import { IAccessibilityService, AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility';
B
Benjamin Pasero 已提交
98

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

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

105
export class TestContextService implements IWorkspaceContextService {
B
Benjamin Pasero 已提交
106
	_serviceBrand: undefined;
E
Erich Gamma 已提交
107

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

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

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

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

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

B
Benjamin Pasero 已提交
131
	get onDidChangeWorkbenchState(): Event<WorkbenchState> {
132 133 134
		return this._onDidChangeWorkbenchState.event;
	}

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

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

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

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

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

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

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

B
Benjamin Pasero 已提交
163
	setWorkspace(workspace: any): void {
D
Daniel Imms 已提交
164 165 166
		this.workspace = workspace;
	}

B
Benjamin Pasero 已提交
167
	getOptions() {
E
Erich Gamma 已提交
168 169 170
		return this.options;
	}

B
Benjamin Pasero 已提交
171
	updateOptions() {
E
Erich Gamma 已提交
172 173 174

	}

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

		return false;
	}

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

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

192
export class TestTextFileService extends NativeTextFileService {
B
Benjamin Pasero 已提交
193
	cleanupBackupsBeforeShutdownCalled!: boolean;
194

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

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

B
Benjamin Pasero 已提交
240
	setPromptPath(path: URI): void {
241 242 243
		this.promptPath = path;
	}

B
Benjamin Pasero 已提交
244
	setResolveTextContentErrorOnce(error: FileOperationError): void {
245 246 247
		this.resolveTextContentError = error;
	}

B
Benjamin Pasero 已提交
248
	async readStream(resource: URI, options?: IReadTextFileOptions): Promise<ITextFileStreamContent> {
249 250 251 252
		if (this.resolveTextContentError) {
			const error = this.resolveTextContentError;
			this.resolveTextContentError = null;

B
Benjamin Pasero 已提交
253
			throw error;
254 255
		}

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

B
Benjamin Pasero 已提交
269
	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 280 281 282 283
export interface ITestInstantiationService extends IInstantiationService {
	stub<T>(service: ServiceIdentifier<T>, ctor: any): T;
}

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

	return instantiationService;
}

330 331 332 333 334 335 336 337 338 339 340
export class TestAccessibilityService implements IAccessibilityService {

	_serviceBrand: undefined;

	onDidChangeAccessibilitySupport = Event.None;

	alwaysUnderlineAccessKeys(): Promise<boolean> { return Promise.resolve(false); }
	getAccessibilitySupport(): AccessibilitySupport { return AccessibilitySupport.Unknown; }
	setAccessibilitySupport(accessibilitySupport: AccessibilitySupport): void { }
}

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

348
export class TestExtensionService extends NullExtensionService { }
B
Benjamin Pasero 已提交
349 350 351

export class TestMenuService implements IMenuService {

B
Benjamin Pasero 已提交
352
	_serviceBrand: undefined;
B
Benjamin Pasero 已提交
353

354
	createMenu(_id: MenuId, _scopedKeybindingService: IContextKeyService): IMenu {
B
Benjamin Pasero 已提交
355 356
		return {
			onDidChange: Event.None,
R
Rob Lourens 已提交
357
			dispose: () => undefined,
B
Benjamin Pasero 已提交
358 359 360 361 362
			getActions: () => []
		};
	}
}

B
Benjamin Pasero 已提交
363 364
export class TestHistoryService implements IHistoryService {

365
	_serviceBrand: undefined;
B
Benjamin Pasero 已提交
366

367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382
	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 已提交
383 384
}

385
export class TestDialogService implements IDialogService {
386

B
Benjamin Pasero 已提交
387
	_serviceBrand: undefined;
E
Erich Gamma 已提交
388

B
Benjamin Pasero 已提交
389
	confirm(_confirmation: IConfirmation): Promise<IConfirmationResult> {
B
Benjamin Pasero 已提交
390
		return Promise.resolve({ confirmed: false });
391
	}
392

B
Benjamin Pasero 已提交
393
	show(_severity: Severity, _message: string, _buttons: string[], _options?: IDialogOptions): Promise<IShowResult> {
394
		return Promise.resolve({ choice: 0 });
395
	}
396

B
Benjamin Pasero 已提交
397
	about(): Promise<void> {
398 399
		return Promise.resolve();
	}
E
Erich Gamma 已提交
400 401
}

M
Martin Aeschlimann 已提交
402 403
export class TestFileDialogService implements IFileDialogService {

B
Benjamin Pasero 已提交
404
	_serviceBrand: undefined;
M
Martin Aeschlimann 已提交
405

406 407
	private confirmResult!: ConfirmResult;

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

446
export class TestLayoutService implements IWorkbenchLayoutService {
B
Benjamin Pasero 已提交
447

B
Benjamin Pasero 已提交
448
	_serviceBrand: undefined;
E
Erich Gamma 已提交
449

450 451
	dimension: IDimension = { width: 800, height: 600 };

452 453
	container: HTMLElement = window.document.body;

B
Benjamin Pasero 已提交
454
	onZenModeChange: Event<boolean> = Event.None;
S
SteVen Batten 已提交
455 456
	onCenteredLayoutChange: Event<boolean> = Event.None;
	onFullscreenChange: Event<boolean> = Event.None;
457
	onMaximizeChange: Event<boolean> = Event.None;
458
	onPanelPositionChange: Event<string> = Event.None;
459
	onPartVisibilityChange: Event<void> = Event.None;
460
	onLayout = Event.None;
B
Benjamin Pasero 已提交
461

462
	private readonly _onMenubarVisibilityChange = new Emitter<Dimension>();
463

B
Benjamin Pasero 已提交
464
	get onMenubarVisibilityChange(): Event<Dimension> {
465 466 467
		return this._onMenubarVisibilityChange.event;
	}

B
Benjamin Pasero 已提交
468
	isRestored(): boolean {
E
Erich Gamma 已提交
469 470 471
		return true;
	}

B
Benjamin Pasero 已提交
472
	hasFocus(_part: Parts): boolean {
E
Erich Gamma 已提交
473 474 475
		return false;
	}

B
Benjamin Pasero 已提交
476
	hasWindowBorder(): boolean {
E
Eric Amodio 已提交
477 478 479
		return false;
	}

B
Benjamin Pasero 已提交
480
	getWindowBorderRadius(): string | undefined {
E
Eric Amodio 已提交
481 482 483
		return undefined;
	}

B
Benjamin Pasero 已提交
484
	isVisible(_part: Parts): boolean {
E
Erich Gamma 已提交
485 486 487
		return true;
	}

488 489 490 491
	getDimension(_part: Parts): Dimension {
		return new Dimension(0, 0);
	}

B
Benjamin Pasero 已提交
492
	getContainer(_part: Parts): HTMLElement {
B
Benjamin Pasero 已提交
493
		return null!;
494 495
	}

B
Benjamin Pasero 已提交
496
	isTitleBarHidden(): boolean {
B
Benjamin Pasero 已提交
497 498 499
		return false;
	}

B
Benjamin Pasero 已提交
500
	getTitleBarOffset(): number {
501 502 503
		return 0;
	}

B
Benjamin Pasero 已提交
504
	isStatusBarHidden(): boolean {
505 506 507
		return false;
	}

B
Benjamin Pasero 已提交
508
	isActivityBarHidden(): boolean {
S
Sanders Lauture 已提交
509 510 511
		return false;
	}

B
Benjamin Pasero 已提交
512
	setActivityBarHidden(_hidden: boolean): void { }
S
Sanders Lauture 已提交
513

B
Benjamin Pasero 已提交
514
	isSideBarHidden(): boolean {
E
Erich Gamma 已提交
515 516 517
		return false;
	}

B
Benjamin Pasero 已提交
518
	setEditorHidden(_hidden: boolean): Promise<void> { return Promise.resolve(); }
S
SteVen Batten 已提交
519

B
Benjamin Pasero 已提交
520
	setSideBarHidden(_hidden: boolean): Promise<void> { return Promise.resolve(); }
E
Erich Gamma 已提交
521

B
Benjamin Pasero 已提交
522
	isPanelHidden(): boolean {
I
isidor 已提交
523 524 525
		return false;
	}

B
Benjamin Pasero 已提交
526
	setPanelHidden(_hidden: boolean): Promise<void> { return Promise.resolve(); }
I
isidor 已提交
527

B
Benjamin Pasero 已提交
528
	toggleMaximizedPanel(): void { }
I
isidor 已提交
529

B
Benjamin Pasero 已提交
530
	isPanelMaximized(): boolean {
B
Benjamin Pasero 已提交
531 532 533
		return false;
	}

B
Benjamin Pasero 已提交
534
	getMenubarVisibility(): MenuBarVisibility {
535
		throw new Error('not implemented');
S
SteVen Batten 已提交
536 537
	}

B
Benjamin Pasero 已提交
538
	getSideBarPosition() {
E
Erich Gamma 已提交
539 540 541
		return 0;
	}

B
Benjamin Pasero 已提交
542
	getPanelPosition() {
I
isidor 已提交
543 544 545
		return 0;
	}

B
Benjamin Pasero 已提交
546
	setPanelPosition(_position: PartPosition): Promise<void> {
547
		return Promise.resolve();
I
isidor 已提交
548 549
	}

B
Benjamin Pasero 已提交
550 551
	addClass(_clazz: string): void { }
	removeClass(_clazz: string): void { }
552

B
Benjamin Pasero 已提交
553
	getMaximumEditorDimensions(): Dimension { throw new Error('not implemented'); }
554

B
Benjamin Pasero 已提交
555 556
	getWorkbenchContainer(): HTMLElement { throw new Error('not implemented'); }
	getWorkbenchElement(): HTMLElement { throw new Error('not implemented'); }
B
Benjamin Pasero 已提交
557

B
Benjamin Pasero 已提交
558
	toggleZenMode(): void { }
559

B
Benjamin Pasero 已提交
560 561
	isEditorLayoutCentered(): boolean { return false; }
	centerEditorLayout(_active: boolean): void { }
S
SrTobi 已提交
562 563


B
Benjamin Pasero 已提交
564
	resizePart(_part: Parts, _sizeChange: number): void { }
565

B
Benjamin Pasero 已提交
566
	registerPart(part: Part): void { }
567 568 569 570 571

	isWindowMaximized() {
		return false;
	}

B
Benjamin Pasero 已提交
572
	updateWindowMaximizedState(maximized: boolean): void { }
E
Erich Gamma 已提交
573 574
}

575
let activeViewlet: Viewlet = {} as any;
576

577
export class TestViewletService implements IViewletService {
B
Benjamin Pasero 已提交
578
	_serviceBrand: undefined;
579 580 581 582 583 584 585 586 587 588 589

	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 已提交
590
	openViewlet(id: string, focus?: boolean): Promise<IViewlet | undefined> {
B
Benjamin Pasero 已提交
591
		return Promise.resolve(undefined);
592 593
	}

B
Benjamin Pasero 已提交
594
	getViewlets(): ViewletDescriptor[] {
595 596 597
		return [];
	}

B
Benjamin Pasero 已提交
598
	getAllViewlets(): ViewletDescriptor[] {
599 600 601
		return [];
	}

B
Benjamin Pasero 已提交
602
	getActiveViewlet(): IViewlet {
603 604 605
		return activeViewlet;
	}

B
Benjamin Pasero 已提交
606
	dispose() {
607 608
	}

B
Benjamin Pasero 已提交
609
	getDefaultViewletId(): string {
610 611 612
		return 'workbench.view.explorer';
	}

B
Benjamin Pasero 已提交
613
	getViewlet(id: string): ViewletDescriptor | undefined {
614 615 616
		return undefined;
	}

B
Benjamin Pasero 已提交
617
	getProgressIndicator(id: string) {
B
Benjamin Pasero 已提交
618
		return undefined;
619
	}
620

B
Benjamin Pasero 已提交
621
	hideActiveViewlet(): void { }
622

B
Benjamin Pasero 已提交
623
	getLastActiveViewletId(): string {
M
Matt Bierner 已提交
624
		return undefined!;
625
	}
626 627 628
}

export class TestPanelService implements IPanelService {
B
Benjamin Pasero 已提交
629
	_serviceBrand: undefined;
630 631 632 633

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

B
Benjamin Pasero 已提交
634
	openPanel(id: string, focus?: boolean): undefined {
635
		return undefined;
636 637
	}

B
Benjamin Pasero 已提交
638
	getPanel(id: string): any {
B
Benjamin Pasero 已提交
639 640 641
		return activeViewlet;
	}

B
Benjamin Pasero 已提交
642
	getPanels() {
643 644 645
		return [];
	}

B
Benjamin Pasero 已提交
646
	getPinnedPanels() {
647 648 649
		return [];
	}

B
Benjamin Pasero 已提交
650
	getActivePanel(): IViewlet {
651 652 653
		return activeViewlet;
	}

B
Benjamin Pasero 已提交
654
	setPanelEnablement(id: string, enabled: boolean): void { }
655

B
Benjamin Pasero 已提交
656
	dispose() {
657 658
	}

B
Benjamin Pasero 已提交
659
	showActivity(panelId: string, badge: IBadge, clazz?: string): IDisposable {
660 661 662
		throw new Error('Method not implemented.');
	}

B
Benjamin Pasero 已提交
663
	getProgressIndicator(id: string) {
B
Benjamin Pasero 已提交
664 665 666
		return null!;
	}

B
Benjamin Pasero 已提交
667
	hideActivePanel(): void { }
668

B
Benjamin Pasero 已提交
669
	getLastActivePanelId(): string {
M
Matt Bierner 已提交
670
		return undefined!;
671 672 673
	}
}

674
export class TestStorageService extends InMemoryStorageService {
B
Benjamin Pasero 已提交
675 676
	readonly _onWillSaveState = this._register(new Emitter<IWillSaveStateEvent>());
	readonly onWillSaveState = this._onWillSaveState.event;
677
}
678

679 680
export class TestEditorGroupsService implements IEditorGroupsService {

681
	_serviceBrand: undefined;
682

683
	constructor(public groups: TestEditorGroupView[] = []) { }
684

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

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

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

699
	get activeGroup(): IEditorGroup {
700 701 702 703 704 705 706
		return this.groups[0];
	}

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

707
	getGroups(_order?: GroupsOrder): ReadonlyArray<IEditorGroup> {
708 709 710
		return this.groups;
	}

711 712
	getGroup(identifier: number): IEditorGroup | undefined {
		return find(this.groups, group => group.id === identifier);
713 714
	}

715
	getLabel(_identifier: number): string {
716 717 718
		return 'Group 1';
	}

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

723
	activateGroup(_group: number | IEditorGroup): IEditorGroup {
724
		throw new Error('not implemented');
725 726
	}

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

731 732
	getSize(_group: number | IEditorGroup): { width: number, height: number } {
		return { width: 100, height: 100 };
733 734
	}

735
	setSize(_group: number | IEditorGroup, _size: { width: number, height: number }): void { }
736

737
	arrangeGroups(_arrangement: GroupsArrangement): void { }
738

739
	applyLayout(_layout: EditorGroupLayout): void { }
740

741
	setGroupOrientation(_orientation: any): void { }
742

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

747
	removeGroup(_group: number | IEditorGroup): void { }
748

749
	moveGroup(_group: number | IEditorGroup, _location: number | IEditorGroup, _direction: GroupDirection): IEditorGroup {
750
		throw new Error('not implemented');
751 752
	}

753
	mergeGroup(_group: number | IEditorGroup, _target: number | IEditorGroup, _options?: IMergeGroupOptions): IEditorGroup {
754
		throw new Error('not implemented');
755 756
	}

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

	centerLayout(active: boolean): void { }

	isLayoutCentered(): boolean {
		return false;
	}

767
	partOptions!: IEditorPartOptions;
768 769
	enforcePartOptions(options: IEditorPartOptions): IDisposable {
		return Disposable.None;
770 771 772
	}
}

773
export class TestEditorGroupView implements IEditorGroupView {
774 775 776

	constructor(public id: number) { }

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

793 794 795
	isEmpty = true;
	isMinimized = false;

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

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

B
Benjamin Pasero 已提交
809
	getEditorByIndex(_index: number): IEditorInput {
810
		throw new Error('not implemented');
811 812
	}

813
	getIndexOfEditor(_editor: IEditorInput): number {
814 815 816
		return -1;
	}

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

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

825
	isOpened(_editor: IEditorInput | IResourceInput): boolean {
826 827 828
		return false;
	}

829
	isPinned(_editor: IEditorInput): boolean {
830 831 832
		return false;
	}

833
	isActive(_editor: IEditorInput): boolean {
834 835 836
		return false;
	}

837
	moveEditor(_editor: IEditorInput, _target: IEditorGroup, _options?: IMoveEditorOptions): void { }
838

839
	copyEditor(_editor: IEditorInput, _target: IEditorGroup, _options?: ICopyEditorOptions): void { }
840

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

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

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

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

857
	pinEditor(_editor?: IEditorInput): void { }
858 859 860 861

	focus(): void { }

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

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

873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894
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.'); }
}

B
Benjamin Pasero 已提交
895
export class TestEditorService implements EditorServiceImpl {
896

897
	_serviceBrand: undefined;
898 899 900

	onDidActiveEditorChange: Event<void> = Event.None;
	onDidVisibleEditorsChange: Event<void> = Event.None;
B
Benjamin Pasero 已提交
901
	onDidCloseEditor: Event<IEditorCloseEvent> = Event.None;
902 903
	onDidOpenEditorFail: Event<IEditorIdentifier> = Event.None;

904
	activeControl!: IVisibleEditor;
905
	activeTextEditorWidget: any;
906
	activeEditor!: IEditorInput;
907
	editors: ReadonlyArray<IEditorInput> = [];
M
Matt Bierner 已提交
908
	visibleControls: ReadonlyArray<IVisibleEditor> = [];
909
	visibleTextEditorWidgets = [];
B
Benjamin Pasero 已提交
910
	visibleEditors: ReadonlyArray<IEditorInput> = [];
911

912
	overrideOpenEditor(_handler: IOpenEditorOverrideHandler): IDisposable {
R
Rob Lourens 已提交
913
		return toDisposable(() => undefined);
914 915
	}

916 917
	openEditor(_editor: any, _options?: any, _group?: any): Promise<any> {
		throw new Error('not implemented');
918 919
	}

920 921
	openEditors(_editors: any, _group?: any): Promise<IEditor[]> {
		throw new Error('not implemented');
922 923
	}

924
	isOpen(_editor: IEditorInput | IResourceInput | IUntitledTextResourceInput): boolean {
925 926 927
		return false;
	}

928
	getOpened(_editor: IEditorInput | IResourceInput | IUntitledTextResourceInput): IEditorInput {
929
		throw new Error('not implemented');
930 931
	}

932
	replaceEditors(_editors: any, _group: any) {
R
Rob Lourens 已提交
933
		return Promise.resolve(undefined);
934 935
	}

936
	invokeWithinEditorContext<T>(fn: (accessor: ServicesAccessor) => T): T {
937
		throw new Error('not implemented');
938 939
	}

940
	createInput(_input: IResourceInput | IUntitledTextResourceInput | IResourceDiffInput | IResourceSideBySideInput): IEditorInput {
941
		throw new Error('not implemented');
942
	}
943 944 945 946 947 948 949 950 951

	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 已提交
952 953 954 955 956
	revert(editors: IEditorIdentifier[], options?: IRevertOptions): Promise<boolean> {
		throw new Error('Method not implemented.');
	}

	revertAll(options?: IRevertAllEditorsOptions): Promise<boolean> {
957 958
		throw new Error('Method not implemented.');
	}
959 960
}

961 962
export class TestFileService implements IFileService {

B
Benjamin Pasero 已提交
963
	_serviceBrand: undefined;
964

M
Matt Bierner 已提交
965 966
	private readonly _onFileChanges: Emitter<FileChangesEvent>;
	private readonly _onAfterOperation: Emitter<FileOperationEvent>;
967

968
	readonly onWillActivateFileSystemProvider = Event.None;
969
	readonly onError: Event<Error> = Event.None;
970

971
	private content = 'Hello Html';
972
	private lastReadFileUri!: URI;
973

974 975 976 977 978
	constructor() {
		this._onFileChanges = new Emitter<FileChangesEvent>();
		this._onAfterOperation = new Emitter<FileOperationEvent>();
	}

B
Benjamin Pasero 已提交
979
	setContent(content: string): void {
980 981 982
		this.content = content;
	}

B
Benjamin Pasero 已提交
983
	getContent(): string {
984 985 986
		return this.content;
	}

B
Benjamin Pasero 已提交
987
	getLastReadFileUri(): URI {
988 989 990
		return this.lastReadFileUri;
	}

B
Benjamin Pasero 已提交
991
	get onFileChanges(): Event<FileChangesEvent> {
992 993 994
		return this._onFileChanges.event;
	}

B
Benjamin Pasero 已提交
995
	fireFileChanges(event: FileChangesEvent): void {
996 997 998
		this._onFileChanges.fire(event);
	}

B
Benjamin Pasero 已提交
999
	get onAfterOperation(): Event<FileOperationEvent> {
1000 1001 1002
		return this._onAfterOperation.event;
	}

B
Benjamin Pasero 已提交
1003
	fireAfterOperation(event: FileOperationEvent): void {
1004 1005 1006
		this._onAfterOperation.fire(event);
	}

B
Benjamin Pasero 已提交
1007 1008 1009
	resolve(resource: URI, _options?: IResolveFileOptions): Promise<IFileStat>;
	resolve(resource: URI, _options: IResolveMetadataFileOptions): Promise<IFileStatWithMetadata>;
	resolve(resource: URI, _options?: IResolveFileOptions): Promise<IFileStat> {
B
Benjamin Pasero 已提交
1010
		return Promise.resolve({
1011 1012
			resource,
			etag: Date.now().toString(),
B
Benjamin Pasero 已提交
1013
			encoding: 'utf8',
B
Benjamin Pasero 已提交
1014
			mtime: Date.now(),
1015
			size: 42,
1016
			isFile: true,
1017
			isDirectory: false,
1018
			isSymbolicLink: false,
B
Benjamin Pasero 已提交
1019
			name: resources.basename(resource)
B
Benjamin Pasero 已提交
1020
		});
1021
	}
B
Benjamin Pasero 已提交
1022

B
Benjamin Pasero 已提交
1023 1024 1025 1026
	async resolveAll(toResolve: { resource: URI, options?: IResolveFileOptions }[]): Promise<IResolveFileResult[]> {
		const stats = await Promise.all(toResolve.map(resourceAndOption => this.resolve(resourceAndOption.resource, resourceAndOption.options)));

		return stats.map(stat => ({ stat, success: true }));
I
isidor 已提交
1027 1028
	}

B
Benjamin Pasero 已提交
1029 1030
	async exists(_resource: URI): Promise<boolean> {
		return true;
1031
	}
B
Benjamin Pasero 已提交
1032

1033
	readFile(resource: URI, options?: IReadFileOptions | undefined): Promise<IFileContent> {
1034 1035
		this.lastReadFileUri = resource;

1036
		return Promise.resolve({
B
Benjamin Pasero 已提交
1037
			resource: resource,
1038
			value: VSBuffer.fromString(this.content),
1039
			etag: 'index.txt',
B
Benjamin Pasero 已提交
1040 1041
			encoding: 'utf8',
			mtime: Date.now(),
1042
			ctime: Date.now(),
1043 1044
			name: resources.basename(resource),
			size: 1
E
Erich Gamma 已提交
1045
		});
1046
	}
E
Erich Gamma 已提交
1047

1048
	readFileStream(resource: URI, options?: IReadFileOptions | undefined): Promise<IFileStreamContent> {
1049 1050
		this.lastReadFileUri = resource;

1051
		return Promise.resolve({
A
Alex Dima 已提交
1052 1053
			resource: resource,
			value: {
1054
				on: (event: string, callback: Function): void => {
A
Alex Dima 已提交
1055
					if (event === 'data') {
1056
						callback(this.content);
A
Alex Dima 已提交
1057 1058 1059 1060
					}
					if (event === 'end') {
						callback();
					}
B
Benjamin Pasero 已提交
1061 1062 1063 1064
				},
				resume: () => { },
				pause: () => { },
				destroy: () => { }
A
Alex Dima 已提交
1065 1066 1067
			},
			etag: 'index.txt',
			encoding: 'utf8',
B
Benjamin Pasero 已提交
1068
			mtime: Date.now(),
1069
			ctime: Date.now(),
1070 1071
			size: 1,
			name: resources.basename(resource)
A
Alex Dima 已提交
1072
		});
1073 1074
	}

B
Benjamin Pasero 已提交
1075 1076 1077 1078
	async writeFile(resource: URI, bufferOrReadable: VSBuffer | VSBufferReadable, options?: IWriteFileOptions): Promise<IFileStatWithMetadata> {
		await timeout(0);

		return ({
1079 1080 1081
			resource,
			etag: 'index.txt',
			mtime: Date.now(),
1082
			ctime: Date.now(),
1083
			size: 42,
1084
			isFile: true,
1085
			isDirectory: false,
1086
			isSymbolicLink: false,
B
Benjamin Pasero 已提交
1087
			name: resources.basename(resource)
B
Benjamin Pasero 已提交
1088
		});
1089
	}
D
Daniel Imms 已提交
1090

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

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

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

1103
	createFolder(_resource: URI): Promise<IFileStatWithMetadata> {
1104
		throw new Error('not implemented');
1105 1106
	}

1107 1108
	onDidChangeFileSystemProviderRegistrations = Event.None;

1109 1110 1111 1112 1113 1114
	private providers = new Map<string, IFileSystemProvider>();

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

		return toDisposable(() => this.providers.delete(scheme));
1115 1116
	}

1117 1118
	activateProvider(_scheme: string): Promise<void> {
		throw new Error('not implemented');
1119 1120
	}

1121
	canHandleResource(resource: URI): boolean {
1122
		return resource.scheme === 'file' || this.providers.has(resource.scheme);
1123 1124
	}

1125
	hasCapability(resource: URI, capability: FileSystemProviderCapabilities): boolean { return false; }
1126

J
Johannes Rieken 已提交
1127
	del(_resource: URI, _options?: { useTrash?: boolean, recursive?: boolean }): Promise<void> {
1128
		return Promise.resolve();
1129 1130
	}

1131 1132
	watch(_resource: URI): IDisposable {
		return Disposable.None;
1133 1134
	}

1135 1136
	getWriteEncoding(_resource: URI): IResourceEncoding {
		return { encoding: 'utf8', hasBOM: false };
1137
	}
D
Daniel Imms 已提交
1138

1139
	dispose(): void {
E
Erich Gamma 已提交
1140
	}
1141
}
1142

1143
export class TestBackupFileService implements IBackupFileService {
B
Benjamin Pasero 已提交
1144
	_serviceBrand: undefined;
1145

B
Benjamin Pasero 已提交
1146
	hasBackups(): Promise<boolean> {
B
Benjamin Pasero 已提交
1147
		return Promise.resolve(false);
1148 1149
	}

B
Benjamin Pasero 已提交
1150
	hasBackup(_resource: URI): Promise<boolean> {
B
Benjamin Pasero 已提交
1151
		return Promise.resolve(false);
1152 1153
	}

B
Benjamin Pasero 已提交
1154
	hasBackupSync(resource: URI, versionId?: number): boolean {
1155 1156 1157
		return false;
	}

B
Benjamin Pasero 已提交
1158 1159 1160 1161 1162
	async loadBackupResource(resource: URI): Promise<URI | undefined> {
		const hasBackup = await this.hasBackup(resource);
		if (hasBackup) {
			return this.toBackupResource(resource);
		}
B
Benjamin Pasero 已提交
1163

B
Benjamin Pasero 已提交
1164
		return undefined;
B
Benjamin Pasero 已提交
1165 1166
	}

B
Benjamin Pasero 已提交
1167
	registerResourceForBackup(_resource: URI): Promise<void> {
B
Benjamin Pasero 已提交
1168
		return Promise.resolve();
D
Daniel Imms 已提交
1169 1170
	}

B
Benjamin Pasero 已提交
1171
	deregisterResourceForBackup(_resource: URI): Promise<void> {
B
Benjamin Pasero 已提交
1172
		return Promise.resolve();
D
Daniel Imms 已提交
1173 1174
	}

B
Benjamin Pasero 已提交
1175
	toBackupResource(_resource: URI): URI {
1176
		throw new Error('not implemented');
D
Daniel Imms 已提交
1177
	}
1178

B
Benjamin Pasero 已提交
1179
	backupResource<T extends object>(_resource: URI, _content: ITextSnapshot, versionId?: number, meta?: T): Promise<void> {
B
Benjamin Pasero 已提交
1180
		return Promise.resolve();
1181 1182
	}

B
Benjamin Pasero 已提交
1183
	getWorkspaceFileBackups(): Promise<URI[]> {
B
Benjamin Pasero 已提交
1184
		return Promise.resolve([]);
1185 1186
	}

B
Benjamin Pasero 已提交
1187
	parseBackupContent(textBufferFactory: ITextBufferFactory): string {
1188 1189 1190 1191
		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);
1192 1193
	}

B
Benjamin Pasero 已提交
1194
	resolveBackupContent<T extends object>(_backup: URI): Promise<IResolvedBackup<T>> {
1195
		throw new Error('not implemented');
1196 1197
	}

B
Benjamin Pasero 已提交
1198
	discardResourceBackup(_resource: URI): Promise<void> {
B
Benjamin Pasero 已提交
1199
		return Promise.resolve();
1200 1201
	}

B
Benjamin Pasero 已提交
1202
	discardAllWorkspaceBackups(): Promise<void> {
B
Benjamin Pasero 已提交
1203
		return Promise.resolve();
1204
	}
1205
}
D
Daniel Imms 已提交
1206

B
Benjamin Pasero 已提交
1207
export class TestCodeEditorService implements ICodeEditorService {
1208
	_serviceBrand: undefined;
B
Benjamin Pasero 已提交
1209 1210 1211 1212 1213

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

1216 1217
	addCodeEditor(_editor: ICodeEditor): void { }
	removeCodeEditor(_editor: ICodeEditor): void { }
B
Benjamin Pasero 已提交
1218
	listCodeEditors(): ICodeEditor[] { return []; }
1219 1220
	addDiffEditor(_editor: IDiffEditor): void { }
	removeDiffEditor(_editor: IDiffEditor): void { }
B
Benjamin Pasero 已提交
1221
	listDiffEditors(): IDiffEditor[] { return []; }
1222
	getFocusedCodeEditor(): ICodeEditor | null { return null; }
1223 1224 1225 1226 1227
	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) { }
1228 1229
	getActiveCodeEditor(): ICodeEditor | null { return null; }
	openCodeEditor(_input: IResourceInput, _source: ICodeEditor, _sideBySide?: boolean): Promise<ICodeEditor | null> { return Promise.resolve(null); }
B
Benjamin Pasero 已提交
1230 1231
}

1232 1233
export class TestLifecycleService implements ILifecycleService {

B
Benjamin Pasero 已提交
1234
	_serviceBrand: undefined;
1235

B
Benjamin Pasero 已提交
1236 1237
	phase!: LifecyclePhase;
	startupKind!: StartupKind;
1238

1239 1240 1241
	private readonly _onBeforeShutdown = new Emitter<BeforeShutdownEvent>();
	private readonly _onWillShutdown = new Emitter<WillShutdownEvent>();
	private readonly _onShutdown = new Emitter<void>();
1242

J
Johannes Rieken 已提交
1243
	when(): Promise<void> {
B
Benjamin Pasero 已提交
1244
		return Promise.resolve();
B
Benjamin Pasero 已提交
1245
	}
1246

B
Benjamin Pasero 已提交
1247
	fireShutdown(reason = ShutdownReason.QUIT): void {
1248
		this._onWillShutdown.fire({
1249 1250 1251
			join: () => { },
			reason
		});
1252 1253
	}

B
Benjamin Pasero 已提交
1254
	fireWillShutdown(event: BeforeShutdownEvent): void {
1255 1256 1257
		this._onBeforeShutdown.fire(event);
	}

B
Benjamin Pasero 已提交
1258
	get onBeforeShutdown(): Event<BeforeShutdownEvent> {
1259
		return this._onBeforeShutdown.event;
1260 1261
	}

B
Benjamin Pasero 已提交
1262
	get onWillShutdown(): Event<WillShutdownEvent> {
1263 1264 1265
		return this._onWillShutdown.event;
	}

B
Benjamin Pasero 已提交
1266
	get onShutdown(): Event<void> {
1267 1268
		return this._onShutdown.event;
	}
1269 1270
}

S
rename  
Sandeep Somavarapu 已提交
1271
export class TestTextResourceConfigurationService implements ITextResourceConfigurationService {
1272

1273
	_serviceBrand: undefined;
1274 1275 1276 1277

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

B
Benjamin Pasero 已提交
1278
	onDidChangeConfiguration() {
1279 1280 1281
		return { dispose() { } };
	}

1282
	getValue<T>(resource: URI, arg2?: any, arg3?: any): T {
1283 1284
		const position: IPosition | null = EditorPosition.isIPosition(arg2) ? arg2 : null;
		const section: string | undefined = position ? (typeof arg3 === 'string' ? arg3 : undefined) : (typeof arg2 === 'string' ? arg2 : undefined);
1285
		return this.configurationService.getValue(section, { resource });
1286
	}
1287 1288 1289 1290

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

S
Sandeep Somavarapu 已提交
1293 1294
export class TestTextResourcePropertiesService implements ITextResourcePropertiesService {

1295
	_serviceBrand: undefined;
S
Sandeep Somavarapu 已提交
1296 1297

	constructor(
1298
		@IConfigurationService private readonly configurationService: IConfigurationService,
S
Sandeep Somavarapu 已提交
1299 1300 1301
	) {
	}

1302 1303 1304 1305
	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 已提交
1306 1307 1308 1309 1310 1311
		}
		return (isLinux || isMacintosh) ? '\n' : '\r\n';
	}
}


1312
export class TestSharedProcessService implements ISharedProcessService {
1313

1314
	_serviceBrand: undefined;
1315

1316 1317 1318
	getChannel(channelName: string): any {
		return undefined;
	}
1319

1320
	registerChannel(channelName: string, channel: any): void { }
1321 1322 1323

	async toggleSharedProcessWindow(): Promise<void> { }
	async whenSharedProcessReady(): Promise<void> { }
1324 1325
}

1326 1327 1328 1329 1330 1331 1332
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 已提交
1333 1334 1335 1336 1337 1338
	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 }),
		};
	}));
1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357
	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 已提交
1358
}
1359 1360

export const productService: IProductService = { _serviceBrand: undefined, ...product };
1361 1362 1363 1364 1365

export class TestHostService implements IHostService {

	_serviceBrand: undefined;

1366 1367 1368
	readonly hasFocus: boolean = true;
	readonly onDidChangeFocus: Event<boolean> = Event.None;

1369 1370
	async restart(): Promise<void> { }
	async reload(): Promise<void> { }
1371

1372 1373
	async focus(): Promise<void> { }

1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398
	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.');
	}
1399

1400
	async toggleFullScreen(): Promise<void> { }
1401 1402 1403 1404 1405 1406 1407
	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> { }
1408 1409 1410
	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.'); }
1411 1412 1413 1414 1415 1416 1417 1418
	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; }
1419
	async updateTouchBar(): Promise<void> { }
1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433
	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; }
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 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

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

1499
	showMessageBox(options: Electron.MessageBoxOptions, window?: Electron.BrowserWindow | undefined): Promise<Electron.MessageBoxReturnValue> {
1500 1501 1502
		throw new Error('Method not implemented.');
	}

1503
	showSaveDialog(options: Electron.SaveDialogOptions, window?: Electron.BrowserWindow | undefined): Promise<Electron.SaveDialogReturnValue> {
1504 1505 1506
		throw new Error('Method not implemented.');
	}

1507
	showOpenDialog(options: Electron.OpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise<Electron.OpenDialogReturnValue> {
1508 1509 1510
		throw new Error('Method not implemented.');
	}
}
1511

1512
export class TestWorkingCopyService extends WorkingCopyService { }
1513 1514 1515 1516 1517 1518 1519

export class TestFilesConfigurationService extends FilesConfigurationService {

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