Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/test/browser/view/viewLayer.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 { ILine, RenderedLinesCollection } from '../../../browser/view/viewLayer.js';
9
10
class TestLine implements ILine {
11
12
_pinged = false;
13
constructor(public id: string) {
14
}
15
16
onContentChanged(): void {
17
this._pinged = true;
18
}
19
onTokensChanged(): void {
20
this._pinged = true;
21
}
22
}
23
24
interface ILinesCollectionState {
25
startLineNumber: number;
26
lines: string[];
27
pinged: boolean[];
28
}
29
30
function assertState(col: RenderedLinesCollection<TestLine>, state: ILinesCollectionState): void {
31
const actualState: ILinesCollectionState = {
32
startLineNumber: col.getStartLineNumber(),
33
lines: [],
34
pinged: []
35
};
36
for (let lineNumber = col.getStartLineNumber(); lineNumber <= col.getEndLineNumber(); lineNumber++) {
37
actualState.lines.push(col.getLine(lineNumber).id);
38
actualState.pinged.push(col.getLine(lineNumber)._pinged);
39
}
40
assert.deepStrictEqual(actualState, state);
41
}
42
43
suite('RenderedLinesCollection onLinesDeleted', () => {
44
45
ensureNoDisposablesAreLeakedInTestSuite();
46
47
function testOnModelLinesDeleted(deleteFromLineNumber: number, deleteToLineNumber: number, expectedDeleted: string[], expectedState: ILinesCollectionState): void {
48
const col = new RenderedLinesCollection<TestLine>({ createLine: () => new TestLine('new') });
49
col._set(6, [
50
new TestLine('old6'),
51
new TestLine('old7'),
52
new TestLine('old8'),
53
new TestLine('old9')
54
]);
55
const actualDeleted1 = col.onLinesDeleted(deleteFromLineNumber, deleteToLineNumber);
56
let actualDeleted: string[] = [];
57
if (actualDeleted1) {
58
actualDeleted = actualDeleted1.map(line => line.id);
59
}
60
assert.deepStrictEqual(actualDeleted, expectedDeleted);
61
assertState(col, expectedState);
62
}
63
64
test('A1', () => {
65
testOnModelLinesDeleted(3, 3, [], {
66
startLineNumber: 5,
67
lines: ['old6', 'old7', 'old8', 'old9'],
68
pinged: [false, false, false, false]
69
});
70
});
71
72
test('A2', () => {
73
testOnModelLinesDeleted(3, 4, [], {
74
startLineNumber: 4,
75
lines: ['old6', 'old7', 'old8', 'old9'],
76
pinged: [false, false, false, false]
77
});
78
});
79
80
test('A3', () => {
81
testOnModelLinesDeleted(3, 5, [], {
82
startLineNumber: 3,
83
lines: ['old6', 'old7', 'old8', 'old9'],
84
pinged: [false, false, false, false]
85
});
86
});
87
88
test('A4', () => {
89
testOnModelLinesDeleted(3, 6, ['old6'], {
90
startLineNumber: 3,
91
lines: ['old7', 'old8', 'old9'],
92
pinged: [false, false, false]
93
});
94
});
95
96
test('A5', () => {
97
testOnModelLinesDeleted(3, 7, ['old6', 'old7'], {
98
startLineNumber: 3,
99
lines: ['old8', 'old9'],
100
pinged: [false, false]
101
});
102
});
103
104
test('A6', () => {
105
testOnModelLinesDeleted(3, 8, ['old6', 'old7', 'old8'], {
106
startLineNumber: 3,
107
lines: ['old9'],
108
pinged: [false]
109
});
110
});
111
112
test('A7', () => {
113
testOnModelLinesDeleted(3, 9, ['old6', 'old7', 'old8', 'old9'], {
114
startLineNumber: 3,
115
lines: [],
116
pinged: []
117
});
118
});
119
120
test('A8', () => {
121
testOnModelLinesDeleted(3, 10, ['old6', 'old7', 'old8', 'old9'], {
122
startLineNumber: 3,
123
lines: [],
124
pinged: []
125
});
126
});
127
128
129
test('B1', () => {
130
testOnModelLinesDeleted(5, 5, [], {
131
startLineNumber: 5,
132
lines: ['old6', 'old7', 'old8', 'old9'],
133
pinged: [false, false, false, false]
134
});
135
});
136
137
test('B2', () => {
138
testOnModelLinesDeleted(5, 6, ['old6'], {
139
startLineNumber: 5,
140
lines: ['old7', 'old8', 'old9'],
141
pinged: [false, false, false]
142
});
143
});
144
145
test('B3', () => {
146
testOnModelLinesDeleted(5, 7, ['old6', 'old7'], {
147
startLineNumber: 5,
148
lines: ['old8', 'old9'],
149
pinged: [false, false]
150
});
151
});
152
153
test('B4', () => {
154
testOnModelLinesDeleted(5, 8, ['old6', 'old7', 'old8'], {
155
startLineNumber: 5,
156
lines: ['old9'],
157
pinged: [false]
158
});
159
});
160
161
test('B5', () => {
162
testOnModelLinesDeleted(5, 9, ['old6', 'old7', 'old8', 'old9'], {
163
startLineNumber: 5,
164
lines: [],
165
pinged: []
166
});
167
});
168
169
test('B6', () => {
170
testOnModelLinesDeleted(5, 10, ['old6', 'old7', 'old8', 'old9'], {
171
startLineNumber: 5,
172
lines: [],
173
pinged: []
174
});
175
});
176
177
178
test('C1', () => {
179
testOnModelLinesDeleted(6, 6, ['old6'], {
180
startLineNumber: 6,
181
lines: ['old7', 'old8', 'old9'],
182
pinged: [false, false, false]
183
});
184
});
185
186
test('C2', () => {
187
testOnModelLinesDeleted(6, 7, ['old6', 'old7'], {
188
startLineNumber: 6,
189
lines: ['old8', 'old9'],
190
pinged: [false, false]
191
});
192
});
193
194
test('C3', () => {
195
testOnModelLinesDeleted(6, 8, ['old6', 'old7', 'old8'], {
196
startLineNumber: 6,
197
lines: ['old9'],
198
pinged: [false]
199
});
200
});
201
202
test('C4', () => {
203
testOnModelLinesDeleted(6, 9, ['old6', 'old7', 'old8', 'old9'], {
204
startLineNumber: 6,
205
lines: [],
206
pinged: []
207
});
208
});
209
210
test('C5', () => {
211
testOnModelLinesDeleted(6, 10, ['old6', 'old7', 'old8', 'old9'], {
212
startLineNumber: 6,
213
lines: [],
214
pinged: []
215
});
216
});
217
218
219
test('D1', () => {
220
testOnModelLinesDeleted(7, 7, ['old7'], {
221
startLineNumber: 6,
222
lines: ['old6', 'old8', 'old9'],
223
pinged: [false, false, false]
224
});
225
});
226
227
test('D2', () => {
228
testOnModelLinesDeleted(7, 8, ['old7', 'old8'], {
229
startLineNumber: 6,
230
lines: ['old6', 'old9'],
231
pinged: [false, false]
232
});
233
});
234
235
test('D3', () => {
236
testOnModelLinesDeleted(7, 9, ['old7', 'old8', 'old9'], {
237
startLineNumber: 6,
238
lines: ['old6'],
239
pinged: [false]
240
});
241
});
242
243
test('D4', () => {
244
testOnModelLinesDeleted(7, 10, ['old7', 'old8', 'old9'], {
245
startLineNumber: 6,
246
lines: ['old6'],
247
pinged: [false]
248
});
249
});
250
251
252
test('E1', () => {
253
testOnModelLinesDeleted(8, 8, ['old8'], {
254
startLineNumber: 6,
255
lines: ['old6', 'old7', 'old9'],
256
pinged: [false, false, false]
257
});
258
});
259
260
test('E2', () => {
261
testOnModelLinesDeleted(8, 9, ['old8', 'old9'], {
262
startLineNumber: 6,
263
lines: ['old6', 'old7'],
264
pinged: [false, false]
265
});
266
});
267
268
test('E3', () => {
269
testOnModelLinesDeleted(8, 10, ['old8', 'old9'], {
270
startLineNumber: 6,
271
lines: ['old6', 'old7'],
272
pinged: [false, false]
273
});
274
});
275
276
277
test('F1', () => {
278
testOnModelLinesDeleted(9, 9, ['old9'], {
279
startLineNumber: 6,
280
lines: ['old6', 'old7', 'old8'],
281
pinged: [false, false, false]
282
});
283
});
284
285
test('F2', () => {
286
testOnModelLinesDeleted(9, 10, ['old9'], {
287
startLineNumber: 6,
288
lines: ['old6', 'old7', 'old8'],
289
pinged: [false, false, false]
290
});
291
});
292
293
294
test('G1', () => {
295
testOnModelLinesDeleted(10, 10, [], {
296
startLineNumber: 6,
297
lines: ['old6', 'old7', 'old8', 'old9'],
298
pinged: [false, false, false, false]
299
});
300
});
301
302
test('G2', () => {
303
testOnModelLinesDeleted(10, 11, [], {
304
startLineNumber: 6,
305
lines: ['old6', 'old7', 'old8', 'old9'],
306
pinged: [false, false, false, false]
307
});
308
});
309
310
311
test('H1', () => {
312
testOnModelLinesDeleted(11, 13, [], {
313
startLineNumber: 6,
314
lines: ['old6', 'old7', 'old8', 'old9'],
315
pinged: [false, false, false, false]
316
});
317
});
318
});
319
320
suite('RenderedLinesCollection onLineChanged', () => {
321
322
ensureNoDisposablesAreLeakedInTestSuite();
323
324
function testOnModelLineChanged(changedLineNumber: number, expectedPinged: boolean, expectedState: ILinesCollectionState): void {
325
const col = new RenderedLinesCollection<TestLine>({ createLine: () => new TestLine('new') });
326
col._set(6, [
327
new TestLine('old6'),
328
new TestLine('old7'),
329
new TestLine('old8'),
330
new TestLine('old9')
331
]);
332
const actualPinged = col.onLinesChanged(changedLineNumber, 1);
333
assert.deepStrictEqual(actualPinged, expectedPinged);
334
assertState(col, expectedState);
335
}
336
337
test('3', () => {
338
testOnModelLineChanged(3, false, {
339
startLineNumber: 6,
340
lines: ['old6', 'old7', 'old8', 'old9'],
341
pinged: [false, false, false, false]
342
});
343
});
344
test('4', () => {
345
testOnModelLineChanged(4, false, {
346
startLineNumber: 6,
347
lines: ['old6', 'old7', 'old8', 'old9'],
348
pinged: [false, false, false, false]
349
});
350
});
351
test('5', () => {
352
testOnModelLineChanged(5, false, {
353
startLineNumber: 6,
354
lines: ['old6', 'old7', 'old8', 'old9'],
355
pinged: [false, false, false, false]
356
});
357
});
358
test('6', () => {
359
testOnModelLineChanged(6, true, {
360
startLineNumber: 6,
361
lines: ['old6', 'old7', 'old8', 'old9'],
362
pinged: [true, false, false, false]
363
});
364
});
365
test('7', () => {
366
testOnModelLineChanged(7, true, {
367
startLineNumber: 6,
368
lines: ['old6', 'old7', 'old8', 'old9'],
369
pinged: [false, true, false, false]
370
});
371
});
372
test('8', () => {
373
testOnModelLineChanged(8, true, {
374
startLineNumber: 6,
375
lines: ['old6', 'old7', 'old8', 'old9'],
376
pinged: [false, false, true, false]
377
});
378
});
379
test('9', () => {
380
testOnModelLineChanged(9, true, {
381
startLineNumber: 6,
382
lines: ['old6', 'old7', 'old8', 'old9'],
383
pinged: [false, false, false, true]
384
});
385
});
386
test('10', () => {
387
testOnModelLineChanged(10, false, {
388
startLineNumber: 6,
389
lines: ['old6', 'old7', 'old8', 'old9'],
390
pinged: [false, false, false, false]
391
});
392
});
393
test('11', () => {
394
testOnModelLineChanged(11, false, {
395
startLineNumber: 6,
396
lines: ['old6', 'old7', 'old8', 'old9'],
397
pinged: [false, false, false, false]
398
});
399
});
400
401
});
402
403
suite('RenderedLinesCollection onLinesInserted', () => {
404
405
ensureNoDisposablesAreLeakedInTestSuite();
406
407
function testOnModelLinesInserted(insertFromLineNumber: number, insertToLineNumber: number, expectedDeleted: string[], expectedState: ILinesCollectionState): void {
408
const col = new RenderedLinesCollection<TestLine>({ createLine: () => new TestLine('new') });
409
col._set(6, [
410
new TestLine('old6'),
411
new TestLine('old7'),
412
new TestLine('old8'),
413
new TestLine('old9')
414
]);
415
const actualDeleted1 = col.onLinesInserted(insertFromLineNumber, insertToLineNumber);
416
let actualDeleted: string[] = [];
417
if (actualDeleted1) {
418
actualDeleted = actualDeleted1.map(line => line.id);
419
}
420
assert.deepStrictEqual(actualDeleted, expectedDeleted);
421
assertState(col, expectedState);
422
}
423
424
test('A1', () => {
425
testOnModelLinesInserted(3, 3, [], {
426
startLineNumber: 7,
427
lines: ['old6', 'old7', 'old8', 'old9'],
428
pinged: [false, false, false, false]
429
});
430
});
431
432
test('A2', () => {
433
testOnModelLinesInserted(3, 4, [], {
434
startLineNumber: 8,
435
lines: ['old6', 'old7', 'old8', 'old9'],
436
pinged: [false, false, false, false]
437
});
438
});
439
440
test('A3', () => {
441
testOnModelLinesInserted(3, 5, [], {
442
startLineNumber: 9,
443
lines: ['old6', 'old7', 'old8', 'old9'],
444
pinged: [false, false, false, false]
445
});
446
});
447
448
test('A4', () => {
449
testOnModelLinesInserted(3, 6, [], {
450
startLineNumber: 10,
451
lines: ['old6', 'old7', 'old8', 'old9'],
452
pinged: [false, false, false, false]
453
});
454
});
455
456
test('A5', () => {
457
testOnModelLinesInserted(3, 7, [], {
458
startLineNumber: 11,
459
lines: ['old6', 'old7', 'old8', 'old9'],
460
pinged: [false, false, false, false]
461
});
462
});
463
464
test('A6', () => {
465
testOnModelLinesInserted(3, 8, [], {
466
startLineNumber: 12,
467
lines: ['old6', 'old7', 'old8', 'old9'],
468
pinged: [false, false, false, false]
469
});
470
});
471
472
test('A7', () => {
473
testOnModelLinesInserted(3, 9, [], {
474
startLineNumber: 13,
475
lines: ['old6', 'old7', 'old8', 'old9'],
476
pinged: [false, false, false, false]
477
});
478
});
479
480
test('A8', () => {
481
testOnModelLinesInserted(3, 10, [], {
482
startLineNumber: 14,
483
lines: ['old6', 'old7', 'old8', 'old9'],
484
pinged: [false, false, false, false]
485
});
486
});
487
488
489
test('B1', () => {
490
testOnModelLinesInserted(5, 5, [], {
491
startLineNumber: 7,
492
lines: ['old6', 'old7', 'old8', 'old9'],
493
pinged: [false, false, false, false]
494
});
495
});
496
497
test('B2', () => {
498
testOnModelLinesInserted(5, 6, [], {
499
startLineNumber: 8,
500
lines: ['old6', 'old7', 'old8', 'old9'],
501
pinged: [false, false, false, false]
502
});
503
});
504
505
test('B3', () => {
506
testOnModelLinesInserted(5, 7, [], {
507
startLineNumber: 9,
508
lines: ['old6', 'old7', 'old8', 'old9'],
509
pinged: [false, false, false, false]
510
});
511
});
512
513
test('B4', () => {
514
testOnModelLinesInserted(5, 8, [], {
515
startLineNumber: 10,
516
lines: ['old6', 'old7', 'old8', 'old9'],
517
pinged: [false, false, false, false]
518
});
519
});
520
521
test('B5', () => {
522
testOnModelLinesInserted(5, 9, [], {
523
startLineNumber: 11,
524
lines: ['old6', 'old7', 'old8', 'old9'],
525
pinged: [false, false, false, false]
526
});
527
});
528
529
test('B6', () => {
530
testOnModelLinesInserted(5, 10, [], {
531
startLineNumber: 12,
532
lines: ['old6', 'old7', 'old8', 'old9'],
533
pinged: [false, false, false, false]
534
});
535
});
536
537
538
test('C1', () => {
539
testOnModelLinesInserted(6, 6, [], {
540
startLineNumber: 7,
541
lines: ['old6', 'old7', 'old8', 'old9'],
542
pinged: [false, false, false, false]
543
});
544
});
545
546
test('C2', () => {
547
testOnModelLinesInserted(6, 7, [], {
548
startLineNumber: 8,
549
lines: ['old6', 'old7', 'old8', 'old9'],
550
pinged: [false, false, false, false]
551
});
552
});
553
554
test('C3', () => {
555
testOnModelLinesInserted(6, 8, [], {
556
startLineNumber: 9,
557
lines: ['old6', 'old7', 'old8', 'old9'],
558
pinged: [false, false, false, false]
559
});
560
});
561
562
test('C4', () => {
563
testOnModelLinesInserted(6, 9, [], {
564
startLineNumber: 10,
565
lines: ['old6', 'old7', 'old8', 'old9'],
566
pinged: [false, false, false, false]
567
});
568
});
569
570
test('C5', () => {
571
testOnModelLinesInserted(6, 10, [], {
572
startLineNumber: 11,
573
lines: ['old6', 'old7', 'old8', 'old9'],
574
pinged: [false, false, false, false]
575
});
576
});
577
578
579
test('D1', () => {
580
testOnModelLinesInserted(7, 7, ['old9'], {
581
startLineNumber: 6,
582
lines: ['old6', 'new', 'old7', 'old8'],
583
pinged: [false, false, false, false]
584
});
585
});
586
587
test('D2', () => {
588
testOnModelLinesInserted(7, 8, ['old8', 'old9'], {
589
startLineNumber: 6,
590
lines: ['old6', 'new', 'new', 'old7'],
591
pinged: [false, false, false, false]
592
});
593
});
594
595
test('D3', () => {
596
testOnModelLinesInserted(7, 9, ['old7', 'old8', 'old9'], {
597
startLineNumber: 6,
598
lines: ['old6'],
599
pinged: [false]
600
});
601
});
602
603
test('D4', () => {
604
testOnModelLinesInserted(7, 10, ['old7', 'old8', 'old9'], {
605
startLineNumber: 6,
606
lines: ['old6'],
607
pinged: [false]
608
});
609
});
610
611
612
test('E1', () => {
613
testOnModelLinesInserted(8, 8, ['old9'], {
614
startLineNumber: 6,
615
lines: ['old6', 'old7', 'new', 'old8'],
616
pinged: [false, false, false, false]
617
});
618
});
619
620
test('E2', () => {
621
testOnModelLinesInserted(8, 9, ['old8', 'old9'], {
622
startLineNumber: 6,
623
lines: ['old6', 'old7'],
624
pinged: [false, false]
625
});
626
});
627
628
test('E3', () => {
629
testOnModelLinesInserted(8, 10, ['old8', 'old9'], {
630
startLineNumber: 6,
631
lines: ['old6', 'old7'],
632
pinged: [false, false]
633
});
634
});
635
636
637
test('F1', () => {
638
testOnModelLinesInserted(9, 9, ['old9'], {
639
startLineNumber: 6,
640
lines: ['old6', 'old7', 'old8'],
641
pinged: [false, false, false]
642
});
643
});
644
645
test('F2', () => {
646
testOnModelLinesInserted(9, 10, ['old9'], {
647
startLineNumber: 6,
648
lines: ['old6', 'old7', 'old8'],
649
pinged: [false, false, false]
650
});
651
});
652
653
654
test('G1', () => {
655
testOnModelLinesInserted(10, 10, [], {
656
startLineNumber: 6,
657
lines: ['old6', 'old7', 'old8', 'old9'],
658
pinged: [false, false, false, false]
659
});
660
});
661
662
test('G2', () => {
663
testOnModelLinesInserted(10, 11, [], {
664
startLineNumber: 6,
665
lines: ['old6', 'old7', 'old8', 'old9'],
666
pinged: [false, false, false, false]
667
});
668
});
669
670
671
test('H1', () => {
672
testOnModelLinesInserted(11, 13, [], {
673
startLineNumber: 6,
674
lines: ['old6', 'old7', 'old8', 'old9'],
675
pinged: [false, false, false, false]
676
});
677
});
678
});
679
680
681
suite('RenderedLinesCollection onTokensChanged', () => {
682
683
ensureNoDisposablesAreLeakedInTestSuite();
684
685
function testOnModelTokensChanged(changedFromLineNumber: number, changedToLineNumber: number, expectedPinged: boolean, expectedState: ILinesCollectionState): void {
686
const col = new RenderedLinesCollection<TestLine>({ createLine: () => new TestLine('new') });
687
col._set(6, [
688
new TestLine('old6'),
689
new TestLine('old7'),
690
new TestLine('old8'),
691
new TestLine('old9')
692
]);
693
const actualPinged = col.onTokensChanged([{ fromLineNumber: changedFromLineNumber, toLineNumber: changedToLineNumber }]);
694
assert.deepStrictEqual(actualPinged, expectedPinged);
695
assertState(col, expectedState);
696
}
697
698
test('A', () => {
699
testOnModelTokensChanged(3, 3, false, {
700
startLineNumber: 6,
701
lines: ['old6', 'old7', 'old8', 'old9'],
702
pinged: [false, false, false, false]
703
});
704
});
705
test('B', () => {
706
testOnModelTokensChanged(3, 5, false, {
707
startLineNumber: 6,
708
lines: ['old6', 'old7', 'old8', 'old9'],
709
pinged: [false, false, false, false]
710
});
711
});
712
test('C', () => {
713
testOnModelTokensChanged(3, 6, true, {
714
startLineNumber: 6,
715
lines: ['old6', 'old7', 'old8', 'old9'],
716
pinged: [true, false, false, false]
717
});
718
});
719
test('D', () => {
720
testOnModelTokensChanged(6, 6, true, {
721
startLineNumber: 6,
722
lines: ['old6', 'old7', 'old8', 'old9'],
723
pinged: [true, false, false, false]
724
});
725
});
726
test('E', () => {
727
testOnModelTokensChanged(5, 10, true, {
728
startLineNumber: 6,
729
lines: ['old6', 'old7', 'old8', 'old9'],
730
pinged: [true, true, true, true]
731
});
732
});
733
test('F', () => {
734
testOnModelTokensChanged(8, 9, true, {
735
startLineNumber: 6,
736
lines: ['old6', 'old7', 'old8', 'old9'],
737
pinged: [false, false, true, true]
738
});
739
});
740
test('G', () => {
741
testOnModelTokensChanged(8, 11, true, {
742
startLineNumber: 6,
743
lines: ['old6', 'old7', 'old8', 'old9'],
744
pinged: [false, false, true, true]
745
});
746
});
747
test('H', () => {
748
testOnModelTokensChanged(10, 10, false, {
749
startLineNumber: 6,
750
lines: ['old6', 'old7', 'old8', 'old9'],
751
pinged: [false, false, false, false]
752
});
753
});
754
test('I', () => {
755
testOnModelTokensChanged(10, 11, false, {
756
startLineNumber: 6,
757
lines: ['old6', 'old7', 'old8', 'old9'],
758
pinged: [false, false, false, false]
759
});
760
});
761
});
762
763