blob: af10e1d5c3740e8c0369510167923f71d31425ca [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)
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +020010 if &ttymouse ==# 'xterm2'
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020011 " 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
Bram Moolenaarc1b81602019-04-27 19:11:35 +020029func MouseMiddleClick(row, col)
30 call TerminalEscapeCode(0x21, 1, a:row, a:col, 'M')
31endfunc
32
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020033func MouseLeftRelease(row, col)
34 call TerminalEscapeCode(0x23, 3, a:row, a:col, 'm')
35endfunc
36
Bram Moolenaarc1b81602019-04-27 19:11:35 +020037func MouseMiddleRelease(row, col)
38 call TerminalEscapeCode(0x23, 3, a:row, a:col, 'm')
39endfunc
40
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020041func MouseLeftDrag(row, col)
42 call TerminalEscapeCode(0x43, 0x20, a:row, a:col, 'M')
43endfunc
44
45func MouseWheelUp(row, col)
46 call TerminalEscapeCode(0x40, 0x40, a:row, a:col, 'M')
47endfunc
48
49func MouseWheelDown(row, col)
50 call TerminalEscapeCode(0x41, 0x41, a:row, a:col, 'M')
51endfunc
52
Bram Moolenaarc1b81602019-04-27 19:11:35 +020053func Test_xterm_mouse_left_click()
Bram Moolenaar905dd902019-04-07 14:21:47 +020054 new
55 let save_mouse = &mouse
56 let save_term = &term
57 let save_ttymouse = &ttymouse
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020058 set mouse=a term=xterm
Bram Moolenaar905dd902019-04-07 14:21:47 +020059 call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer'])
Bram Moolenaar905dd902019-04-07 14:21:47 +020060
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +020061 for ttymouse_val in ['xterm2', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +020062 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020063 exe 'set ttymouse=' . ttymouse_val
64 go
Bram Moolenaar49452192019-04-17 16:27:02 +020065 call assert_equal([0, 1, 1, 0], getpos('.'), msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020066 let row = 2
67 let col = 6
68 call MouseLeftClick(row, col)
69 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +020070 call assert_equal([0, 2, 6, 0], getpos('.'), msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020071 endfor
Bram Moolenaar905dd902019-04-07 14:21:47 +020072
73 let &mouse = save_mouse
74 let &term = save_term
75 let &ttymouse = save_ttymouse
76 bwipe!
77endfunc
78
Bram Moolenaarc1b81602019-04-27 19:11:35 +020079func Test_xterm_mouse_middle_click()
80 new
81 let save_mouse = &mouse
82 let save_term = &term
83 let save_ttymouse = &ttymouse
84 let save_quotestar = @*
85 let @* = 'abc'
86 set mouse=a term=xterm
87
88 for ttymouse_val in ['xterm2', 'sgr']
89 let msg = 'ttymouse=' .. ttymouse_val
90 exe 'set ttymouse=' . ttymouse_val
91 call setline(1, ['123456789', '123456789'])
92
93 " Middle-click in the middle of the line pastes text where clicked.
94 let row = 1
95 let col = 6
96 call MouseMiddleClick(row, col)
97 call MouseMiddleRelease(row, col)
98 call assert_equal(['12345abc6789', '123456789'], getline(1, '$'), msg)
99
100 " Middle-click beyond end of the line pastes text at the end of the line.
101 let col = 20
102 call MouseMiddleClick(row, col)
103 call MouseMiddleRelease(row, col)
104 call assert_equal(['12345abc6789abc', '123456789'], getline(1, '$'), msg)
105
106 " Middle-click beyond the last line pastes in the last line.
107 let row = 5
108 let col = 3
109 call MouseMiddleClick(row, col)
110 call MouseMiddleRelease(row, col)
111 call assert_equal(['12345abc6789abc', '12abc3456789'], getline(1, '$'), msg)
112 endfor
113
114 let &mouse = save_mouse
115 let &term = save_term
116 let &ttymouse = save_ttymouse
117 let @* = save_quotestar
118 bwipe!
119endfunc
120
Bram Moolenaar049736f2019-04-07 21:55:07 +0200121func Test_xterm_mouse_wheel()
122 new
123 let save_mouse = &mouse
124 let save_term = &term
125 let save_ttymouse = &ttymouse
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200126 set mouse=a term=xterm
Bram Moolenaar049736f2019-04-07 21:55:07 +0200127 call setline(1, range(1, 100))
128
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200129 for ttymouse_val in ['xterm2', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +0200130 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200131 exe 'set ttymouse=' . ttymouse_val
132 go
Bram Moolenaar49452192019-04-17 16:27:02 +0200133 call assert_equal(1, line('w0'), msg)
134 call assert_equal([0, 1, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +0200135
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200136 call MouseWheelDown(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +0200137 call assert_equal(4, line('w0'), msg)
138 call assert_equal([0, 4, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +0200139
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200140 call MouseWheelDown(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +0200141 call assert_equal(7, line('w0'), msg)
142 call assert_equal([0, 7, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +0200143
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200144 call MouseWheelUp(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +0200145 call assert_equal(4, line('w0'), msg)
146 call assert_equal([0, 7, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +0200147
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200148 call MouseWheelUp(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +0200149 call assert_equal(1, line('w0'), msg)
150 call assert_equal([0, 7, 1, 0], getpos('.'), msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200151 endfor
Bram Moolenaar049736f2019-04-07 21:55:07 +0200152
153 let &mouse = save_mouse
154 let &term = save_term
155 let &ttymouse = save_ttymouse
156 bwipe!
157endfunc
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200158
159func Test_xterm_mouse_drag_window_separator()
160 let save_mouse = &mouse
161 let save_term = &term
162 let save_ttymouse = &ttymouse
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200163 set mouse=a term=xterm
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200164
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200165 for ttymouse_val in ['xterm2', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +0200166 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200167 exe 'set ttymouse=' . ttymouse_val
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200168
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200169 " Split horizontally and test dragging the horizontal window separator.
170 split
171 let rowseparator = winheight(0) + 1
172 let row = rowseparator
173 let col = 1
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200174
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200175 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
176 if ttymouse_val !=# 'xterm2' || row <= 223
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200177 call MouseLeftClick(row, col)
178 let row -= 1
179 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200180 call assert_equal(rowseparator - 1, winheight(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200181 let row += 1
182 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200183 call assert_equal(rowseparator, winheight(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200184 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200185 call assert_equal(rowseparator, winheight(0) + 1, msg)
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200186 endif
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200187 bwipe!
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200188
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200189 " Split vertically and test dragging the vertical window separator.
190 vsplit
191 let colseparator = winwidth(0) + 1
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200192 let row = 1
193 let col = colseparator
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200194
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200195 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
196 if ttymouse_val !=# 'xterm2' || col <= 223
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200197 call MouseLeftClick(row, col)
198 let col -= 1
199 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200200 call assert_equal(colseparator - 1, winwidth(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200201 let col += 1
202 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200203 call assert_equal(colseparator, winwidth(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200204 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200205 call assert_equal(colseparator, winwidth(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200206 endif
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200207 bwipe!
208 endfor
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200209
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200210 let &mouse = save_mouse
211 let &term = save_term
212 let &ttymouse = save_ttymouse
213endfunc
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200214
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200215func Test_xterm_mouse_drag_statusline()
216 let save_mouse = &mouse
217 let save_term = &term
218 let save_ttymouse = &ttymouse
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200219 let save_laststatus = &laststatus
220 set mouse=a term=xterm laststatus=2
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200221
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200222 for ttymouse_val in ['xterm2', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +0200223 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200224 exe 'set ttymouse=' . ttymouse_val
225
Bram Moolenaar49452192019-04-17 16:27:02 +0200226 call assert_equal(1, &cmdheight, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200227 let rowstatusline = winheight(0) + 1
228 let row = rowstatusline
229 let col = 1
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200230
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200231 if ttymouse_val ==# 'xterm2' && row > 223
232 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200233 continue
234 endif
235
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200236 call MouseLeftClick(row, col)
237 let row -= 1
238 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200239 call assert_equal(2, &cmdheight, msg)
240 call assert_equal(rowstatusline - 1, winheight(0) + 1, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200241 let row += 1
242 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200243 call assert_equal(1, &cmdheight, msg)
244 call assert_equal(rowstatusline, winheight(0) + 1, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200245 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200246 call assert_equal(1, &cmdheight, msg)
247 call assert_equal(rowstatusline, winheight(0) + 1, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200248 endfor
249
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200250 let &mouse = save_mouse
251 let &term = save_term
252 let &ttymouse = save_ttymouse
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200253 let &laststatus = save_laststatus
254endfunc
255
256func Test_xterm_mouse_click_tab()
257 let save_mouse = &mouse
258 let save_term = &term
259 let save_ttymouse = &ttymouse
260 set mouse=a term=xterm
261 let row = 1
262
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200263 for ttymouse_val in ['xterm2', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +0200264 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200265 exe 'set ttymouse=' . ttymouse_val
266 e Xfoo
267 tabnew Xbar
268
269 let a = split(execute(':tabs'), "\n")
270 call assert_equal(['Tab page 1',
271 \ ' Xfoo',
272 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200273 \ '> Xbar'], a, msg)
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200274
275 " Test clicking on tab names in the tabline at the top.
276 let col = 2
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200277 redraw
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200278 call MouseLeftClick(row, col)
279 call MouseLeftRelease(row, col)
280 let a = split(execute(':tabs'), "\n")
281 call assert_equal(['Tab page 1',
282 \ '> Xfoo',
283 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200284 \ ' Xbar'], a, msg)
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200285
286 let col = 9
287 call MouseLeftClick(row, col)
288 call MouseLeftRelease(row, col)
289 let a = split(execute(':tabs'), "\n")
290 call assert_equal(['Tab page 1',
291 \ ' Xfoo',
292 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200293 \ '> Xbar'], a, msg)
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200294
295 %bwipe!
296 endfor
297
298 let &mouse = save_mouse
299 let &term = save_term
300 let &ttymouse = save_ttymouse
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200301endfunc
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200302
303func Test_xterm_mouse_click_X_to_close_tab()
304 let save_mouse = &mouse
305 let save_term = &term
306 let save_ttymouse = &ttymouse
307 set mouse=a term=xterm
308 let row = 1
309 let col = &columns
310
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200311 for ttymouse_val in ['xterm2', 'sgr']
312 if ttymouse_val ==# 'xterm2' && col > 223
313 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200314 continue
315 endif
Bram Moolenaar49452192019-04-17 16:27:02 +0200316 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200317 exe 'set ttymouse=' . ttymouse_val
318 e Xtab1
319 tabnew Xtab2
320 tabnew Xtab3
321 tabn 2
322
323 let a = split(execute(':tabs'), "\n")
324 call assert_equal(['Tab page 1',
325 \ ' Xtab1',
326 \ 'Tab page 2',
327 \ '> Xtab2',
328 \ 'Tab page 3',
Bram Moolenaar49452192019-04-17 16:27:02 +0200329 \ ' Xtab3'], a, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200330
331 " Click on "X" in tabline to close current tab i.e. Xtab2.
332 redraw
333 call MouseLeftClick(row, col)
334 call MouseLeftRelease(row, col)
335 let a = split(execute(':tabs'), "\n")
336 call assert_equal(['Tab page 1',
337 \ ' Xtab1',
338 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200339 \ '> Xtab3'], a, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200340
341 %bwipe!
342 endfor
343
344 let &mouse = save_mouse
345 let &term = save_term
346 let &ttymouse = save_ttymouse
347endfunc
Bram Moolenaare3e38282019-04-15 20:55:31 +0200348
349func Test_xterm_mouse_drag_to_move_tab()
350 let save_mouse = &mouse
351 let save_term = &term
352 let save_ttymouse = &ttymouse
353 " Set 'mousetime' to 1 to avoid recognizing a double-click in the loop
354 set mouse=a term=xterm mousetime=1
355 let row = 1
356
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200357 for ttymouse_val in ['xterm2', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +0200358 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaare3e38282019-04-15 20:55:31 +0200359 exe 'set ttymouse=' . ttymouse_val
360 e Xtab1
361 tabnew Xtab2
362
363 let a = split(execute(':tabs'), "\n")
364 call assert_equal(['Tab page 1',
365 \ ' Xtab1',
366 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200367 \ '> Xtab2'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200368 redraw
369
370 " Click in tab2 and drag it to tab1.
371 " Check getcharmod() to verify that click is not
372 " interpreted as a spurious double-click.
373 call MouseLeftClick(row, 10)
Bram Moolenaar49452192019-04-17 16:27:02 +0200374 call assert_equal(0, getcharmod(), msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200375 for col in [9, 8, 7, 6]
376 call MouseLeftDrag(row, col)
377 endfor
378 call MouseLeftRelease(row, col)
379 let a = split(execute(':tabs'), "\n")
380 call assert_equal(['Tab page 1',
381 \ '> Xtab2',
382 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200383 \ ' Xtab1'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200384
Bram Moolenaar7f279762019-04-15 21:48:22 +0200385 " brief sleep to avoid causing a double-click
386 sleep 20m
Bram Moolenaare3e38282019-04-15 20:55:31 +0200387 %bwipe!
388 endfor
389
390 let &mouse = save_mouse
391 let &term = save_term
392 let &ttymouse = save_ttymouse
393 set mousetime&
394endfunc
395
396func Test_xterm_mouse_double_click_to_create_tab()
397 let save_mouse = &mouse
398 let save_term = &term
399 let save_ttymouse = &ttymouse
400 " Set 'mousetime' to a small value, so that double-click works but we don't
401 " have to wait long to avoid a triple-click.
402 set mouse=a term=xterm mousetime=100
403 let row = 1
404 let col = 10
405
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200406 for ttymouse_val in ['xterm2', 'sgr']
Bram Moolenaar49452192019-04-17 16:27:02 +0200407 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaare3e38282019-04-15 20:55:31 +0200408 exe 'set ttymouse=' . ttymouse_val
409 e Xtab1
410 tabnew Xtab2
411
412 let a = split(execute(':tabs'), "\n")
413 call assert_equal(['Tab page 1',
414 \ ' Xtab1',
415 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200416 \ '> Xtab2'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200417
418 redraw
419 call MouseLeftClick(row, col)
420 " Check getcharmod() to verify that first click is not
421 " interpreted as a spurious double-click.
Bram Moolenaar49452192019-04-17 16:27:02 +0200422 call assert_equal(0, getcharmod(), msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200423 call MouseLeftRelease(row, col)
424 call MouseLeftClick(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200425 call assert_equal(32, getcharmod(), msg) " double-click
Bram Moolenaare3e38282019-04-15 20:55:31 +0200426 call MouseLeftRelease(row, col)
427 let a = split(execute(':tabs'), "\n")
428 call assert_equal(['Tab page 1',
429 \ ' Xtab1',
430 \ 'Tab page 2',
431 \ '> [No Name]',
432 \ 'Tab page 3',
Bram Moolenaar49452192019-04-17 16:27:02 +0200433 \ ' Xtab2'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200434
435 if ttymouse_val !=# 'sgr'
436 " We need to sleep, or else MouseLeftClick() in next loop
437 " iteration will be interpreted as a spurious triple-click.
438 sleep 100m
439 endif
440 %bwipe!
441 endfor
442
443 let &mouse = save_mouse
444 let &term = save_term
445 let &ttymouse = save_ttymouse
446 set mousetime&
447endfunc
Bram Moolenaar696d6372019-04-17 16:33:46 +0200448
449func Test_xterm_mouse_click_in_fold_columns()
450 new
451 let save_mouse = &mouse
452 let save_term = &term
453 let save_ttymouse = &ttymouse
454 let save_foldcolumn = &foldcolumn
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200455 set mouse=a term=xterm foldcolumn=3 ttymouse=xterm2
Bram Moolenaar696d6372019-04-17 16:33:46 +0200456
457 " Create 2 nested folds.
458 call setline(1, range(1, 7))
459 2,6fold
460 norm! zR
461 4,5fold
462 call assert_equal([-1, -1, -1, 4, 4, -1, -1],
463 \ map(range(1, 7), 'foldclosed(v:val)'))
464
465 " Click in "+" of inner fold in foldcolumn should open it.
466 redraw
467 let row = 4
468 let col = 2
469 call MouseLeftClick(row, col)
470 call MouseLeftRelease(row, col)
471 call assert_equal([-1, -1, -1, -1, -1, -1, -1],
472 \ map(range(1, 7), 'foldclosed(v:val)'))
473
474 " Click in "-" of outer fold in foldcolumn should close it.
475 redraw
476 let row = 2
477 let col = 1
478 call MouseLeftClick(row, col)
479 call MouseLeftRelease(row, col)
480 call assert_equal([-1, 2, 2, 2, 2, 2, -1],
481 \ map(range(1, 7), 'foldclosed(v:val)'))
482 norm! zR
483
484 " Click in "|" of inner fold in foldcolumn should close it.
485 redraw
486 let row = 5
487 let col = 2
488 call MouseLeftClick(row, col)
489 call MouseLeftRelease(row, col)
490 call assert_equal([-1, -1, -1, 4, 4, -1, -1],
491 \ map(range(1, 7), 'foldclosed(v:val)'))
492
493 let &foldcolumn = save_foldcolumn
494 let &ttymouse = save_ttymouse
495 let &term = save_term
496 let &mouse = save_mouse
497 bwipe!
498endfunc