workbenchTestServices.ts 54.8 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 } 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 {
B
Benjamin Pasero 已提交
105
	_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
	}

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

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

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

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

B
Benjamin Pasero 已提交
138
	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());
	}

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

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

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

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

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

	}

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

		return false;
	}

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

B
Benjamin Pasero 已提交
186
	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 {
B
Benjamin Pasero 已提交
192
	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

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

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

B
Benjamin Pasero 已提交
247
	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

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
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 {

B
Benjamin Pasero 已提交
336
	_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

B
Benjamin Pasero 已提交
371
	_serviceBrand: undefined;
E
Erich Gamma 已提交
372

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

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

B
Benjamin Pasero 已提交
381
	about(): Promise<void> {
382 383
		return Promise.resolve();
	}
E
Erich Gamma 已提交
384 385
}

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

B
Benjamin Pasero 已提交
388
	_serviceBrand: undefined;
M
Martin Aeschlimann 已提交
389

390 391
	private confirmResult!: ConfirmResult;

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

B
Benjamin Pasero 已提交
432
	_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

B
Benjamin Pasero 已提交
448
	get onMenubarVisibilityChange(): Event<Dimension> {
449 450 451
		return this._onMenubarVisibilityChange.event;
	}

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

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

B
Benjamin Pasero 已提交
460
	hasWindowBorder(): boolean {
E
Eric Amodio 已提交
461 462 463
		return false;
	}

B
Benjamin Pasero 已提交
464
	getWindowBorderRadius(): string | undefined {
E
Eric Amodio 已提交
465 466 467
		return undefined;
	}

B
Benjamin Pasero 已提交
468
	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);
	}

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

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

B
Benjamin Pasero 已提交
484
	getTitleBarOffset(): number {
485 486 487
		return 0;
	}

B
Benjamin Pasero 已提交
488
	isStatusBarHidden(): boolean {
489 490 491
		return false;
	}

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

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

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

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

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

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

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

B
Benjamin Pasero 已提交
512
	toggleMaximizedPanel(): void { }
I
isidor 已提交
513

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

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

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

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

B
Benjamin Pasero 已提交
530
	setPanelPosition(_position: PartPosition): Promise<void> {
531
		return Promise.resolve();
I
isidor 已提交
532 533
	}

B
Benjamin Pasero 已提交
534 535
	addClass(_clazz: string): void { }
	removeClass(_clazz: string): void { }
536

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

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

B
Benjamin Pasero 已提交
542
	toggleZenMode(): void { }
543

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


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

B
Benjamin Pasero 已提交
550
	registerPart(part: Part): void { }
551 552 553 554 555

	isWindowMaximized() {
		return false;
	}

B
Benjamin Pasero 已提交
556
	updateWindowMaximizedState(maximized: boolean): void { }
E
Erich Gamma 已提交
557 558
}

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

561
export class TestViewletService implements IViewletService {
B
Benjamin Pasero 已提交
562
	_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
	openViewlet(id: string, focus?: boolean): Promise<IViewlet | undefined> {
B
Benjamin Pasero 已提交
575
		return Promise.resolve(undefined);
576 577
	}

B
Benjamin Pasero 已提交
578
	getViewlets(): ViewletDescriptor[] {
579 580 581
		return [];
	}

B
Benjamin Pasero 已提交
582
	getAllViewlets(): ViewletDescriptor[] {
583 584 585
		return [];
	}

B
Benjamin Pasero 已提交
586
	getActiveViewlet(): IViewlet {
587 588 589
		return activeViewlet;
	}

B
Benjamin Pasero 已提交
590
	dispose() {
591 592
	}

B
Benjamin Pasero 已提交
593
	getDefaultViewletId(): string {
594 595 596
		return 'workbench.view.explorer';
	}

B
Benjamin Pasero 已提交
597
	getViewlet(id: string): ViewletDescriptor | undefined {
598 599 600
		return undefined;
	}

B
Benjamin Pasero 已提交
601
	getProgressIndicator(id: string) {
B
Benjamin Pasero 已提交
602
		return undefined;
603
	}
604

B
Benjamin Pasero 已提交
605
	hideActiveViewlet(): void { }
606

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

export class TestPanelService implements IPanelService {
B
Benjamin Pasero 已提交
613
	_serviceBrand: undefined;
614 615 616 617

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

B
Benjamin Pasero 已提交
618
	openPanel(id: string, focus?: boolean): undefined {
619
		return undefined;
620 621
	}

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

B
Benjamin Pasero 已提交
626
	getPanels() {
627 628 629
		return [];
	}

B
Benjamin Pasero 已提交
630
	getPinnedPanels() {
631 632 633
		return [];
	}

B
Benjamin Pasero 已提交
634
	getActivePanel(): IViewlet {
635 636 637
		return activeViewlet;
	}

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

B
Benjamin Pasero 已提交
640
	dispose() {
641 642
	}

B
Benjamin Pasero 已提交
643
	showActivity(panelId: string, badge: IBadge, clazz?: string): IDisposable {
644 645 646
		throw new Error('Method not implemented.');
	}

B
Benjamin Pasero 已提交
647
	getProgressIndicator(id: string) {
B
Benjamin Pasero 已提交
648 649 650
		return null!;
	}

B
Benjamin Pasero 已提交
651
	hideActivePanel(): void { }
652

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

658
export class TestStorageService extends InMemoryStorageService {
B
Benjamin Pasero 已提交
659 660
	readonly _onWillSaveState = this._register(new Emitter<IWillSaveStateEvent>());
	readonly onWillSaveState = this._onWillSaveState.event;
661
}
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
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 已提交
879
export class TestEditorService implements EditorServiceImpl {
880

881
	_serviceBrand: undefined;
882 883 884

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

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

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

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

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

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

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

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

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

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

	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 已提交
936 937 938 939 940
	revert(editors: IEditorIdentifier[], options?: IRevertOptions): Promise<boolean> {
		throw new Error('Method not implemented.');
	}

