]>
Commit | Line | Data |
---|---|---|
24c7594d BB |
1 | helpers = require './spec-helper' |
2 | ||
3 | describe "TextObjects", -> | |
4 | [editor, editorElement, vimState] = [] | |
5 | ||
6 | beforeEach -> | |
7 | vimMode = atom.packages.loadPackage('vim-mode') | |
8 | vimMode.activateResources() | |
9 | ||
10 | helpers.getEditorElement (element) -> | |
11 | editorElement = element | |
12 | editor = editorElement.getModel() | |
13 | vimState = editorElement.vimState | |
455f099b BB |
14 | vimState.activateNormalMode() |
15 | vimState.resetNormalMode() | |
24c7594d BB |
16 | |
17 | keydown = (key, options={}) -> | |
18 | options.element ?= editorElement | |
19 | helpers.keydown(key, options) | |
20 | ||
455f099b BB |
21 | describe "Text Object commands in normal mode not preceded by an operator", -> |
22 | beforeEach -> | |
23 | vimState.activateNormalMode() | |
24 | ||
25 | it "selects the appropriate text", -> | |
26 | editor.setText("<html> text </html>") | |
27 | editor.setCursorScreenPosition([0, 7]) | |
28 | # Users could dispatch it via the command palette | |
29 | atom.commands.dispatch(editorElement, "vim-mode:select-inside-tags") | |
30 | expect(editor.getSelectedScreenRange()).toEqual [[0, 6], [0, 12]] | |
24c7594d BB |
31 | |
32 | describe "the 'iw' text object", -> | |
33 | beforeEach -> | |
34 | editor.setText("12345 abcde ABCDE") | |
35 | editor.setCursorScreenPosition([0, 9]) | |
36 | ||
37 | it "applies operators inside the current word in operator-pending mode", -> | |
38 | keydown('d') | |
39 | keydown('i') | |
40 | keydown('w') | |
41 | ||
42 | expect(editor.getText()).toBe "12345 ABCDE" | |
43 | expect(editor.getCursorScreenPosition()).toEqual [0, 6] | |
44 | expect(vimState.getRegister('"').text).toBe "abcde" | |
45 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b | 46 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
47 | |
48 | it "selects inside the current word in visual mode", -> | |
49 | keydown('v') | |
50 | keydown('i') | |
51 | keydown('w') | |
52 | ||
53 | expect(editor.getSelectedScreenRange()).toEqual [[0, 6], [0, 11]] | |
54 | ||
455f099b BB |
55 | it "expands an existing selection in visual mode", -> |
56 | keydown('v') | |
57 | keydown('l') | |
58 | keydown('l') | |
59 | keydown('l') | |
60 | keydown('i') | |
61 | keydown('w') | |
62 | ||
63 | expect(editor.getSelectedScreenRange()).toEqual [[0, 9], [0, 17]] | |
64 | ||
24c7594d BB |
65 | it "works with multiple cursors", -> |
66 | editor.addCursorAtBufferPosition([0, 1]) | |
67 | keydown("v") | |
68 | keydown("i") | |
69 | keydown("w") | |
70 | expect(editor.getSelectedBufferRanges()).toEqual [ | |
71 | [[0, 6], [0, 11]] | |
72 | [[0, 0], [0, 5]] | |
73 | ] | |
74 | ||
455f099b BB |
75 | describe "the 'iW' text object", -> |
76 | beforeEach -> | |
77 | editor.setText("12(45 ab'de ABCDE") | |
78 | editor.setCursorScreenPosition([0, 9]) | |
79 | ||
80 | it "applies operators inside the current whole word in operator-pending mode", -> | |
81 | keydown('d') | |
82 | keydown('i') | |
83 | keydown('W', shift: true) | |
84 | ||
85 | expect(editor.getText()).toBe "12(45 ABCDE" | |
86 | expect(editor.getCursorScreenPosition()).toEqual [0, 6] | |
87 | expect(vimState.getRegister('"').text).toBe "ab'de" | |
88 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
89 | expect(editorElement.classList.contains('normal-mode')).toBe(true) | |
90 | ||
91 | it "selects inside the current whole word in visual mode", -> | |
92 | keydown('v') | |
93 | keydown('i') | |
94 | keydown('W', shift: true) | |
95 | ||
96 | expect(editor.getSelectedScreenRange()).toEqual [[0, 6], [0, 11]] | |
97 | ||
98 | it "expands an existing selection in visual mode", -> | |
99 | keydown('v') | |
100 | keydown('l') | |
101 | keydown('l') | |
102 | keydown('l') | |
103 | keydown('i') | |
104 | keydown('W', shift: true) | |
105 | ||
106 | expect(editor.getSelectedScreenRange()).toEqual [[0, 9], [0, 17]] | |
107 | ||
24c7594d BB |
108 | describe "the 'i(' text object", -> |
109 | beforeEach -> | |
110 | editor.setText("( something in here and in (here) )") | |
111 | editor.setCursorScreenPosition([0, 9]) | |
112 | ||
113 | it "applies operators inside the current word in operator-pending mode", -> | |
114 | keydown('d') | |
115 | keydown('i') | |
116 | keydown('(') | |
117 | expect(editor.getText()).toBe "()" | |
118 | expect(editor.getCursorScreenPosition()).toEqual [0, 1] | |
119 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b | 120 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
121 | |
122 | it "applies operators inside the current word in operator-pending mode (second test)", -> | |
123 | editor.setCursorScreenPosition([0, 29]) | |
124 | keydown('d') | |
125 | keydown('i') | |
126 | keydown('(') | |
127 | expect(editor.getText()).toBe "( something in here and in () )" | |
128 | expect(editor.getCursorScreenPosition()).toEqual [0, 28] | |
129 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b | 130 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
131 | |
132 | it "works with multiple cursors", -> | |
133 | editor.setText("( a b ) cde ( f g h ) ijk") | |
134 | editor.setCursorBufferPosition([0, 2]) | |
135 | editor.addCursorAtBufferPosition([0, 18]) | |
136 | ||
137 | keydown("v") | |
138 | keydown("i") | |
139 | keydown("(") | |
140 | ||
141 | expect(editor.getSelectedBufferRanges()).toEqual [ | |
142 | [[0, 1], [0, 6]] | |
143 | [[0, 13], [0, 20]] | |
144 | ] | |
145 | ||
455f099b BB |
146 | it "expands an existing selection in visual mode", -> |
147 | editor.setCursorScreenPosition([0, 25]) | |
148 | keydown('v') | |
149 | keydown('l') | |
150 | keydown('l') | |
151 | keydown('l') | |
152 | keydown('l') | |
153 | keydown('i') | |
154 | keydown('(') | |
155 | ||
156 | expect(editor.getSelectedScreenRange()).toEqual [[0, 25], [0, 32]] | |
157 | ||
24c7594d BB |
158 | describe "the 'i{' text object", -> |
159 | beforeEach -> | |
160 | editor.setText("{ something in here and in {here} }") | |
161 | editor.setCursorScreenPosition([0, 9]) | |
162 | ||
163 | it "applies operators inside the current word in operator-pending mode", -> | |
164 | keydown('d') | |
165 | keydown('i') | |
166 | keydown('{') | |
167 | expect(editor.getText()).toBe "{}" | |
168 | expect(editor.getCursorScreenPosition()).toEqual [0, 1] | |
169 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b | 170 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
171 | |
172 | it "applies operators inside the current word in operator-pending mode (second test)", -> | |
173 | editor.setCursorScreenPosition([0, 29]) | |
174 | keydown('d') | |
175 | keydown('i') | |
176 | keydown('{') | |
177 | expect(editor.getText()).toBe "{ something in here and in {} }" | |
178 | expect(editor.getCursorScreenPosition()).toEqual [0, 28] | |
179 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b BB |
180 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
181 | ||
182 | it "expands an existing selection in visual mode", -> | |
183 | editor.setCursorScreenPosition([0, 25]) | |
184 | keydown('v') | |
185 | keydown('l') | |
186 | keydown('l') | |
187 | keydown('l') | |
188 | keydown('l') | |
189 | keydown('i') | |
190 | keydown('{') | |
191 | ||
192 | expect(editor.getSelectedScreenRange()).toEqual [[0, 25], [0, 32]] | |
24c7594d BB |
193 | |
194 | describe "the 'i<' text object", -> | |
195 | beforeEach -> | |
196 | editor.setText("< something in here and in <here> >") | |
197 | editor.setCursorScreenPosition([0, 9]) | |
198 | ||
199 | it "applies operators inside the current word in operator-pending mode", -> | |
200 | keydown('d') | |
201 | keydown('i') | |
202 | keydown('<') | |
203 | expect(editor.getText()).toBe "<>" | |
204 | expect(editor.getCursorScreenPosition()).toEqual [0, 1] | |
205 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b | 206 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
207 | |
208 | it "applies operators inside the current word in operator-pending mode (second test)", -> | |
209 | editor.setCursorScreenPosition([0, 29]) | |
210 | keydown('d') | |
211 | keydown('i') | |
212 | keydown('<') | |
213 | expect(editor.getText()).toBe "< something in here and in <> >" | |
214 | expect(editor.getCursorScreenPosition()).toEqual [0, 28] | |
215 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b BB |
216 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
217 | ||
218 | it "expands an existing selection in visual mode", -> | |
219 | editor.setCursorScreenPosition([0, 25]) | |
220 | keydown('v') | |
221 | keydown('l') | |
222 | keydown('l') | |
223 | keydown('l') | |
224 | keydown('l') | |
225 | keydown('i') | |
226 | keydown('<') | |
227 | ||
228 | expect(editor.getSelectedScreenRange()).toEqual [[0, 25], [0, 32]] | |
24c7594d BB |
229 | |
230 | describe "the 'it' text object", -> | |
231 | beforeEach -> | |
232 | editor.setText("<something>here</something><again>") | |
233 | editor.setCursorScreenPosition([0, 5]) | |
234 | ||
235 | it "applies only if in the value of a tag", -> | |
236 | keydown('d') | |
237 | keydown('i') | |
238 | keydown('t') | |
239 | expect(editor.getText()).toBe "<something>here</something><again>" | |
240 | expect(editor.getCursorScreenPosition()).toEqual [0, 5] | |
241 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b | 242 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
243 | |
244 | it "applies operators inside the current word in operator-pending mode", -> | |
245 | editor.setCursorScreenPosition([0, 13]) | |
246 | keydown('d') | |
247 | keydown('i') | |
248 | keydown('t') | |
249 | expect(editor.getText()).toBe "<something></something><again>" | |
250 | expect(editor.getCursorScreenPosition()).toEqual [0, 11] | |
251 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b BB |
252 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
253 | ||
254 | it "expands an existing selection in visual mode", -> | |
255 | editor.setCursorScreenPosition([0, 7]) | |
256 | keydown('v') | |
257 | keydown('6') | |
258 | keydown('l') | |
259 | keydown('i') | |
260 | keydown('t') | |
261 | ||
262 | expect(editor.getSelectedScreenRange()).toEqual [[0, 7], [0, 15]] | |
24c7594d BB |
263 | |
264 | describe "the 'ip' text object", -> | |
265 | beforeEach -> | |
266 | editor.setText("\nParagraph-1\nParagraph-1\nParagraph-1\n\n") | |
455f099b | 267 | editor.setCursorBufferPosition([2, 2]) |
24c7594d BB |
268 | |
269 | it "applies operators inside the current paragraph in operator-pending mode", -> | |
24c7594d BB |
270 | keydown('y') |
271 | keydown('i') | |
272 | keydown('p') | |
273 | ||
274 | expect(editor.getText()).toBe "\nParagraph-1\nParagraph-1\nParagraph-1\n\n" | |
275 | expect(editor.getCursorScreenPosition()).toEqual [1, 0] | |
276 | expect(vimState.getRegister('"').text).toBe "Paragraph-1\nParagraph-1\nParagraph-1\n" | |
277 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b | 278 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
279 | |
280 | it "selects inside the current paragraph in visual mode", -> | |
281 | keydown('v') | |
282 | keydown('i') | |
283 | keydown('p') | |
284 | ||
285 | expect(editor.getSelectedScreenRange()).toEqual [[1, 0], [4, 0]] | |
286 | ||
455f099b BB |
287 | it "selects between paragraphs in visual mode if invoked on a empty line", -> |
288 | editor.setText("text\n\n\n\ntext\n") | |
289 | editor.setCursorBufferPosition([1, 0]) | |
290 | ||
291 | keydown('v') | |
292 | keydown('i') | |
293 | keydown('p') | |
294 | ||
295 | expect(editor.getSelectedScreenRange()).toEqual [[1, 0], [4, 0]] | |
296 | ||
297 | it "selects all the lines", -> | |
298 | editor.setText("text\ntext\ntext\n") | |
299 | editor.setCursorBufferPosition([0, 0]) | |
300 | ||
301 | keydown('v') | |
302 | keydown('i') | |
303 | keydown('p') | |
304 | ||
305 | expect(editor.getSelectedScreenRange()).toEqual [[0, 0], [3, 0]] | |
306 | ||
307 | it "expands an existing selection in visual mode", -> | |
308 | editor.setText("\nParagraph-1\nParagraph-1\nParagraph-1\n\n\nParagraph-2\nParagraph-2\nParagraph-2\n") | |
309 | editor.setCursorBufferPosition([2, 2]) | |
310 | ||
311 | keydown('v') | |
312 | keydown('i') | |
313 | keydown('p') | |
314 | ||
315 | keydown('j') | |
316 | keydown('j') | |
317 | keydown('j') | |
318 | keydown('i') | |
319 | keydown('p') | |
320 | ||
321 | expect(editor.getSelectedScreenRange()).toEqual [[1, 0], [9, 0]] | |
322 | ||
24c7594d BB |
323 | describe "the 'ap' text object", -> |
324 | beforeEach -> | |
455f099b | 325 | editor.setText("text\n\nParagraph-1\nParagraph-1\nParagraph-1\n\n\nmoretext") |
24c7594d BB |
326 | editor.setCursorScreenPosition([3, 2]) |
327 | ||
328 | it "applies operators around the current paragraph in operator-pending mode", -> | |
24c7594d BB |
329 | keydown('y') |
330 | keydown('a') | |
331 | keydown('p') | |
332 | ||
455f099b | 333 | expect(editor.getText()).toBe "text\n\nParagraph-1\nParagraph-1\nParagraph-1\n\n\nmoretext" |
24c7594d | 334 | expect(editor.getCursorScreenPosition()).toEqual [2, 0] |
455f099b | 335 | expect(vimState.getRegister('"').text).toBe "Paragraph-1\nParagraph-1\nParagraph-1\n\n\n" |
24c7594d | 336 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) |
455f099b | 337 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
338 | |
339 | it "selects around the current paragraph in visual mode", -> | |
340 | keydown('v') | |
341 | keydown('a') | |
342 | keydown('p') | |
343 | ||
455f099b BB |
344 | expect(editor.getSelectedScreenRange()).toEqual [[2, 0], [7, 0]] |
345 | ||
346 | it "applies operators around the next paragraph in operator-pending mode when started from a blank/only-whitespace line", -> | |
347 | editor.setText("text\n\n\n\nParagraph-1\nParagraph-1\nParagraph-1\n\n\nmoretext") | |
348 | editor.setCursorBufferPosition([1, 0]) | |
349 | ||
350 | keydown('y') | |
351 | keydown('a') | |
352 | keydown('p') | |
353 | ||
354 | expect(editor.getText()).toBe "text\n\n\n\nParagraph-1\nParagraph-1\nParagraph-1\n\n\nmoretext" | |
355 | expect(editor.getCursorScreenPosition()).toEqual [1, 0] | |
356 | expect(vimState.getRegister('"').text).toBe "\n\n\nParagraph-1\nParagraph-1\nParagraph-1\n" | |
357 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
358 | expect(editorElement.classList.contains('normal-mode')).toBe(true) | |
359 | ||
360 | it "selects around the next paragraph in visual mode when started from a blank/only-whitespace line", -> | |
361 | editor.setText("text\n\n\n\nparagraph-1\nparagraph-1\nparagraph-1\n\n\nmoretext") | |
362 | editor.setCursorBufferPosition([1, 0]) | |
363 | ||
364 | keydown('v') | |
365 | keydown('a') | |
366 | keydown('p') | |
367 | ||
368 | expect(editor.getSelectedScreenRange()).toEqual [[1, 0], [7, 0]] | |
369 | ||
370 | it "expands an existing selection in visual mode", -> | |
371 | editor.setText("text\n\n\n\nparagraph-1\nparagraph-1\nparagraph-1\n\n\n\nparagraph-2\nparagraph-2\nparagraph-2\n\n\nmoretext") | |
372 | editor.setCursorBufferPosition([5, 0]) | |
373 | ||
374 | keydown('v') | |
375 | keydown('a') | |
376 | keydown('p') | |
377 | ||
378 | keydown('j') | |
379 | keydown('j') | |
380 | keydown('j') | |
381 | keydown('i') | |
382 | keydown('p') | |
383 | ||
384 | expect(editor.getSelectedScreenRange()).toEqual [[4, 0], [13, 0]] | |
385 | ||
24c7594d BB |
386 | describe "the 'i[' text object", -> |
387 | beforeEach -> | |
388 | editor.setText("[ something in here and in [here] ]") | |
389 | editor.setCursorScreenPosition([0, 9]) | |
390 | ||
391 | it "applies operators inside the current word in operator-pending mode", -> | |
392 | keydown('d') | |
393 | keydown('i') | |
394 | keydown('[') | |
395 | expect(editor.getText()).toBe "[]" | |
396 | expect(editor.getCursorScreenPosition()).toEqual [0, 1] | |
397 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b | 398 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
399 | |
400 | it "applies operators inside the current word in operator-pending mode (second test)", -> | |
401 | editor.setCursorScreenPosition([0, 29]) | |
402 | keydown('d') | |
403 | keydown('i') | |
404 | keydown('[') | |
405 | expect(editor.getText()).toBe "[ something in here and in [] ]" | |
406 | expect(editor.getCursorScreenPosition()).toEqual [0, 28] | |
407 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b BB |
408 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
409 | ||
410 | it "expands an existing selection in visual mode", -> | |
411 | editor.setCursorScreenPosition([0, 25]) | |
412 | keydown('v') | |
413 | keydown('l') | |
414 | keydown('l') | |
415 | keydown('l') | |
416 | keydown('l') | |
417 | keydown('i') | |
418 | keydown('[') | |
419 | ||
420 | expect(editor.getSelectedScreenRange()).toEqual [[0, 25], [0, 32]] | |
24c7594d BB |
421 | |
422 | describe "the 'i\'' text object", -> | |
423 | beforeEach -> | |
424 | editor.setText("' something in here and in 'here' ' and over here") | |
425 | editor.setCursorScreenPosition([0, 9]) | |
426 | ||
427 | it "applies operators inside the current string in operator-pending mode", -> | |
428 | keydown('d') | |
429 | keydown('i') | |
430 | keydown('\'') | |
431 | expect(editor.getText()).toBe "''here' ' and over here" | |
432 | expect(editor.getCursorScreenPosition()).toEqual [0, 1] | |
433 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b | 434 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
435 | |
436 | it "applies operators inside the next string in operator-pending mode (if not in a string)", -> | |
437 | editor.setCursorScreenPosition([0, 29]) | |
438 | keydown('d') | |
439 | keydown('i') | |
440 | keydown('\'') | |
441 | expect(editor.getText()).toBe "' something in here and in 'here'' and over here" | |
442 | expect(editor.getCursorScreenPosition()).toEqual [0, 33] | |
443 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b | 444 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
445 | |
446 | it "makes no change if past the last string on a line", -> | |
447 | editor.setCursorScreenPosition([0, 39]) | |
448 | keydown('d') | |
449 | keydown('i') | |
450 | keydown('\'') | |
451 | expect(editor.getText()).toBe "' something in here and in 'here' ' and over here" | |
452 | expect(editor.getCursorScreenPosition()).toEqual [0, 39] | |
453 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b BB |
454 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
455 | ||
456 | it "expands an existing selection in visual mode", -> | |
457 | editor.setCursorScreenPosition([0, 25]) | |
458 | keydown('v') | |
459 | keydown('l') | |
460 | keydown('l') | |
461 | keydown('l') | |
462 | keydown('l') | |
463 | keydown('i') | |
464 | keydown('\'') | |
465 | ||
466 | expect(editor.getSelectedScreenRange()).toEqual [[0, 25], [0, 34]] | |
24c7594d BB |
467 | |
468 | describe "the 'i\"' text object", -> | |
469 | beforeEach -> | |
470 | editor.setText("\" something in here and in \"here\" \" and over here") | |
471 | editor.setCursorScreenPosition([0, 9]) | |
472 | ||
473 | it "applies operators inside the current string in operator-pending mode", -> | |
474 | keydown('d') | |
475 | keydown('i') | |
476 | keydown('"') | |
477 | expect(editor.getText()).toBe "\"\"here\" \" and over here" | |
478 | expect(editor.getCursorScreenPosition()).toEqual [0, 1] | |
479 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b | 480 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
481 | |
482 | it "applies operators inside the next string in operator-pending mode (if not in a string)", -> | |
483 | editor.setCursorScreenPosition([0, 29]) | |
484 | keydown('d') | |
485 | keydown('i') | |
486 | keydown('"') | |
487 | expect(editor.getText()).toBe "\" something in here and in \"here\"\" and over here" | |
488 | expect(editor.getCursorScreenPosition()).toEqual [0, 33] | |
489 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b | 490 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
491 | |
492 | it "makes no change if past the last string on a line", -> | |
493 | editor.setCursorScreenPosition([0, 39]) | |
494 | keydown('d') | |
495 | keydown('i') | |
496 | keydown('"') | |
497 | expect(editor.getText()).toBe "\" something in here and in \"here\" \" and over here" | |
498 | expect(editor.getCursorScreenPosition()).toEqual [0, 39] | |
499 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
500 | ||
455f099b BB |
501 | it "expands an existing selection in visual mode", -> |
502 | editor.setCursorScreenPosition([0, 25]) | |
503 | keydown('v') | |
504 | keydown('l') | |
505 | keydown('l') | |
506 | keydown('l') | |
507 | keydown('l') | |
508 | keydown('i') | |
509 | keydown('"') | |
510 | ||
511 | expect(editor.getSelectedScreenRange()).toEqual [[0, 25], [0, 34]] | |
512 | ||
24c7594d BB |
513 | describe "the 'aw' text object", -> |
514 | beforeEach -> | |
515 | editor.setText("12345 abcde ABCDE") | |
516 | editor.setCursorScreenPosition([0, 9]) | |
517 | ||
518 | it "applies operators from the start of the current word to the start of the next word in operator-pending mode", -> | |
519 | keydown('d') | |
520 | keydown('a') | |
521 | keydown('w') | |
522 | ||
523 | expect(editor.getText()).toBe "12345 ABCDE" | |
524 | expect(editor.getCursorScreenPosition()).toEqual [0, 6] | |
525 | expect(vimState.getRegister('"').text).toBe "abcde " | |
526 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b | 527 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
528 | |
529 | it "selects from the start of the current word to the start of the next word in visual mode", -> | |
530 | keydown('v') | |
531 | keydown('a') | |
532 | keydown('w') | |
533 | ||
534 | expect(editor.getSelectedScreenRange()).toEqual [[0, 6], [0, 12]] | |
535 | ||
455f099b BB |
536 | it "expands an existing selection in visual mode", -> |
537 | editor.setCursorScreenPosition([0, 2]) | |
538 | keydown('v') | |
539 | keydown('l') | |
540 | keydown('l') | |
541 | keydown('l') | |
542 | keydown('a') | |
543 | keydown('w') | |
544 | ||
545 | expect(editor.getSelectedScreenRange()).toEqual [[0, 2], [0, 12]] | |
546 | ||
24c7594d BB |
547 | it "doesn't span newlines", -> |
548 | editor.setText("12345\nabcde ABCDE") | |
549 | editor.setCursorBufferPosition([0, 3]) | |
550 | ||
551 | keydown("v") | |
552 | keydown("a") | |
553 | keydown("w") | |
554 | ||
555 | expect(editor.getSelectedBufferRanges()).toEqual [[[0, 0], [0, 5]]] | |
556 | ||
455f099b BB |
557 | it "doesn't span special characters", -> |
558 | editor.setText("1(345\nabcde ABCDE") | |
559 | editor.setCursorBufferPosition([0, 3]) | |
560 | ||
561 | keydown("v") | |
562 | keydown("a") | |
563 | keydown("w") | |
564 | ||
565 | expect(editor.getSelectedBufferRanges()).toEqual [[[0, 2], [0, 5]]] | |
566 | ||
567 | describe "the 'aW' text object", -> | |
568 | beforeEach -> | |
569 | editor.setText("12(45 ab'de ABCDE") | |
570 | editor.setCursorScreenPosition([0, 9]) | |
571 | ||
572 | it "applies operators from the start of the current whole word to the start of the next whole word in operator-pending mode", -> | |
573 | keydown('d') | |
574 | keydown('a') | |
575 | keydown('W', shift: true) | |
576 | ||
577 | expect(editor.getText()).toBe "12(45 ABCDE" | |
578 | expect(editor.getCursorScreenPosition()).toEqual [0, 6] | |
579 | expect(vimState.getRegister('"').text).toBe "ab'de " | |
580 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
581 | expect(editorElement.classList.contains('normal-mode')).toBe(true) | |
582 | ||
583 | it "selects from the start of the current whole word to the start of the next whole word in visual mode", -> | |
584 | keydown('v') | |
585 | keydown('a') | |
586 | keydown('W', shift: true) | |
587 | ||
588 | expect(editor.getSelectedScreenRange()).toEqual [[0, 6], [0, 12]] | |
589 | ||
590 | it "expands an existing selection in visual mode", -> | |
591 | editor.setCursorScreenPosition([0, 2]) | |
592 | keydown('v') | |
593 | keydown('l') | |
594 | keydown('l') | |
595 | keydown('l') | |
596 | keydown('a') | |
597 | keydown('W', shift: true) | |
598 | ||
599 | expect(editor.getSelectedScreenRange()).toEqual [[0, 2], [0, 12]] | |
600 | ||
601 | it "doesn't span newlines", -> | |
602 | editor.setText("12(45\nab'de ABCDE") | |
603 | editor.setCursorBufferPosition([0, 4]) | |
604 | ||
605 | keydown('v') | |
606 | keydown('a') | |
607 | keydown('W', shift: true) | |
608 | ||
609 | expect(editor.getSelectedBufferRanges()).toEqual [[[0, 0], [0, 5]]] | |
610 | ||
24c7594d BB |
611 | describe "the 'a(' text object", -> |
612 | beforeEach -> | |
613 | editor.setText("( something in here and in (here) )") | |
614 | editor.setCursorScreenPosition([0, 9]) | |
615 | ||
616 | it "applies operators around the current parentheses in operator-pending mode", -> | |
617 | keydown('d') | |
618 | keydown('a') | |
619 | keydown('(') | |
620 | expect(editor.getText()).toBe "" | |
621 | expect(editor.getCursorScreenPosition()).toEqual [0, 0] | |
622 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b | 623 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
624 | |
625 | it "applies operators around the current parentheses in operator-pending mode (second test)", -> | |
626 | editor.setCursorScreenPosition([0, 29]) | |
627 | keydown('d') | |
628 | keydown('a') | |
629 | keydown('(') | |
630 | expect(editor.getText()).toBe "( something in here and in )" | |
631 | expect(editor.getCursorScreenPosition()).toEqual [0, 27] | |
632 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b BB |
633 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
634 | ||
635 | it "expands an existing selection in visual mode", -> | |
636 | editor.setCursorScreenPosition([0, 25]) | |
637 | keydown('v') | |
638 | keydown('l') | |
639 | keydown('l') | |
640 | keydown('l') | |
641 | keydown('l') | |
642 | keydown('a') | |
643 | keydown('(') | |
644 | ||
645 | expect(editor.getSelectedScreenRange()).toEqual [[0, 25], [0, 33]] | |
24c7594d BB |
646 | |
647 | describe "the 'a{' text object", -> | |
648 | beforeEach -> | |
649 | editor.setText("{ something in here and in {here} }") | |
650 | editor.setCursorScreenPosition([0, 9]) | |
651 | ||
652 | it "applies operators around the current curly brackets in operator-pending mode", -> | |
653 | keydown('d') | |
654 | keydown('a') | |
655 | keydown('{') | |
656 | expect(editor.getText()).toBe "" | |
657 | expect(editor.getCursorScreenPosition()).toEqual [0, 0] | |
658 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b | 659 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
660 | |
661 | it "applies operators around the current curly brackets in operator-pending mode (second test)", -> | |
662 | editor.setCursorScreenPosition([0, 29]) | |
663 | keydown('d') | |
664 | keydown('a') | |
665 | keydown('{') | |
666 | expect(editor.getText()).toBe "{ something in here and in }" | |
667 | expect(editor.getCursorScreenPosition()).toEqual [0, 27] | |
668 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b BB |
669 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
670 | ||
671 | it "expands an existing selection in visual mode", -> | |
672 | editor.setCursorScreenPosition([0, 25]) | |
673 | keydown('v') | |
674 | keydown('l') | |
675 | keydown('l') | |
676 | keydown('l') | |
677 | keydown('l') | |
678 | keydown('a') | |
679 | keydown('{') | |
680 | ||
681 | expect(editor.getSelectedScreenRange()).toEqual [[0, 25], [0, 33]] | |
24c7594d BB |
682 | |
683 | describe "the 'a<' text object", -> | |
684 | beforeEach -> | |
685 | editor.setText("< something in here and in <here> >") | |
686 | editor.setCursorScreenPosition([0, 9]) | |
687 | ||
688 | it "applies operators around the current angle brackets in operator-pending mode", -> | |
689 | keydown('d') | |
690 | keydown('a') | |
691 | keydown('<') | |
692 | expect(editor.getText()).toBe "" | |
693 | expect(editor.getCursorScreenPosition()).toEqual [0, 0] | |
694 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b | 695 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
696 | |
697 | it "applies operators around the current angle brackets in operator-pending mode (second test)", -> | |
698 | editor.setCursorScreenPosition([0, 29]) | |
699 | keydown('d') | |
700 | keydown('a') | |
701 | keydown('<') | |
702 | expect(editor.getText()).toBe "< something in here and in >" | |
703 | expect(editor.getCursorScreenPosition()).toEqual [0, 27] | |
704 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b BB |
705 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
706 | ||
707 | it "expands an existing selection in visual mode", -> | |
708 | editor.setCursorScreenPosition([0, 25]) | |
709 | keydown('v') | |
710 | keydown('l') | |
711 | keydown('l') | |
712 | keydown('l') | |
713 | keydown('l') | |
714 | keydown('a') | |
715 | keydown('<') | |
716 | ||
717 | expect(editor.getSelectedScreenRange()).toEqual [[0, 25], [0, 33]] | |
24c7594d BB |
718 | |
719 | describe "the 'a[' text object", -> | |
720 | beforeEach -> | |
721 | editor.setText("[ something in here and in [here] ]") | |
722 | editor.setCursorScreenPosition([0, 9]) | |
723 | ||
724 | it "applies operators around the current square brackets in operator-pending mode", -> | |
725 | keydown('d') | |
726 | keydown('a') | |
727 | keydown('[') | |
728 | expect(editor.getText()).toBe "" | |
729 | expect(editor.getCursorScreenPosition()).toEqual [0, 0] | |
730 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b | 731 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
732 | |
733 | it "applies operators around the current square brackets in operator-pending mode (second test)", -> | |
734 | editor.setCursorScreenPosition([0, 29]) | |
735 | keydown('d') | |
736 | keydown('a') | |
737 | keydown('[') | |
738 | expect(editor.getText()).toBe "[ something in here and in ]" | |
739 | expect(editor.getCursorScreenPosition()).toEqual [0, 27] | |
740 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b BB |
741 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
742 | ||
743 | it "expands an existing selection in visual mode", -> | |
744 | editor.setCursorScreenPosition([0, 25]) | |
745 | keydown('v') | |
746 | keydown('l') | |
747 | keydown('l') | |
748 | keydown('l') | |
749 | keydown('l') | |
750 | keydown('a') | |
751 | keydown('[') | |
752 | ||
753 | expect(editor.getSelectedScreenRange()).toEqual [[0, 25], [0, 33]] | |
24c7594d BB |
754 | |
755 | describe "the 'a\'' text object", -> | |
756 | beforeEach -> | |
757 | editor.setText("' something in here and in 'here' '") | |
758 | editor.setCursorScreenPosition([0, 9]) | |
759 | ||
760 | it "applies operators around the current single quotes in operator-pending mode", -> | |
761 | keydown('d') | |
762 | keydown('a') | |
763 | keydown('\'') | |
764 | expect(editor.getText()).toBe "here' '" | |
765 | expect(editor.getCursorScreenPosition()).toEqual [0, 0] | |
766 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b | 767 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
768 | |
769 | it "applies operators around the current single quotes in operator-pending mode (second test)", -> | |
770 | editor.setCursorScreenPosition([0, 29]) | |
771 | keydown('d') | |
772 | keydown('a') | |
773 | keydown('\'') | |
774 | expect(editor.getText()).toBe "' something in here and in 'here" | |
775 | expect(editor.getCursorScreenPosition()).toEqual [0, 31] | |
776 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b BB |
777 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
778 | ||
779 | it "expands an existing selection in visual mode", -> | |
780 | editor.setCursorScreenPosition([0, 25]) | |
781 | keydown('v') | |
782 | keydown('l') | |
783 | keydown('l') | |
784 | keydown('l') | |
785 | keydown('l') | |
786 | keydown('a') | |
787 | keydown('\'') | |
788 | ||
789 | expect(editor.getSelectedScreenRange()).toEqual [[0, 25], [0, 35]] | |
24c7594d BB |
790 | |
791 | describe "the 'a\"' text object", -> | |
792 | beforeEach -> | |
793 | editor.setText("\" something in here and in \"here\" \"") | |
794 | editor.setCursorScreenPosition([0, 9]) | |
795 | ||
796 | it "applies operators around the current double quotes in operator-pending mode", -> | |
797 | keydown('d') | |
798 | keydown('a') | |
799 | keydown('""') | |
800 | expect(editor.getText()).toBe 'here" "' | |
801 | expect(editor.getCursorScreenPosition()).toEqual [0, 0] | |
802 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b | 803 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
24c7594d BB |
804 | |
805 | it "applies operators around the current double quotes in operator-pending mode (second test)", -> | |
806 | editor.setCursorScreenPosition([0, 29]) | |
807 | keydown('d') | |
808 | keydown('a') | |
809 | keydown('"') | |
810 | expect(editor.getText()).toBe "\" something in here and in \"here" | |
811 | expect(editor.getCursorScreenPosition()).toEqual [0, 31] | |
812 | expect(editorElement.classList.contains('operator-pending-mode')).toBe(false) | |
455f099b BB |
813 | expect(editorElement.classList.contains('normal-mode')).toBe(true) |
814 | ||
815 | it "expands an existing selection in visual mode", -> | |
816 | editor.setCursorScreenPosition([0, 25]) | |
817 | keydown('v') | |
818 | keydown('l') | |
819 | keydown('l') | |
820 | keydown('l') | |
821 | keydown('l') | |
822 | keydown('a') | |
823 | keydown('"') | |
824 | ||
825 | expect(editor.getSelectedScreenRange()).toEqual [[0, 25], [0, 35]] |