1" Test for modeless selection
2
3" This only works for Unix in a terminal
4source check.vim
5CheckNotGui
6CheckUnix
7
8source mouse.vim
9
10" Test for modeless characterwise selection (single click)
11func Test_modeless_characterwise_selection()
12  CheckFeature clipboard_working
13  let save_mouse = &mouse
14  let save_term = &term
15  let save_ttymouse = &ttymouse
16  call test_override('no_query_mouse', 1)
17  set mouse=a term=xterm mousetime=200
18  new
19  call setline(1, ['one two three', 'foo bar baz'])
20  redraw!
21
22  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
23    let msg = 'ttymouse=' .. ttymouse_val
24    exe 'set ttymouse=' .. ttymouse_val
25
26    " select multiple characters within a line
27    let @* = 'clean'
28    call MouseRightClick(1, 1)
29    call MouseRightRelease(1, 1)
30    let keys = ":"
31    let keys ..= MouseLeftClickCode(1, 6)
32    let keys ..= MouseLeftDragCode(1, 10)
33    let keys ..= MouseLeftReleaseCode(1, 10)
34    let keys ..= "\<C-Y>\<CR>"
35    call feedkeys(keys, "x")
36    call assert_equal("wo th", @*, msg)
37
38    " select multiple characters including the end of line
39    let @* = 'clean'
40    call MouseRightClick(1, 1)
41    call MouseRightRelease(1, 1)
42    let keys = ":"
43    let keys ..= MouseLeftClickCode(1, 11)
44    let keys ..= MouseLeftDragCode(1, 16)
45    let keys ..= MouseLeftReleaseCode(1, 16)
46    let keys ..= "\<C-Y>\<CR>"
47    call feedkeys(keys, "x")
48    call assert_equal("ree\n", @*, msg)
49
50    " extend a selection using right mouse click
51    let @* = 'clean'
52    call MouseRightClick(1, 1)
53    call MouseRightRelease(1, 1)
54    set mousemodel=extend
55    let keys = ":"
56    let keys ..= MouseLeftClickCode(1, 2)
57    let keys ..= MouseLeftDragCode(1, 5)
58    let keys ..= MouseLeftReleaseCode(1, 5)
59    let keys ..= MouseRightClickCode(1, 10)
60    let keys ..= MouseRightReleaseCode(1, 10)
61    let keys ..= "\<C-Y>\<CR>"
62    call feedkeys(keys, "x")
63    call assert_equal("ne two th", @*, msg)
64    set mousemodel&
65
66    " extend a selection backwards using right mouse click
67    let @* = 'clean'
68    call MouseRightClick(1, 1)
69    call MouseRightRelease(1, 1)
70    set mousemodel=extend
71    let keys = ":"
72    let keys ..= MouseLeftClickCode(1, 7)
73    let keys ..= MouseLeftDragCode(1, 11)
74    let keys ..= MouseLeftReleaseCode(1, 11)
75    let keys ..= MouseRightClickCode(1, 3)
76    let keys ..= MouseRightReleaseCode(1, 3)
77    let keys ..= "\<C-Y>\<CR>"
78    call feedkeys(keys, "x")
79    call assert_equal("e two thr", @*, msg)
80    set mousemodel&
81
82    " select multiple characters within a line backwards
83    let @* = 'clean'
84    call MouseRightClick(1, 1)
85    call MouseRightRelease(1, 1)
86    let keys = ":"
87    let keys ..= MouseLeftClickCode(1, 9)
88    let keys ..= MouseLeftDragCode(1, 3)
89    let keys ..= MouseLeftReleaseCode(1, 3)
90    let keys ..= "\<C-Y>\<CR>"
91    call feedkeys(keys, "x")
92    call assert_equal("e two t", @*, msg)
93
94    " select multiple characters across lines with (end row > start row) and
95    " (end column < start column)
96    let @* = 'clean'
97    call MouseRightClick(1, 1)
98    call MouseRightRelease(1, 1)
99    let keys = ":"
100    let keys ..= MouseLeftClickCode(1, 9)
101    let keys ..= MouseLeftDragCode(2, 3)
102    let keys ..= MouseLeftReleaseCode(2, 3)
103    let keys ..= "\<C-Y>\<CR>"
104    call feedkeys(keys, "x")
105    call assert_equal("three\nfoo", @*, msg)
106
107    " select multiple characters across lines with (end row > start row) and
108    " (end column > start column)
109    let @* = 'clean'
110    call MouseRightClick(1, 1)
111    call MouseRightRelease(1, 1)
112    let keys = ":"
113    let keys ..= MouseLeftClickCode(1, 4)
114    let keys ..= MouseLeftDragCode(2, 8)
115    let keys ..= MouseLeftReleaseCode(2, 8)
116    let keys ..= "\<C-Y>\<CR>"
117    call feedkeys(keys, "x")
118    call assert_equal(" two three\nfoo bar ", @*, msg)
119
120    " select multiple characters across lines with (end row < start row) and
121    " (end column < start column)
122    let @* = 'clean'
123    call MouseRightClick(1, 1)
124    call MouseRightRelease(1, 1)
125    let keys = ":"
126    let keys ..= MouseLeftClickCode(2, 7)
127    let keys ..= MouseLeftDragCode(1, 5)
128    let keys ..= MouseLeftReleaseCode(1, 5)
129    let keys ..= "\<C-Y>\<CR>"
130    call feedkeys(keys, "x")
131    call assert_equal("two three\nfoo bar", @*, msg)
132
133    " select multiple characters across lines with (end row < start row) and
134    " (end column > start column)
135    let @* = 'clean'
136    call MouseRightClick(1, 1)
137    call MouseRightRelease(1, 1)
138    let keys = ":"
139    let keys ..= MouseLeftClickCode(2, 11)
140    let keys ..= MouseLeftDragCode(1, 13)
141    let keys ..= MouseLeftReleaseCode(1, 13)
142    let keys ..= "\<C-Y>\<CR>"
143    call feedkeys(keys, "x")
144    call assert_equal("e\nfoo bar baz", @*, msg)
145
146    " select multiple characters across lines with (end row < start row) and
147    " the end column is greater than the line length
148    let @* = 'clean'
149    call MouseRightClick(1, 1)
150    call MouseRightRelease(1, 1)
151    let keys = ":"
152    let keys ..= MouseLeftClickCode(2, 7)
153    let keys ..= MouseLeftDragCode(1, 16)
154    let keys ..= MouseLeftReleaseCode(1, 16)
155    let keys ..= "\<C-Y>\<CR>"
156    call feedkeys(keys, "x")
157    call assert_equal("\nfoo bar", @*, msg)
158
159    " select multiple characters across lines with start/end row and start/end
160    " column outside the lines in the buffer
161    let @* = 'clean'
162    call MouseRightClick(1, 1)
163    call MouseRightRelease(1, 1)
164    let keys = ":"
165    let keys ..= MouseLeftClickCode(4, 3)
166    let keys ..= MouseLeftDragCode(3, 2)
167    let keys ..= MouseLeftReleaseCode(3, 2)
168    let keys ..= "\<C-Y>\<CR>"
169    call feedkeys(keys, "x")
170    call assert_equal("\n~  ", @*, msg)
171
172    " change selection using right mouse click within the selected text
173    let @* = 'clean'
174    call MouseRightClick(1, 1)
175    call MouseRightRelease(1, 1)
176    set mousemodel=extend
177    let keys = ":"
178    let keys ..= MouseLeftClickCode(1, 5)
179    let keys ..= MouseLeftDragCode(1, 13)
180    let keys ..= MouseLeftReleaseCode(1, 13)
181    let keys ..= MouseRightClickCode(1, 7)
182    let keys ..= MouseRightReleaseCode(1, 7)
183    let keys ..= MouseRightClickCode(1, 11)
184    let keys ..= MouseRightReleaseCode(1, 11)
185    let keys ..= "\<C-Y>\<CR>"
186    call feedkeys(keys, "x")
187    call assert_equal("o thr", @*, msg)
188    set mousemodel&
189
190    " select text multiple times at different places
191    let @* = 'clean'
192    call MouseRightClick(1, 1)
193    call MouseRightRelease(1, 1)
194    let keys = ":"
195    let keys ..= MouseLeftClickCode(1, 3)
196    let keys ..= MouseLeftDragCode(1, 5)
197    let keys ..= MouseLeftReleaseCode(1, 5)
198    let keys ..= MouseLeftClickCode(2, 7)
199    let keys ..= MouseLeftDragCode(2, 9)
200    let keys ..= MouseLeftReleaseCode(2, 9)
201    let keys ..= "\<C-Y>\<CR>"
202    call feedkeys(keys, "x")
203    call assert_equal("r b", @*, msg)
204
205    " Test for 'clipboard' set to 'autoselectml' to automatically copy the
206    " modeless selection to the clipboard
207    set clipboard=autoselectml
208    let @* = 'clean'
209    let keys = ":"
210    let keys ..= MouseLeftClickCode(2, 5)
211    let keys ..= MouseLeftDragCode(2, 7)
212    let keys ..= MouseLeftReleaseCode(2, 7)
213    let keys ..= "\<CR>"
214    call feedkeys(keys, "x")
215    call assert_equal("bar", @*)
216    set clipboard&
217
218    " quadruple click should start characterwise selectmode
219    let @* = 'clean'
220    call MouseRightClick(1, 1)
221    call MouseRightRelease(1, 1)
222    let keys = ":"
223    let keys ..= MouseLeftClickCode(1, 10)
224    let keys ..= MouseLeftReleaseCode(1, 10)
225    let keys ..= MouseLeftClickCode(1, 10)
226    let keys ..= MouseLeftReleaseCode(1, 10)
227    let keys ..= MouseLeftClickCode(1, 10)
228    let keys ..= MouseLeftReleaseCode(1, 10)
229    let keys ..= MouseLeftClickCode(1, 10)
230    let keys ..= MouseLeftDragCode(1, 11)
231    let keys ..= MouseLeftReleaseCode(1, 11)
232    let keys ..= "\<C-Y>\<CR>"
233    call feedkeys(keys, "x")
234    call assert_equal("hree", @*, msg)
235  endfor
236
237  let &mouse = save_mouse
238  let &term = save_term
239  let &ttymouse = save_ttymouse
240  set mousetime&
241  call test_override('no_query_mouse', 0)
242  close!
243endfunc
244
245" Test for modeless word selection (double click)
246func Test_modeless_word_selection()
247  CheckFeature clipboard_working
248  let save_mouse = &mouse
249  let save_term = &term
250  let save_ttymouse = &ttymouse
251  call test_override('no_query_mouse', 1)
252  set mouse=a term=xterm mousetime=200
253  new
254  call setline(1, ['one two three', 'foo bar baz'])
255  redraw!
256
257  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
258    let msg = 'ttymouse=' .. ttymouse_val
259    exe 'set ttymouse=' .. ttymouse_val
260
261    " select multiple words within a line
262    let @* = 'clean'
263    call MouseRightClick(1, 1)
264    call MouseRightRelease(1, 1)
265    let keys = ":"
266    let keys ..= MouseLeftClickCode(1, 6)
267    let keys ..= MouseLeftReleaseCode(1, 6)
268    let keys ..= MouseLeftClickCode(1, 6)
269    let keys ..= MouseLeftDragCode(1, 10)
270    let keys ..= MouseLeftReleaseCode(1, 10)
271    let keys ..= "\<C-Y>\<CR>"
272    call feedkeys(keys, "x")
273    call assert_equal("two three", @*, msg)
274
275    " select a single word
276    let @* = 'clean'
277    call MouseRightClick(1, 1)
278    call MouseRightRelease(1, 1)
279    let keys = ":"
280    let keys ..= MouseLeftClickCode(2, 6)
281    let keys ..= MouseLeftReleaseCode(2, 6)
282    let keys ..= MouseLeftClickCode(2, 6)
283    let keys ..= MouseLeftReleaseCode(2, 6)
284    let keys ..= "\<C-Y>\<CR>"
285    call feedkeys(keys, "x")
286    call assert_equal("bar", @*, msg)
287
288    " select multiple words backwards within a line
289    let @* = 'clean'
290    call MouseRightClick(1, 1)
291    call MouseRightRelease(1, 1)
292    let keys = ":"
293    let keys ..= MouseLeftClickCode(2, 11)
294    let keys ..= MouseLeftReleaseCode(2, 11)
295    let keys ..= MouseLeftClickCode(2, 11)
296    let keys ..= MouseLeftDragCode(2, 7)
297    let keys ..= MouseLeftReleaseCode(2, 7)
298    let keys ..= "\<C-Y>\<CR>"
299    call feedkeys(keys, "x")
300    call assert_equal("bar baz", @*, msg)
301
302    " select multiple words backwards across lines
303    let @* = 'clean'
304    call MouseRightClick(1, 1)
305    call MouseRightRelease(1, 1)
306    let keys = ":"
307    let keys ..= MouseLeftClickCode(2, 7)
308    let keys ..= MouseLeftReleaseCode(2, 7)
309    let keys ..= MouseLeftClickCode(2, 7)
310    let keys ..= MouseLeftDragCode(1, 6)
311    let keys ..= MouseLeftReleaseCode(1, 6)
312    let keys ..= "\<C-Y>\<CR>"
313    call feedkeys(keys, "x")
314    call assert_equal("two three\nfoo bar", @*, msg)
315  endfor
316
317  let &mouse = save_mouse
318  let &term = save_term
319  let &ttymouse = save_ttymouse
320  set mousetime&
321  call test_override('no_query_mouse', 0)
322  close!
323endfunc
324
325" Test for modeless line selection (triple click)
326func Test_modeless_line_selection()
327  CheckFeature clipboard_working
328  let save_mouse = &mouse
329  let save_term = &term
330  let save_ttymouse = &ttymouse
331  call test_override('no_query_mouse', 1)
332  set mouse=a term=xterm mousetime=200
333  new
334  call setline(1, ['one two three', 'foo bar baz'])
335  redraw!
336
337  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
338    let msg = 'ttymouse=' .. ttymouse_val
339    exe 'set ttymouse=' .. ttymouse_val
340
341    " select single line
342    let @* = 'clean'
343    call MouseRightClick(1, 1)
344    call MouseRightRelease(1, 1)
345    let keys = ":"
346    let keys ..= MouseLeftClickCode(2, 6)
347    let keys ..= MouseLeftReleaseCode(2, 6)
348    let keys ..= MouseLeftClickCode(2, 6)
349    let keys ..= MouseLeftReleaseCode(2, 6)
350    let keys ..= MouseLeftClickCode(2, 6)
351    let keys ..= MouseLeftReleaseCode(2, 6)
352    let keys ..= "\<C-Y>\<CR>"
353    call feedkeys(keys, "x")
354    call assert_equal("foo bar baz\n", @*, msg)
355
356    " select multiple lines
357    let @* = 'clean'
358    call MouseRightClick(1, 1)
359    call MouseRightRelease(1, 1)
360    let keys = ":"
361    let keys ..= MouseLeftClickCode(1, 6)
362    let keys ..= MouseLeftReleaseCode(1, 6)
363    let keys ..= MouseLeftClickCode(1, 6)
364    let keys ..= MouseLeftReleaseCode(1, 6)
365    let keys ..= MouseLeftClickCode(1, 6)
366    let keys ..= MouseLeftDragCode(2, 12)
367    let keys ..= MouseLeftReleaseCode(2, 12)
368    let keys ..= "\<C-Y>\<CR>"
369    call feedkeys(keys, "x")
370    call assert_equal("one two three\nfoo bar baz\n", @*, msg)
371
372    " select multiple lines backwards
373    let @* = 'clean'
374    call MouseRightClick(1, 1)
375    call MouseRightRelease(1, 1)
376    let keys = ":"
377    let keys ..= MouseLeftClickCode(2, 10)
378    let keys ..= MouseLeftReleaseCode(2, 10)
379    let keys ..= MouseLeftClickCode(2, 10)
380    let keys ..= MouseLeftReleaseCode(2, 10)
381    let keys ..= MouseLeftClickCode(2, 10)
382    let keys ..= MouseLeftDragCode(1, 3)
383    let keys ..= MouseLeftReleaseCode(1, 3)
384    let keys ..= "\<C-Y>\<CR>"
385    call feedkeys(keys, "x")
386    call assert_equal("one two three\nfoo bar baz\n", @*, msg)
387  endfor
388
389  let &mouse = save_mouse
390  let &term = save_term
391  let &ttymouse = save_ttymouse
392  set mousetime&
393  call test_override('no_query_mouse', 0)
394  close!
395endfunc
396
397" vim: shiftwidth=2 sts=2 expandtab
398