	revertAll(options?: IRevertAllEditorsOptions): Promise<boolean> {
941 942
		throw new Error('Method not implemented.');
	}
943 944
}

945 946
export class TestFileService implements IFileService {

B
Benjamin Pasero 已提交
947
	_serviceBrand: undefined;
948

M
Matt Bierner 已提交
949 950
	private readonly _onFileChanges: Emitter<FileChangesEvent>;
	private readonly _onAfterOperation: Emitter<FileOperationEvent>;
951

952
	readonly onWillActivateFileSystemProvider = Event.None;
953
	readonly onError: Event<Error> = Event.None;
954

955
	private content = 'Hello Html';
956
	private lastReadFileUri!: URI;
957

958 959 960 961 962
	constructor() {
		this._onFileChanges = new Emitter<FileChangesEvent>();
		this._onAfterOperation = new Emitter<FileOperationEvent>();
	}

B
Benjamin Pasero 已提交
963
	setContent(content: string): void {
964 965 966
		this.content = content;
	}

B
Benjamin Pasero 已提交
967
	getContent(): string {
968 969 970
		return this.content;
	}

B
Benjamin Pasero 已提交
971
	getLastReadFileUri(): URI {
972 973 974
		return this.lastReadFileUri;
	}

B
Benjamin Pasero 已提交
975
	get onFileChanges(): Event<FileChangesEvent> {
976 977 978
		return this._onFileChanges.event;
	}

B
Benjamin Pasero 已提交
979
	fireFileChanges(event: FileChangesEvent): void {
980 981 982
		this._onFileChanges.fire(event);
	}

B
Benjamin Pasero 已提交
983
	get onAfterOperation(): Event<FileOperationEvent> {
984 985 986
		return this._onAfterOperation.event;
	}

B
Benjamin Pasero 已提交
987
	fireAfterOperation(event: FileOperationEvent): void {
988 989 990
		this._onAfterOperation.fire(event);
	}

B
Benjamin Pasero 已提交
991 992 993
	resolve(resource: URI, _options?: IResolveFileOptions): Promise<IFileStat>;
	resolve(resource: URI, _options: IResolveMetadataFileOptions): Promise<IFileStatWithMetadata>;
	resolve(resource: URI, _options?: IResolveFileOptions): Promise<IFileStat> {
B
Benjamin Pasero 已提交
994
		return Promise.resolve({
995 996
			resource,
			etag: Date.now().toString(),
B
Benjamin Pasero 已提交
997
			encoding: 'utf8',
B
Benjamin Pasero 已提交
998
			mtime: Date.now(),
999
			size: 42,
1000
			isFile: true,
1001
			isDirectory: false,
1002
			isSymbolicLink: false,
B
Benjamin Pasero 已提交
1003
			name: resources.basename(resource)
B
Benjamin Pasero 已提交
1004
		});
1005
	}
B
Benjamin Pasero 已提交
1006

B
Benjamin Pasero 已提交
1007 1008
	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 已提交
1009 1010
	}

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

1015
	readFile(resource: URI, options?: IReadFileOptions | undefined): Promise<IFileContent> {
1016 1017
		this.lastReadFileUri = resource;

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

1030
	readFileStream(resource: URI, options?: IReadFileOptions | undefined): Promise<IFileStreamContent> {
1031 1032
		this.lastReadFileUri = resource;

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

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

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

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

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

1084
	createFolder(_resource: URI): Promise<IFileStatWithMetadata> {
1085
		throw new Error('not implemented');
1086 1087
	}

1088 1089
	onDidChangeFileSystemProviderRegistrations = Event.None;

1090 1091 1092 1093 1094 1095
	private providers = new Map<string, IFileSystemProvider>();

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

		return toDisposable(() => this.providers.delete(scheme));
1096 1097
	}

1098 1099
	activateProvider(_scheme: string): Promise<void> {
		throw new Error('not implemented');
1100 1101
	}

1102
	canHandleResource(resource: URI): boolean {
1103
		return resource.scheme === 'file' || this.providers.has(resource.scheme);
1104 1105
	}

1106
	hasCapability(resource: URI, capability: FileSystemProviderCapabilities): boolean { return false; }
1107

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

1112 1113
	watch(_resource: URI): IDisposable {
		return Disposable.None;
1114 1115
	}

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

1120
	dispose(): void {
E
Erich Gamma 已提交
1121
	}
1122
}
1123

1124
export class TestBackupFileService implements IBackupFileService {
B
Benjamin Pasero 已提交
1125
	_serviceBrand: undefined;
1126

B
Benjamin Pasero 已提交
1127
	hasBackups(): Promise<boolean> {
B
Benjamin Pasero 已提交
1128
		return Promise.resolve(false);
1129 1130
	}

B
Benjamin Pasero 已提交
1131
	hasBackup(_resource: URI): Promise<boolean> {
B
Benjamin Pasero 已提交
1132
		return Promise.resolve(false);
1133 1134
	}

B
Benjamin Pasero 已提交
1135
	hasBackupSync(resource: URI, versionId?: number): boolean {
1136 1137 1138
		return false;
	}

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

R
Rob Lourens 已提交
1145
			return undefined;
B
Benjamin Pasero 已提交
1146 1147 1148
		});
	}

