Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/contrib/quickAccess/test/browser/gotoLineQuickAccess.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
6
import assert from 'assert';
7
import { Event } from '../../../../../base/common/event.js';
8
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
9
import { IEditor } from '../../../../common/editorCommon.js';
10
import { withTestCodeEditor } from '../../../../test/browser/testCodeEditor.js';
11
import { AbstractGotoLineQuickAccessProvider } from '../../browser/gotoLineQuickAccess.js';
12
import { IStorageService } from '../../../../../platform/storage/common/storage.js';
13
14
class TestGotoLineQuickAccessProvider extends AbstractGotoLineQuickAccessProvider {
15
protected override onDidActiveTextEditorControlChange = Event.None;
16
protected override activeTextEditorControl: IEditor | undefined;
17
constructor(private zeroBased: boolean) {
18
super();
19
}
20
protected override readonly storageService = {
21
getBoolean: () => this.zeroBased,
22
store: () => { }
23
} as unknown as IStorageService;
24
25
public parsePositionTest(editor: IEditor, value: string) {
26
return super.parsePosition(editor, value);
27
}
28
}
29
30
suite('AbstractGotoLineQuickAccessProvider', () => {
31
ensureNoDisposablesAreLeakedInTestSuite();
32
33
function runTest(input: string, expectedLine: number, expectedColumn?: number, zeroBased = false) {
34
const provider = new TestGotoLineQuickAccessProvider(zeroBased);
35
withTestCodeEditor([
36
'line 1',
37
'line 2',
38
'line 3',
39
'line 4',
40
'line 5'
41
], {}, (editor, _) => {
42
const { lineNumber, column } = provider.parsePositionTest(editor, input);
43
assert.strictEqual(lineNumber, expectedLine);
44
assert.strictEqual(column, expectedColumn ?? 1);
45
});
46
}
47
48
test('parsePosition works as expected', () => {
49
// :line
50
runTest('-100', 1);
51
runTest('-5', 1);
52
runTest('-1', 5);
53
runTest('0', 1);
54
runTest('1', 1);
55
runTest('2', 2);
56
runTest('5', 5);
57
runTest('6', 5);
58
runTest('7', 5);
59
runTest('100', 5);
60
61
// :line,column
62
runTest('2:-100', 2, 1);
63
runTest('2:-5', 2, 2);
64
runTest('2:-1', 2, 6);
65
runTest('2:0', 2, 1);
66
runTest('2:1', 2, 1);
67
runTest('2:2', 2, 2);
68
runTest('2:6', 2, 6);
69
runTest('2:7', 2, 7);
70
runTest('2:8', 2, 7);
71
runTest('2:100', 2, 7);
72
73
// ::offset (1-based)
74
runTest(':-1000', 1, 1);
75
runTest(':-10', 4, 5);
76
runTest(':-1', 5, 7);
77
runTest(':0', 1, 1);
78
runTest(':1', 1, 1);
79
runTest(':10', 2, 3);
80
runTest(':1000', 5, 7);
81
82
// offset (0-based)
83
runTest(':-1000', 1, 1, true);
84
runTest(':-10', 4, 4, true);
85
runTest(':-1', 5, 6, true);
86
runTest(':0', 1, 1, true);
87
runTest(':1', 1, 2, true);
88
runTest(':10', 2, 4, true);
89
runTest(':1000', 5, 7, true);
90
91
// :line#column
92
// :line,column
93
// spaces
94
runTest('-1#6', 5, 6);
95
runTest('2,4', 2, 4);
96
runTest(' 2 : 3 ', 2, 3);
97
});
98
99
function runTabTest(input: string, expectedLine: number, expectedColumn?: number, zeroBased = false) {
100
const provider = new TestGotoLineQuickAccessProvider(zeroBased);
101
withTestCodeEditor([
102
'\tline 1',
103
'\t\tline 2',
104
'\tline 3'
105
], {}, (editor, _) => {
106
const { lineNumber, column } = provider.parsePositionTest(editor, input);
107
assert.strictEqual(lineNumber, expectedLine);
108
assert.strictEqual(column, expectedColumn ?? 1);
109
});
110
}
111
112
test('parsePosition works with tabs', () => {
113
// :line,column
114
runTabTest('1:1', 1, 1);
115
runTabTest('1:2', 1, 1);
116
runTabTest('1:3', 1, 1);
117
runTabTest('1:4', 1, 2);
118
runTabTest('1:5', 1, 2);
119
runTabTest('1:6', 1, 3);
120
runTabTest('1:11', 1, 8);
121
runTabTest('1:12', 1, 8);
122
runTabTest('1:-5', 1, 3);
123
runTabTest('1:-6', 1, 2);
124
runTabTest('1:-7', 1, 2);
125
runTabTest('1:-8', 1, 1);
126
runTabTest('1:-9', 1, 1);
127
runTabTest('1:-10', 1, 1);
128
runTabTest('1:-11', 1, 1);
129
runTabTest('2:1', 2, 1);
130
runTabTest('2:2', 2, 1);
131
runTabTest('2:3', 2, 1);
132
runTabTest('2:4', 2, 2);
133
runTabTest('2:5', 2, 2);
134
runTabTest('2:8', 2, 3);
135
runTabTest('2:9', 2, 3);
136
runTabTest('2:11', 2, 5);
137
});
138
});
139
140
141