Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/test/browser/viewModel/viewModelImpl.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 { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';
8
import { Position } from '../../../common/core/position.js';
9
import { Range } from '../../../common/core/range.js';
10
import { EndOfLineSequence, PositionAffinity } from '../../../common/model.js';
11
import { ViewEventHandler } from '../../../common/viewEventHandler.js';
12
import { ViewEvent } from '../../../common/viewEvents.js';
13
import { testViewModel } from './testViewModel.js';
14
15
suite('ViewModel', () => {
16
17
ensureNoDisposablesAreLeakedInTestSuite();
18
19
test('issue #21073: SplitLinesCollection: attempt to access a \'newer\' model', () => {
20
const text = [''];
21
const opts = {
22
lineNumbersMinChars: 1
23
};
24
testViewModel(text, opts, (viewModel, model) => {
25
assert.strictEqual(viewModel.getLineCount(), 1);
26
27
viewModel.setViewport(1, 1, 1);
28
29
model.applyEdits([{
30
range: new Range(1, 1, 1, 1),
31
text: [
32
'line01',
33
'line02',
34
'line03',
35
'line04',
36
'line05',
37
'line06',
38
'line07',
39
'line08',
40
'line09',
41
'line10',
42
].join('\n')
43
}]);
44
45
assert.strictEqual(viewModel.getLineCount(), 10);
46
});
47
});
48
49
test('issue #44805: SplitLinesCollection: attempt to access a \'newer\' model', () => {
50
const text = [''];
51
testViewModel(text, {}, (viewModel, model) => {
52
assert.strictEqual(viewModel.getLineCount(), 1);
53
54
model.pushEditOperations([], [{
55
range: new Range(1, 1, 1, 1),
56
text: '\ninsert1'
57
}], () => ([]));
58
59
model.pushEditOperations([], [{
60
range: new Range(1, 1, 1, 1),
61
text: '\ninsert2'
62
}], () => ([]));
63
64
model.pushEditOperations([], [{
65
range: new Range(1, 1, 1, 1),
66
text: '\ninsert3'
67
}], () => ([]));
68
69
const viewLineCount: number[] = [];
70
71
viewLineCount.push(viewModel.getLineCount());
72
const eventHandler = new class extends ViewEventHandler {
73
override handleEvents(events: ViewEvent[]): void {
74
// Access the view model
75
viewLineCount.push(viewModel.getLineCount());
76
}
77
};
78
viewModel.addViewEventHandler(eventHandler);
79
model.undo();
80
viewLineCount.push(viewModel.getLineCount());
81
82
assert.deepStrictEqual(viewLineCount, [4, 1, 1, 1, 1]);
83
84
viewModel.removeViewEventHandler(eventHandler);
85
eventHandler.dispose();
86
});
87
});
88
89
test('issue #44805: No visible lines via API call', () => {
90
const text = [
91
'line1',
92
'line2',
93
'line3'
94
];
95
testViewModel(text, {}, (viewModel, model) => {
96
assert.strictEqual(viewModel.getLineCount(), 3);
97
viewModel.setHiddenAreas([new Range(1, 1, 3, 1)]);
98
assert.ok(viewModel.getVisibleRanges() !== null);
99
});
100
});
101
102
test('issue #44805: No visible lines via undoing', () => {
103
const text = [
104
''
105
];
106
testViewModel(text, {}, (viewModel, model) => {
107
assert.strictEqual(viewModel.getLineCount(), 1);
108
109
model.pushEditOperations([], [{
110
range: new Range(1, 1, 1, 1),
111
text: 'line1\nline2\nline3'
112
}], () => ([]));
113
114
viewModel.setHiddenAreas([new Range(1, 1, 1, 1)]);
115
assert.strictEqual(viewModel.getLineCount(), 2);
116
117
model.undo();
118
assert.ok(viewModel.getVisibleRanges() !== null);
119
});
120
});
121
122
function assertGetPlainTextToCopy(text: string[], ranges: Range[], emptySelectionClipboard: boolean, expected: string | string[]): void {
123
testViewModel(text, {}, (viewModel, model) => {
124
const actual = viewModel.getPlainTextToCopy(ranges, emptySelectionClipboard, false);
125
assert.deepStrictEqual(actual, expected);
126
});
127
}
128
129
const USUAL_TEXT = [
130
'',
131
'line2',
132
'line3',
133
'line4',
134
''
135
];
136
137
test('getPlainTextToCopy 0/1', () => {
138
assertGetPlainTextToCopy(
139
USUAL_TEXT,
140
[
141
new Range(2, 2, 2, 2)
142
],
143
false,
144
''
145
);
146
});
147
148
test('getPlainTextToCopy 0/1 - emptySelectionClipboard', () => {
149
assertGetPlainTextToCopy(
150
USUAL_TEXT,
151
[
152
new Range(2, 2, 2, 2)
153
],
154
true,
155
'line2\n'
156
);
157
});
158
159
test('getPlainTextToCopy 1/1', () => {
160
assertGetPlainTextToCopy(
161
USUAL_TEXT,
162
[
163
new Range(2, 2, 2, 6)
164
],
165
false,
166
'ine2'
167
);
168
});
169
170
test('getPlainTextToCopy 1/1 - emptySelectionClipboard', () => {
171
assertGetPlainTextToCopy(
172
USUAL_TEXT,
173
[
174
new Range(2, 2, 2, 6)
175
],
176
true,
177
'ine2'
178
);
179
});
180
181
test('getPlainTextToCopy 0/2', () => {
182
assertGetPlainTextToCopy(
183
USUAL_TEXT,
184
[
185
new Range(2, 2, 2, 2),
186
new Range(3, 2, 3, 2),
187
],
188
false,
189
''
190
);
191
});
192
193
test('getPlainTextToCopy 0/2 - emptySelectionClipboard', () => {
194
assertGetPlainTextToCopy(
195
USUAL_TEXT,
196
[
197
new Range(2, 2, 2, 2),
198
new Range(3, 2, 3, 2),
199
],
200
true,
201
'line2\nline3\n'
202
);
203
});
204
205
test('getPlainTextToCopy 1/2', () => {
206
assertGetPlainTextToCopy(
207
USUAL_TEXT,
208
[
209
new Range(2, 2, 2, 6),
210
new Range(3, 2, 3, 2),
211
],
212
false,
213
'ine2'
214
);
215
});
216
217
test('getPlainTextToCopy 1/2 - emptySelectionClipboard', () => {
218
assertGetPlainTextToCopy(
219
USUAL_TEXT,
220
[
221
new Range(2, 2, 2, 6),
222
new Range(3, 2, 3, 2),
223
],
224
true,
225
['ine2', 'line3']
226
);
227
});
228
229
test('getPlainTextToCopy 2/2', () => {
230
assertGetPlainTextToCopy(
231
USUAL_TEXT,
232
[
233
new Range(2, 2, 2, 6),
234
new Range(3, 2, 3, 6),
235
],
236
false,
237
['ine2', 'ine3']
238
);
239
});
240
241
test('getPlainTextToCopy 2/2 reversed', () => {
242
assertGetPlainTextToCopy(
243
USUAL_TEXT,
244
[
245
new Range(3, 2, 3, 6),
246
new Range(2, 2, 2, 6),
247
],
248
false,
249
['ine2', 'ine3']
250
);
251
});
252
253
test('getPlainTextToCopy 0/3 - emptySelectionClipboard', () => {
254
assertGetPlainTextToCopy(
255
USUAL_TEXT,
256
[
257
new Range(2, 2, 2, 2),
258
new Range(2, 3, 2, 3),
259
new Range(3, 2, 3, 2),
260
],
261
true,
262
'line2\nline3\n'
263
);
264
});
265
266
test('issue #22688 - always use CRLF for clipboard on Windows', () => {
267
testViewModel(USUAL_TEXT, {}, (viewModel, model) => {
268
model.setEOL(EndOfLineSequence.LF);
269
const actual = viewModel.getPlainTextToCopy([new Range(2, 1, 5, 1)], true, true);
270
assert.deepStrictEqual(actual, 'line2\r\nline3\r\nline4\r\n');
271
});
272
});
273
274
test('issue #40926: Incorrect spacing when inserting new line after multiple folded blocks of code', () => {
275
testViewModel(
276
[
277
'foo = {',
278
' foobar: function() {',
279
' this.foobar();',
280
' },',
281
' foobar: function() {',
282
' this.foobar();',
283
' },',
284
' foobar: function() {',
285
' this.foobar();',
286
' },',
287
'}',
288
], {}, (viewModel, model) => {
289
viewModel.setHiddenAreas([
290
new Range(3, 1, 3, 1),
291
new Range(6, 1, 6, 1),
292
new Range(9, 1, 9, 1),
293
]);
294
295
model.applyEdits([
296
{ range: new Range(4, 7, 4, 7), text: '\n ' },
297
{ range: new Range(7, 7, 7, 7), text: '\n ' },
298
{ range: new Range(10, 7, 10, 7), text: '\n ' }
299
]);
300
301
assert.strictEqual(viewModel.getLineCount(), 11);
302
}
303
);
304
});
305
306
test('normalizePosition with multiple touching injected text', () => {
307
testViewModel(
308
[
309
'just some text'
310
],
311
{},
312
(viewModel, model) => {
313
model.deltaDecorations([], [
314
{
315
range: new Range(1, 8, 1, 8),
316
options: {
317
description: 'test',
318
before: {
319
content: 'bar'
320
},
321
showIfCollapsed: true
322
}
323
},
324
{
325
range: new Range(1, 8, 1, 8),
326
options: {
327
description: 'test',
328
before: {
329
content: 'bz'
330
},
331
showIfCollapsed: true
332
}
333
},
334
]);
335
336
// just sobarbzme text
337
338
assert.deepStrictEqual(viewModel.normalizePosition(new Position(1, 8), PositionAffinity.None), new Position(1, 8));
339
assert.deepStrictEqual(viewModel.normalizePosition(new Position(1, 9), PositionAffinity.None), new Position(1, 8));
340
assert.deepStrictEqual(viewModel.normalizePosition(new Position(1, 11), PositionAffinity.None), new Position(1, 11));
341
assert.deepStrictEqual(viewModel.normalizePosition(new Position(1, 12), PositionAffinity.None), new Position(1, 11));
342
assert.deepStrictEqual(viewModel.normalizePosition(new Position(1, 13), PositionAffinity.None), new Position(1, 13));
343
344
assert.deepStrictEqual(viewModel.normalizePosition(new Position(1, 8), PositionAffinity.Left), new Position(1, 8));
345
assert.deepStrictEqual(viewModel.normalizePosition(new Position(1, 9), PositionAffinity.Left), new Position(1, 8));
346
assert.deepStrictEqual(viewModel.normalizePosition(new Position(1, 11), PositionAffinity.Left), new Position(1, 8));
347
assert.deepStrictEqual(viewModel.normalizePosition(new Position(1, 12), PositionAffinity.Left), new Position(1, 8));
348
assert.deepStrictEqual(viewModel.normalizePosition(new Position(1, 13), PositionAffinity.Left), new Position(1, 8));
349
350
assert.deepStrictEqual(viewModel.normalizePosition(new Position(1, 8), PositionAffinity.Right), new Position(1, 13));
351
assert.deepStrictEqual(viewModel.normalizePosition(new Position(1, 9), PositionAffinity.Right), new Position(1, 13));
352
assert.deepStrictEqual(viewModel.normalizePosition(new Position(1, 11), PositionAffinity.Right), new Position(1, 13));
353
assert.deepStrictEqual(viewModel.normalizePosition(new Position(1, 12), PositionAffinity.Right), new Position(1, 13));
354
assert.deepStrictEqual(viewModel.normalizePosition(new Position(1, 13), PositionAffinity.Right), new Position(1, 13));
355
}
356
);
357
});
358
359
test('issue #193262: Incorrect implementation of modifyPosition', () => {
360
testViewModel(
361
[
362
'just some text'
363
],
364
{
365
wordWrap: 'wordWrapColumn',
366
wordWrapColumn: 5
367
},
368
(viewModel, model) => {
369
assert.deepStrictEqual(
370
new Position(3, 1),
371
viewModel.modifyPosition(new Position(3, 2), -1)
372
);
373
}
374
);
375
});
376
});
377
378