B
Benjamin Pasero 已提交
1149
	registerResourceForBackup(_resource: URI): Promise<void> {
B
Benjamin Pasero 已提交
1150
		return Promise.resolve();
D
Daniel Imms 已提交
1151 1152
	}

B
Benjamin Pasero 已提交
1153
	deregisterResourceForBackup(_resource: URI): Promise<void> {
B
Benjamin Pasero 已提交
1154
		return Promise.resolve();
D
Daniel Imms 已提交
1155 1156
	}

B
Benjamin Pasero 已提交
1157
	toBackupResource(_resource: URI): URI {
1158
		throw new Error('not implemented');
D
Daniel Imms 已提交
1159
	}
1160

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

B
Benjamin Pasero 已提交
1165
	getWorkspaceFileBackups(): Promise<URI[]> {
B
Benjamin Pasero 已提交
1166
		return Promise.resolve([]);
1167 1168
	}

B
Benjamin Pasero 已提交
1169
	parseBackupContent(textBufferFactory: ITextBufferFactory): string {
1170 1171 1172 1173
		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);
1174 1175
	}

B
Benjamin Pasero 已提交
1176
	resolveBackupContent<T extends object>(_backup: URI): Promise<IResolvedBackup<T>> {
1177
		throw new Error('not implemented');
1178 1179
	}

B
Benjamin Pasero 已提交
1180
	discardResourceBackup(_resource: URI): Promise<void> {
B
Benjamin Pasero 已提交
1181
		return Promise.resolve();
1182 1183
	}

B
Benjamin Pasero 已提交
1184
	discardAllWorkspaceBackups(): Promise<void> {
B
Benjamin Pasero 已提交
1185
		return Promise.resolve();
1186
	}
1187
}
D
Daniel Imms 已提交
1188

