blob: 3adb843cb847c7d30bc0cd33497114a799fefa5a [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)
168 set mouse=a term=xterm mousetime=200
169 set selectmode=mouse
170 new
171
172 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
173 let msg = 'ttymouse=' .. ttymouse_val
174 exe 'set ttymouse=' .. ttymouse_val
175
176 " Single-click and drag should 'select' the characters
177 call setline(1, ['foo [foo bar] foo', 'foo'])
178 call MouseLeftClick(1, 3)
179 call assert_equal(0, getcharmod(), msg)
180 call MouseLeftDrag(1, 13)
181 call MouseLeftRelease(1, 13)
182 norm! o
183 call assert_equal(['foo foo', 'foo'], getline(1, '$'), msg)
184
185 " Double-click on word should visually 'select' the word.
186 call setline(1, ['foo [foo bar] foo', 'foo'])
187 call MouseLeftClick(1, 2)
188 call assert_equal(0, getcharmod(), msg)
189 call MouseLeftRelease(1, 2)
190 call MouseLeftClick(1, 2)
191 call assert_equal(32, getcharmod(), msg) " double-click
192 call MouseLeftRelease(1, 2)
193 call assert_equal('s', mode(), msg)
194 norm! bar
195 call assert_equal(['bar [foo bar] foo', 'foo'], getline(1, '$'), msg)
196
197 " Double-click on opening square bracket should visually
198 " 'select' the whole [foo bar].
199 call setline(1, ['foo [foo bar] foo', 'foo'])
200 call MouseLeftClick(1, 5)
201 call assert_equal(0, getcharmod(), msg)
202 call MouseLeftRelease(1, 5)
203 call MouseLeftClick(1, 5)
204 call assert_equal(32, getcharmod(), msg) " double-click
205 call MouseLeftRelease(1, 5)
206 call assert_equal('s', mode(), msg)
207 norm! bar
208 call assert_equal(['foo bar foo', 'foo'], getline(1, '$'), msg)
209
210 " To guarantee that the next click is not counted as a triple click
211 call MouseRightClick(1, 1)
212 call MouseRightRelease(1, 1)
213
214 " Triple-click should visually 'select' the whole line.
215 call setline(1, ['foo [foo bar] foo', 'foo'])
216 call MouseLeftClick(1, 3)
217 call assert_equal(0, getcharmod(), msg)
218 call MouseLeftRelease(1, 3)
219 call MouseLeftClick(1, 3)
220 call assert_equal(32, getcharmod(), msg) " double-click
221 call MouseLeftRelease(1, 3)
222 call MouseLeftClick(1, 3)
223 call assert_equal(64, getcharmod(), msg) " triple-click
224 call MouseLeftRelease(1, 3)
225 call assert_equal('S', mode(), msg)
226 norm! baz
227 call assert_equal(['bazfoo'], getline(1, '$'), msg)
228
229 " Quadruple-click should start visual block 'select'.
230 call setline(1, ['aaaaaa', 'bbbbbb'])
231 call MouseLeftClick(1, 2)
232 call assert_equal(0, getcharmod(), msg)
233 call MouseLeftRelease(1, 2)
234 call MouseLeftClick(1, 2)
235 call assert_equal(32, getcharmod(), msg) " double-click
236 call MouseLeftRelease(1, 2)
237 call MouseLeftClick(1, 2)
238 call assert_equal(64, getcharmod(), msg) " triple-click
239 call MouseLeftRelease(1, 2)
240 call MouseLeftClick(1, 2)
241 call assert_equal(96, getcharmod(), msg) " quadruple-click
242 call MouseLeftDrag(2, 4)
243 call MouseLeftRelease(2, 4)
244 call assert_equal("\<c-s>", mode(), msg)
245 norm! x
246 call assert_equal(['axaa', 'bxbb'], getline(1, '$'), msg)
247 endfor
248
249 let &mouse = save_mouse
250 let &term = save_term
251 let &ttymouse = save_ttymouse
252 set mousetime&
253 set selectmode&
254 call test_override('no_query_mouse', 0)
255 bwipe!
256endfunc
257
258" vim: shiftwidth=2 sts=2 expandtab