Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/test/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.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 { WordCharacterClassifier } from '../../../../common/core/wordCharacterClassifier.js';
8
import { Position } from '../../../../common/core/position.js';
9
import { Range } from '../../../../common/core/range.js';
10
import { DefaultEndOfLine, ITextSnapshot, SearchData } from '../../../../common/model.js';
11
import { PieceTreeBase } from '../../../../common/model/pieceTreeTextBuffer/pieceTreeBase.js';
12
import { PieceTreeTextBuffer } from '../../../../common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.js';
13
import { PieceTreeTextBufferBuilder } from '../../../../common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder.js';
14
import { NodeColor, SENTINEL, TreeNode } from '../../../../common/model/pieceTreeTextBuffer/rbTreeBase.js';
15
import { createTextModel } from '../../testTextModel.js';
16
import { splitLines } from '../../../../../base/common/strings.js';
17
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
18
19
const alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n';
20
21
function randomChar() {
22
return alphabet[randomInt(alphabet.length)];
23
}
24
25
function randomInt(bound: number) {
26
return Math.floor(Math.random() * bound);
27
}
28
29
function randomStr(len: number) {
30
if (len === null) {
31
len = 10;
32
}
33
return (function () {
34
let j, ref;
35
const results = [];
36
for (
37
j = 1, ref = len;
38
1 <= ref ? j < ref : j > ref;
39
1 <= ref ? j++ : j--
40
) {
41
results.push(randomChar());
42
}
43
return results;
44
})().join('');
45
}
46
47
function trimLineFeed(text: string): string {
48
if (text.length === 0) {
49
return text;
50
}
51
52
if (text.length === 1) {
53
if (
54
text.charCodeAt(text.length - 1) === 10 ||
55
text.charCodeAt(text.length - 1) === 13
56
) {
57
return '';
58
}
59
return text;
60
}
61
62
if (text.charCodeAt(text.length - 1) === 10) {
63
if (text.charCodeAt(text.length - 2) === 13) {
64
return text.slice(0, -2);
65
}
66
return text.slice(0, -1);
67
}
68
69
if (text.charCodeAt(text.length - 1) === 13) {
70
return text.slice(0, -1);
71
}
72
73
return text;
74
}
75
76
//#region Assertion
77
78
function testLinesContent(str: string, pieceTable: PieceTreeBase) {
79
const lines = splitLines(str);
80
assert.strictEqual(pieceTable.getLineCount(), lines.length);
81
assert.strictEqual(pieceTable.getLinesRawContent(), str);
82
for (let i = 0; i < lines.length; i++) {
83
assert.strictEqual(pieceTable.getLineContent(i + 1), lines[i]);
84
assert.strictEqual(
85
trimLineFeed(
86
pieceTable.getValueInRange(
87
new Range(
88
i + 1,
89
1,
90
i + 1,
91
lines[i].length + (i === lines.length - 1 ? 1 : 2)
92
)
93
)
94
),
95
lines[i]
96
);
97
}
98
}
99
100
function testLineStarts(str: string, pieceTable: PieceTreeBase) {
101
const lineStarts = [0];
102
103
// Reset regex to search from the beginning
104
const _regex = new RegExp(/\r\n|\r|\n/g);
105
_regex.lastIndex = 0;
106
let prevMatchStartIndex = -1;
107
let prevMatchLength = 0;
108
109
let m: RegExpExecArray | null;
110
do {
111
if (prevMatchStartIndex + prevMatchLength === str.length) {
112
// Reached the end of the line
113
break;
114
}
115
116
m = _regex.exec(str);
117
if (!m) {
118
break;
119
}
120
121
const matchStartIndex = m.index;
122
const matchLength = m[0].length;
123
124
if (
125
matchStartIndex === prevMatchStartIndex &&
126
matchLength === prevMatchLength
127
) {
128
// Exit early if the regex matches the same range twice
129
break;
130
}
131
132
prevMatchStartIndex = matchStartIndex;
133
prevMatchLength = matchLength;
134
135
lineStarts.push(matchStartIndex + matchLength);
136
} while (m);
137
138
for (let i = 0; i < lineStarts.length; i++) {
139
assert.deepStrictEqual(
140
pieceTable.getPositionAt(lineStarts[i]),
141
new Position(i + 1, 1)
142
);
143
assert.strictEqual(pieceTable.getOffsetAt(i + 1, 1), lineStarts[i]);
144
}
145
146
for (let i = 1; i < lineStarts.length; i++) {
147
const pos = pieceTable.getPositionAt(lineStarts[i] - 1);
148
assert.strictEqual(
149
pieceTable.getOffsetAt(pos.lineNumber, pos.column),
150
lineStarts[i] - 1
151
);
152
}
153
}
154
155
function createTextBuffer(val: string[], normalizeEOL: boolean = true): PieceTreeTextBuffer {
156
const bufferBuilder = new PieceTreeTextBufferBuilder();
157
for (const chunk of val) {
158
bufferBuilder.acceptChunk(chunk);
159
}
160
const factory = bufferBuilder.finish(normalizeEOL);
161
return (<PieceTreeTextBuffer>factory.create(DefaultEndOfLine.LF).textBuffer);
162
}
163
164
function assertTreeInvariants(T: PieceTreeBase): void {
165
assert(SENTINEL.color === NodeColor.Black);
166
assert(SENTINEL.parent === SENTINEL);
167
assert(SENTINEL.left === SENTINEL);
168
assert(SENTINEL.right === SENTINEL);
169
assert(SENTINEL.size_left === 0);
170
assert(SENTINEL.lf_left === 0);
171
assertValidTree(T);
172
}
173
174
function depth(n: TreeNode): number {
175
if (n === SENTINEL) {
176
// The leafs are black
177
return 1;
178
}
179
assert(depth(n.left) === depth(n.right));
180
return (n.color === NodeColor.Black ? 1 : 0) + depth(n.left);
181
}
182
183
function assertValidNode(n: TreeNode): { size: number; lf_cnt: number } {
184
if (n === SENTINEL) {
185
return { size: 0, lf_cnt: 0 };
186
}
187
188
const l = n.left;
189
const r = n.right;
190
191
if (n.color === NodeColor.Red) {
192
assert(l.color === NodeColor.Black);
193
assert(r.color === NodeColor.Black);
194
}
195
196
const actualLeft = assertValidNode(l);
197
assert(actualLeft.lf_cnt === n.lf_left);
198
assert(actualLeft.size === n.size_left);
199
const actualRight = assertValidNode(r);
200
201
return { size: n.size_left + n.piece.length + actualRight.size, lf_cnt: n.lf_left + n.piece.lineFeedCnt + actualRight.lf_cnt };
202
}
203
204
function assertValidTree(T: PieceTreeBase): void {
205
if (T.root === SENTINEL) {
206
return;
207
}
208
assert(T.root.color === NodeColor.Black);
209
assert(depth(T.root.left) === depth(T.root.right));
210
assertValidNode(T.root);
211
}
212
213
//#endregion
214
215
suite('inserts and deletes', () => {
216
const ds = ensureNoDisposablesAreLeakedInTestSuite();
217
218
test('basic insert/delete', () => {
219
const pieceTree = createTextBuffer([
220
'This is a document with some text.'
221
]);
222
ds.add(pieceTree);
223
const pieceTable = pieceTree.getPieceTree();
224
225
pieceTable.insert(34, 'This is some more text to insert at offset 34.');
226
assert.strictEqual(
227
pieceTable.getLinesRawContent(),
228
'This is a document with some text.This is some more text to insert at offset 34.'
229
);
230
pieceTable.delete(42, 5);
231
assert.strictEqual(
232
pieceTable.getLinesRawContent(),
233
'This is a document with some text.This is more text to insert at offset 34.'
234
);
235
assertTreeInvariants(pieceTable);
236
});
237
238
test('more inserts', () => {
239
const pieceTree = createTextBuffer(['']);
240
ds.add(pieceTree);
241
const pt = pieceTree.getPieceTree();
242
pt.insert(0, 'AAA');
243
assert.strictEqual(pt.getLinesRawContent(), 'AAA');
244
pt.insert(0, 'BBB');
245
assert.strictEqual(pt.getLinesRawContent(), 'BBBAAA');
246
pt.insert(6, 'CCC');
247
assert.strictEqual(pt.getLinesRawContent(), 'BBBAAACCC');
248
pt.insert(5, 'DDD');
249
assert.strictEqual(pt.getLinesRawContent(), 'BBBAADDDACCC');
250
assertTreeInvariants(pt);
251
});
252
253
test('more deletes', () => {
254
const pieceTree = createTextBuffer(['012345678']);
255
ds.add(pieceTree);
256
const pt = pieceTree.getPieceTree();
257
258
pt.delete(8, 1);
259
assert.strictEqual(pt.getLinesRawContent(), '01234567');
260
pt.delete(0, 1);
261
assert.strictEqual(pt.getLinesRawContent(), '1234567');
262
pt.delete(5, 1);
263
assert.strictEqual(pt.getLinesRawContent(), '123457');
264
pt.delete(5, 1);
265
assert.strictEqual(pt.getLinesRawContent(), '12345');
266
pt.delete(0, 5);
267
assert.strictEqual(pt.getLinesRawContent(), '');
268
assertTreeInvariants(pt);
269
});
270
271
test('random test 1', () => {
272
let str = '';
273
const pieceTree = createTextBuffer(['']);
274
ds.add(pieceTree);
275
const pieceTable = pieceTree.getPieceTree();
276
277
pieceTable.insert(0, 'ceLPHmFzvCtFeHkCBej ');
278
str = str.substring(0, 0) + 'ceLPHmFzvCtFeHkCBej ' + str.substring(0);
279
assert.strictEqual(pieceTable.getLinesRawContent(), str);
280
pieceTable.insert(8, 'gDCEfNYiBUNkSwtvB K ');
281
str = str.substring(0, 8) + 'gDCEfNYiBUNkSwtvB K ' + str.substring(8);
282
assert.strictEqual(pieceTable.getLinesRawContent(), str);
283
pieceTable.insert(38, 'cyNcHxjNPPoehBJldLS ');
284
str = str.substring(0, 38) + 'cyNcHxjNPPoehBJldLS ' + str.substring(38);
285
assert.strictEqual(pieceTable.getLinesRawContent(), str);
286
pieceTable.insert(59, 'ejMx\nOTgWlbpeDExjOk ');
287
str = str.substring(0, 59) + 'ejMx\nOTgWlbpeDExjOk ' + str.substring(59);
288
289
assert.strictEqual(pieceTable.getLinesRawContent(), str);
290
assertTreeInvariants(pieceTable);
291
});
292
293
test('random test 2', () => {
294
let str = '';
295
const pieceTree = createTextBuffer(['']);
296
ds.add(pieceTree);
297
const pieceTable = pieceTree.getPieceTree();
298
pieceTable.insert(0, 'VgPG ');
299
str = str.substring(0, 0) + 'VgPG ' + str.substring(0);
300
pieceTable.insert(2, 'DdWF ');
301
str = str.substring(0, 2) + 'DdWF ' + str.substring(2);
302
pieceTable.insert(0, 'hUJc ');
303
str = str.substring(0, 0) + 'hUJc ' + str.substring(0);
304
pieceTable.insert(8, 'lQEq ');
305
str = str.substring(0, 8) + 'lQEq ' + str.substring(8);
306
pieceTable.insert(10, 'Gbtp ');
307
str = str.substring(0, 10) + 'Gbtp ' + str.substring(10);
308
309
assert.strictEqual(pieceTable.getLinesRawContent(), str);
310
assertTreeInvariants(pieceTable);
311
});
312
313
test('random test 3', () => {
314
let str = '';
315
const pieceTree = createTextBuffer(['']);
316
ds.add(pieceTree);
317
const pieceTable = pieceTree.getPieceTree();
318
pieceTable.insert(0, 'gYSz');
319
str = str.substring(0, 0) + 'gYSz' + str.substring(0);
320
pieceTable.insert(1, 'mDQe');
321
str = str.substring(0, 1) + 'mDQe' + str.substring(1);
322
pieceTable.insert(1, 'DTMQ');
323
str = str.substring(0, 1) + 'DTMQ' + str.substring(1);
324
pieceTable.insert(2, 'GGZB');
325
str = str.substring(0, 2) + 'GGZB' + str.substring(2);
326
pieceTable.insert(12, 'wXpq');
327
str = str.substring(0, 12) + 'wXpq' + str.substring(12);
328
assert.strictEqual(pieceTable.getLinesRawContent(), str);
329
});
330
331
test('random delete 1', () => {
332
let str = '';
333
const pieceTree = createTextBuffer(['']);
334
ds.add(pieceTree);
335
const pieceTable = pieceTree.getPieceTree();
336
337
pieceTable.insert(0, 'vfb');
338
str = str.substring(0, 0) + 'vfb' + str.substring(0);
339
assert.strictEqual(pieceTable.getLinesRawContent(), str);
340
pieceTable.insert(0, 'zRq');
341
str = str.substring(0, 0) + 'zRq' + str.substring(0);
342
assert.strictEqual(pieceTable.getLinesRawContent(), str);
343
344
pieceTable.delete(5, 1);
345
str = str.substring(0, 5) + str.substring(5 + 1);
346
assert.strictEqual(pieceTable.getLinesRawContent(), str);
347
348
pieceTable.insert(1, 'UNw');
349
str = str.substring(0, 1) + 'UNw' + str.substring(1);
350
assert.strictEqual(pieceTable.getLinesRawContent(), str);
351
352
pieceTable.delete(4, 3);
353
str = str.substring(0, 4) + str.substring(4 + 3);
354
assert.strictEqual(pieceTable.getLinesRawContent(), str);
355
356
pieceTable.delete(1, 4);
357
str = str.substring(0, 1) + str.substring(1 + 4);
358
assert.strictEqual(pieceTable.getLinesRawContent(), str);
359
360
pieceTable.delete(0, 1);
361
str = str.substring(0, 0) + str.substring(0 + 1);
362
assert.strictEqual(pieceTable.getLinesRawContent(), str);
363
assertTreeInvariants(pieceTable);
364
});
365
366
test('random delete 2', () => {
367
let str = '';
368
const pieceTree = createTextBuffer(['']);
369
ds.add(pieceTree);
370
const pieceTable = pieceTree.getPieceTree();
371
372
pieceTable.insert(0, 'IDT');
373
str = str.substring(0, 0) + 'IDT' + str.substring(0);
374
pieceTable.insert(3, 'wwA');
375
str = str.substring(0, 3) + 'wwA' + str.substring(3);
376
pieceTable.insert(3, 'Gnr');
377
str = str.substring(0, 3) + 'Gnr' + str.substring(3);
378
pieceTable.delete(6, 3);
379
str = str.substring(0, 6) + str.substring(6 + 3);
380
pieceTable.insert(4, 'eHp');
381
str = str.substring(0, 4) + 'eHp' + str.substring(4);
382
pieceTable.insert(1, 'UAi');
383
str = str.substring(0, 1) + 'UAi' + str.substring(1);
384
pieceTable.insert(2, 'FrR');
385
str = str.substring(0, 2) + 'FrR' + str.substring(2);
386
pieceTable.delete(6, 7);
387
str = str.substring(0, 6) + str.substring(6 + 7);
388
pieceTable.delete(3, 5);
389
str = str.substring(0, 3) + str.substring(3 + 5);
390
assert.strictEqual(pieceTable.getLinesRawContent(), str);
391
assertTreeInvariants(pieceTable);
392
});
393
394
test('random delete 3', () => {
395
let str = '';
396
const pieceTree = createTextBuffer(['']);
397
ds.add(pieceTree);
398
const pieceTable = pieceTree.getPieceTree();
399
pieceTable.insert(0, 'PqM');
400
str = str.substring(0, 0) + 'PqM' + str.substring(0);
401
pieceTable.delete(1, 2);
402
str = str.substring(0, 1) + str.substring(1 + 2);
403
pieceTable.insert(1, 'zLc');
404
str = str.substring(0, 1) + 'zLc' + str.substring(1);
405
pieceTable.insert(0, 'MEX');
406
str = str.substring(0, 0) + 'MEX' + str.substring(0);
407
pieceTable.insert(0, 'jZh');
408
str = str.substring(0, 0) + 'jZh' + str.substring(0);
409
pieceTable.insert(8, 'GwQ');
410
str = str.substring(0, 8) + 'GwQ' + str.substring(8);
411
pieceTable.delete(5, 6);
412
str = str.substring(0, 5) + str.substring(5 + 6);
413
pieceTable.insert(4, 'ktw');
414
str = str.substring(0, 4) + 'ktw' + str.substring(4);
415
pieceTable.insert(5, 'GVu');
416
str = str.substring(0, 5) + 'GVu' + str.substring(5);
417
pieceTable.insert(9, 'jdm');
418
str = str.substring(0, 9) + 'jdm' + str.substring(9);
419
pieceTable.insert(15, 'na\n');
420
str = str.substring(0, 15) + 'na\n' + str.substring(15);
421
pieceTable.delete(5, 8);
422
str = str.substring(0, 5) + str.substring(5 + 8);
423
pieceTable.delete(3, 4);
424
str = str.substring(0, 3) + str.substring(3 + 4);
425
assert.strictEqual(pieceTable.getLinesRawContent(), str);
426
assertTreeInvariants(pieceTable);
427
});
428
429
test('random insert/delete \\r bug 1', () => {
430
let str = 'a';
431
const pieceTree = createTextBuffer(['a']);
432
ds.add(pieceTree);
433
const pieceTable = pieceTree.getPieceTree();
434
pieceTable.delete(0, 1);
435
str = str.substring(0, 0) + str.substring(0 + 1);
436
pieceTable.insert(0, '\r\r\n\n');
437
str = str.substring(0, 0) + '\r\r\n\n' + str.substring(0);
438
pieceTable.delete(3, 1);
439
str = str.substring(0, 3) + str.substring(3 + 1);
440
pieceTable.insert(2, '\n\n\ra');
441
str = str.substring(0, 2) + '\n\n\ra' + str.substring(2);
442
pieceTable.delete(4, 3);
443
str = str.substring(0, 4) + str.substring(4 + 3);
444
pieceTable.insert(2, '\na\r\r');
445
str = str.substring(0, 2) + '\na\r\r' + str.substring(2);
446
pieceTable.insert(6, '\ra\n\n');
447
str = str.substring(0, 6) + '\ra\n\n' + str.substring(6);
448
pieceTable.insert(0, 'aa\n\n');
449
str = str.substring(0, 0) + 'aa\n\n' + str.substring(0);
450
pieceTable.insert(5, '\n\na\r');
451
str = str.substring(0, 5) + '\n\na\r' + str.substring(5);
452
453
assert.strictEqual(pieceTable.getLinesRawContent(), str);
454
assertTreeInvariants(pieceTable);
455
});
456
457
test('random insert/delete \\r bug 2', () => {
458
let str = 'a';
459
const pieceTree = createTextBuffer(['a']);
460
ds.add(pieceTree);
461
const pieceTable = pieceTree.getPieceTree();
462
pieceTable.insert(1, '\naa\r');
463
str = str.substring(0, 1) + '\naa\r' + str.substring(1);
464
pieceTable.delete(0, 4);
465
str = str.substring(0, 0) + str.substring(0 + 4);
466
pieceTable.insert(1, '\r\r\na');
467
str = str.substring(0, 1) + '\r\r\na' + str.substring(1);
468
pieceTable.insert(2, '\n\r\ra');
469
str = str.substring(0, 2) + '\n\r\ra' + str.substring(2);
470
pieceTable.delete(4, 1);
471
str = str.substring(0, 4) + str.substring(4 + 1);
472
pieceTable.insert(8, '\r\n\r\r');
473
str = str.substring(0, 8) + '\r\n\r\r' + str.substring(8);
474
pieceTable.insert(7, '\n\n\na');
475
str = str.substring(0, 7) + '\n\n\na' + str.substring(7);
476
pieceTable.insert(13, 'a\n\na');
477
str = str.substring(0, 13) + 'a\n\na' + str.substring(13);
478
pieceTable.delete(17, 3);
479
str = str.substring(0, 17) + str.substring(17 + 3);
480
pieceTable.insert(2, 'a\ra\n');
481
str = str.substring(0, 2) + 'a\ra\n' + str.substring(2);
482
483
assert.strictEqual(pieceTable.getLinesRawContent(), str);
484
assertTreeInvariants(pieceTable);
485
});
486
487
test('random insert/delete \\r bug 3', () => {
488
let str = 'a';
489
const pieceTree = createTextBuffer(['a']);
490
ds.add(pieceTree);
491
const pieceTable = pieceTree.getPieceTree();
492
pieceTable.insert(0, '\r\na\r');
493
str = str.substring(0, 0) + '\r\na\r' + str.substring(0);
494
pieceTable.delete(2, 3);
495
str = str.substring(0, 2) + str.substring(2 + 3);
496
pieceTable.insert(2, 'a\r\n\r');
497
str = str.substring(0, 2) + 'a\r\n\r' + str.substring(2);
498
pieceTable.delete(4, 2);
499
str = str.substring(0, 4) + str.substring(4 + 2);
500
pieceTable.insert(4, 'a\n\r\n');
501
str = str.substring(0, 4) + 'a\n\r\n' + str.substring(4);
502
pieceTable.insert(1, 'aa\n\r');
503
str = str.substring(0, 1) + 'aa\n\r' + str.substring(1);
504
pieceTable.insert(7, '\na\r\n');
505
str = str.substring(0, 7) + '\na\r\n' + str.substring(7);
506
pieceTable.insert(5, '\n\na\r');
507
str = str.substring(0, 5) + '\n\na\r' + str.substring(5);
508
pieceTable.insert(10, '\r\r\n\r');
509
str = str.substring(0, 10) + '\r\r\n\r' + str.substring(10);
510
assert.strictEqual(pieceTable.getLinesRawContent(), str);
511
pieceTable.delete(21, 3);
512
str = str.substring(0, 21) + str.substring(21 + 3);
513
514
assert.strictEqual(pieceTable.getLinesRawContent(), str);
515
assertTreeInvariants(pieceTable);
516
});
517
518
test('random insert/delete \\r bug 4s', () => {
519
let str = 'a';
520
const pieceTree = createTextBuffer(['a']);
521
ds.add(pieceTree);
522
const pieceTable = pieceTree.getPieceTree();
523
pieceTable.delete(0, 1);
524
str = str.substring(0, 0) + str.substring(0 + 1);
525
pieceTable.insert(0, '\naaa');
526
str = str.substring(0, 0) + '\naaa' + str.substring(0);
527
pieceTable.insert(2, '\n\naa');
528
str = str.substring(0, 2) + '\n\naa' + str.substring(2);
529
pieceTable.delete(1, 4);
530
str = str.substring(0, 1) + str.substring(1 + 4);
531
pieceTable.delete(3, 1);
532
str = str.substring(0, 3) + str.substring(3 + 1);
533
pieceTable.delete(1, 2);
534
str = str.substring(0, 1) + str.substring(1 + 2);
535
pieceTable.delete(0, 1);
536
str = str.substring(0, 0) + str.substring(0 + 1);
537
pieceTable.insert(0, 'a\n\n\r');
538
str = str.substring(0, 0) + 'a\n\n\r' + str.substring(0);
539
pieceTable.insert(2, 'aa\r\n');
540
str = str.substring(0, 2) + 'aa\r\n' + str.substring(2);
541
pieceTable.insert(3, 'a\naa');
542
str = str.substring(0, 3) + 'a\naa' + str.substring(3);
543
544
assert.strictEqual(pieceTable.getLinesRawContent(), str);
545
assertTreeInvariants(pieceTable);
546
});
547
test('random insert/delete \\r bug 5', () => {
548
let str = '';
549
const pieceTree = createTextBuffer(['']);
550
ds.add(pieceTree);
551
const pieceTable = pieceTree.getPieceTree();
552
pieceTable.insert(0, '\n\n\n\r');
553
str = str.substring(0, 0) + '\n\n\n\r' + str.substring(0);
554
pieceTable.insert(1, '\n\n\n\r');
555
str = str.substring(0, 1) + '\n\n\n\r' + str.substring(1);
556
pieceTable.insert(2, '\n\r\r\r');
557
str = str.substring(0, 2) + '\n\r\r\r' + str.substring(2);
558
pieceTable.insert(8, '\n\r\n\r');
559
str = str.substring(0, 8) + '\n\r\n\r' + str.substring(8);
560
pieceTable.delete(5, 2);
561
str = str.substring(0, 5) + str.substring(5 + 2);
562
pieceTable.insert(4, '\n\r\r\r');
563
str = str.substring(0, 4) + '\n\r\r\r' + str.substring(4);
564
pieceTable.insert(8, '\n\n\n\r');
565
str = str.substring(0, 8) + '\n\n\n\r' + str.substring(8);
566
pieceTable.delete(0, 7);
567
str = str.substring(0, 0) + str.substring(0 + 7);
568
pieceTable.insert(1, '\r\n\r\r');
569
str = str.substring(0, 1) + '\r\n\r\r' + str.substring(1);
570
pieceTable.insert(15, '\n\r\r\r');
571
str = str.substring(0, 15) + '\n\r\r\r' + str.substring(15);
572
573
assert.strictEqual(pieceTable.getLinesRawContent(), str);
574
assertTreeInvariants(pieceTable);
575
});
576
});
577
578
suite('prefix sum for line feed', () => {
579
const ds = ensureNoDisposablesAreLeakedInTestSuite();
580
581
test('basic', () => {
582
const pieceTree = createTextBuffer(['1\n2\n3\n4']);
583
ds.add(pieceTree);
584
const pieceTable = pieceTree.getPieceTree();
585
586
assert.strictEqual(pieceTable.getLineCount(), 4);
587
assert.deepStrictEqual(pieceTable.getPositionAt(0), new Position(1, 1));
588
assert.deepStrictEqual(pieceTable.getPositionAt(1), new Position(1, 2));
589
assert.deepStrictEqual(pieceTable.getPositionAt(2), new Position(2, 1));
590
assert.deepStrictEqual(pieceTable.getPositionAt(3), new Position(2, 2));
591
assert.deepStrictEqual(pieceTable.getPositionAt(4), new Position(3, 1));
592
assert.deepStrictEqual(pieceTable.getPositionAt(5), new Position(3, 2));
593
assert.deepStrictEqual(pieceTable.getPositionAt(6), new Position(4, 1));
594
595
assert.strictEqual(pieceTable.getOffsetAt(1, 1), 0);
596
assert.strictEqual(pieceTable.getOffsetAt(1, 2), 1);
597
assert.strictEqual(pieceTable.getOffsetAt(2, 1), 2);
598
assert.strictEqual(pieceTable.getOffsetAt(2, 2), 3);
599
assert.strictEqual(pieceTable.getOffsetAt(3, 1), 4);
600
assert.strictEqual(pieceTable.getOffsetAt(3, 2), 5);
601
assert.strictEqual(pieceTable.getOffsetAt(4, 1), 6);
602
assertTreeInvariants(pieceTable);
603
});
604
605
test('append', () => {
606
const pieceTree = createTextBuffer(['a\nb\nc\nde']);
607
ds.add(pieceTree);
608
const pieceTable = pieceTree.getPieceTree();
609
pieceTable.insert(8, 'fh\ni\njk');
610
611
assert.strictEqual(pieceTable.getLineCount(), 6);
612
assert.deepStrictEqual(pieceTable.getPositionAt(9), new Position(4, 4));
613
assert.strictEqual(pieceTable.getOffsetAt(1, 1), 0);
614
assertTreeInvariants(pieceTable);
615
});
616
617
test('insert', () => {
618
const pieceTree = createTextBuffer(['a\nb\nc\nde']);
619
ds.add(pieceTree);
620
const pieceTable = pieceTree.getPieceTree();
621
pieceTable.insert(7, 'fh\ni\njk');
622
623
assert.strictEqual(pieceTable.getLineCount(), 6);
624
assert.deepStrictEqual(pieceTable.getPositionAt(6), new Position(4, 1));
625
assert.deepStrictEqual(pieceTable.getPositionAt(7), new Position(4, 2));
626
assert.deepStrictEqual(pieceTable.getPositionAt(8), new Position(4, 3));
627
assert.deepStrictEqual(pieceTable.getPositionAt(9), new Position(4, 4));
628
assert.deepStrictEqual(pieceTable.getPositionAt(12), new Position(6, 1));
629
assert.deepStrictEqual(pieceTable.getPositionAt(13), new Position(6, 2));
630
assert.deepStrictEqual(pieceTable.getPositionAt(14), new Position(6, 3));
631
632
assert.strictEqual(pieceTable.getOffsetAt(4, 1), 6);
633
assert.strictEqual(pieceTable.getOffsetAt(4, 2), 7);
634
assert.strictEqual(pieceTable.getOffsetAt(4, 3), 8);
635
assert.strictEqual(pieceTable.getOffsetAt(4, 4), 9);
636
assert.strictEqual(pieceTable.getOffsetAt(6, 1), 12);
637
assert.strictEqual(pieceTable.getOffsetAt(6, 2), 13);
638
assert.strictEqual(pieceTable.getOffsetAt(6, 3), 14);
639
assertTreeInvariants(pieceTable);
640
});
641
642
test('delete', () => {
643
const pieceTree = createTextBuffer(['a\nb\nc\ndefh\ni\njk']);
644
ds.add(pieceTree);
645
const pieceTable = pieceTree.getPieceTree();
646
647
pieceTable.delete(7, 2);
648
649
assert.strictEqual(pieceTable.getLinesRawContent(), 'a\nb\nc\ndh\ni\njk');
650
assert.strictEqual(pieceTable.getLineCount(), 6);
651
assert.deepStrictEqual(pieceTable.getPositionAt(6), new Position(4, 1));
652
assert.deepStrictEqual(pieceTable.getPositionAt(7), new Position(4, 2));
653
assert.deepStrictEqual(pieceTable.getPositionAt(8), new Position(4, 3));
654
assert.deepStrictEqual(pieceTable.getPositionAt(9), new Position(5, 1));
655
assert.deepStrictEqual(pieceTable.getPositionAt(11), new Position(6, 1));
656
assert.deepStrictEqual(pieceTable.getPositionAt(12), new Position(6, 2));
657
assert.deepStrictEqual(pieceTable.getPositionAt(13), new Position(6, 3));
658
659
assert.strictEqual(pieceTable.getOffsetAt(4, 1), 6);
660
assert.strictEqual(pieceTable.getOffsetAt(4, 2), 7);
661
assert.strictEqual(pieceTable.getOffsetAt(4, 3), 8);
662
assert.strictEqual(pieceTable.getOffsetAt(5, 1), 9);
663
assert.strictEqual(pieceTable.getOffsetAt(6, 1), 11);
664
assert.strictEqual(pieceTable.getOffsetAt(6, 2), 12);
665
assert.strictEqual(pieceTable.getOffsetAt(6, 3), 13);
666
assertTreeInvariants(pieceTable);
667
});
668
669
test('add+delete 1', () => {
670
const pieceTree = createTextBuffer(['a\nb\nc\nde']);
671
ds.add(pieceTree);
672
const pieceTable = pieceTree.getPieceTree();
673
pieceTable.insert(8, 'fh\ni\njk');
674
pieceTable.delete(7, 2);
675
676
assert.strictEqual(pieceTable.getLinesRawContent(), 'a\nb\nc\ndh\ni\njk');
677
assert.strictEqual(pieceTable.getLineCount(), 6);
678
assert.deepStrictEqual(pieceTable.getPositionAt(6), new Position(4, 1));
679
assert.deepStrictEqual(pieceTable.getPositionAt(7), new Position(4, 2));
680
assert.deepStrictEqual(pieceTable.getPositionAt(8), new Position(4, 3));
681
assert.deepStrictEqual(pieceTable.getPositionAt(9), new Position(5, 1));
682
assert.deepStrictEqual(pieceTable.getPositionAt(11), new Position(6, 1));
683
assert.deepStrictEqual(pieceTable.getPositionAt(12), new Position(6, 2));
684
assert.deepStrictEqual(pieceTable.getPositionAt(13), new Position(6, 3));
685
686
assert.strictEqual(pieceTable.getOffsetAt(4, 1), 6);
687
assert.strictEqual(pieceTable.getOffsetAt(4, 2), 7);
688
assert.strictEqual(pieceTable.getOffsetAt(4, 3), 8);
689
assert.strictEqual(pieceTable.getOffsetAt(5, 1), 9);
690
assert.strictEqual(pieceTable.getOffsetAt(6, 1), 11);
691
assert.strictEqual(pieceTable.getOffsetAt(6, 2), 12);
692
assert.strictEqual(pieceTable.getOffsetAt(6, 3), 13);
693
assertTreeInvariants(pieceTable);
694
});
695
696
test('insert random bug 1: prefixSumComputer.removeValues(start, cnt) cnt is 1 based.', () => {
697
let str = '';
698
const pieceTree = createTextBuffer(['']);
699
ds.add(pieceTree);
700
const pieceTable = pieceTree.getPieceTree();
701
pieceTable.insert(0, ' ZX \n Z\nZ\n YZ\nY\nZXX ');
702
str =
703
str.substring(0, 0) +
704
' ZX \n Z\nZ\n YZ\nY\nZXX ' +
705
str.substring(0);
706
pieceTable.insert(14, 'X ZZ\nYZZYZXXY Y XY\n ');
707
str =
708
str.substring(0, 14) + 'X ZZ\nYZZYZXXY Y XY\n ' + str.substring(14);
709
710
assert.strictEqual(pieceTable.getLinesRawContent(), str);
711
testLineStarts(str, pieceTable);
712
assertTreeInvariants(pieceTable);
713
});
714
715
test('insert random bug 2: prefixSumComputer initialize does not do deep copy of UInt32Array.', () => {
716
let str = '';
717
const pieceTree = createTextBuffer(['']);
718
ds.add(pieceTree);
719
const pieceTable = pieceTree.getPieceTree();
720
pieceTable.insert(0, 'ZYZ\nYY XY\nX \nZ Y \nZ ');
721
str =
722
str.substring(0, 0) + 'ZYZ\nYY XY\nX \nZ Y \nZ ' + str.substring(0);
723
pieceTable.insert(3, 'XXY \n\nY Y YYY ZYXY ');
724
str = str.substring(0, 3) + 'XXY \n\nY Y YYY ZYXY ' + str.substring(3);
725
726
assert.strictEqual(pieceTable.getLinesRawContent(), str);
727
testLineStarts(str, pieceTable);
728
assertTreeInvariants(pieceTable);
729
});
730
731
test('delete random bug 1: I forgot to update the lineFeedCnt when deletion is on one single piece.', () => {
732
const pieceTree = createTextBuffer(['']);
733
ds.add(pieceTree);
734
const pieceTable = pieceTree.getPieceTree();
735
pieceTable.insert(0, 'ba\na\nca\nba\ncbab\ncaa ');
736
pieceTable.insert(13, 'cca\naabb\ncac\nccc\nab ');
737
pieceTable.delete(5, 8);
738
pieceTable.delete(30, 2);
739
pieceTable.insert(24, 'cbbacccbac\nbaaab\n\nc ');
740
pieceTable.delete(29, 3);
741
pieceTable.delete(23, 9);
742
pieceTable.delete(21, 5);
743
pieceTable.delete(30, 3);
744
pieceTable.insert(3, 'cb\nac\nc\n\nacc\nbb\nb\nc ');
745
pieceTable.delete(19, 5);
746
pieceTable.insert(18, '\nbb\n\nacbc\ncbb\nc\nbb\n ');
747
pieceTable.insert(65, 'cbccbac\nbc\n\nccabba\n ');
748
pieceTable.insert(77, 'a\ncacb\n\nac\n\n\n\n\nabab ');
749
pieceTable.delete(30, 9);
750
pieceTable.insert(45, 'b\n\nc\nba\n\nbbbba\n\naa\n ');
751
pieceTable.insert(82, 'ab\nbb\ncabacab\ncbc\na ');
752
pieceTable.delete(123, 9);
753
pieceTable.delete(71, 2);
754
pieceTable.insert(33, 'acaa\nacb\n\naa\n\nc\n\n\n\n ');
755
756
const str = pieceTable.getLinesRawContent();
757
testLineStarts(str, pieceTable);
758
assertTreeInvariants(pieceTable);
759
});
760
761
test('delete random bug rb tree 1', () => {
762
let str = '';
763
const pieceTree = createTextBuffer([str]);
764
ds.add(pieceTree);
765
const pieceTable = pieceTree.getPieceTree();
766
pieceTable.insert(0, 'YXXZ\n\nYY\n');
767
str = str.substring(0, 0) + 'YXXZ\n\nYY\n' + str.substring(0);
768
pieceTable.delete(0, 5);
769
str = str.substring(0, 0) + str.substring(0 + 5);
770
pieceTable.insert(0, 'ZXYY\nX\nZ\n');
771
str = str.substring(0, 0) + 'ZXYY\nX\nZ\n' + str.substring(0);
772
pieceTable.insert(10, '\nXY\nYXYXY');
773
str = str.substring(0, 10) + '\nXY\nYXYXY' + str.substring(10);
774
testLineStarts(str, pieceTable);
775
assertTreeInvariants(pieceTable);
776
});
777
778
test('delete random bug rb tree 2', () => {
779
let str = '';
780
const pieceTree = createTextBuffer([str]);
781
ds.add(pieceTree);
782
const pieceTable = pieceTree.getPieceTree();
783
pieceTable.insert(0, 'YXXZ\n\nYY\n');
784
str = str.substring(0, 0) + 'YXXZ\n\nYY\n' + str.substring(0);
785
pieceTable.insert(0, 'ZXYY\nX\nZ\n');
786
str = str.substring(0, 0) + 'ZXYY\nX\nZ\n' + str.substring(0);
787
pieceTable.insert(10, '\nXY\nYXYXY');
788
str = str.substring(0, 10) + '\nXY\nYXYXY' + str.substring(10);
789
pieceTable.insert(8, 'YZXY\nZ\nYX');
790
str = str.substring(0, 8) + 'YZXY\nZ\nYX' + str.substring(8);
791
pieceTable.insert(12, 'XX\nXXYXYZ');
792
str = str.substring(0, 12) + 'XX\nXXYXYZ' + str.substring(12);
793
pieceTable.delete(0, 4);
794
str = str.substring(0, 0) + str.substring(0 + 4);
795
796
testLineStarts(str, pieceTable);
797
assertTreeInvariants(pieceTable);
798
});
799
800
test('delete random bug rb tree 3', () => {
801
let str = '';
802
const pieceTree = createTextBuffer([str]);
803
ds.add(pieceTree);
804
const pieceTable = pieceTree.getPieceTree();
805
pieceTable.insert(0, 'YXXZ\n\nYY\n');
806
str = str.substring(0, 0) + 'YXXZ\n\nYY\n' + str.substring(0);
807
pieceTable.delete(7, 2);
808
str = str.substring(0, 7) + str.substring(7 + 2);
809
pieceTable.delete(6, 1);
810
str = str.substring(0, 6) + str.substring(6 + 1);
811
pieceTable.delete(0, 5);
812
str = str.substring(0, 0) + str.substring(0 + 5);
813
pieceTable.insert(0, 'ZXYY\nX\nZ\n');
814
str = str.substring(0, 0) + 'ZXYY\nX\nZ\n' + str.substring(0);
815
pieceTable.insert(10, '\nXY\nYXYXY');
816
str = str.substring(0, 10) + '\nXY\nYXYXY' + str.substring(10);
817
pieceTable.insert(8, 'YZXY\nZ\nYX');
818
str = str.substring(0, 8) + 'YZXY\nZ\nYX' + str.substring(8);
819
pieceTable.insert(12, 'XX\nXXYXYZ');
820
str = str.substring(0, 12) + 'XX\nXXYXYZ' + str.substring(12);
821
pieceTable.delete(0, 4);
822
str = str.substring(0, 0) + str.substring(0 + 4);
823
pieceTable.delete(30, 3);
824
str = str.substring(0, 30) + str.substring(30 + 3);
825
826
testLineStarts(str, pieceTable);
827
assertTreeInvariants(pieceTable);
828
});
829
});
830
831
suite('offset 2 position', () => {
832
const ds = ensureNoDisposablesAreLeakedInTestSuite();
833
834
test('random tests bug 1', () => {
835
let str = '';
836
const pieceTree = createTextBuffer(['']);
837
ds.add(pieceTree);
838
const pieceTable = pieceTree.getPieceTree();
839
pieceTable.insert(0, 'huuyYzUfKOENwGgZLqn ');
840
str = str.substring(0, 0) + 'huuyYzUfKOENwGgZLqn ' + str.substring(0);
841
pieceTable.delete(18, 2);
842
str = str.substring(0, 18) + str.substring(18 + 2);
843
pieceTable.delete(3, 1);
844
str = str.substring(0, 3) + str.substring(3 + 1);
845
pieceTable.delete(12, 4);
846
str = str.substring(0, 12) + str.substring(12 + 4);
847
pieceTable.insert(3, 'hMbnVEdTSdhLlPevXKF ');
848
str = str.substring(0, 3) + 'hMbnVEdTSdhLlPevXKF ' + str.substring(3);
849
pieceTable.delete(22, 8);
850
str = str.substring(0, 22) + str.substring(22 + 8);
851
pieceTable.insert(4, 'S umSnYrqOmOAV\nEbZJ ');
852
str = str.substring(0, 4) + 'S umSnYrqOmOAV\nEbZJ ' + str.substring(4);
853
854
testLineStarts(str, pieceTable);
855
assertTreeInvariants(pieceTable);
856
});
857
});
858
859
suite('get text in range', () => {
860
const ds = ensureNoDisposablesAreLeakedInTestSuite();
861
862
test('getContentInRange', () => {
863
const pieceTree = createTextBuffer(['a\nb\nc\nde']);
864
ds.add(pieceTree);
865
const pieceTable = pieceTree.getPieceTree();
866
pieceTable.insert(8, 'fh\ni\njk');
867
pieceTable.delete(7, 2);
868
// 'a\nb\nc\ndh\ni\njk'
869
870
assert.strictEqual(pieceTable.getValueInRange(new Range(1, 1, 1, 3)), 'a\n');
871
assert.strictEqual(pieceTable.getValueInRange(new Range(2, 1, 2, 3)), 'b\n');
872
assert.strictEqual(pieceTable.getValueInRange(new Range(3, 1, 3, 3)), 'c\n');
873
assert.strictEqual(pieceTable.getValueInRange(new Range(4, 1, 4, 4)), 'dh\n');
874
assert.strictEqual(pieceTable.getValueInRange(new Range(5, 1, 5, 3)), 'i\n');
875
assert.strictEqual(pieceTable.getValueInRange(new Range(6, 1, 6, 3)), 'jk');
876
assertTreeInvariants(pieceTable);
877
});
878
879
test('random test value in range', () => {
880
let str = '';
881
const pieceTree = createTextBuffer([str]);
882
ds.add(pieceTree);
883
const pieceTable = pieceTree.getPieceTree();
884
885
pieceTable.insert(0, 'ZXXY');
886
str = str.substring(0, 0) + 'ZXXY' + str.substring(0);
887
pieceTable.insert(1, 'XZZY');
888
str = str.substring(0, 1) + 'XZZY' + str.substring(1);
889
pieceTable.insert(5, '\nX\n\n');
890
str = str.substring(0, 5) + '\nX\n\n' + str.substring(5);
891
pieceTable.insert(3, '\nXX\n');
892
str = str.substring(0, 3) + '\nXX\n' + str.substring(3);
893
pieceTable.insert(12, 'YYYX');
894
str = str.substring(0, 12) + 'YYYX' + str.substring(12);
895
896
testLinesContent(str, pieceTable);
897
assertTreeInvariants(pieceTable);
898
});
899
test('random test value in range exception', () => {
900
let str = '';
901
const pieceTree = createTextBuffer([str]);
902
ds.add(pieceTree);
903
const pieceTable = pieceTree.getPieceTree();
904
905
pieceTable.insert(0, 'XZ\nZ');
906
str = str.substring(0, 0) + 'XZ\nZ' + str.substring(0);
907
pieceTable.delete(0, 3);
908
str = str.substring(0, 0) + str.substring(0 + 3);
909
pieceTable.delete(0, 1);
910
str = str.substring(0, 0) + str.substring(0 + 1);
911
pieceTable.insert(0, 'ZYX\n');
912
str = str.substring(0, 0) + 'ZYX\n' + str.substring(0);
913
pieceTable.delete(0, 4);
914
str = str.substring(0, 0) + str.substring(0 + 4);
915
916
pieceTable.getValueInRange(new Range(1, 1, 1, 1));
917
assertTreeInvariants(pieceTable);
918
});
919
920
test('random tests bug 1', () => {
921
let str = '';
922
const pieceTree = createTextBuffer(['']);
923
ds.add(pieceTree);
924
const pieceTable = pieceTree.getPieceTree();
925
pieceTable.insert(0, 'huuyYzUfKOENwGgZLqn ');
926
str = str.substring(0, 0) + 'huuyYzUfKOENwGgZLqn ' + str.substring(0);
927
pieceTable.delete(18, 2);
928
str = str.substring(0, 18) + str.substring(18 + 2);
929
pieceTable.delete(3, 1);
930
str = str.substring(0, 3) + str.substring(3 + 1);
931
pieceTable.delete(12, 4);
932
str = str.substring(0, 12) + str.substring(12 + 4);
933
pieceTable.insert(3, 'hMbnVEdTSdhLlPevXKF ');
934
str = str.substring(0, 3) + 'hMbnVEdTSdhLlPevXKF ' + str.substring(3);
935
pieceTable.delete(22, 8);
936
str = str.substring(0, 22) + str.substring(22 + 8);
937
pieceTable.insert(4, 'S umSnYrqOmOAV\nEbZJ ');
938
str = str.substring(0, 4) + 'S umSnYrqOmOAV\nEbZJ ' + str.substring(4);
939
testLinesContent(str, pieceTable);
940
assertTreeInvariants(pieceTable);
941
});
942
943
test('random tests bug 2', () => {
944
let str = '';
945
const pieceTree = createTextBuffer(['']);
946
ds.add(pieceTree);
947
const pieceTable = pieceTree.getPieceTree();
948
pieceTable.insert(0, 'xfouRDZwdAHjVXJAMV\n ');
949
str = str.substring(0, 0) + 'xfouRDZwdAHjVXJAMV\n ' + str.substring(0);
950
pieceTable.insert(16, 'dBGndxpFZBEAIKykYYx ');
951
str = str.substring(0, 16) + 'dBGndxpFZBEAIKykYYx ' + str.substring(16);
952
pieceTable.delete(7, 6);
953
str = str.substring(0, 7) + str.substring(7 + 6);
954
pieceTable.delete(9, 7);
955
str = str.substring(0, 9) + str.substring(9 + 7);
956
pieceTable.delete(17, 6);
957
str = str.substring(0, 17) + str.substring(17 + 6);
958
pieceTable.delete(0, 4);
959
str = str.substring(0, 0) + str.substring(0 + 4);
960
pieceTable.insert(9, 'qvEFXCNvVkWgvykahYt ');
961
str = str.substring(0, 9) + 'qvEFXCNvVkWgvykahYt ' + str.substring(9);
962
pieceTable.delete(4, 6);
963
str = str.substring(0, 4) + str.substring(4 + 6);
964
pieceTable.insert(11, 'OcSChUYT\nzPEBOpsGmR ');
965
str =
966
str.substring(0, 11) + 'OcSChUYT\nzPEBOpsGmR ' + str.substring(11);
967
pieceTable.insert(15, 'KJCozaXTvkE\nxnqAeTz ');
968
str =
969
str.substring(0, 15) + 'KJCozaXTvkE\nxnqAeTz ' + str.substring(15);
970
971
testLinesContent(str, pieceTable);
972
assertTreeInvariants(pieceTable);
973
});
974
975
test('get line content', () => {
976
const pieceTree = createTextBuffer(['1']);
977
ds.add(pieceTree);
978
const pieceTable = pieceTree.getPieceTree();
979
980
assert.strictEqual(pieceTable.getLineRawContent(1), '1');
981
pieceTable.insert(1, '2');
982
assert.strictEqual(pieceTable.getLineRawContent(1), '12');
983
assertTreeInvariants(pieceTable);
984
});
985
986
test('get line content basic', () => {
987
const pieceTree = createTextBuffer(['1\n2\n3\n4']);
988
ds.add(pieceTree);
989
const pieceTable = pieceTree.getPieceTree();
990
991
assert.strictEqual(pieceTable.getLineRawContent(1), '1\n');
992
assert.strictEqual(pieceTable.getLineRawContent(2), '2\n');
993
assert.strictEqual(pieceTable.getLineRawContent(3), '3\n');
994
assert.strictEqual(pieceTable.getLineRawContent(4), '4');
995
assertTreeInvariants(pieceTable);
996
});
997
998
test('get line content after inserts/deletes', () => {
999
const pieceTree = createTextBuffer(['a\nb\nc\nde']);
1000
ds.add(pieceTree);
1001
const pieceTable = pieceTree.getPieceTree();
1002
pieceTable.insert(8, 'fh\ni\njk');
1003
pieceTable.delete(7, 2);
1004
// 'a\nb\nc\ndh\ni\njk'
1005
1006
assert.strictEqual(pieceTable.getLineRawContent(1), 'a\n');
1007
assert.strictEqual(pieceTable.getLineRawContent(2), 'b\n');
1008
assert.strictEqual(pieceTable.getLineRawContent(3), 'c\n');
1009
assert.strictEqual(pieceTable.getLineRawContent(4), 'dh\n');
1010
assert.strictEqual(pieceTable.getLineRawContent(5), 'i\n');
1011
assert.strictEqual(pieceTable.getLineRawContent(6), 'jk');
1012
assertTreeInvariants(pieceTable);
1013
});
1014
1015
test('random 1', () => {
1016
let str = '';
1017
const pieceTree = createTextBuffer(['']);
1018
ds.add(pieceTree);
1019
const pieceTable = pieceTree.getPieceTree();
1020
1021
pieceTable.insert(0, 'J eNnDzQpnlWyjmUu\ny ');
1022
str = str.substring(0, 0) + 'J eNnDzQpnlWyjmUu\ny ' + str.substring(0);
1023
pieceTable.insert(0, 'QPEeRAQmRwlJqtZSWhQ ');
1024
str = str.substring(0, 0) + 'QPEeRAQmRwlJqtZSWhQ ' + str.substring(0);
1025
pieceTable.delete(5, 1);
1026
str = str.substring(0, 5) + str.substring(5 + 1);
1027
1028
testLinesContent(str, pieceTable);
1029
assertTreeInvariants(pieceTable);
1030
});
1031
1032
test('random 2', () => {
1033
let str = '';
1034
const pieceTree = createTextBuffer(['']);
1035
ds.add(pieceTree);
1036
const pieceTable = pieceTree.getPieceTree();
1037
pieceTable.insert(0, 'DZoQ tglPCRHMltejRI ');
1038
str = str.substring(0, 0) + 'DZoQ tglPCRHMltejRI ' + str.substring(0);
1039
pieceTable.insert(10, 'JRXiyYqJ qqdcmbfkKX ');
1040
str = str.substring(0, 10) + 'JRXiyYqJ qqdcmbfkKX ' + str.substring(10);
1041
pieceTable.delete(16, 3);
1042
str = str.substring(0, 16) + str.substring(16 + 3);
1043
pieceTable.delete(25, 1);
1044
str = str.substring(0, 25) + str.substring(25 + 1);
1045
pieceTable.insert(18, 'vH\nNlvfqQJPm\nSFkhMc ');
1046
str =
1047
str.substring(0, 18) + 'vH\nNlvfqQJPm\nSFkhMc ' + str.substring(18);
1048
1049
testLinesContent(str, pieceTable);
1050
assertTreeInvariants(pieceTable);
1051
});
1052
});
1053
1054
suite('CRLF', () => {
1055
const ds = ensureNoDisposablesAreLeakedInTestSuite();
1056
1057
test('delete CR in CRLF 1', () => {
1058
const pieceTree = createTextBuffer([''], false);
1059
ds.add(pieceTree);
1060
const pieceTable = pieceTree.getPieceTree();
1061
pieceTable.insert(0, 'a\r\nb');
1062
pieceTable.delete(0, 2);
1063
1064
assert.strictEqual(pieceTable.getLineCount(), 2);
1065
assertTreeInvariants(pieceTable);
1066
});
1067
1068
test('delete CR in CRLF 2', () => {
1069
const pieceTree = createTextBuffer([''], false);
1070
ds.add(pieceTree);
1071
const pieceTable = pieceTree.getPieceTree();
1072
pieceTable.insert(0, 'a\r\nb');
1073
pieceTable.delete(2, 2);
1074
1075
assert.strictEqual(pieceTable.getLineCount(), 2);
1076
assertTreeInvariants(pieceTable);
1077
});
1078
1079
test('random bug 1', () => {
1080
let str = '';
1081
const pieceTree = createTextBuffer([''], false);
1082
ds.add(pieceTree);
1083
const pieceTable = pieceTree.getPieceTree();
1084
pieceTable.insert(0, '\n\n\r\r');
1085
str = str.substring(0, 0) + '\n\n\r\r' + str.substring(0);
1086
pieceTable.insert(1, '\r\n\r\n');
1087
str = str.substring(0, 1) + '\r\n\r\n' + str.substring(1);
1088
pieceTable.delete(5, 3);
1089
str = str.substring(0, 5) + str.substring(5 + 3);
1090
pieceTable.delete(2, 3);
1091
str = str.substring(0, 2) + str.substring(2 + 3);
1092
1093
const lines = splitLines(str);
1094
assert.strictEqual(pieceTable.getLineCount(), lines.length);
1095
assertTreeInvariants(pieceTable);
1096
});
1097
test('random bug 2', () => {
1098
let str = '';
1099
const pieceTree = createTextBuffer([''], false);
1100
ds.add(pieceTree);
1101
const pieceTable = pieceTree.getPieceTree();
1102
1103
pieceTable.insert(0, '\n\r\n\r');
1104
str = str.substring(0, 0) + '\n\r\n\r' + str.substring(0);
1105
pieceTable.insert(2, '\n\r\r\r');
1106
str = str.substring(0, 2) + '\n\r\r\r' + str.substring(2);
1107
pieceTable.delete(4, 1);
1108
str = str.substring(0, 4) + str.substring(4 + 1);
1109
1110
const lines = splitLines(str);
1111
assert.strictEqual(pieceTable.getLineCount(), lines.length);
1112
assertTreeInvariants(pieceTable);
1113
});
1114
test('random bug 3', () => {
1115
let str = '';
1116
const pieceTree = createTextBuffer([''], false);
1117
ds.add(pieceTree);
1118
const pieceTable = pieceTree.getPieceTree();
1119
1120
pieceTable.insert(0, '\n\n\n\r');
1121
str = str.substring(0, 0) + '\n\n\n\r' + str.substring(0);
1122
pieceTable.delete(2, 2);
1123
str = str.substring(0, 2) + str.substring(2 + 2);
1124
pieceTable.delete(0, 2);
1125
str = str.substring(0, 0) + str.substring(0 + 2);
1126
pieceTable.insert(0, '\r\r\r\r');
1127
str = str.substring(0, 0) + '\r\r\r\r' + str.substring(0);
1128
pieceTable.insert(2, '\r\n\r\r');
1129
str = str.substring(0, 2) + '\r\n\r\r' + str.substring(2);
1130
pieceTable.insert(3, '\r\r\r\n');
1131
str = str.substring(0, 3) + '\r\r\r\n' + str.substring(3);
1132
1133
const lines = splitLines(str);
1134
assert.strictEqual(pieceTable.getLineCount(), lines.length);
1135
assertTreeInvariants(pieceTable);
1136
});
1137
test('random bug 4', () => {
1138
let str = '';
1139
const pieceTree = createTextBuffer([''], false);
1140
ds.add(pieceTree);
1141
const pieceTable = pieceTree.getPieceTree();
1142
1143
pieceTable.insert(0, '\n\n\n\n');
1144
str = str.substring(0, 0) + '\n\n\n\n' + str.substring(0);
1145
pieceTable.delete(3, 1);
1146
str = str.substring(0, 3) + str.substring(3 + 1);
1147
pieceTable.insert(1, '\r\r\r\r');
1148
str = str.substring(0, 1) + '\r\r\r\r' + str.substring(1);
1149
pieceTable.insert(6, '\r\n\n\r');
1150
str = str.substring(0, 6) + '\r\n\n\r' + str.substring(6);
1151
pieceTable.delete(5, 3);
1152
str = str.substring(0, 5) + str.substring(5 + 3);
1153
1154
testLinesContent(str, pieceTable);
1155
assertTreeInvariants(pieceTable);
1156
});
1157
test('random bug 5', () => {
1158
let str = '';
1159
const pieceTree = createTextBuffer([''], false);
1160
ds.add(pieceTree);
1161
const pieceTable = pieceTree.getPieceTree();
1162
1163
pieceTable.insert(0, '\n\n\n\n');
1164
str = str.substring(0, 0) + '\n\n\n\n' + str.substring(0);
1165
pieceTable.delete(3, 1);
1166
str = str.substring(0, 3) + str.substring(3 + 1);
1167
pieceTable.insert(0, '\n\r\r\n');
1168
str = str.substring(0, 0) + '\n\r\r\n' + str.substring(0);
1169
pieceTable.insert(4, '\n\r\r\n');
1170
str = str.substring(0, 4) + '\n\r\r\n' + str.substring(4);
1171
pieceTable.delete(4, 3);
1172
str = str.substring(0, 4) + str.substring(4 + 3);
1173
pieceTable.insert(5, '\r\r\n\r');
1174
str = str.substring(0, 5) + '\r\r\n\r' + str.substring(5);
1175
pieceTable.insert(12, '\n\n\n\r');
1176
str = str.substring(0, 12) + '\n\n\n\r' + str.substring(12);
1177
pieceTable.insert(5, '\r\r\r\n');
1178
str = str.substring(0, 5) + '\r\r\r\n' + str.substring(5);
1179
pieceTable.insert(20, '\n\n\r\n');
1180
str = str.substring(0, 20) + '\n\n\r\n' + str.substring(20);
1181
1182
testLinesContent(str, pieceTable);
1183
assertTreeInvariants(pieceTable);
1184
});
1185
test('random bug 6', () => {
1186
let str = '';
1187
const pieceTree = createTextBuffer([''], false);
1188
ds.add(pieceTree);
1189
const pieceTable = pieceTree.getPieceTree();
1190
1191
pieceTable.insert(0, '\n\r\r\n');
1192
str = str.substring(0, 0) + '\n\r\r\n' + str.substring(0);
1193
pieceTable.insert(4, '\r\n\n\r');
1194
str = str.substring(0, 4) + '\r\n\n\r' + str.substring(4);
1195
pieceTable.insert(3, '\r\n\n\n');
1196
str = str.substring(0, 3) + '\r\n\n\n' + str.substring(3);
1197
pieceTable.delete(4, 8);
1198
str = str.substring(0, 4) + str.substring(4 + 8);
1199
pieceTable.insert(4, '\r\n\n\r');
1200
str = str.substring(0, 4) + '\r\n\n\r' + str.substring(4);
1201
pieceTable.insert(0, '\r\n\n\r');
1202
str = str.substring(0, 0) + '\r\n\n\r' + str.substring(0);
1203
pieceTable.delete(4, 0);
1204
str = str.substring(0, 4) + str.substring(4 + 0);
1205
pieceTable.delete(8, 4);
1206
str = str.substring(0, 8) + str.substring(8 + 4);
1207
1208
testLinesContent(str, pieceTable);
1209
assertTreeInvariants(pieceTable);
1210
});
1211
test('random bug 8', () => {
1212
let str = '';
1213
const pieceTree = createTextBuffer([''], false);
1214
ds.add(pieceTree);
1215
const pieceTable = pieceTree.getPieceTree();
1216
1217
pieceTable.insert(0, '\r\n\n\r');
1218
str = str.substring(0, 0) + '\r\n\n\r' + str.substring(0);
1219
pieceTable.delete(1, 0);
1220
str = str.substring(0, 1) + str.substring(1 + 0);
1221
pieceTable.insert(3, '\n\n\n\r');
1222
str = str.substring(0, 3) + '\n\n\n\r' + str.substring(3);
1223
pieceTable.insert(7, '\n\n\r\n');
1224
str = str.substring(0, 7) + '\n\n\r\n' + str.substring(7);
1225
1226
testLinesContent(str, pieceTable);
1227
assertTreeInvariants(pieceTable);
1228
});
1229
test('random bug 7', () => {
1230
let str = '';
1231
const pieceTree = createTextBuffer([''], false);
1232
ds.add(pieceTree);
1233
const pieceTable = pieceTree.getPieceTree();
1234
1235
pieceTable.insert(0, '\r\r\n\n');
1236
str = str.substring(0, 0) + '\r\r\n\n' + str.substring(0);
1237
pieceTable.insert(4, '\r\n\n\r');
1238
str = str.substring(0, 4) + '\r\n\n\r' + str.substring(4);
1239
pieceTable.insert(7, '\n\r\r\r');
1240
str = str.substring(0, 7) + '\n\r\r\r' + str.substring(7);
1241
pieceTable.insert(11, '\n\n\r\n');
1242
str = str.substring(0, 11) + '\n\n\r\n' + str.substring(11);
1243
testLinesContent(str, pieceTable);
1244
assertTreeInvariants(pieceTable);
1245
});
1246
1247
test('random bug 10', () => {
1248
let str = '';
1249
const pieceTree = createTextBuffer([''], false);
1250
ds.add(pieceTree);
1251
const pieceTable = pieceTree.getPieceTree();
1252
1253
pieceTable.insert(0, 'qneW');
1254
str = str.substring(0, 0) + 'qneW' + str.substring(0);
1255
pieceTable.insert(0, 'YhIl');
1256
str = str.substring(0, 0) + 'YhIl' + str.substring(0);
1257
pieceTable.insert(0, 'qdsm');
1258
str = str.substring(0, 0) + 'qdsm' + str.substring(0);
1259
pieceTable.delete(7, 0);
1260
str = str.substring(0, 7) + str.substring(7 + 0);
1261
pieceTable.insert(12, 'iiPv');
1262
str = str.substring(0, 12) + 'iiPv' + str.substring(12);
1263
pieceTable.insert(9, 'V\rSA');
1264
str = str.substring(0, 9) + 'V\rSA' + str.substring(9);
1265
1266
testLinesContent(str, pieceTable);
1267
assertTreeInvariants(pieceTable);
1268
});
1269
1270
test('random bug 9', () => {
1271
let str = '';
1272
const pieceTree = createTextBuffer([''], false);
1273
ds.add(pieceTree);
1274
const pieceTable = pieceTree.getPieceTree();
1275
1276
pieceTable.insert(0, '\n\n\n\n');
1277
str = str.substring(0, 0) + '\n\n\n\n' + str.substring(0);
1278
pieceTable.insert(3, '\n\r\n\r');
1279
str = str.substring(0, 3) + '\n\r\n\r' + str.substring(3);
1280
pieceTable.insert(2, '\n\r\n\n');
1281
str = str.substring(0, 2) + '\n\r\n\n' + str.substring(2);
1282
pieceTable.insert(0, '\n\n\r\r');
1283
str = str.substring(0, 0) + '\n\n\r\r' + str.substring(0);
1284
pieceTable.insert(3, '\r\r\r\r');
1285
str = str.substring(0, 3) + '\r\r\r\r' + str.substring(3);
1286
pieceTable.insert(3, '\n\n\r\r');
1287
str = str.substring(0, 3) + '\n\n\r\r' + str.substring(3);
1288
1289
testLinesContent(str, pieceTable);
1290
assertTreeInvariants(pieceTable);
1291
});
1292
});
1293
1294
suite('centralized lineStarts with CRLF', () => {
1295
const ds = ensureNoDisposablesAreLeakedInTestSuite();
1296
1297
test('delete CR in CRLF 1', () => {
1298
const pieceTree = createTextBuffer(['a\r\nb'], false);
1299
ds.add(pieceTree);
1300
const pieceTable = pieceTree.getPieceTree();
1301
pieceTable.delete(2, 2);
1302
assert.strictEqual(pieceTable.getLineCount(), 2);
1303
assertTreeInvariants(pieceTable);
1304
});
1305
test('delete CR in CRLF 2', () => {
1306
const pieceTree = createTextBuffer(['a\r\nb']);
1307
ds.add(pieceTree);
1308
const pieceTable = pieceTree.getPieceTree();
1309
pieceTable.delete(0, 2);
1310
1311
assert.strictEqual(pieceTable.getLineCount(), 2);
1312
assertTreeInvariants(pieceTable);
1313
});
1314
1315
test('random bug 1', () => {
1316
let str = '\n\n\r\r';
1317
const pieceTree = createTextBuffer(['\n\n\r\r'], false);
1318
ds.add(pieceTree);
1319
const pieceTable = pieceTree.getPieceTree();
1320
1321
pieceTable.insert(1, '\r\n\r\n');
1322
str = str.substring(0, 1) + '\r\n\r\n' + str.substring(1);
1323
pieceTable.delete(5, 3);
1324
str = str.substring(0, 5) + str.substring(5 + 3);
1325
pieceTable.delete(2, 3);
1326
str = str.substring(0, 2) + str.substring(2 + 3);
1327
1328
const lines = splitLines(str);
1329
assert.strictEqual(pieceTable.getLineCount(), lines.length);
1330
assertTreeInvariants(pieceTable);
1331
});
1332
test('random bug 2', () => {
1333
let str = '\n\r\n\r';
1334
const pieceTree = createTextBuffer(['\n\r\n\r'], false);
1335
ds.add(pieceTree);
1336
const pieceTable = pieceTree.getPieceTree();
1337
1338
pieceTable.insert(2, '\n\r\r\r');
1339
str = str.substring(0, 2) + '\n\r\r\r' + str.substring(2);
1340
pieceTable.delete(4, 1);
1341
str = str.substring(0, 4) + str.substring(4 + 1);
1342
1343
const lines = splitLines(str);
1344
assert.strictEqual(pieceTable.getLineCount(), lines.length);
1345
assertTreeInvariants(pieceTable);
1346
});
1347
1348
test('random bug 3', () => {
1349
let str = '\n\n\n\r';
1350
const pieceTree = createTextBuffer(['\n\n\n\r'], false);
1351
ds.add(pieceTree);
1352
const pieceTable = pieceTree.getPieceTree();
1353
1354
pieceTable.delete(2, 2);
1355
str = str.substring(0, 2) + str.substring(2 + 2);
1356
pieceTable.delete(0, 2);
1357
str = str.substring(0, 0) + str.substring(0 + 2);
1358
pieceTable.insert(0, '\r\r\r\r');
1359
str = str.substring(0, 0) + '\r\r\r\r' + str.substring(0);
1360
pieceTable.insert(2, '\r\n\r\r');
1361
str = str.substring(0, 2) + '\r\n\r\r' + str.substring(2);
1362
pieceTable.insert(3, '\r\r\r\n');
1363
str = str.substring(0, 3) + '\r\r\r\n' + str.substring(3);
1364
1365
const lines = splitLines(str);
1366
assert.strictEqual(pieceTable.getLineCount(), lines.length);
1367
assertTreeInvariants(pieceTable);
1368
});
1369
1370
test('random bug 4', () => {
1371
let str = '\n\n\n\n';
1372
const pieceTree = createTextBuffer(['\n\n\n\n'], false);
1373
ds.add(pieceTree);
1374
const pieceTable = pieceTree.getPieceTree();
1375
1376
pieceTable.delete(3, 1);
1377
str = str.substring(0, 3) + str.substring(3 + 1);
1378
pieceTable.insert(1, '\r\r\r\r');
1379
str = str.substring(0, 1) + '\r\r\r\r' + str.substring(1);
1380
pieceTable.insert(6, '\r\n\n\r');
1381
str = str.substring(0, 6) + '\r\n\n\r' + str.substring(6);
1382
pieceTable.delete(5, 3);
1383
str = str.substring(0, 5) + str.substring(5 + 3);
1384
1385
testLinesContent(str, pieceTable);
1386
assertTreeInvariants(pieceTable);
1387
});
1388
1389
test('random bug 5', () => {
1390
let str = '\n\n\n\n';
1391
const pieceTree = createTextBuffer(['\n\n\n\n'], false);
1392
ds.add(pieceTree);
1393
const pieceTable = pieceTree.getPieceTree();
1394
1395
pieceTable.delete(3, 1);
1396
str = str.substring(0, 3) + str.substring(3 + 1);
1397
pieceTable.insert(0, '\n\r\r\n');
1398
str = str.substring(0, 0) + '\n\r\r\n' + str.substring(0);
1399
pieceTable.insert(4, '\n\r\r\n');
1400
str = str.substring(0, 4) + '\n\r\r\n' + str.substring(4);
1401
pieceTable.delete(4, 3);
1402
str = str.substring(0, 4) + str.substring(4 + 3);
1403
pieceTable.insert(5, '\r\r\n\r');
1404
str = str.substring(0, 5) + '\r\r\n\r' + str.substring(5);
1405
pieceTable.insert(12, '\n\n\n\r');
1406
str = str.substring(0, 12) + '\n\n\n\r' + str.substring(12);
1407
pieceTable.insert(5, '\r\r\r\n');
1408
str = str.substring(0, 5) + '\r\r\r\n' + str.substring(5);
1409
pieceTable.insert(20, '\n\n\r\n');
1410
str = str.substring(0, 20) + '\n\n\r\n' + str.substring(20);
1411
1412
testLinesContent(str, pieceTable);
1413
assertTreeInvariants(pieceTable);
1414
});
1415
1416
test('random bug 6', () => {
1417
let str = '\n\r\r\n';
1418
const pieceTree = createTextBuffer(['\n\r\r\n'], false);
1419
ds.add(pieceTree);
1420
const pieceTable = pieceTree.getPieceTree();
1421
1422
pieceTable.insert(4, '\r\n\n\r');
1423
str = str.substring(0, 4) + '\r\n\n\r' + str.substring(4);
1424
pieceTable.insert(3, '\r\n\n\n');
1425
str = str.substring(0, 3) + '\r\n\n\n' + str.substring(3);
1426
pieceTable.delete(4, 8);
1427
str = str.substring(0, 4) + str.substring(4 + 8);
1428
pieceTable.insert(4, '\r\n\n\r');
1429
str = str.substring(0, 4) + '\r\n\n\r' + str.substring(4);
1430
pieceTable.insert(0, '\r\n\n\r');
1431
str = str.substring(0, 0) + '\r\n\n\r' + str.substring(0);
1432
pieceTable.delete(4, 0);
1433
str = str.substring(0, 4) + str.substring(4 + 0);
1434
pieceTable.delete(8, 4);
1435
str = str.substring(0, 8) + str.substring(8 + 4);
1436
1437
testLinesContent(str, pieceTable);
1438
assertTreeInvariants(pieceTable);
1439
});
1440
1441
test('random bug 7', () => {
1442
let str = '\r\n\n\r';
1443
const pieceTree = createTextBuffer(['\r\n\n\r'], false);
1444
ds.add(pieceTree);
1445
const pieceTable = pieceTree.getPieceTree();
1446
1447
pieceTable.delete(1, 0);
1448
str = str.substring(0, 1) + str.substring(1 + 0);
1449
pieceTable.insert(3, '\n\n\n\r');
1450
str = str.substring(0, 3) + '\n\n\n\r' + str.substring(3);
1451
pieceTable.insert(7, '\n\n\r\n');
1452
str = str.substring(0, 7) + '\n\n\r\n' + str.substring(7);
1453
1454
testLinesContent(str, pieceTable);
1455
assertTreeInvariants(pieceTable);
1456
});
1457
1458
test('random bug 8', () => {
1459
let str = '\r\r\n\n';
1460
const pieceTree = createTextBuffer(['\r\r\n\n'], false);
1461
ds.add(pieceTree);
1462
const pieceTable = pieceTree.getPieceTree();
1463
1464
pieceTable.insert(4, '\r\n\n\r');
1465
str = str.substring(0, 4) + '\r\n\n\r' + str.substring(4);
1466
pieceTable.insert(7, '\n\r\r\r');
1467
str = str.substring(0, 7) + '\n\r\r\r' + str.substring(7);
1468
pieceTable.insert(11, '\n\n\r\n');
1469
str = str.substring(0, 11) + '\n\n\r\n' + str.substring(11);
1470
testLinesContent(str, pieceTable);
1471
assertTreeInvariants(pieceTable);
1472
});
1473
1474
test('random bug 9', () => {
1475
let str = 'qneW';
1476
const pieceTree = createTextBuffer(['qneW'], false);
1477
ds.add(pieceTree);
1478
const pieceTable = pieceTree.getPieceTree();
1479
1480
pieceTable.insert(0, 'YhIl');
1481
str = str.substring(0, 0) + 'YhIl' + str.substring(0);
1482
pieceTable.insert(0, 'qdsm');
1483
str = str.substring(0, 0) + 'qdsm' + str.substring(0);
1484
pieceTable.delete(7, 0);
1485
str = str.substring(0, 7) + str.substring(7 + 0);
1486
pieceTable.insert(12, 'iiPv');
1487
str = str.substring(0, 12) + 'iiPv' + str.substring(12);
1488
pieceTable.insert(9, 'V\rSA');
1489
str = str.substring(0, 9) + 'V\rSA' + str.substring(9);
1490
1491
testLinesContent(str, pieceTable);
1492
assertTreeInvariants(pieceTable);
1493
});
1494
1495
test('random bug 10', () => {
1496
let str = '\n\n\n\n';
1497
const pieceTree = createTextBuffer(['\n\n\n\n'], false);
1498
ds.add(pieceTree);
1499
const pieceTable = pieceTree.getPieceTree();
1500
1501
pieceTable.insert(3, '\n\r\n\r');
1502
str = str.substring(0, 3) + '\n\r\n\r' + str.substring(3);
1503
pieceTable.insert(2, '\n\r\n\n');
1504
str = str.substring(0, 2) + '\n\r\n\n' + str.substring(2);
1505
pieceTable.insert(0, '\n\n\r\r');
1506
str = str.substring(0, 0) + '\n\n\r\r' + str.substring(0);
1507
pieceTable.insert(3, '\r\r\r\r');
1508
str = str.substring(0, 3) + '\r\r\r\r' + str.substring(3);
1509
pieceTable.insert(3, '\n\n\r\r');
1510
str = str.substring(0, 3) + '\n\n\r\r' + str.substring(3);
1511
1512
testLinesContent(str, pieceTable);
1513
assertTreeInvariants(pieceTable);
1514
});
1515
1516
test('random chunk bug 1', () => {
1517
const pieceTree = createTextBuffer(['\n\r\r\n\n\n\r\n\r'], false);
1518
ds.add(pieceTree);
1519
const pieceTable = pieceTree.getPieceTree();
1520
1521
let str = '\n\r\r\n\n\n\r\n\r';
1522
pieceTable.delete(0, 2);
1523
str = str.substring(0, 0) + str.substring(0 + 2);
1524
pieceTable.insert(1, '\r\r\n\n');
1525
str = str.substring(0, 1) + '\r\r\n\n' + str.substring(1);
1526
pieceTable.insert(7, '\r\r\r\r');
1527
str = str.substring(0, 7) + '\r\r\r\r' + str.substring(7);
1528
1529
assert.strictEqual(pieceTable.getLinesRawContent(), str);
1530
testLineStarts(str, pieceTable);
1531
assertTreeInvariants(pieceTable);
1532
});
1533
1534
test('random chunk bug 2', () => {
1535
const pieceTree = createTextBuffer([
1536
'\n\r\n\n\n\r\n\r\n\r\r\n\n\n\r\r\n\r\n'
1537
], false);
1538
ds.add(pieceTree);
1539
const pieceTable = pieceTree.getPieceTree();
1540
let str = '\n\r\n\n\n\r\n\r\n\r\r\n\n\n\r\r\n\r\n';
1541
pieceTable.insert(16, '\r\n\r\r');
1542
str = str.substring(0, 16) + '\r\n\r\r' + str.substring(16);
1543
pieceTable.insert(13, '\n\n\r\r');
1544
str = str.substring(0, 13) + '\n\n\r\r' + str.substring(13);
1545
pieceTable.insert(19, '\n\n\r\n');
1546
str = str.substring(0, 19) + '\n\n\r\n' + str.substring(19);
1547
pieceTable.delete(5, 0);
1548
str = str.substring(0, 5) + str.substring(5 + 0);
1549
pieceTable.delete(11, 2);
1550
str = str.substring(0, 11) + str.substring(11 + 2);
1551
1552
assert.strictEqual(pieceTable.getLinesRawContent(), str);
1553
testLineStarts(str, pieceTable);
1554
assertTreeInvariants(pieceTable);
1555
});
1556
1557
test('random chunk bug 3', () => {
1558
const pieceTree = createTextBuffer(['\r\n\n\n\n\n\n\r\n'], false);
1559
ds.add(pieceTree);
1560
const pieceTable = pieceTree.getPieceTree();
1561
let str = '\r\n\n\n\n\n\n\r\n';
1562
pieceTable.insert(4, '\n\n\r\n\r\r\n\n\r');
1563
str = str.substring(0, 4) + '\n\n\r\n\r\r\n\n\r' + str.substring(4);
1564
pieceTable.delete(4, 4);
1565
str = str.substring(0, 4) + str.substring(4 + 4);
1566
pieceTable.insert(11, '\r\n\r\n\n\r\r\n\n');
1567
str = str.substring(0, 11) + '\r\n\r\n\n\r\r\n\n' + str.substring(11);
1568
pieceTable.delete(1, 2);
1569
str = str.substring(0, 1) + str.substring(1 + 2);
1570
1571
assert.strictEqual(pieceTable.getLinesRawContent(), str);
1572
testLineStarts(str, pieceTable);
1573
assertTreeInvariants(pieceTable);
1574
});
1575
1576
test('random chunk bug 4', () => {
1577
const pieceTree = createTextBuffer(['\n\r\n\r'], false);
1578
ds.add(pieceTree);
1579
const pieceTable = pieceTree.getPieceTree();
1580
let str = '\n\r\n\r';
1581
pieceTable.insert(4, '\n\n\r\n');
1582
str = str.substring(0, 4) + '\n\n\r\n' + str.substring(4);
1583
pieceTable.insert(3, '\r\n\n\n');
1584
str = str.substring(0, 3) + '\r\n\n\n' + str.substring(3);
1585
1586
assert.strictEqual(pieceTable.getLinesRawContent(), str);
1587
testLineStarts(str, pieceTable);
1588
assertTreeInvariants(pieceTable);
1589
});
1590
});
1591
1592
suite('random is unsupervised', () => {
1593
const ds = ensureNoDisposablesAreLeakedInTestSuite();
1594
1595
test('splitting large change buffer', function () {
1596
const pieceTree = createTextBuffer([''], false);
1597
ds.add(pieceTree);
1598
const pieceTable = pieceTree.getPieceTree();
1599
let str = '';
1600
1601
pieceTable.insert(0, 'WUZ\nXVZY\n');
1602
str = str.substring(0, 0) + 'WUZ\nXVZY\n' + str.substring(0);
1603
pieceTable.insert(8, '\r\r\nZXUWVW');
1604
str = str.substring(0, 8) + '\r\r\nZXUWVW' + str.substring(8);
1605
pieceTable.delete(10, 7);
1606
str = str.substring(0, 10) + str.substring(10 + 7);
1607
pieceTable.delete(10, 1);
1608
str = str.substring(0, 10) + str.substring(10 + 1);
1609
pieceTable.insert(4, 'VX\r\r\nWZVZ');
1610
str = str.substring(0, 4) + 'VX\r\r\nWZVZ' + str.substring(4);
1611
pieceTable.delete(11, 3);
1612
str = str.substring(0, 11) + str.substring(11 + 3);
1613
pieceTable.delete(12, 4);
1614
str = str.substring(0, 12) + str.substring(12 + 4);
1615
pieceTable.delete(8, 0);
1616
str = str.substring(0, 8) + str.substring(8 + 0);
1617
pieceTable.delete(10, 2);
1618
str = str.substring(0, 10) + str.substring(10 + 2);
1619
pieceTable.insert(0, 'VZXXZYZX\r');
1620
str = str.substring(0, 0) + 'VZXXZYZX\r' + str.substring(0);
1621
1622
assert.strictEqual(pieceTable.getLinesRawContent(), str);
1623
1624
testLineStarts(str, pieceTable);
1625
testLinesContent(str, pieceTable);
1626
assertTreeInvariants(pieceTable);
1627
});
1628
1629
test('random insert delete', function () {
1630
this.timeout(500000);
1631
let str = '';
1632
const pieceTree = createTextBuffer([str], false);
1633
ds.add(pieceTree);
1634
const pieceTable = pieceTree.getPieceTree();
1635
// let output = '';
1636
for (let i = 0; i < 1000; i++) {
1637
if (Math.random() < 0.6) {
1638
// insert
1639
const text = randomStr(100);
1640
const pos = randomInt(str.length + 1);
1641
pieceTable.insert(pos, text);
1642
str = str.substring(0, pos) + text + str.substring(pos);
1643
// output += `pieceTable.insert(${pos}, '${text.replace(/\n/g, '\\n').replace(/\r/g, '\\r')}');\n`;
1644
// output += `str = str.substring(0, ${pos}) + '${text.replace(/\n/g, '\\n').replace(/\r/g, '\\r')}' + str.substring(${pos});\n`;
1645
} else {
1646
// delete
1647
const pos = randomInt(str.length);
1648
const length = Math.min(
1649
str.length - pos,
1650
Math.floor(Math.random() * 10)
1651
);
1652
pieceTable.delete(pos, length);
1653
str = str.substring(0, pos) + str.substring(pos + length);
1654
// output += `pieceTable.delete(${pos}, ${length});\n`;
1655
// output += `str = str.substring(0, ${pos}) + str.substring(${pos} + ${length});\n`
1656
1657
}
1658
}
1659
// console.log(output);
1660
1661
assert.strictEqual(pieceTable.getLinesRawContent(), str);
1662
1663
testLineStarts(str, pieceTable);
1664
testLinesContent(str, pieceTable);
1665
assertTreeInvariants(pieceTable);
1666
});
1667
1668
test('random chunks', function () {
1669
this.timeout(500000);
1670
const chunks: string[] = [];
1671
for (let i = 0; i < 5; i++) {
1672
chunks.push(randomStr(1000));
1673
}
1674
1675
const pieceTree = createTextBuffer(chunks, false);
1676
ds.add(pieceTree);
1677
const pieceTable = pieceTree.getPieceTree();
1678
let str = chunks.join('');
1679
1680
for (let i = 0; i < 1000; i++) {
1681
if (Math.random() < 0.6) {
1682
// insert
1683
const text = randomStr(100);
1684
const pos = randomInt(str.length + 1);
1685
pieceTable.insert(pos, text);
1686
str = str.substring(0, pos) + text + str.substring(pos);
1687
} else {
1688
// delete
1689
const pos = randomInt(str.length);
1690
const length = Math.min(
1691
str.length - pos,
1692
Math.floor(Math.random() * 10)
1693
);
1694
pieceTable.delete(pos, length);
1695
str = str.substring(0, pos) + str.substring(pos + length);
1696
}
1697
}
1698
1699
assert.strictEqual(pieceTable.getLinesRawContent(), str);
1700
testLineStarts(str, pieceTable);
1701
testLinesContent(str, pieceTable);
1702
assertTreeInvariants(pieceTable);
1703
});
1704
1705
test('random chunks 2', function () {
1706
this.timeout(500000);
1707
const chunks: string[] = [];
1708
chunks.push(randomStr(1000));
1709
1710
const pieceTree = createTextBuffer(chunks, false);
1711
ds.add(pieceTree);
1712
const pieceTable = pieceTree.getPieceTree();
1713
let str = chunks.join('');
1714
1715
for (let i = 0; i < 50; i++) {
1716
if (Math.random() < 0.6) {
1717
// insert
1718
const text = randomStr(30);
1719
const pos = randomInt(str.length + 1);
1720
pieceTable.insert(pos, text);
1721
str = str.substring(0, pos) + text + str.substring(pos);
1722
} else {
1723
// delete
1724
const pos = randomInt(str.length);
1725
const length = Math.min(
1726
str.length - pos,
1727
Math.floor(Math.random() * 10)
1728
);
1729
pieceTable.delete(pos, length);
1730
str = str.substring(0, pos) + str.substring(pos + length);
1731
}
1732
testLinesContent(str, pieceTable);
1733
}
1734
1735
assert.strictEqual(pieceTable.getLinesRawContent(), str);
1736
testLineStarts(str, pieceTable);
1737
testLinesContent(str, pieceTable);
1738
assertTreeInvariants(pieceTable);
1739
});
1740
});
1741
1742
suite('buffer api', () => {
1743
const ds = ensureNoDisposablesAreLeakedInTestSuite();
1744
1745
test('equal', () => {
1746
const a = createTextBuffer(['abc']);
1747
const b = createTextBuffer(['ab', 'c']);
1748
const c = createTextBuffer(['abd']);
1749
const d = createTextBuffer(['abcd']);
1750
ds.add(a);
1751
ds.add(b);
1752
ds.add(c);
1753
ds.add(d);
1754
1755
assert(a.getPieceTree().equal(b.getPieceTree()));
1756
assert(!a.getPieceTree().equal(c.getPieceTree()));
1757
assert(!a.getPieceTree().equal(d.getPieceTree()));
1758
});
1759
1760
test('equal with more chunks', () => {
1761
const a = createTextBuffer(['ab', 'cd', 'e']);
1762
const b = createTextBuffer(['ab', 'c', 'de']);
1763
ds.add(a);
1764
ds.add(b);
1765
assert(a.getPieceTree().equal(b.getPieceTree()));
1766
});
1767
1768
test('equal 2, empty buffer', () => {
1769
const a = createTextBuffer(['']);
1770
const b = createTextBuffer(['']);
1771
ds.add(a);
1772
ds.add(b);
1773
1774
assert(a.getPieceTree().equal(b.getPieceTree()));
1775
});
1776
1777
test('equal 3, empty buffer', () => {
1778
const a = createTextBuffer(['a']);
1779
const b = createTextBuffer(['']);
1780
ds.add(a);
1781
ds.add(b);
1782
1783
assert(!a.getPieceTree().equal(b.getPieceTree()));
1784
});
1785
1786
test('getLineCharCode - issue #45735', () => {
1787
const pieceTree = createTextBuffer(['LINE1\nline2']);
1788
ds.add(pieceTree);
1789
const pieceTable = pieceTree.getPieceTree();
1790
assert.strictEqual(pieceTable.getLineCharCode(1, 0), 'L'.charCodeAt(0), 'L');
1791
assert.strictEqual(pieceTable.getLineCharCode(1, 1), 'I'.charCodeAt(0), 'I');
1792
assert.strictEqual(pieceTable.getLineCharCode(1, 2), 'N'.charCodeAt(0), 'N');
1793
assert.strictEqual(pieceTable.getLineCharCode(1, 3), 'E'.charCodeAt(0), 'E');
1794
assert.strictEqual(pieceTable.getLineCharCode(1, 4), '1'.charCodeAt(0), '1');
1795
assert.strictEqual(pieceTable.getLineCharCode(1, 5), '\n'.charCodeAt(0), '\\n');
1796
assert.strictEqual(pieceTable.getLineCharCode(2, 0), 'l'.charCodeAt(0), 'l');
1797
assert.strictEqual(pieceTable.getLineCharCode(2, 1), 'i'.charCodeAt(0), 'i');
1798
assert.strictEqual(pieceTable.getLineCharCode(2, 2), 'n'.charCodeAt(0), 'n');
1799
assert.strictEqual(pieceTable.getLineCharCode(2, 3), 'e'.charCodeAt(0), 'e');
1800
assert.strictEqual(pieceTable.getLineCharCode(2, 4), '2'.charCodeAt(0), '2');
1801
});
1802
1803
1804
test('getLineCharCode - issue #47733', () => {
1805
const pieceTree = createTextBuffer(['', 'LINE1\n', 'line2']);
1806
ds.add(pieceTree);
1807
const pieceTable = pieceTree.getPieceTree();
1808
assert.strictEqual(pieceTable.getLineCharCode(1, 0), 'L'.charCodeAt(0), 'L');
1809
assert.strictEqual(pieceTable.getLineCharCode(1, 1), 'I'.charCodeAt(0), 'I');
1810
assert.strictEqual(pieceTable.getLineCharCode(1, 2), 'N'.charCodeAt(0), 'N');
1811
assert.strictEqual(pieceTable.getLineCharCode(1, 3), 'E'.charCodeAt(0), 'E');
1812
assert.strictEqual(pieceTable.getLineCharCode(1, 4), '1'.charCodeAt(0), '1');
1813
assert.strictEqual(pieceTable.getLineCharCode(1, 5), '\n'.charCodeAt(0), '\\n');
1814
assert.strictEqual(pieceTable.getLineCharCode(2, 0), 'l'.charCodeAt(0), 'l');
1815
assert.strictEqual(pieceTable.getLineCharCode(2, 1), 'i'.charCodeAt(0), 'i');
1816
assert.strictEqual(pieceTable.getLineCharCode(2, 2), 'n'.charCodeAt(0), 'n');
1817
assert.strictEqual(pieceTable.getLineCharCode(2, 3), 'e'.charCodeAt(0), 'e');
1818
assert.strictEqual(pieceTable.getLineCharCode(2, 4), '2'.charCodeAt(0), '2');
1819
});
1820
1821
test('getNearestChunk', () => {
1822
const pieceTree = createTextBuffer(['012345678']);
1823
ds.add(pieceTree);
1824
const pt = pieceTree.getPieceTree();
1825
1826
pt.insert(3, 'ABC');
1827
assert.equal(pt.getLineContent(1), '012ABC345678');
1828
assert.equal(pt.getNearestChunk(3), 'ABC');
1829
assert.equal(pt.getNearestChunk(6), '345678');
1830
1831
pt.delete(9, 1);
1832
assert.equal(pt.getLineContent(1), '012ABC34578');
1833
assert.equal(pt.getNearestChunk(6), '345');
1834
assert.equal(pt.getNearestChunk(9), '78');
1835
});
1836
});
1837
1838
suite('search offset cache', () => {
1839
const ds = ensureNoDisposablesAreLeakedInTestSuite();
1840
1841
test('render white space exception', () => {
1842
const pieceTree = createTextBuffer(['class Name{\n\t\n\t\t\tget() {\n\n\t\t\t}\n\t\t}']);
1843
ds.add(pieceTree);
1844
const pieceTable = pieceTree.getPieceTree();
1845
let str = 'class Name{\n\t\n\t\t\tget() {\n\n\t\t\t}\n\t\t}';
1846
1847
pieceTable.insert(12, 's');
1848
str = str.substring(0, 12) + 's' + str.substring(12);
1849
1850
pieceTable.insert(13, 'e');
1851
str = str.substring(0, 13) + 'e' + str.substring(13);
1852
1853
pieceTable.insert(14, 't');
1854
str = str.substring(0, 14) + 't' + str.substring(14);
1855
1856
pieceTable.insert(15, '()');
1857
str = str.substring(0, 15) + '()' + str.substring(15);
1858
1859
pieceTable.delete(16, 1);
1860
str = str.substring(0, 16) + str.substring(16 + 1);
1861
1862
pieceTable.insert(17, '()');
1863
str = str.substring(0, 17) + '()' + str.substring(17);
1864
1865
pieceTable.delete(18, 1);
1866
str = str.substring(0, 18) + str.substring(18 + 1);
1867
1868
pieceTable.insert(18, '}');
1869
str = str.substring(0, 18) + '}' + str.substring(18);
1870
1871
pieceTable.insert(12, '\n');
1872
str = str.substring(0, 12) + '\n' + str.substring(12);
1873
1874
pieceTable.delete(12, 1);
1875
str = str.substring(0, 12) + str.substring(12 + 1);
1876
1877
pieceTable.delete(18, 1);
1878
str = str.substring(0, 18) + str.substring(18 + 1);
1879
1880
pieceTable.insert(18, '}');
1881
str = str.substring(0, 18) + '}' + str.substring(18);
1882
1883
pieceTable.delete(17, 2);
1884
str = str.substring(0, 17) + str.substring(17 + 2);
1885
1886
pieceTable.delete(16, 1);
1887
str = str.substring(0, 16) + str.substring(16 + 1);
1888
1889
pieceTable.insert(16, ')');
1890
str = str.substring(0, 16) + ')' + str.substring(16);
1891
1892
pieceTable.delete(15, 2);
1893
str = str.substring(0, 15) + str.substring(15 + 2);
1894
1895
const content = pieceTable.getLinesRawContent();
1896
assert(content === str);
1897
});
1898
1899
test('Line breaks replacement is not necessary when EOL is normalized', () => {
1900
const pieceTree = createTextBuffer(['abc']);
1901
ds.add(pieceTree);
1902
const pieceTable = pieceTree.getPieceTree();
1903
let str = 'abc';
1904
1905
pieceTable.insert(3, 'def\nabc');
1906
str = str + 'def\nabc';
1907
1908
testLineStarts(str, pieceTable);
1909
testLinesContent(str, pieceTable);
1910
assertTreeInvariants(pieceTable);
1911
});
1912
1913
test('Line breaks replacement is not necessary when EOL is normalized 2', () => {
1914
const pieceTree = createTextBuffer(['abc\n']);
1915
ds.add(pieceTree);
1916
const pieceTable = pieceTree.getPieceTree();
1917
let str = 'abc\n';
1918
1919
pieceTable.insert(4, 'def\nabc');
1920
str = str + 'def\nabc';
1921
1922
testLineStarts(str, pieceTable);
1923
testLinesContent(str, pieceTable);
1924
assertTreeInvariants(pieceTable);
1925
});
1926
1927
test('Line breaks replacement is not necessary when EOL is normalized 3', () => {
1928
const pieceTree = createTextBuffer(['abc\n']);
1929
ds.add(pieceTree);
1930
const pieceTable = pieceTree.getPieceTree();
1931
let str = 'abc\n';
1932
1933
pieceTable.insert(2, 'def\nabc');
1934
str = str.substring(0, 2) + 'def\nabc' + str.substring(2);
1935
1936
testLineStarts(str, pieceTable);
1937
testLinesContent(str, pieceTable);
1938
assertTreeInvariants(pieceTable);
1939
});
1940
1941
test('Line breaks replacement is not necessary when EOL is normalized 4', () => {
1942
const pieceTree = createTextBuffer(['abc\n']);
1943
ds.add(pieceTree);
1944
const pieceTable = pieceTree.getPieceTree();
1945
let str = 'abc\n';
1946
1947
pieceTable.insert(3, 'def\nabc');
1948
str = str.substring(0, 3) + 'def\nabc' + str.substring(3);
1949
1950
testLineStarts(str, pieceTable);
1951
testLinesContent(str, pieceTable);
1952
assertTreeInvariants(pieceTable);
1953
});
1954
1955
});
1956
1957
function getValueInSnapshot(snapshot: ITextSnapshot) {
1958
let ret = '';
1959
let tmp = snapshot.read();
1960
1961
while (tmp !== null) {
1962
ret += tmp;
1963
tmp = snapshot.read();
1964
}
1965
1966
return ret;
1967
}
1968
suite('snapshot', () => {
1969
ensureNoDisposablesAreLeakedInTestSuite();
1970
1971
test('bug #45564, piece tree pieces should be immutable', () => {
1972
const model = createTextModel('\n');
1973
model.applyEdits([
1974
{
1975
range: new Range(2, 1, 2, 1),
1976
text: '!'
1977
}
1978
]);
1979
const snapshot = model.createSnapshot();
1980
const snapshot1 = model.createSnapshot();
1981
assert.strictEqual(model.getLinesContent().join('\n'), getValueInSnapshot(snapshot));
1982
1983
model.applyEdits([
1984
{
1985
range: new Range(2, 1, 2, 2),
1986
text: ''
1987
}
1988
]);
1989
model.applyEdits([
1990
{
1991
range: new Range(2, 1, 2, 1),
1992
text: '!'
1993
}
1994
]);
1995
1996
assert.strictEqual(model.getLinesContent().join('\n'), getValueInSnapshot(snapshot1));
1997
1998
model.dispose();
1999
});
2000
2001
test('immutable snapshot 1', () => {
2002
const model = createTextModel('abc\ndef');
2003
const snapshot = model.createSnapshot();
2004
model.applyEdits([
2005
{
2006
range: new Range(2, 1, 2, 4),
2007
text: ''
2008
}
2009
]);
2010
2011
model.applyEdits([
2012
{
2013
range: new Range(1, 1, 2, 1),
2014
text: 'abc\ndef'
2015
}
2016
]);
2017
2018
assert.strictEqual(model.getLinesContent().join('\n'), getValueInSnapshot(snapshot));
2019
2020
model.dispose();
2021
});
2022
2023
test('immutable snapshot 2', () => {
2024
const model = createTextModel('abc\ndef');
2025
const snapshot = model.createSnapshot();
2026
model.applyEdits([
2027
{
2028
range: new Range(2, 1, 2, 1),
2029
text: '!'
2030
}
2031
]);
2032
2033
model.applyEdits([
2034
{
2035
range: new Range(2, 1, 2, 2),
2036
text: ''
2037
}
2038
]);
2039
2040
assert.strictEqual(model.getLinesContent().join('\n'), getValueInSnapshot(snapshot));
2041
2042
model.dispose();
2043
});
2044
2045
test('immutable snapshot 3', () => {
2046
const model = createTextModel('abc\ndef');
2047
model.applyEdits([
2048
{
2049
range: new Range(2, 4, 2, 4),
2050
text: '!'
2051
}
2052
]);
2053
const snapshot = model.createSnapshot();
2054
model.applyEdits([
2055
{
2056
range: new Range(2, 5, 2, 5),
2057
text: '!'
2058
}
2059
]);
2060
2061
assert.notStrictEqual(model.getLinesContent().join('\n'), getValueInSnapshot(snapshot));
2062
2063
model.dispose();
2064
});
2065
});
2066
2067
suite('chunk based search', () => {
2068
const ds = ensureNoDisposablesAreLeakedInTestSuite();
2069
2070
test('#45892. For some cases, the buffer is empty but we still try to search', () => {
2071
const pieceTree = createTextBuffer(['']);
2072
ds.add(pieceTree);
2073
const pieceTable = pieceTree.getPieceTree();
2074
pieceTable.delete(0, 1);
2075
const ret = pieceTree.findMatchesLineByLine(new Range(1, 1, 1, 1), new SearchData(/abc/, new WordCharacterClassifier(',./', []), 'abc'), true, 1000);
2076
assert.strictEqual(ret.length, 0);
2077
});
2078
2079
test('#45770. FindInNode should not cross node boundary.', () => {
2080
const pieceTree = createTextBuffer([
2081
[
2082
'balabalababalabalababalabalaba',
2083
'balabalababalabalababalabalaba',
2084
'',
2085
'* [ ] task1',
2086
'* [x] task2 balabalaba',
2087
'* [ ] task 3'
2088
].join('\n')
2089
]);
2090
ds.add(pieceTree);
2091
const pieceTable = pieceTree.getPieceTree();
2092
2093
pieceTable.delete(0, 62);
2094
pieceTable.delete(16, 1);
2095
2096
pieceTable.insert(16, ' ');
2097
const ret = pieceTable.findMatchesLineByLine(new Range(1, 1, 4, 13), new SearchData(/\[/gi, new WordCharacterClassifier(',./', []), '['), true, 1000);
2098
assert.strictEqual(ret.length, 3);
2099
2100
assert.deepStrictEqual(ret[0].range, new Range(2, 3, 2, 4));
2101
assert.deepStrictEqual(ret[1].range, new Range(3, 3, 3, 4));
2102
assert.deepStrictEqual(ret[2].range, new Range(4, 3, 4, 4));
2103
});
2104
2105
test('search searching from the middle', () => {
2106
const pieceTree = createTextBuffer([
2107
[
2108
'def',
2109
'dbcabc'
2110
].join('\n')
2111
]);
2112
ds.add(pieceTree);
2113
const pieceTable = pieceTree.getPieceTree();
2114
2115
pieceTable.delete(4, 1);
2116
let ret = pieceTable.findMatchesLineByLine(new Range(2, 3, 2, 6), new SearchData(/a/gi, null, 'a'), true, 1000);
2117
assert.strictEqual(ret.length, 1);
2118
assert.deepStrictEqual(ret[0].range, new Range(2, 3, 2, 4));
2119
2120
pieceTable.delete(4, 1);
2121
ret = pieceTable.findMatchesLineByLine(new Range(2, 2, 2, 5), new SearchData(/a/gi, null, 'a'), true, 1000);
2122
assert.strictEqual(ret.length, 1);
2123
assert.deepStrictEqual(ret[0].range, new Range(2, 2, 2, 3));
2124
});
2125
});
2126
2127