Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/git-base/src/test/foldingProvider.test.ts
4774 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 'mocha';
7
import * as assert from 'assert';
8
import * as vscode from 'vscode';
9
import { GitCommitFoldingProvider } from '../foldingProvider';
10
11
suite('GitCommitFoldingProvider', () => {
12
13
function createMockDocument(content: string): vscode.TextDocument {
14
const lines = content.split('\n');
15
return {
16
lineCount: lines.length,
17
lineAt: (index: number) => ({
18
text: lines[index] || '',
19
lineNumber: index
20
}),
21
} as vscode.TextDocument;
22
}
23
24
const mockContext: vscode.FoldingContext = {} as vscode.FoldingContext;
25
const mockToken: vscode.CancellationToken = { isCancellationRequested: false } as vscode.CancellationToken;
26
27
test('empty document returns no folding ranges', () => {
28
const provider = new GitCommitFoldingProvider();
29
const doc = createMockDocument('');
30
const ranges = provider.provideFoldingRanges(doc, mockContext, mockToken);
31
32
assert.strictEqual(Array.isArray(ranges) ? ranges.length : 0, 0);
33
});
34
35
test('single line document returns no folding ranges', () => {
36
const provider = new GitCommitFoldingProvider();
37
const doc = createMockDocument('commit message');
38
const ranges = provider.provideFoldingRanges(doc, mockContext, mockToken);
39
40
assert.strictEqual(Array.isArray(ranges) ? ranges.length : 0, 0);
41
});
42
43
test('single comment line returns no folding ranges', () => {
44
const provider = new GitCommitFoldingProvider();
45
const doc = createMockDocument('# Comment');
46
const ranges = provider.provideFoldingRanges(doc, mockContext, mockToken);
47
48
assert.strictEqual(Array.isArray(ranges) ? ranges.length : 0, 0);
49
});
50
51
test('two comment lines create one folding range', () => {
52
const provider = new GitCommitFoldingProvider();
53
const content = '# Comment 1\n# Comment 2';
54
const doc = createMockDocument(content);
55
const ranges = provider.provideFoldingRanges(doc, mockContext, mockToken) as vscode.FoldingRange[];
56
57
assert.strictEqual(ranges.length, 1);
58
assert.strictEqual(ranges[0].start, 0);
59
assert.strictEqual(ranges[0].end, 1);
60
assert.strictEqual(ranges[0].kind, vscode.FoldingRangeKind.Comment);
61
});
62
63
test('multiple comment lines create one folding range', () => {
64
const provider = new GitCommitFoldingProvider();
65
const content = '# Comment 1\n# Comment 2\n# Comment 3\n# Comment 4';
66
const doc = createMockDocument(content);
67
const ranges = provider.provideFoldingRanges(doc, mockContext, mockToken) as vscode.FoldingRange[];
68
69
assert.strictEqual(ranges.length, 1);
70
assert.strictEqual(ranges[0].start, 0);
71
assert.strictEqual(ranges[0].end, 3);
72
assert.strictEqual(ranges[0].kind, vscode.FoldingRangeKind.Comment);
73
});
74
75
test('comment block followed by content', () => {
76
const provider = new GitCommitFoldingProvider();
77
const content = '# Comment 1\n# Comment 2\nCommit message';
78
const doc = createMockDocument(content);
79
const ranges = provider.provideFoldingRanges(doc, mockContext, mockToken) as vscode.FoldingRange[];
80
81
assert.strictEqual(ranges.length, 1);
82
assert.strictEqual(ranges[0].start, 0);
83
assert.strictEqual(ranges[0].end, 1);
84
assert.strictEqual(ranges[0].kind, vscode.FoldingRangeKind.Comment);
85
});
86
87
test('comment block at end of document', () => {
88
const provider = new GitCommitFoldingProvider();
89
const content = 'Commit message\n\n# Comment 1\n# Comment 2';
90
const doc = createMockDocument(content);
91
const ranges = provider.provideFoldingRanges(doc, mockContext, mockToken) as vscode.FoldingRange[];
92
93
assert.strictEqual(ranges.length, 1);
94
assert.strictEqual(ranges[0].start, 2);
95
assert.strictEqual(ranges[0].end, 3);
96
assert.strictEqual(ranges[0].kind, vscode.FoldingRangeKind.Comment);
97
});
98
99
test('multiple separated comment blocks', () => {
100
const provider = new GitCommitFoldingProvider();
101
const content = '# Comment 1\n# Comment 2\n\nCommit message\n\n# Comment 3\n# Comment 4';
102
const doc = createMockDocument(content);
103
const ranges = provider.provideFoldingRanges(doc, mockContext, mockToken) as vscode.FoldingRange[];
104
105
assert.strictEqual(ranges.length, 2);
106
assert.strictEqual(ranges[0].start, 0);
107
assert.strictEqual(ranges[0].end, 1);
108
assert.strictEqual(ranges[0].kind, vscode.FoldingRangeKind.Comment);
109
assert.strictEqual(ranges[1].start, 5);
110
assert.strictEqual(ranges[1].end, 6);
111
assert.strictEqual(ranges[1].kind, vscode.FoldingRangeKind.Comment);
112
});
113
114
test('single diff line returns no folding ranges', () => {
115
const provider = new GitCommitFoldingProvider();
116
const doc = createMockDocument('diff --git a/file.txt b/file.txt');
117
const ranges = provider.provideFoldingRanges(doc, mockContext, mockToken);
118
119
assert.strictEqual(Array.isArray(ranges) ? ranges.length : 0, 0);
120
});
121
122
test('diff block with content creates folding range', () => {
123
const provider = new GitCommitFoldingProvider();
124
const content = 'diff --git a/file.txt b/file.txt\nindex 1234..5678\n--- a/file.txt\n+++ b/file.txt';
125
const doc = createMockDocument(content);
126
const ranges = provider.provideFoldingRanges(doc, mockContext, mockToken) as vscode.FoldingRange[];
127
128
assert.strictEqual(ranges.length, 1);
129
assert.strictEqual(ranges[0].start, 0);
130
assert.strictEqual(ranges[0].end, 3);
131
assert.strictEqual(ranges[0].kind, undefined); // Diff blocks don't have a specific kind
132
});
133
134
test('multiple diff blocks', () => {
135
const provider = new GitCommitFoldingProvider();
136
const content = [
137
'diff --git a/file1.txt b/file1.txt',
138
'--- a/file1.txt',
139
'+++ b/file1.txt',
140
'diff --git a/file2.txt b/file2.txt',
141
'--- a/file2.txt',
142
'+++ b/file2.txt'
143
].join('\n');
144
const doc = createMockDocument(content);
145
const ranges = provider.provideFoldingRanges(doc, mockContext, mockToken) as vscode.FoldingRange[];
146
147
assert.strictEqual(ranges.length, 2);
148
assert.strictEqual(ranges[0].start, 0);
149
assert.strictEqual(ranges[0].end, 2);
150
assert.strictEqual(ranges[1].start, 3);
151
assert.strictEqual(ranges[1].end, 5);
152
});
153
154
test('diff block at end of document', () => {
155
const provider = new GitCommitFoldingProvider();
156
const content = [
157
'Commit message',
158
'',
159
'diff --git a/file.txt b/file.txt',
160
'--- a/file.txt',
161
'+++ b/file.txt'
162
].join('\n');
163
const doc = createMockDocument(content);
164
const ranges = provider.provideFoldingRanges(doc, mockContext, mockToken) as vscode.FoldingRange[];
165
166
assert.strictEqual(ranges.length, 1);
167
assert.strictEqual(ranges[0].start, 2);
168
assert.strictEqual(ranges[0].end, 4);
169
});
170
171
test('realistic git commit message with comments and verbose diff', () => {
172
const provider = new GitCommitFoldingProvider();
173
const content = [
174
'Add folding support for git commit messages',
175
'',
176
'# Please enter the commit message for your changes. Lines starting',
177
'# with \'#\' will be ignored, and an empty message aborts the commit.',
178
'#',
179
'# On branch main',
180
'# Changes to be committed:',
181
'#\tmodified: extension.ts',
182
'#\tnew file: foldingProvider.ts',
183
'#',
184
'# ------------------------ >8 ------------------------',
185
'# Do not modify or remove the line above.',
186
'# Everything below it will be ignored.',
187
'diff --git a/extensions/git-base/src/extension.ts b/extensions/git-base/src/extension.ts',
188
'index 17ffb89..453d8f7 100644',
189
'--- a/extensions/git-base/src/extension.ts',
190
'+++ b/extensions/git-base/src/extension.ts',
191
'@@ -3,14 +3,20 @@',
192
' * Licensed under the MIT License.',
193
'-import { ExtensionContext } from \'vscode\';',
194
'+import { ExtensionContext, languages } from \'vscode\';',
195
'diff --git a/extensions/git-base/src/foldingProvider.ts b/extensions/git-base/src/foldingProvider.ts',
196
'new file mode 100644',
197
'index 0000000..2c4a9c3',
198
'--- /dev/null',
199
'+++ b/extensions/git-base/src/foldingProvider.ts'
200
].join('\n');
201
const doc = createMockDocument(content);
202
const ranges = provider.provideFoldingRanges(doc, mockContext, mockToken) as vscode.FoldingRange[];
203
204
// Should have one comment block and two diff blocks
205
assert.strictEqual(ranges.length, 3);
206
207
// Comment block (lines 2-12)
208
assert.strictEqual(ranges[0].start, 2);
209
assert.strictEqual(ranges[0].end, 12);
210
assert.strictEqual(ranges[0].kind, vscode.FoldingRangeKind.Comment);
211
212
// First diff block (lines 13-20)
213
assert.strictEqual(ranges[1].start, 13);
214
assert.strictEqual(ranges[1].end, 20);
215
assert.strictEqual(ranges[1].kind, undefined);
216
217
// Second diff block (lines 21-25)
218
assert.strictEqual(ranges[2].start, 21);
219
assert.strictEqual(ranges[2].end, 25);
220
assert.strictEqual(ranges[2].kind, undefined);
221
});
222
223
test('mixed comment and diff content', () => {
224
const provider = new GitCommitFoldingProvider();
225
const content = [
226
'Fix bug in parser',
227
'',
228
'# Comment 1',
229
'# Comment 2',
230
'',
231
'diff --git a/file.txt b/file.txt',
232
'--- a/file.txt',
233
'+++ b/file.txt',
234
'',
235
'# Comment 3',
236
'# Comment 4'
237
].join('\n');
238
const doc = createMockDocument(content);
239
const ranges = provider.provideFoldingRanges(doc, mockContext, mockToken) as vscode.FoldingRange[];
240
241
assert.strictEqual(ranges.length, 3);
242
243
// First comment block
244
assert.strictEqual(ranges[0].start, 2);
245
assert.strictEqual(ranges[0].end, 3);
246
assert.strictEqual(ranges[0].kind, vscode.FoldingRangeKind.Comment);
247
248
// Diff block
249
assert.strictEqual(ranges[1].start, 5);
250
assert.strictEqual(ranges[1].end, 8);
251
assert.strictEqual(ranges[1].kind, undefined);
252
253
// Second comment block
254
assert.strictEqual(ranges[2].start, 9);
255
assert.strictEqual(ranges[2].end, 10);
256
assert.strictEqual(ranges[2].kind, vscode.FoldingRangeKind.Comment);
257
});
258
});
259
260