Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/test/browser/widget/codeEditorWidget.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 { DisposableStore } from '../../../../base/common/lifecycle.js';
8
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';
9
import { Range } from '../../../common/core/range.js';
10
import { Selection } from '../../../common/core/selection.js';
11
import { ILanguageService } from '../../../common/languages/language.js';
12
import { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';
13
import { withTestCodeEditor } from '../testCodeEditor.js';
14
15
suite('CodeEditorWidget', () => {
16
17
ensureNoDisposablesAreLeakedInTestSuite();
18
19
test('onDidChangeModelDecorations', () => {
20
withTestCodeEditor('', {}, (editor, viewModel) => {
21
const disposables = new DisposableStore();
22
23
let invoked = false;
24
disposables.add(editor.onDidChangeModelDecorations((e) => {
25
invoked = true;
26
}));
27
28
viewModel.model.deltaDecorations([], [{ range: new Range(1, 1, 1, 1), options: { description: 'test' } }]);
29
30
assert.deepStrictEqual(invoked, true);
31
32
disposables.dispose();
33
});
34
});
35
36
test('onDidChangeModelLanguage', () => {
37
withTestCodeEditor('', {}, (editor, viewModel, instantiationService) => {
38
const languageService = instantiationService.get(ILanguageService);
39
const disposables = new DisposableStore();
40
disposables.add(languageService.registerLanguage({ id: 'testMode' }));
41
42
let invoked = false;
43
disposables.add(editor.onDidChangeModelLanguage((e) => {
44
invoked = true;
45
}));
46
47
viewModel.model.setLanguage('testMode');
48
49
assert.deepStrictEqual(invoked, true);
50
51
disposables.dispose();
52
});
53
});
54
55
test('onDidChangeModelLanguageConfiguration', () => {
56
withTestCodeEditor('', {}, (editor, viewModel, instantiationService) => {
57
const languageConfigurationService = instantiationService.get(ILanguageConfigurationService);
58
const languageService = instantiationService.get(ILanguageService);
59
const disposables = new DisposableStore();
60
disposables.add(languageService.registerLanguage({ id: 'testMode' }));
61
viewModel.model.setLanguage('testMode');
62
63
let invoked = false;
64
disposables.add(editor.onDidChangeModelLanguageConfiguration((e) => {
65
invoked = true;
66
}));
67
68
disposables.add(languageConfigurationService.register('testMode', {
69
brackets: [['(', ')']]
70
}));
71
72
assert.deepStrictEqual(invoked, true);
73
74
disposables.dispose();
75
});
76
});
77
78
test('onDidChangeModelContent', () => {
79
withTestCodeEditor('', {}, (editor, viewModel) => {
80
const disposables = new DisposableStore();
81
82
let invoked = false;
83
disposables.add(editor.onDidChangeModelContent((e) => {
84
invoked = true;
85
}));
86
87
viewModel.type('hello', 'test');
88
89
assert.deepStrictEqual(invoked, true);
90
91
disposables.dispose();
92
});
93
});
94
95
test('onDidChangeModelOptions', () => {
96
withTestCodeEditor('', {}, (editor, viewModel) => {
97
const disposables = new DisposableStore();
98
99
let invoked = false;
100
disposables.add(editor.onDidChangeModelOptions((e) => {
101
invoked = true;
102
}));
103
104
viewModel.model.updateOptions({
105
tabSize: 3
106
});
107
108
assert.deepStrictEqual(invoked, true);
109
110
disposables.dispose();
111
});
112
});
113
114
test('issue #145872 - Model change events are emitted before the selection updates', () => {
115
withTestCodeEditor('', {}, (editor, viewModel) => {
116
const disposables = new DisposableStore();
117
118
let observedSelection: Selection | null = null;
119
disposables.add(editor.onDidChangeModelContent((e) => {
120
observedSelection = editor.getSelection();
121
}));
122
123
viewModel.type('hello', 'test');
124
125
assert.deepStrictEqual(observedSelection, new Selection(1, 6, 1, 6));
126
127
disposables.dispose();
128
});
129
});
130
131
test('monaco-editor issue #2774 - Wrong order of events onDidChangeModelContent and onDidChangeCursorSelection on redo', () => {
132
withTestCodeEditor('', {}, (editor, viewModel) => {
133
const disposables = new DisposableStore();
134
135
const calls: string[] = [];
136
disposables.add(editor.onDidChangeModelContent((e) => {
137
calls.push(`contentchange(${e.changes.reduce<any[]>((aggr, c) => [...aggr, c.text, c.rangeOffset, c.rangeLength], []).join(', ')})`);
138
}));
139
disposables.add(editor.onDidChangeCursorSelection((e) => {
140
calls.push(`cursorchange(${e.selection.positionLineNumber}, ${e.selection.positionColumn})`);
141
}));
142
143
viewModel.type('a', 'test');
144
viewModel.model.undo();
145
viewModel.model.redo();
146
147
assert.deepStrictEqual(calls, [
148
'contentchange(a, 0, 0)',
149
'cursorchange(1, 2)',
150
'contentchange(, 0, 1)',
151
'cursorchange(1, 1)',
152
'contentchange(a, 0, 0)',
153
'cursorchange(1, 2)'
154
]);
155
156
disposables.dispose();
157
});
158
});
159
160
test('issue #146174: Events delivered out of order when adding decorations in content change listener (1 of 2)', () => {
161
withTestCodeEditor('', {}, (editor, viewModel) => {
162
const disposables = new DisposableStore();
163
164
const calls: string[] = [];
165
disposables.add(editor.onDidChangeModelContent((e) => {
166
calls.push(`listener1 - contentchange(${e.changes.reduce<any[]>((aggr, c) => [...aggr, c.text, c.rangeOffset, c.rangeLength], []).join(', ')})`);
167
}));
168
disposables.add(editor.onDidChangeCursorSelection((e) => {
169
calls.push(`listener1 - cursorchange(${e.selection.positionLineNumber}, ${e.selection.positionColumn})`);
170
}));
171
disposables.add(editor.onDidChangeModelContent((e) => {
172
calls.push(`listener2 - contentchange(${e.changes.reduce<any[]>((aggr, c) => [...aggr, c.text, c.rangeOffset, c.rangeLength], []).join(', ')})`);
173
}));
174
disposables.add(editor.onDidChangeCursorSelection((e) => {
175
calls.push(`listener2 - cursorchange(${e.selection.positionLineNumber}, ${e.selection.positionColumn})`);
176
}));
177
178
viewModel.type('a', 'test');
179
180
assert.deepStrictEqual(calls, ([
181
'listener1 - contentchange(a, 0, 0)',
182
'listener2 - contentchange(a, 0, 0)',
183
'listener1 - cursorchange(1, 2)',
184
'listener2 - cursorchange(1, 2)',
185
]));
186
187
disposables.dispose();
188
});
189
});
190
191
test('issue #146174: Events delivered out of order when adding decorations in content change listener (2 of 2)', () => {
192
withTestCodeEditor('', {}, (editor, viewModel) => {
193
const disposables = new DisposableStore();
194
195
const calls: string[] = [];
196
disposables.add(editor.onDidChangeModelContent((e) => {
197
calls.push(`listener1 - contentchange(${e.changes.reduce<any[]>((aggr, c) => [...aggr, c.text, c.rangeOffset, c.rangeLength], []).join(', ')})`);
198
editor.changeDecorations((changeAccessor) => {
199
changeAccessor.deltaDecorations([], [{ range: new Range(1, 1, 1, 1), options: { description: 'test' } }]);
200
});
201
}));
202
disposables.add(editor.onDidChangeCursorSelection((e) => {
203
calls.push(`listener1 - cursorchange(${e.selection.positionLineNumber}, ${e.selection.positionColumn})`);
204
}));
205
disposables.add(editor.onDidChangeModelContent((e) => {
206
calls.push(`listener2 - contentchange(${e.changes.reduce<any[]>((aggr, c) => [...aggr, c.text, c.rangeOffset, c.rangeLength], []).join(', ')})`);
207
}));
208
disposables.add(editor.onDidChangeCursorSelection((e) => {
209
calls.push(`listener2 - cursorchange(${e.selection.positionLineNumber}, ${e.selection.positionColumn})`);
210
}));
211
212
viewModel.type('a', 'test');
213
214
assert.deepStrictEqual(calls, ([
215
'listener1 - contentchange(a, 0, 0)',
216
'listener2 - contentchange(a, 0, 0)',
217
'listener1 - cursorchange(1, 2)',
218
'listener2 - cursorchange(1, 2)',
219
]));
220
221
disposables.dispose();
222
});
223
});
224
225
});
226
227