Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/contrib/bracketMatching/test/browser/bracketMatching.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 { Position } from '../../../../common/core/position.js';
7
import { Selection } from '../../../../common/core/selection.js';
8
import { ILanguageConfigurationService } from '../../../../common/languages/languageConfigurationRegistry.js';
9
import { BracketMatchingController } from '../../browser/bracketMatching.js';
10
import { createCodeEditorServices, instantiateTestCodeEditor } from '../../../../test/browser/testCodeEditor.js';
11
import { instantiateTextModel } from '../../../../test/common/testTextModel.js';
12
import { DisposableStore } from '../../../../../base/common/lifecycle.js';
13
import { TestInstantiationService } from '../../../../../platform/instantiation/test/common/instantiationServiceMock.js';
14
import { ILanguageService } from '../../../../common/languages/language.js';
15
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
16
17
suite('bracket matching', () => {
18
let disposables: DisposableStore;
19
let instantiationService: TestInstantiationService;
20
let languageConfigurationService: ILanguageConfigurationService;
21
let languageService: ILanguageService;
22
23
setup(() => {
24
disposables = new DisposableStore();
25
instantiationService = createCodeEditorServices(disposables);
26
languageConfigurationService = instantiationService.get(ILanguageConfigurationService);
27
languageService = instantiationService.get(ILanguageService);
28
});
29
30
teardown(() => {
31
disposables.dispose();
32
});
33
34
ensureNoDisposablesAreLeakedInTestSuite();
35
36
function createTextModelWithBrackets(text: string) {
37
const languageId = 'bracketMode';
38
disposables.add(languageService.registerLanguage({ id: languageId }));
39
disposables.add(languageConfigurationService.register(languageId, {
40
brackets: [
41
['{', '}'],
42
['[', ']'],
43
['(', ')'],
44
]
45
}));
46
return disposables.add(instantiateTextModel(instantiationService, text, languageId));
47
}
48
49
function createCodeEditorWithBrackets(text: string) {
50
return disposables.add(instantiateTestCodeEditor(instantiationService, createTextModelWithBrackets(text)));
51
}
52
53
test('issue #183: jump to matching bracket position', () => {
54
const editor = createCodeEditorWithBrackets('var x = (3 + (5-7)) + ((5+3)+5);');
55
const bracketMatchingController = disposables.add(editor.registerAndInstantiateContribution(BracketMatchingController.ID, BracketMatchingController));
56
57
// start on closing bracket
58
editor.setPosition(new Position(1, 20));
59
bracketMatchingController.jumpToBracket();
60
assert.deepStrictEqual(editor.getPosition(), new Position(1, 9));
61
bracketMatchingController.jumpToBracket();
62
assert.deepStrictEqual(editor.getPosition(), new Position(1, 19));
63
bracketMatchingController.jumpToBracket();
64
assert.deepStrictEqual(editor.getPosition(), new Position(1, 9));
65
66
// start on opening bracket
67
editor.setPosition(new Position(1, 23));
68
bracketMatchingController.jumpToBracket();
69
assert.deepStrictEqual(editor.getPosition(), new Position(1, 31));
70
bracketMatchingController.jumpToBracket();
71
assert.deepStrictEqual(editor.getPosition(), new Position(1, 23));
72
bracketMatchingController.jumpToBracket();
73
assert.deepStrictEqual(editor.getPosition(), new Position(1, 31));
74
});
75
76
test('Jump to next bracket', () => {
77
const editor = createCodeEditorWithBrackets('var x = (3 + (5-7)); y();');
78
const bracketMatchingController = disposables.add(editor.registerAndInstantiateContribution(BracketMatchingController.ID, BracketMatchingController));
79
80
// start position between brackets
81
editor.setPosition(new Position(1, 16));
82
bracketMatchingController.jumpToBracket();
83
assert.deepStrictEqual(editor.getPosition(), new Position(1, 18));
84
bracketMatchingController.jumpToBracket();
85
assert.deepStrictEqual(editor.getPosition(), new Position(1, 14));
86
bracketMatchingController.jumpToBracket();
87
assert.deepStrictEqual(editor.getPosition(), new Position(1, 18));
88
89
// skip brackets in comments
90
editor.setPosition(new Position(1, 21));
91
bracketMatchingController.jumpToBracket();
92
assert.deepStrictEqual(editor.getPosition(), new Position(1, 23));
93
bracketMatchingController.jumpToBracket();
94
assert.deepStrictEqual(editor.getPosition(), new Position(1, 24));
95
bracketMatchingController.jumpToBracket();
96
assert.deepStrictEqual(editor.getPosition(), new Position(1, 23));
97
98
// do not break if no brackets are available
99
editor.setPosition(new Position(1, 26));
100
bracketMatchingController.jumpToBracket();
101
assert.deepStrictEqual(editor.getPosition(), new Position(1, 26));
102
});
103
104
test('Select to next bracket', () => {
105
const editor = createCodeEditorWithBrackets('var x = (3 + (5-7)); y();');
106
const bracketMatchingController = disposables.add(editor.registerAndInstantiateContribution(BracketMatchingController.ID, BracketMatchingController));
107
108
// start position in open brackets
109
editor.setPosition(new Position(1, 9));
110
bracketMatchingController.selectToBracket(true);
111
assert.deepStrictEqual(editor.getPosition(), new Position(1, 20));
112
assert.deepStrictEqual(editor.getSelection(), new Selection(1, 9, 1, 20));
113
114
// start position in close brackets (should select backwards)
115
editor.setPosition(new Position(1, 20));
116
bracketMatchingController.selectToBracket(true);
117
assert.deepStrictEqual(editor.getPosition(), new Position(1, 9));
118
assert.deepStrictEqual(editor.getSelection(), new Selection(1, 20, 1, 9));
119
120
// start position between brackets
121
editor.setPosition(new Position(1, 16));
122
bracketMatchingController.selectToBracket(true);
123
assert.deepStrictEqual(editor.getPosition(), new Position(1, 19));
124
assert.deepStrictEqual(editor.getSelection(), new Selection(1, 14, 1, 19));
125
126
// start position outside brackets
127
editor.setPosition(new Position(1, 21));
128
bracketMatchingController.selectToBracket(true);
129
assert.deepStrictEqual(editor.getPosition(), new Position(1, 25));
130
assert.deepStrictEqual(editor.getSelection(), new Selection(1, 23, 1, 25));
131
132
// do not break if no brackets are available
133
editor.setPosition(new Position(1, 26));
134
bracketMatchingController.selectToBracket(true);
135
assert.deepStrictEqual(editor.getPosition(), new Position(1, 26));
136
assert.deepStrictEqual(editor.getSelection(), new Selection(1, 26, 1, 26));
137
});
138
139
test('issue #1772: jump to enclosing brackets', () => {
140
const text = [
141
'const x = {',
142
' something: [0, 1, 2],',
143
' another: true,',
144
' somethingmore: [0, 2, 4]',
145
'};',
146
].join('\n');
147
const editor = createCodeEditorWithBrackets(text);
148
const bracketMatchingController = disposables.add(editor.registerAndInstantiateContribution(BracketMatchingController.ID, BracketMatchingController));
149
150
editor.setPosition(new Position(3, 5));
151
bracketMatchingController.jumpToBracket();
152
assert.deepStrictEqual(editor.getSelection(), new Selection(5, 1, 5, 1));
153
});
154
155
test('issue #43371: argument to not select brackets', () => {
156
const text = [
157
'const x = {',
158
' something: [0, 1, 2],',
159
' another: true,',
160
' somethingmore: [0, 2, 4]',
161
'};',
162
].join('\n');
163
const editor = createCodeEditorWithBrackets(text);
164
const bracketMatchingController = disposables.add(editor.registerAndInstantiateContribution(BracketMatchingController.ID, BracketMatchingController));
165
166
editor.setPosition(new Position(3, 5));
167
bracketMatchingController.selectToBracket(false);
168
assert.deepStrictEqual(editor.getSelection(), new Selection(1, 12, 5, 1));
169
});
170
171
test('issue #45369: Select to Bracket with multicursor', () => {
172
const editor = createCodeEditorWithBrackets('{ } { } { }');
173
const bracketMatchingController = disposables.add(editor.registerAndInstantiateContribution(BracketMatchingController.ID, BracketMatchingController));
174
175
// cursors inside brackets become selections of the entire bracket contents
176
editor.setSelections([
177
new Selection(1, 3, 1, 3),
178
new Selection(1, 10, 1, 10),
179
new Selection(1, 17, 1, 17)
180
]);
181
bracketMatchingController.selectToBracket(true);
182
assert.deepStrictEqual(editor.getSelections(), [
183
new Selection(1, 1, 1, 5),
184
new Selection(1, 8, 1, 13),
185
new Selection(1, 16, 1, 19)
186
]);
187
188
// cursors to the left of bracket pairs become selections of the entire pair
189
editor.setSelections([
190
new Selection(1, 1, 1, 1),
191
new Selection(1, 6, 1, 6),
192
new Selection(1, 14, 1, 14)
193
]);
194
bracketMatchingController.selectToBracket(true);
195
assert.deepStrictEqual(editor.getSelections(), [
196
new Selection(1, 1, 1, 5),
197
new Selection(1, 8, 1, 13),
198
new Selection(1, 16, 1, 19)
199
]);
200
201
// cursors just right of a bracket pair become selections of the entire pair
202
editor.setSelections([
203
new Selection(1, 5, 1, 5),
204
new Selection(1, 13, 1, 13),
205
new Selection(1, 19, 1, 19)
206
]);
207
bracketMatchingController.selectToBracket(true);
208
assert.deepStrictEqual(editor.getSelections(), [
209
new Selection(1, 5, 1, 1),
210
new Selection(1, 13, 1, 8),
211
new Selection(1, 19, 1, 16)
212
]);
213
});
214
215
test('Removes brackets', () => {
216
const editor = createCodeEditorWithBrackets('var x = (3 + (5-7)); y();');
217
const bracketMatchingController = disposables.add(editor.registerAndInstantiateContribution(BracketMatchingController.ID, BracketMatchingController));
218
function removeBrackets() {
219
bracketMatchingController.removeBrackets();
220
}
221
222
// position before the bracket
223
editor.setPosition(new Position(1, 9));
224
removeBrackets();
225
assert.deepStrictEqual(editor.getModel().getValue(), 'var x = 3 + (5-7); y();');
226
editor.getModel().setValue('var x = (3 + (5-7)); y();');
227
228
// position between brackets
229
editor.setPosition(new Position(1, 16));
230
removeBrackets();
231
assert.deepStrictEqual(editor.getModel().getValue(), 'var x = (3 + 5-7); y();');
232
removeBrackets();
233
assert.deepStrictEqual(editor.getModel().getValue(), 'var x = 3 + 5-7; y();');
234
removeBrackets();
235
assert.deepStrictEqual(editor.getModel().getValue(), 'var x = 3 + 5-7; y();');
236
});
237
});
238
239