blob: 6e2c36927c136b7ee89aa3e1d286fa2dfb25d5dc [file] [log] [blame]
Bram Moolenaar515545e2020-03-22 14:08:59 +01001" Test for Select-mode
2
3" This only works for Unix in a terminal
4source check.vim
5CheckNotGui
6CheckUnix
7
8source mouse.vim
9
10" Test for select mode
11func Test_selectmode_basic()
12 new
13 call setline(1, range(1,100))
14 50
15 norm! gHy
16 call assert_equal('y51', getline('.'))
17 call setline(1, range(1,100))
18 50
19 exe ":norm! V9jo\<c-g>y"
20 call assert_equal('y60', getline('.'))
21 call setline(1, range(1,100))
22 50
23 call feedkeys(":set im\n\<c-o>gHc\<c-o>:set noim\n", 'tx')
24 call assert_equal('c51', getline('.'))
25 " clean up
26 bw!
27endfunc
28
29" Test for starting selectmode
30func Test_selectmode_start()
31 new
32 set selectmode=key keymodel=startsel
33 call setline(1, ['abc', 'def', 'ghi'])
34 call cursor(1, 4)
35 call feedkeys("A\<s-home>start\<esc>", 'txin')
36 call assert_equal(['startdef', 'ghi'], getline(1, '$'))
37 " start select mode again with gv
38 set selectmode=cmd
39 call feedkeys('gvabc', 'xt')
40 call assert_equal('abctdef', getline(1))
Bram Moolenaar845e0ee2020-06-20 16:05:32 +020041 " arrow keys without shift should not start selection
42 call feedkeys("A\<Home>\<Right>\<Left>ro", 'xt')
43 call assert_equal('roabctdef', getline(1))
Bram Moolenaar515545e2020-03-22 14:08:59 +010044 set selectmode= keymodel=
45 bw!
46endfunc
47
48" Test for characterwise select mode
49func Test_characterwise_select_mode()
50 new
51
52 " Select mode maps
53 snoremap <lt>End> <End>
54 snoremap <lt>Down> <Down>
55 snoremap <lt>Del> <Del>
56
57 " characterwise select mode: delete middle line
58 call deletebufline('', 1, '$')
59 call append('$', ['a', 'b', 'c'])
60 exe "normal Gkkgh\<End>\<Del>"
61 call assert_equal(['', 'b', 'c'], getline(1, '$'))
62
63 " characterwise select mode: delete middle two lines
64 call deletebufline('', 1, '$')
65 call append('$', ['a', 'b', 'c'])
66 exe "normal Gkkgh\<Down>\<End>\<Del>"
67 call assert_equal(['', 'c'], getline(1, '$'))
68
69 " characterwise select mode: delete last line
70 call deletebufline('', 1, '$')
71 call append('$', ['a', 'b', 'c'])
72 exe "normal Ggh\<End>\<Del>"
73 call assert_equal(['', 'a', 'b', ''], getline(1, '$'))
74
75 " characterwise select mode: delete last two lines
76 call deletebufline('', 1, '$')
77 call append('$', ['a', 'b', 'c'])
78 exe "normal Gkgh\<Down>\<End>\<Del>"
79 call assert_equal(['', 'a', ''], getline(1, '$'))
80
81 " CTRL-H in select mode behaves like 'x'
82 call setline(1, 'abcdef')
83 exe "normal! gggh\<Right>\<Right>\<Right>\<C-H>"
84 call assert_equal('ef', getline(1))
85
86 " CTRL-O in select mode switches to visual mode for one command
87 call setline(1, 'abcdef')
88 exe "normal! gggh\<C-O>3lm"
89 call assert_equal('mef', getline(1))
90
91 sunmap <lt>End>
92 sunmap <lt>Down>
93 sunmap <lt>Del>
94 bwipe!
95endfunc
96
97" Test for linewise select mode
98func Test_linewise_select_mode()
99 new
100
101 " linewise select mode: delete middle line
102 call append('$', ['a', 'b', 'c'])
103 exe "normal GkkgH\<Del>"
104 call assert_equal(['', 'b', 'c'], getline(1, '$'))
105
106 " linewise select mode: delete middle two lines
107 call deletebufline('', 1, '$')
108 call append('$', ['a', 'b', 'c'])
109 exe "normal GkkgH\<Down>\<Del>"
110 call assert_equal(['', 'c'], getline(1, '$'))
111
112 " linewise select mode: delete last line
113 call deletebufline('', 1, '$')
114 call append('$', ['a', 'b', 'c'])
115 exe "normal GgH\<Del>"
116 call assert_equal(['', 'a', 'b'], getline(1, '$'))
117
118 " linewise select mode: delete last two lines
119 call deletebufline('', 1, '$')
120 call append('$', ['a', 'b', 'c'])
121 exe "normal GkgH\<Down>\<Del>"
122 call assert_equal(['', 'a'], getline(1, '$'))
123
124 bwipe!
125endfunc
126
127" Test for blockwise select mode (g CTRL-H)
128func Test_blockwise_select_mode()
129 new
130 call setline(1, ['foo', 'bar'])
131 call feedkeys("g\<BS>\<Right>\<Down>mm", 'xt')
132 call assert_equal(['mmo', 'mmr'], getline(1, '$'))
133 close!
134endfunc
135
136" Test for using visual mode maps in select mode
137func Test_select_mode_map()
138 new
139 vmap <buffer> <F2> 3l
140 call setline(1, 'Test line')
141 call feedkeys("gh\<F2>map", 'xt')
142 call assert_equal('map line', getline(1))
143
144 vmap <buffer> <F2> ygV
145 call feedkeys("0gh\<Right>\<Right>\<F2>cwabc", 'xt')
146 call assert_equal('abc line', getline(1))
147
148 vmap <buffer> <F2> :<C-U>let v=100<CR>
149 call feedkeys("gggh\<Right>\<Right>\<F2>foo", 'xt')
150 call assert_equal('foo line', getline(1))
151
152 " reselect the select mode using gv from a visual mode map
153 vmap <buffer> <F2> gv
154 set selectmode=cmd
155 call feedkeys("0gh\<F2>map", 'xt')
156 call assert_equal('map line', getline(1))
157 set selectmode&
158
159 close!
160endfunc
161
162" Test double/triple/quadruple click to start 'select' mode
163func Test_term_mouse_multiple_clicks_to_select_mode()
164 let save_mouse = &mouse
165 let save_term = &term
166 let save_ttymouse = &ttymouse
167 call test_override('no_query_mouse', 1)
Bram Moolenaar1e448462021-03-16 21:17:16 +0100168
169 " 'mousetime' must be sufficiently large, or else the test is flaky when
170 " using a ssh connection with X forwarding; i.e. ssh -X.
171 set mouse=a term=xterm mousetime=1000
Bram Moolenaar515545e2020-03-22 14:08:59 +0100172 set selectmode=mouse
173 new
174
175 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
176 let msg = 'ttymouse=' .. ttymouse_val
177 exe 'set ttymouse=' .. ttymouse_val
178
179 " Single-click and drag should 'select' the characters
180 call setline(1, ['foo [foo bar] foo', 'foo'])
181 call MouseLeftClick(1, 3)
182 call assert_equal(0, getcharmod(), msg)
183 call MouseLeftDrag(1, 13)
184 call MouseLeftRelease(1, 13)
185 norm! o
186 call assert_equal(['foo foo', 'foo'], getline(1, '$'), msg)
187
188 " Double-click on word should visually 'select' the word.
189 call setline(1, ['foo [foo bar] foo', 'foo'])
190 call MouseLeftClick(1, 2)
191 call assert_equal(0, getcharmod(), msg)
192 call MouseLeftRelease(1, 2)
193 call MouseLeftClick(1, 2)
194 call assert_equal(32, getcharmod(), msg) " double-click
195 call MouseLeftRelease(1, 2)
196 call assert_equal('s', mode(), msg)
197 norm! bar
198 call assert_equal(['bar [foo bar] foo', 'foo'], getline(1, '$'), msg)
199
200 " Double-click on opening square bracket should visually
201 " 'select' the whole [foo bar].
202 call setline(1, ['foo [foo bar] foo', 'foo'])
203 call MouseLeftClick(1, 5)
204 call assert_equal(0, getcharmod(), msg)
205 call MouseLeftRelease(1, 5)
206 call MouseLeftClick(1, 5)
207 call assert_equal(32, getcharmod(), msg) " double-click
208 call MouseLeftRelease(1, 5)
209 call assert_equal('s', mode(), msg)
210 norm! bar
211 call assert_equal(['foo bar foo', 'foo'], getline(1, '$'), msg)
212
213 " To guarantee that the next click is not counted as a triple click
214 call MouseRightClick(1, 1)
215 call MouseRightRelease(1, 1)
216
217 " Triple-click should visually 'select' the whole line.
218 call setline(1, ['foo [foo bar] foo', 'foo'])
219 call MouseLeftClick(1, 3)
220 call assert_equal(0, getcharmod(), msg)
221 call MouseLeftRelease(1, 3)
222 call MouseLeftClick(1, 3)
223 call assert_equal(32, getcharmod(), msg) " double-click
224 call MouseLeftRelease(1, 3)
225 call MouseLeftClick(1, 3)
226 call assert_equal(64, getcharmod(), msg) " triple-click
227 call MouseLeftRelease(1, 3)
228 call assert_equal('S', mode(), msg)
229 norm! baz
230 call assert_equal(['bazfoo'], getline(1, '$'), msg)
231
232 " Quadruple-click should start visual block 'select'.
233 call setline(1, ['aaaaaa', 'bbbbbb'])
234 call MouseLeftClick(1, 2)
235 call assert_equal(0, getcharmod(), msg)
236 call MouseLeftRelease(1, 2)
237 call MouseLeftClick(1, 2)
238 call assert_equal(32, getcharmod(), msg) " double-click
239 call MouseLeftRelease(1, 2)
240 call MouseLeftClick(1, 2)
241 call assert_equal(64, getcharmod(), msg) " triple-click
242 call MouseLeftRelease(1, 2)
243 call MouseLeftClick(1, 2)
244 call assert_equal(96, getcharmod(), msg) " quadruple-click
245 call MouseLeftDrag(2, 4)
246 call MouseLeftRelease(2, 4)
247 call assert_equal("\<c-s>", mode(), msg)
248 norm! x
249 call assert_equal(['axaa', 'bxbb'], getline(1, '$'), msg)
250 endfor
251
252 let &mouse = save_mouse
253 let &term = save_term
254 let &ttymouse = save_ttymouse
255 set mousetime&
256 set selectmode&
257 call test_override('no_query_mouse', 0)
258 bwipe!
259endfunc
260
Shougo Matsushita4ede01f2022-01-20 15:26:03 +0000261" Test for selecting a register with CTRL-R
262func Test_selectmode_register()
263 new
264
265 " Default behavior: use unnamed register
266 call setline(1, 'foo')
267 call setreg('"', 'bar')
268 call setreg('a', 'baz')
269 exe ":norm! v\<c-g>a"
270 call assert_equal(getline('.'), 'aoo')
271 call assert_equal('f', getreg('"'))
272 call assert_equal('baz', getreg('a'))
273
274 " Use the black hole register
275 call setline(1, 'foo')
276 call setreg('"', 'bar')
277 call setreg('a', 'baz')
278 exe ":norm! v\<c-g>\<c-r>_a"
279 call assert_equal(getline('.'), 'aoo')
280 call assert_equal('bar', getreg('"'))
281 call assert_equal('baz', getreg('a'))
282
283 " Invalid register: use unnamed register
284 call setline(1, 'foo')
285 call setreg('"', 'bar')
286 call setreg('a', 'baz')
287 exe ":norm! v\<c-g>\<c-r>?a"
288 call assert_equal(getline('.'), 'aoo')
289 call assert_equal('f', getreg('"'))
290 call assert_equal('baz', getreg('a'))
291
292 " Use unnamed register
293 call setline(1, 'foo')
294 call setreg('"', 'bar')
295 call setreg('a', 'baz')
296 exe ":norm! v\<c-g>\<c-r>\"a"
297 call assert_equal(getline('.'), 'aoo')
298 call assert_equal('f', getreg('"'))
299 call assert_equal('baz', getreg('a'))
300
301 " use specicifed register, unnamed register is also written
302 call setline(1, 'foo')
303 call setreg('"', 'bar')
304 call setreg('a', 'baz')
305 exe ":norm! v\<c-g>\<c-r>aa"
306 call assert_equal(getline('.'), 'aoo')
307 call assert_equal('f', getreg('"'))
308 call assert_equal('f', getreg('a'))
309
310 bw!
311endfunc
312
Bram Moolenaar515545e2020-03-22 14:08:59 +0100313" vim: shiftwidth=2 sts=2 expandtab