1" 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))
41  " arrow keys without shift should not start selection
42  call feedkeys("A\<Home>\<Right>\<Left>ro", 'xt')
43  call assert_equal('roabctdef', getline(1))
44  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
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
172  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
261" vim: shiftwidth=2 sts=2 expandtab
262