Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/api/test/browser/mainThreadDocumentsAndEditors.test.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import assert from 'assert';
7
import { MainThreadDocumentsAndEditors } from '../../browser/mainThreadDocumentsAndEditors.js';
8
import { SingleProxyRPCProtocol } from '../common/testRPCProtocol.js';
9
import { TestConfigurationService } from '../../../../platform/configuration/test/common/testConfigurationService.js';
10
import { ModelService } from '../../../../editor/common/services/modelService.js';
11
import { TestCodeEditorService } from '../../../../editor/test/browser/editorTestServices.js';
12
import { ITextFileService } from '../../../services/textfile/common/textfiles.js';
13
import { IDocumentsAndEditorsDelta } from '../../common/extHost.protocol.js';
14
import { createTestCodeEditor, ITestCodeEditor } from '../../../../editor/test/browser/testCodeEditor.js';
15
import { mock } from '../../../../base/test/common/mock.js';
16
import { TestEditorService, TestEditorGroupsService, TestEnvironmentService, TestPathService } from '../../../test/browser/workbenchTestServices.js';
17
import { Event } from '../../../../base/common/event.js';
18
import { ITextModel } from '../../../../editor/common/model.js';
19
import { ServiceCollection } from '../../../../platform/instantiation/common/serviceCollection.js';
20
import { ICodeEditorService } from '../../../../editor/browser/services/codeEditorService.js';
21
import { IFileService } from '../../../../platform/files/common/files.js';
22
import { TestThemeService } from '../../../../platform/theme/test/common/testThemeService.js';
23
import { UndoRedoService } from '../../../../platform/undoRedo/common/undoRedoService.js';
24
import { TestDialogService } from '../../../../platform/dialogs/test/common/testDialogService.js';
25
import { TestNotificationService } from '../../../../platform/notification/test/common/testNotificationService.js';
26
import { TestTextResourcePropertiesService, TestWorkingCopyFileService } from '../../../test/common/workbenchTestServices.js';
27
import { UriIdentityService } from '../../../../platform/uriIdentity/common/uriIdentityService.js';
28
import { IClipboardService } from '../../../../platform/clipboard/common/clipboardService.js';
29
import { IPaneCompositePartService } from '../../../services/panecomposite/browser/panecomposite.js';
30
import { TextModel } from '../../../../editor/common/model/textModel.js';
31
import { DisposableStore } from '../../../../base/common/lifecycle.js';
32
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';
33
import { TestInstantiationService } from '../../../../platform/instantiation/test/common/instantiationServiceMock.js';
34
import { ILanguageService } from '../../../../editor/common/languages/language.js';
35
import { LanguageService } from '../../../../editor/common/services/languageService.js';
36
import { ILanguageConfigurationService } from '../../../../editor/common/languages/languageConfigurationRegistry.js';
37
import { TestLanguageConfigurationService } from '../../../../editor/test/common/modes/testLanguageConfigurationService.js';
38
import { IUndoRedoService } from '../../../../platform/undoRedo/common/undoRedo.js';
39
import { IQuickDiffModelService } from '../../../contrib/scm/browser/quickDiffModel.js';
40
import { ITextEditorDiffInformation } from '../../../../platform/editor/common/editor.js';
41
import { ITreeSitterLibraryService } from '../../../../editor/common/services/treeSitter/treeSitterLibraryService.js';
42
import { TestTreeSitterLibraryService } from '../../../../editor/test/common/services/testTreeSitterLibraryService.js';
43
44
suite('MainThreadDocumentsAndEditors', () => {
45
46
let disposables: DisposableStore;
47
48
let modelService: ModelService;
49
let codeEditorService: TestCodeEditorService;
50
let textFileService: ITextFileService;
51
const deltas: IDocumentsAndEditorsDelta[] = [];
52
53
function myCreateTestCodeEditor(model: ITextModel | undefined): ITestCodeEditor {
54
return createTestCodeEditor(model, {
55
hasTextFocus: false,
56
serviceCollection: new ServiceCollection(
57
[ICodeEditorService, codeEditorService]
58
)
59
});
60
}
61
62
setup(() => {
63
disposables = new DisposableStore();
64
65
deltas.length = 0;
66
const configService = new TestConfigurationService();
67
configService.setUserConfiguration('editor', { 'detectIndentation': false });
68
const dialogService = new TestDialogService();
69
const notificationService = new TestNotificationService();
70
const undoRedoService = new UndoRedoService(dialogService, notificationService);
71
const themeService = new TestThemeService();
72
const instantiationService = new TestInstantiationService();
73
instantiationService.set(ILanguageService, disposables.add(new LanguageService()));
74
instantiationService.set(ILanguageConfigurationService, new TestLanguageConfigurationService());
75
instantiationService.set(ITreeSitterLibraryService, new TestTreeSitterLibraryService());
76
instantiationService.set(IUndoRedoService, undoRedoService);
77
modelService = new ModelService(
78
configService,
79
new TestTextResourcePropertiesService(configService),
80
undoRedoService,
81
instantiationService
82
);
83
codeEditorService = new TestCodeEditorService(themeService);
84
textFileService = new class extends mock<ITextFileService>() {
85
override isDirty() { return false; }
86
override files = <any>{
87
onDidSave: Event.None,
88
onDidRevert: Event.None,
89
onDidChangeDirty: Event.None,
90
onDidChangeEncoding: Event.None
91
};
92
override untitled = <any>{
93
onDidChangeEncoding: Event.None
94
};
95
override getEncoding() { return 'utf8'; }
96
};
97
const workbenchEditorService = disposables.add(new TestEditorService());
98
const editorGroupService = new TestEditorGroupsService();
99
100
const fileService = new class extends mock<IFileService>() {
101
override onDidRunOperation = Event.None;
102
override onDidChangeFileSystemProviderCapabilities = Event.None;
103
override onDidChangeFileSystemProviderRegistrations = Event.None;
104
};
105
106
new MainThreadDocumentsAndEditors(
107
SingleProxyRPCProtocol({
108
$acceptDocumentsAndEditorsDelta: (delta: IDocumentsAndEditorsDelta) => { deltas.push(delta); },
109
$acceptEditorDiffInformation: (id: string, diffInformation: ITextEditorDiffInformation | undefined) => { }
110
}),
111
modelService,
112
textFileService,
113
workbenchEditorService,
114
codeEditorService,
115
fileService,
116
null!,
117
editorGroupService,
118
new class extends mock<IPaneCompositePartService>() implements IPaneCompositePartService {
119
override onDidPaneCompositeOpen = Event.None;
120
override onDidPaneCompositeClose = Event.None;
121
override getActivePaneComposite() {
122
return undefined;
123
}
124
},
125
TestEnvironmentService,
126
new TestWorkingCopyFileService(),
127
new UriIdentityService(fileService),
128
new class extends mock<IClipboardService>() {
129
override readText() {
130
return Promise.resolve('clipboard_contents');
131
}
132
},
133
new TestPathService(),
134
new TestConfigurationService(),
135
new class extends mock<IQuickDiffModelService>() {
136
override createQuickDiffModelReference() {
137
return undefined;
138
}
139
}
140
);
141
});
142
143
teardown(() => {
144
disposables.dispose();
145
});
146
147
ensureNoDisposablesAreLeakedInTestSuite();
148
149
test('Model#add', () => {
150
deltas.length = 0;
151
152
disposables.add(modelService.createModel('farboo', null));
153
154
assert.strictEqual(deltas.length, 1);
155
const [delta] = deltas;
156
157
assert.strictEqual(delta.addedDocuments!.length, 1);
158
assert.strictEqual(delta.removedDocuments, undefined);
159
assert.strictEqual(delta.addedEditors, undefined);
160
assert.strictEqual(delta.removedEditors, undefined);
161
assert.strictEqual(delta.newActiveEditor, undefined);
162
});
163
164
test('ignore huge model', function () {
165
166
const oldLimit = TextModel._MODEL_SYNC_LIMIT;
167
try {
168
const largeModelString = 'abc'.repeat(1024);
169
TextModel._MODEL_SYNC_LIMIT = largeModelString.length / 2;
170
171
const model = modelService.createModel(largeModelString, null);
172
disposables.add(model);
173
assert.ok(model.isTooLargeForSyncing());
174
175
assert.strictEqual(deltas.length, 1);
176
const [delta] = deltas;
177
assert.strictEqual(delta.newActiveEditor, null);
178
assert.strictEqual(delta.addedDocuments, undefined);
179
assert.strictEqual(delta.removedDocuments, undefined);
180
assert.strictEqual(delta.addedEditors, undefined);
181
assert.strictEqual(delta.removedEditors, undefined);
182
183
} finally {
184
TextModel._MODEL_SYNC_LIMIT = oldLimit;
185
}
186
});
187
188
test('ignore huge model from editor', function () {
189
190
const oldLimit = TextModel._MODEL_SYNC_LIMIT;
191
try {
192
const largeModelString = 'abc'.repeat(1024);
193
TextModel._MODEL_SYNC_LIMIT = largeModelString.length / 2;
194
195
const model = modelService.createModel(largeModelString, null);
196
const editor = myCreateTestCodeEditor(model);
197
198
assert.strictEqual(deltas.length, 1);
199
deltas.length = 0;
200
assert.strictEqual(deltas.length, 0);
201
editor.dispose();
202
model.dispose();
203
204
} finally {
205
TextModel._MODEL_SYNC_LIMIT = oldLimit;
206
}
207
});
208
209
test('ignore simple widget model', function () {
210
this.timeout(1000 * 60); // increase timeout for this one test
211
212
const model = modelService.createModel('test', null, undefined, true);
213
disposables.add(model);
214
assert.ok(model.isForSimpleWidget);
215
216
assert.strictEqual(deltas.length, 1);
217
const [delta] = deltas;
218
assert.strictEqual(delta.newActiveEditor, null);
219
assert.strictEqual(delta.addedDocuments, undefined);
220
assert.strictEqual(delta.removedDocuments, undefined);
221
assert.strictEqual(delta.addedEditors, undefined);
222
assert.strictEqual(delta.removedEditors, undefined);
223
});
224
225
test('ignore editor w/o model', () => {
226
const editor = myCreateTestCodeEditor(undefined);
227
assert.strictEqual(deltas.length, 1);
228
const [delta] = deltas;
229
assert.strictEqual(delta.newActiveEditor, null);
230
assert.strictEqual(delta.addedDocuments, undefined);
231
assert.strictEqual(delta.removedDocuments, undefined);
232
assert.strictEqual(delta.addedEditors, undefined);
233
assert.strictEqual(delta.removedEditors, undefined);
234
235
editor.dispose();
236
});
237
238
test('editor with model', () => {
239
deltas.length = 0;
240
241
const model = modelService.createModel('farboo', null);
242
const editor = myCreateTestCodeEditor(model);
243
244
assert.strictEqual(deltas.length, 2);
245
const [first, second] = deltas;
246
assert.strictEqual(first.addedDocuments!.length, 1);
247
assert.strictEqual(first.newActiveEditor, undefined);
248
assert.strictEqual(first.removedDocuments, undefined);
249
assert.strictEqual(first.addedEditors, undefined);
250
assert.strictEqual(first.removedEditors, undefined);
251
252
assert.strictEqual(second.addedEditors!.length, 1);
253
assert.strictEqual(second.addedDocuments, undefined);
254
assert.strictEqual(second.removedDocuments, undefined);
255
assert.strictEqual(second.removedEditors, undefined);
256
assert.strictEqual(second.newActiveEditor, undefined);
257
258
editor.dispose();
259
model.dispose();
260
});
261
262
test('editor with dispos-ed/-ing model', () => {
263
const model = modelService.createModel('farboo', null);
264
const editor = myCreateTestCodeEditor(model);
265
266
// ignore things until now
267
deltas.length = 0;
268
269
modelService.destroyModel(model.uri);
270
assert.strictEqual(deltas.length, 1);
271
const [first] = deltas;
272
273
assert.strictEqual(first.newActiveEditor, undefined);
274
assert.strictEqual(first.removedEditors!.length, 1);
275
assert.strictEqual(first.removedDocuments!.length, 1);
276
assert.strictEqual(first.addedDocuments, undefined);
277
assert.strictEqual(first.addedEditors, undefined);
278
279
editor.dispose();
280
model.dispose();
281
});
282
});
283
284