B
Benjamin Pasero 已提交
1189
export class TestCodeEditorService implements ICodeEditorService {
1190
	_serviceBrand: undefined;
B
Benjamin Pasero 已提交
1191 1192 1193 1194 1195

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

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

1214 1215
export class TestLifecycleService implements ILifecycleService {

B
Benjamin Pasero 已提交
1216
	_serviceBrand: undefined;
1217

B
Benjamin Pasero 已提交
1218 1219
	phase!: LifecyclePhase;
	startupKind!: StartupKind;
1220

1221 1222 1223
	private readonly _onBeforeShutdown = new Emitter<BeforeShutdownEvent>();
	private readonly _onWillShutdown = new Emitter<WillShutdownEvent>();
	private readonly _onShutdown = new Emitter<void>();
1224

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

B
Benjamin Pasero 已提交
1229
	fireShutdown(reason = ShutdownReason.QUIT): void {
1230
		this._onWillShutdown.fire({
1231 1232 1233
			join: () => { },
			reason
		});
1234 1235
	}

B
Benjamin Pasero 已提交
1236
	fireWillShutdown(event: BeforeShutdownEvent): void {
1237 1238 1239
		this._onBeforeShutdown.fire(event);
	}

B
Benjamin Pasero 已提交
1240
	get onBeforeShutdown(): Event<BeforeShutdownEvent> {
1241
		return this._onBeforeShutdown.event;
1242 1243
	}

B
Benjamin Pasero 已提交
1244
	get onWillShutdown(): Event<WillShutdownEvent> {
1245 1246 1247
		return this._onWillShutdown.event;
	}

B
Benjamin Pasero 已提交
1248
	get onShutdown(): Event<void> {
1249 1250
		return this._onShutdown.event;
	}
1251 1252
}

S
rename  
Sandeep Somavarapu 已提交
1253
export class TestTextResourceConfigurationService implements ITextResourceConfigurationService {
1254

1255
	_serviceBrand: undefined;
1256 1257 1258 1259

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

B
Benjamin Pasero 已提交
1260
	onDidChangeConfiguration() {
1261 1262 1263
		return { dispose() { } };
	}

1264
	getValue<T>(resource: URI, arg2?: any, arg3?: any): T {
1265 1266
		const position: IPosition | null = EditorPosition.isIPosition(arg2) ? arg2 : null;
		const section: string | undefined = position ? (typeof arg3 === 'string' ? arg3 : undefined) : (typeof arg2 === 'string' ? arg2 : undefined);
1267
		return this.configurationService.getValue(section, { resource });
1268
	}
1269 1270 1271 1272

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

S
Sandeep Somavarapu 已提交
1275 1276
export class TestTextResourcePropertiesService implements ITextResourcePropertiesService {

1277
	_serviceBrand: undefined;
S
Sandeep Somavarapu 已提交
1278 1279

	constructor(
1280
		@IConfigurationService private readonly configurationService: IConfigurationService,
S
Sandeep Somavarapu 已提交
1281 1282 1283
	) {
	}

1284 1285 1286 1287
	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 已提交
1288 1289 1290 1291 1292 1293
		}
		return (isLinux || isMacintosh) ? '\n' : '\r\n';
	}
}


1294
export class TestSharedProcessService implements ISharedProcessService {
1295

1296
	_serviceBrand: undefined;
1297

1298 1299 1300
	getChannel(channelName: string): any {
		return undefined;
	}
1301

1302
	registerChannel(channelName: string, channel: any): void { }
1303 1304 1305

	async toggleSharedProcessWindow(): Promise<void> { }
	async whenSharedProcessReady(): Promise<void> { }
1306 1307
}

1308 1309 1310 1311 1312 1313 1314
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 已提交
1315 1316 1317 1318 1319 1320
	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 }),
		};
	}));
1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339
	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 已提交
1340
}
1341 1342

export const productService: IProductService = { _serviceBrand: undefined, ...product };
1343 1344 1345 1346 1347

export class TestHostService implements IHostService {

	_serviceBrand: undefined;

1348 1349 1350
	readonly hasFocus: boolean = true;
	readonly onDidChangeFocus: Event<boolean> = Event.None;

1351 1352
	async restart(): Promise<void> { }
	async reload(): Promise<void> { }
1353

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

1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380
	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.');
	}
1381

1382
	async toggleFullScreen(): Promise<void> { }
1383 1384 1385 1386 1387 1388 1389
	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> { }
1390 1391 1392
	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.'); }
1393 1394 1395 1396 1397 1398 1399 1400
	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; }
1401
	async updateTouchBar(): Promise<void> { }
1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415
	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; }
1416
}
1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480

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

1481
	showMessageBox(options: Electron.MessageBoxOptions, window?: Electron.BrowserWindow | undefined): Promise<Electron.MessageBoxReturnValue> {
1482 1483 1484
		throw new Error('Method not implemented.');
	}

1485
	showSaveDialog(options: Electron.SaveDialogOptions, window?: Electron.BrowserWindow | undefined): Promise<Electron.SaveDialogReturnValue> {
1486 1487 1488
		throw new Error('Method not implemented.');
	}

1489
	showOpenDialog(options: Electron.OpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise<Electron.OpenDialogReturnValue> {
1490 1491 1492
		throw new Error('Method not implemented.');
	}
}
1493

1494
export class TestWorkingCopyService extends WorkingCopyService { }
1495 1496 1497 1498 1499 1500 1501

export class TestFilesConfigurationService extends FilesConfigurationService {

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