comparison src/testdir/test_termcodes.vim @ 19738:0208534b8a84 v8.2.0425

patch 8.2.0425: code for modeless selection not sufficiently tested Commit: https://github.com/vim/vim/commit/515545e11f523d14343b1e588dc0b9bd3d362bc2 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Mar 22 14:08:59 2020 +0100 patch 8.2.0425: code for modeless selection not sufficiently tested Problem: Code for modeless selection not sufficiently tested. Solution: Add tests. Move mouse code functionality to a common script file. (Yegappan Lakshmanan, closes #5821)
author Bram Moolenaar <Bram@vim.org>
date Sun, 22 Mar 2020 14:15:04 +0100
parents da791e5c0139
children 0927df746554
comparison
equal deleted inserted replaced
19737:5591829276ff 19738:0208534b8a84
4 source check.vim 4 source check.vim
5 CheckNotGui 5 CheckNotGui
6 CheckUnix 6 CheckUnix
7 7
8 source shared.vim 8 source shared.vim
9 9 source mouse.vim
10 " xterm2 and sgr always work, urxvt is optional.
11 let s:ttymouse_values = ['xterm2', 'sgr']
12 if has('mouse_urxvt')
13 call add(s:ttymouse_values, 'urxvt')
14 endif
15
16 " dec doesn't support all the functionality
17 if has('mouse_dec')
18 let s:ttymouse_dec = ['dec']
19 else
20 let s:ttymouse_dec = []
21 endif
22
23 " netterm only supports left click
24 if has('mouse_netterm')
25 let s:ttymouse_netterm = ['netterm']
26 else
27 let s:ttymouse_netterm = []
28 endif
29
30 " Helper function to emit a terminal escape code.
31 func TerminalEscapeCode(code, row, col, m)
32 if &ttymouse ==# 'xterm2'
33 " need to use byte encoding here.
34 let str = list2str([a:code + 0x20, a:col + 0x20, a:row + 0x20])
35 if has('iconv')
36 let bytes = str->iconv('utf-8', 'latin1')
37 else
38 " Hopefully the numbers are not too big.
39 let bytes = str
40 endif
41 return "\<Esc>[M" .. bytes
42 elseif &ttymouse ==# 'sgr'
43 return printf("\<Esc>[<%d;%d;%d%s", a:code, a:col, a:row, a:m)
44 elseif &ttymouse ==# 'urxvt'
45 return printf("\<Esc>[%d;%d;%dM", a:code + 0x20, a:col, a:row)
46 endif
47 endfunc
48
49 func DecEscapeCode(code, down, row, col)
50 return printf("\<Esc>[%d;%d;%d;%d&w", a:code, a:down, a:row, a:col)
51 endfunc
52
53 func NettermEscapeCode(row, col)
54 return printf("\<Esc>}%d,%d\r", a:row, a:col)
55 endfunc
56
57 func MouseLeftClickCode(row, col)
58 if &ttymouse ==# 'dec'
59 return DecEscapeCode(2, 4, a:row, a:col)
60 elseif &ttymouse ==# 'netterm'
61 return NettermEscapeCode(a:row, a:col)
62 else
63 return TerminalEscapeCode(0, a:row, a:col, 'M')
64 endif
65 endfunc
66
67 func MouseLeftClick(row, col)
68 call feedkeys(MouseLeftClickCode(a:row, a:col), 'Lx!')
69 endfunc
70
71 func MouseMiddleClickCode(row, col)
72 if &ttymouse ==# 'dec'
73 return DecEscapeCode(4, 2, a:row, a:col)
74 else
75 return TerminalEscapeCode(1, a:row, a:col, 'M')
76 endif
77 endfunc
78
79 func MouseMiddleClick(row, col)
80 call feedkeys(MouseMiddleClickCode(a:row, a:col), 'Lx!')
81 endfunc
82
83 func MouseRightClickCode(row, col)
84 if &ttymouse ==# 'dec'
85 return DecEscapeCode(6, 1, a:row, a:col)
86 else
87 return TerminalEscapeCode(2, a:row, a:col, 'M')
88 endif
89 endfunc
90
91 func MouseRightClick(row, col)
92 call feedkeys(MouseRightClickCode(a:row, a:col), 'Lx!')
93 endfunc
94
95 func MouseCtrlLeftClickCode(row, col)
96 let ctrl = 0x10
97 return TerminalEscapeCode(0 + ctrl, a:row, a:col, 'M')
98 endfunc
99
100 func MouseCtrlLeftClick(row, col)
101 call feedkeys(MouseCtrlLeftClickCode(a:row, a:col), 'Lx!')
102 endfunc
103
104 func MouseCtrlRightClickCode(row, col)
105 let ctrl = 0x10
106 return TerminalEscapeCode(2 + ctrl, a:row, a:col, 'M')
107 endfunc
108
109 func MouseCtrlRightClick(row, col)
110 call feedkeys(MouseCtrlRightClickCode(a:row, a:col), 'Lx!')
111 endfunc
112
113 func MouseLeftReleaseCode(row, col)
114 if &ttymouse ==# 'dec'
115 return DecEscapeCode(3, 0, a:row, a:col)
116 elseif &ttymouse ==# 'netterm'
117 return ''
118 else
119 return TerminalEscapeCode(3, a:row, a:col, 'm')
120 endif
121 endfunc
122
123 func MouseLeftRelease(row, col)
124 call feedkeys(MouseLeftReleaseCode(a:row, a:col), 'Lx!')
125 endfunc
126
127 func MouseMiddleReleaseCode(row, col)
128 if &ttymouse ==# 'dec'
129 return DecEscapeCode(5, 0, a:row, a:col)
130 else
131 return TerminalEscapeCode(3, a:row, a:col, 'm')
132 endif
133 endfunc
134
135 func MouseMiddleRelease(row, col)
136 call feedkeys(MouseMiddleReleaseCode(a:row, a:col), 'Lx!')
137 endfunc
138
139 func MouseRightReleaseCode(row, col)
140 if &ttymouse ==# 'dec'
141 return DecEscapeCode(7, 0, a:row, a:col)
142 else
143 return TerminalEscapeCode(3, a:row, a:col, 'm')
144 endif
145 endfunc
146
147 func MouseRightRelease(row, col)
148 call feedkeys(MouseRightReleaseCode(a:row, a:col), 'Lx!')
149 endfunc
150
151 func MouseLeftDragCode(row, col)
152 if &ttymouse ==# 'dec'
153 return DecEscapeCode(1, 4, a:row, a:col)
154 else
155 return TerminalEscapeCode(0x20, a:row, a:col, 'M')
156 endif
157 endfunc
158
159 func MouseLeftDrag(row, col)
160 call feedkeys(MouseLeftDragCode(a:row, a:col), 'Lx!')
161 endfunc
162
163 func MouseWheelUpCode(row, col)
164 return TerminalEscapeCode(0x40, a:row, a:col, 'M')
165 endfunc
166
167 func MouseWheelUp(row, col)
168 call feedkeys(MouseWheelUpCode(a:row, a:col), 'Lx!')
169 endfunc
170
171 func MouseWheelDownCode(row, col)
172 return TerminalEscapeCode(0x41, a:row, a:col, 'M')
173 endfunc
174
175 func MouseWheelDown(row, col)
176 call feedkeys(MouseWheelDownCode(a:row, a:col), 'Lx!')
177 endfunc
178 10
179 func Test_term_mouse_left_click() 11 func Test_term_mouse_left_click()
180 new 12 new
181 let save_mouse = &mouse 13 let save_mouse = &mouse
182 let save_term = &term 14 let save_term = &term
183 let save_ttymouse = &ttymouse 15 let save_ttymouse = &ttymouse
184 call test_override('no_query_mouse', 1) 16 call test_override('no_query_mouse', 1)
185 set mouse=a term=xterm 17 set mouse=a term=xterm
186 call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer']) 18 call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer'])
187 19
188 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec + s:ttymouse_netterm 20 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
189 let msg = 'ttymouse=' .. ttymouse_val 21 let msg = 'ttymouse=' .. ttymouse_val
190 exe 'set ttymouse=' .. ttymouse_val 22 exe 'set ttymouse=' .. ttymouse_val
191 go 23 go
192 call assert_equal([0, 1, 1, 0], getpos('.'), msg) 24 call assert_equal([0, 1, 1, 0], getpos('.'), msg)
193 let row = 2 25 let row = 2
213 let save_ttymouse = &ttymouse 45 let save_ttymouse = &ttymouse
214 call test_override('no_query_mouse', 1) 46 call test_override('no_query_mouse', 1)
215 set mouse=a term=xterm 47 set mouse=a term=xterm
216 48
217 for visual_mode in ["v", "V", "\<C-V>"] 49 for visual_mode in ["v", "V", "\<C-V>"]
218 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec 50 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
219 let msg = 'visual=' .. visual_mode .. ' ttymouse=' .. ttymouse_val 51 let msg = 'visual=' .. visual_mode .. ' ttymouse=' .. ttymouse_val
220 exe 'set ttymouse=' .. ttymouse_val 52 exe 'set ttymouse=' .. ttymouse_val
221 53
222 call setline(1, repeat([repeat('-', 7)], 7)) 54 call setline(1, repeat([repeat('-', 7)], 7))
223 call MouseLeftClick(4, 4) 55 call MouseLeftClick(4, 4)
282 let save_mouse = &mouse 114 let save_mouse = &mouse
283 let save_term = &term 115 let save_term = &term
284 let save_ttymouse = &ttymouse 116 let save_ttymouse = &ttymouse
285 set mouse=a term=xterm 117 set mouse=a term=xterm
286 118
287 for ttymouse_val in s:ttymouse_values 119 for ttymouse_val in g:Ttymouse_values
288 let msg = 'ttymouse=' .. ttymouse_val 120 let msg = 'ttymouse=' .. ttymouse_val
289 exe 'set ttymouse=' .. ttymouse_val 121 exe 'set ttymouse=' .. ttymouse_val
290 help 122 help
291 /usr_02.txt 123 /usr_02.txt
292 norm! zt 124 norm! zt
320 call test_override('no_query_mouse', 1) 152 call test_override('no_query_mouse', 1)
321 let save_quotestar = @* 153 let save_quotestar = @*
322 let @* = 'abc' 154 let @* = 'abc'
323 set mouse=a term=xterm 155 set mouse=a term=xterm
324 156
325 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec 157 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
326 let msg = 'ttymouse=' .. ttymouse_val 158 let msg = 'ttymouse=' .. ttymouse_val
327 exe 'set ttymouse=' .. ttymouse_val 159 exe 'set ttymouse=' .. ttymouse_val
328 call setline(1, ['123456789', '123456789']) 160 call setline(1, ['123456789', '123456789'])
329 161
330 " Middle-click in the middle of the line pastes text where clicked. 162 " Middle-click in the middle of the line pastes text where clicked.
364 let save_term = &term 196 let save_term = &term
365 let save_ttymouse = &ttymouse 197 let save_ttymouse = &ttymouse
366 set mouse=a term=xterm 198 set mouse=a term=xterm
367 call setline(1, range(1, 100)) 199 call setline(1, range(1, 100))
368 200
369 for ttymouse_val in s:ttymouse_values 201 for ttymouse_val in g:Ttymouse_values
370 let msg = 'ttymouse=' .. ttymouse_val 202 let msg = 'ttymouse=' .. ttymouse_val
371 exe 'set ttymouse=' .. ttymouse_val 203 exe 'set ttymouse=' .. ttymouse_val
372 go 204 go
373 call assert_equal(1, line('w0'), msg) 205 call assert_equal(1, line('w0'), msg)
374 call assert_equal([0, 1, 1, 0], getpos('.'), msg) 206 call assert_equal([0, 1, 1, 0], getpos('.'), msg)
411 " so we test dragging mouse below and above the window. 243 " so we test dragging mouse below and above the window.
412 2split 244 2split
413 wincmd j 245 wincmd j
414 2split 246 2split
415 247
416 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec 248 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
417 let msg = 'ttymouse=' .. ttymouse_val 249 let msg = 'ttymouse=' .. ttymouse_val
418 exe 'set ttymouse=' .. ttymouse_val 250 exe 'set ttymouse=' .. ttymouse_val
419 251
420 " Line #10 at the top. 252 " Line #10 at the top.
421 norm! 10zt 253 norm! 10zt
488 let save_term = &term 320 let save_term = &term
489 let save_ttymouse = &ttymouse 321 let save_ttymouse = &ttymouse
490 call test_override('no_query_mouse', 1) 322 call test_override('no_query_mouse', 1)
491 set mouse=a term=xterm 323 set mouse=a term=xterm
492 324
493 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec 325 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
494 let msg = 'ttymouse=' .. ttymouse_val 326 let msg = 'ttymouse=' .. ttymouse_val
495 exe 'set ttymouse=' .. ttymouse_val 327 exe 'set ttymouse=' .. ttymouse_val
496 328
497 " Split horizontally and test dragging the horizontal window separator. 329 " Split horizontally and test dragging the horizontal window separator.
498 split 330 split
547 let save_ttymouse = &ttymouse 379 let save_ttymouse = &ttymouse
548 call test_override('no_query_mouse', 1) 380 call test_override('no_query_mouse', 1)
549 let save_laststatus = &laststatus 381 let save_laststatus = &laststatus
550 set mouse=a term=xterm laststatus=2 382 set mouse=a term=xterm laststatus=2
551 383
552 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec 384 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
553 let msg = 'ttymouse=' .. ttymouse_val 385 let msg = 'ttymouse=' .. ttymouse_val
554 exe 'set ttymouse=' .. ttymouse_val 386 exe 'set ttymouse=' .. ttymouse_val
555 387
556 call assert_equal(1, &cmdheight, msg) 388 call assert_equal(1, &cmdheight, msg)
557 let rowstatusline = winheight(0) + 1 389 let rowstatusline = winheight(0) + 1
590 let save_ttymouse = &ttymouse 422 let save_ttymouse = &ttymouse
591 call test_override('no_query_mouse', 1) 423 call test_override('no_query_mouse', 1)
592 set mouse=a term=xterm 424 set mouse=a term=xterm
593 let row = 1 425 let row = 1
594 426
595 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec + s:ttymouse_netterm 427 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
596 let msg = 'ttymouse=' .. ttymouse_val 428 let msg = 'ttymouse=' .. ttymouse_val
597 exe 'set ttymouse=' .. ttymouse_val 429 exe 'set ttymouse=' .. ttymouse_val
598 e Xfoo 430 e Xfoo
599 tabnew Xbar 431 tabnew Xbar
600 432
640 call test_override('no_query_mouse', 1) 472 call test_override('no_query_mouse', 1)
641 set mouse=a term=xterm 473 set mouse=a term=xterm
642 let row = 1 474 let row = 1
643 let col = &columns 475 let col = &columns
644 476
645 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec + s:ttymouse_netterm 477 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
646 if ttymouse_val ==# 'xterm2' && col > 223 478 if ttymouse_val ==# 'xterm2' && col > 223
647 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported. 479 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
648 continue 480 continue
649 endif 481 endif
650 let msg = 'ttymouse=' .. ttymouse_val 482 let msg = 'ttymouse=' .. ttymouse_val
688 call test_override('no_query_mouse', 1) 520 call test_override('no_query_mouse', 1)
689 " Set 'mousetime' to 1 to avoid recognizing a double-click in the loop 521 " Set 'mousetime' to 1 to avoid recognizing a double-click in the loop
690 set mouse=a term=xterm mousetime=1 522 set mouse=a term=xterm mousetime=1
691 let row = 1 523 let row = 1
692 524
693 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec 525 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
694 let msg = 'ttymouse=' .. ttymouse_val 526 let msg = 'ttymouse=' .. ttymouse_val
695 exe 'set ttymouse=' .. ttymouse_val 527 exe 'set ttymouse=' .. ttymouse_val
696 e Xtab1 528 e Xtab1
697 tabnew Xtab2 529 tabnew Xtab2
698 530
742 " have to wait long to avoid a triple-click. 574 " have to wait long to avoid a triple-click.
743 set mouse=a term=xterm mousetime=200 575 set mouse=a term=xterm mousetime=200
744 let row = 1 576 let row = 1
745 let col = 10 577 let col = 10
746 578
747 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec 579 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
748 let msg = 'ttymouse=' .. ttymouse_val 580 let msg = 'ttymouse=' .. ttymouse_val
749 exe 'set ttymouse=' .. ttymouse_val 581 exe 'set ttymouse=' .. ttymouse_val
750 e Xtab1 582 e Xtab1
751 tabnew Xtab2 583 tabnew Xtab2
752 584
795 let save_ttymouse = &ttymouse 627 let save_ttymouse = &ttymouse
796 call test_override('no_query_mouse', 1) 628 call test_override('no_query_mouse', 1)
797 set mouse=a term=xterm mousetime=200 629 set mouse=a term=xterm mousetime=200
798 new 630 new
799 631
800 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec 632 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
801 let msg = 'ttymouse=' .. ttymouse_val 633 let msg = 'ttymouse=' .. ttymouse_val
802 exe 'set ttymouse=' .. ttymouse_val 634 exe 'set ttymouse=' .. ttymouse_val
803 call setline(1, ['foo [foo bar] foo', 'foo']) 635 call setline(1, ['foo [foo bar] foo', 'foo'])
804 636
805 " Double-click on word should visually select the word. 637 " Double-click on word should visually select the word.
923 let save_ttymouse = &ttymouse 755 let save_ttymouse = &ttymouse
924 call test_override('no_query_mouse', 1) 756 call test_override('no_query_mouse', 1)
925 set mouse=a term=xterm 757 set mouse=a term=xterm
926 let row = &lines 758 let row = &lines
927 759
928 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec 760 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
929 let msg = 'ttymouse=' .. ttymouse_val 761 let msg = 'ttymouse=' .. ttymouse_val
930 exe 'set ttymouse=' .. ttymouse_val 762 exe 'set ttymouse=' .. ttymouse_val
931 763
932 call feedkeys(':"3456789' 764 call feedkeys(':"3456789'
933 \ .. MouseLeftClickCode(row, 7) 765 \ .. MouseLeftClickCode(row, 7)
956 let row = &lines 788 let row = &lines
957 " Column values does not matter, paste is done at position of cursor. 789 " Column values does not matter, paste is done at position of cursor.
958 let col = 1 790 let col = 1
959 let @* = 'paste' 791 let @* = 'paste'
960 792
961 for ttymouse_val in s:ttymouse_values + s:ttymouse_dec 793 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
962 let msg = 'ttymouse=' .. ttymouse_val 794 let msg = 'ttymouse=' .. ttymouse_val
963 exe 'set ttymouse=' .. ttymouse_val 795 exe 'set ttymouse=' .. ttymouse_val
964 796
965 call feedkeys(":\"->" 797 call feedkeys(":\"->"
966 \ .. MouseMiddleReleaseCode(row, col) 798 \ .. MouseMiddleReleaseCode(row, col)
993 825
994 menu PopUp.foo :let g:menustr = 'foo'<CR> 826 menu PopUp.foo :let g:menustr = 'foo'<CR>
995 menu PopUp.bar :let g:menustr = 'bar'<CR> 827 menu PopUp.bar :let g:menustr = 'bar'<CR>
996 menu PopUp.baz :let g:menustr = 'baz'<CR> 828 menu PopUp.baz :let g:menustr = 'baz'<CR>
997 829
998 for ttymouse_val in s:ttymouse_values 830 for ttymouse_val in g:Ttymouse_values
999 exe 'set ttymouse=' .. ttymouse_val 831 exe 'set ttymouse=' .. ttymouse_val
1000 let g:menustr = '' 832 let g:menustr = ''
1001 call feedkeys(MouseRightClickCode(1, 4) 833 call feedkeys(MouseRightClickCode(1, 4)
1002 \ .. MouseRightReleaseCode(1, 4) .. "\<Down>\<Down>\<CR>", "x") 834 \ .. MouseRightReleaseCode(1, 4) .. "\<Down>\<Down>\<CR>", "x")
1003 call assert_equal('bar', g:menustr) 835 call assert_equal('bar', g:menustr)