blob: 949fa94814ccf16317f44919a358f924ddb6986c [file] [log] [blame]
Bram Moolenaar905dd902019-04-07 14:21:47 +02001" Tests for decoding escape sequences sent by the terminal.
2
3" This only works for Unix in a terminal
4if has('gui_running') || !has('unix')
5 finish
6endif
7
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +02008" Helper function to emit a terminal escape code.
9func TerminalEscapeCode(code_xterm, code_sgr, row, col, m)
10 if &ttymouse ==# 'xterm'
11 " need to use byte encoding here.
12 let str = list2str([a:code_xterm, a:col + 0x20, a:row + 0x20])
13 if has('iconv')
14 let bytes = iconv(str, 'utf-8', 'latin1')
15 else
16 " Hopefully the numbers are not too big.
17 let bytes = str
18 endif
19 call feedkeys("\<Esc>[M" .. bytes, 'Lx!')
20 elseif &ttymouse ==# 'sgr'
21 call feedkeys(printf("\<Esc>[<%d;%d;%d%s", a:code_sgr, a:col, a:row, a:m), 'Lx!')
22 endif
23endfunc
24
25func MouseLeftClick(row, col)
26 call TerminalEscapeCode(0x20, 0, a:row, a:col, 'M')
27endfunc
28
29func MouseLeftRelease(row, col)
30 call TerminalEscapeCode(0x23, 3, a:row, a:col, 'm')
31endfunc
32
33func MouseLeftDrag(row, col)
34 call TerminalEscapeCode(0x43, 0x20, a:row, a:col, 'M')
35endfunc
36
37func MouseWheelUp(row, col)
38 call TerminalEscapeCode(0x40, 0x40, a:row, a:col, 'M')
39endfunc
40
41func MouseWheelDown(row, col)
42 call TerminalEscapeCode(0x41, 0x41, a:row, a:col, 'M')
43endfunc
44
Bram Moolenaar905dd902019-04-07 14:21:47 +020045func Test_xterm_mouse_click()
46 new
47 let save_mouse = &mouse
48 let save_term = &term
49 let save_ttymouse = &ttymouse
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020050 set mouse=a term=xterm
Bram Moolenaar905dd902019-04-07 14:21:47 +020051 call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer'])
Bram Moolenaar905dd902019-04-07 14:21:47 +020052
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020053 for ttymouse_val in ['xterm', 'sgr']
54 exe 'set ttymouse=' . ttymouse_val
55 go
56 call assert_equal([0, 1, 1, 0], getpos('.'))
57 let row = 2
58 let col = 6
59 call MouseLeftClick(row, col)
60 call MouseLeftRelease(row, col)
61 call assert_equal([0, 2, 6, 0], getpos('.'))
62 endfor
Bram Moolenaar905dd902019-04-07 14:21:47 +020063
64 let &mouse = save_mouse
65 let &term = save_term
66 let &ttymouse = save_ttymouse
67 bwipe!
68endfunc
69
Bram Moolenaar049736f2019-04-07 21:55:07 +020070func Test_xterm_mouse_wheel()
71 new
72 let save_mouse = &mouse
73 let save_term = &term
74 let save_ttymouse = &ttymouse
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020075 set mouse=a term=xterm
Bram Moolenaar049736f2019-04-07 21:55:07 +020076 call setline(1, range(1, 100))
77
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020078 for ttymouse_val in ['xterm', 'sgr']
79 exe 'set ttymouse=' . ttymouse_val
80 go
81 call assert_equal(1, line('w0'))
82 call assert_equal([0, 1, 1, 0], getpos('.'))
Bram Moolenaar049736f2019-04-07 21:55:07 +020083
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020084 call MouseWheelDown(1, 1)
85 call assert_equal(4, line('w0'))
86 call assert_equal([0, 4, 1, 0], getpos('.'))
Bram Moolenaar049736f2019-04-07 21:55:07 +020087
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020088 call MouseWheelDown(1, 1)
89 call assert_equal(7, line('w0'))
90 call assert_equal([0, 7, 1, 0], getpos('.'))
Bram Moolenaar049736f2019-04-07 21:55:07 +020091
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020092 call MouseWheelUp(1, 1)
93 call assert_equal(4, line('w0'))
94 call assert_equal([0, 7, 1, 0], getpos('.'))
Bram Moolenaar049736f2019-04-07 21:55:07 +020095
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020096 call MouseWheelUp(1, 1)
97 call assert_equal(1, line('w0'))
98 call assert_equal([0, 7, 1, 0], getpos('.'))
99 endfor
Bram Moolenaar049736f2019-04-07 21:55:07 +0200100
101 let &mouse = save_mouse
102 let &term = save_term
103 let &ttymouse = save_ttymouse
104 bwipe!
105endfunc
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200106
107func Test_xterm_mouse_drag_window_separator()
108 let save_mouse = &mouse
109 let save_term = &term
110 let save_ttymouse = &ttymouse
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200111 set mouse=a term=xterm
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200112
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200113 for ttymouse_val in ['xterm', 'sgr']
114 exe 'set ttymouse=' . ttymouse_val
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200115
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200116 " Split horizontally and test dragging the horizontal window separator.
117 split
118 let rowseparator = winheight(0) + 1
119 let row = rowseparator
120 let col = 1
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200121
122 if ttymouse_val ==# 'xterm' && row > 223
123 " When 'ttymouse' is 'xterm', row/col bigger than 223 are not supported.
124 continue
125 endif
126
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200127 call MouseLeftClick(row, col)
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200128
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200129 let row -= 1
130 call MouseLeftDrag(row, col)
131 call assert_equal(rowseparator - 1, winheight(0) + 1)
132 let row += 1
133 call MouseLeftDrag(row, col)
134 call assert_equal(rowseparator, winheight(0) + 1)
135 call MouseLeftRelease(row, col)
136 call assert_equal(rowseparator, winheight(0) + 1)
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200137
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200138 bwipe!
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200139
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200140 " Split vertically and test dragging the vertical window separator.
141 vsplit
142 let colseparator = winwidth(0) + 1
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200143
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200144 let row = 1
145 let col = colseparator
146 call MouseLeftClick(row, col)
147 let col -= 1
148 call MouseLeftDrag(row, col)
149 call assert_equal(colseparator - 1, winwidth(0) + 1)
150 let col += 1
151 call MouseLeftDrag(row, col)
152 call assert_equal(colseparator, winwidth(0) + 1)
153 call MouseLeftRelease(row, col)
154 call assert_equal(colseparator, winwidth(0) + 1)
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200155
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200156 bwipe!
157 endfor
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200158
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200159 let &mouse = save_mouse
160 let &term = save_term
161 let &ttymouse = save_ttymouse
162endfunc
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200163
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200164func Test_xterm_mouse_drag_statusline()
165 let save_mouse = &mouse
166 let save_term = &term
167 let save_ttymouse = &ttymouse
168 set mouse=a term=xterm
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200169
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200170 for ttymouse_val in ['xterm', 'sgr']
171 exe 'set ttymouse=' . ttymouse_val
172
173 call assert_equal(1, &cmdheight)
174 let rowstatusline = winheight(0) + 1
175 let row = rowstatusline
176 let col = 1
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200177
178 if ttymouse_val ==# 'xterm' && row > 223
179 " When 'ttymouse' is 'xterm', row/col bigger than 223 are not supported.
180 continue
181 endif
182
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200183 call MouseLeftClick(row, col)
184 let row -= 1
185 call MouseLeftDrag(row, col)
186 call assert_equal(2, &cmdheight)
187 call assert_equal(rowstatusline - 1, winheight(0) + 1)
188 let row += 1
189 call MouseLeftDrag(row, col)
190 call assert_equal(1, &cmdheight)
191 call assert_equal(rowstatusline, winheight(0) + 1)
192 call MouseLeftRelease(row, col)
193 call assert_equal(1, &cmdheight)
194 call assert_equal(rowstatusline, winheight(0) + 1)
195 endfor
196
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200197 let &mouse = save_mouse
198 let &term = save_term
199 let &ttymouse = save_ttymouse
200endfunc