Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/contrib/folding/test/browser/syntaxFold.test.ts
4780 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
import assert from 'assert';
6
import { CancellationToken } from '../../../../../base/common/cancellation.js';
7
import { ITextModel } from '../../../../common/model.js';
8
import { FoldingContext, FoldingRange, FoldingRangeProvider, ProviderResult } from '../../../../common/languages.js';
9
import { SyntaxRangeProvider } from '../../browser/syntaxRangeProvider.js';
10
import { createTextModel } from '../../../../test/common/testTextModel.js';
11
import { FoldingLimitReporter } from '../../browser/folding.js';
12
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
13
14
interface IndentRange {
15
start: number;
16
end: number;
17
}
18
19
class TestFoldingRangeProvider implements FoldingRangeProvider {
20
constructor(private model: ITextModel, private ranges: IndentRange[]) {
21
}
22
23
provideFoldingRanges(model: ITextModel, context: FoldingContext, token: CancellationToken): ProviderResult<FoldingRange[]> {
24
if (model === this.model) {
25
return this.ranges;
26
}
27
return null;
28
}
29
}
30
31
suite('Syntax folding', () => {
32
ensureNoDisposablesAreLeakedInTestSuite();
33
34
function r(start: number, end: number): IndentRange {
35
return { start, end };
36
}
37
38
test('Limit by nesting level', async () => {
39
const lines = [
40
/* 1*/ '{',
41
/* 2*/ ' A',
42
/* 3*/ ' {',
43
/* 4*/ ' {',
44
/* 5*/ ' B',
45
/* 6*/ ' }',
46
/* 7*/ ' {',
47
/* 8*/ ' A',
48
/* 9*/ ' {',
49
/* 10*/ ' A',
50
/* 11*/ ' }',
51
/* 12*/ ' {',
52
/* 13*/ ' {',
53
/* 14*/ ' {',
54
/* 15*/ ' A',
55
/* 16*/ ' }',
56
/* 17*/ ' }',
57
/* 18*/ ' }',
58
/* 19*/ ' }',
59
/* 20*/ ' }',
60
/* 21*/ '}',
61
/* 22*/ '{',
62
/* 23*/ ' A',
63
/* 24*/ '}',
64
];
65
66
const r1 = r(1, 20); //0
67
const r2 = r(3, 19); //1
68
const r3 = r(4, 5); //2
69
const r4 = r(7, 18); //2
70
const r5 = r(9, 10); //3
71
const r6 = r(12, 17); //4
72
const r7 = r(13, 16); //5
73
const r8 = r(14, 15); //6
74
const r9 = r(22, 23); //0
75
76
const model = createTextModel(lines.join('\n'));
77
const ranges = [r1, r2, r3, r4, r5, r6, r7, r8, r9];
78
const providers = [new TestFoldingRangeProvider(model, ranges)];
79
80
async function assertLimit(maxEntries: number, expectedRanges: IndentRange[], message: string) {
81
let reported: number | false = false;
82
const foldingRangesLimit: FoldingLimitReporter = { limit: maxEntries, update: (computed, limited) => reported = limited };
83
const syntaxRangeProvider = new SyntaxRangeProvider(model, providers, () => { }, foldingRangesLimit, undefined);
84
try {
85
const indentRanges = await syntaxRangeProvider.compute(CancellationToken.None);
86
const actual: IndentRange[] = [];
87
if (indentRanges) {
88
for (let i = 0; i < indentRanges.length; i++) {
89
actual.push({ start: indentRanges.getStartLineNumber(i), end: indentRanges.getEndLineNumber(i) });
90
}
91
assert.equal(reported, 9 <= maxEntries ? false : maxEntries, 'limited');
92
}
93
assert.deepStrictEqual(actual, expectedRanges, message);
94
} finally {
95
syntaxRangeProvider.dispose();
96
}
97
98
}
99
100
await assertLimit(1000, [r1, r2, r3, r4, r5, r6, r7, r8, r9], '1000');
101
await assertLimit(9, [r1, r2, r3, r4, r5, r6, r7, r8, r9], '9');
102
await assertLimit(8, [r1, r2, r3, r4, r5, r6, r7, r9], '8');
103
await assertLimit(7, [r1, r2, r3, r4, r5, r6, r9], '7');
104
await assertLimit(6, [r1, r2, r3, r4, r5, r9], '6');
105
await assertLimit(5, [r1, r2, r3, r4, r9], '5');
106
await assertLimit(4, [r1, r2, r3, r9], '4');
107
await assertLimit(3, [r1, r2, r9], '3');
108
await assertLimit(2, [r1, r9], '2');
109
await assertLimit(1, [r1], '1');
110
await assertLimit(0, [], '0');
111
112
model.dispose();
113
});
114
});
115
116