1905dd905SBram Moolenaar" Tests for decoding escape sequences sent by the terminal.
2905dd905SBram Moolenaar
3905dd905SBram Moolenaar" This only works for Unix in a terminal
4905dd905SBram Moolenaarif has('gui_running') || !has('unix')
5905dd905SBram Moolenaar  finish
6905dd905SBram Moolenaarendif
7905dd905SBram Moolenaar
8*3fbd2d7cSBram Moolenaar" Helper function to emit a terminal escape code.
9*3fbd2d7cSBram Moolenaarfunc TerminalEscapeCode(code_xterm, code_sgr, row, col, m)
10*3fbd2d7cSBram Moolenaar  if &ttymouse ==# 'xterm'
11*3fbd2d7cSBram Moolenaar    " need to use byte encoding here.
12*3fbd2d7cSBram Moolenaar    let str = list2str([a:code_xterm, a:col + 0x20, a:row + 0x20])
13*3fbd2d7cSBram Moolenaar    if has('iconv')
14*3fbd2d7cSBram Moolenaar      let bytes = iconv(str, 'utf-8', 'latin1')
15*3fbd2d7cSBram Moolenaar    else
16*3fbd2d7cSBram Moolenaar      " Hopefully the numbers are not too big.
17*3fbd2d7cSBram Moolenaar      let bytes = str
18*3fbd2d7cSBram Moolenaar    endif
19*3fbd2d7cSBram Moolenaar    call feedkeys("\<Esc>[M" .. bytes, 'Lx!')
20*3fbd2d7cSBram Moolenaar  elseif &ttymouse ==# 'sgr'
21*3fbd2d7cSBram Moolenaar    call feedkeys(printf("\<Esc>[<%d;%d;%d%s", a:code_sgr, a:col, a:row, a:m), 'Lx!')
22*3fbd2d7cSBram Moolenaar  endif
23*3fbd2d7cSBram Moolenaarendfunc
24*3fbd2d7cSBram Moolenaar
25*3fbd2d7cSBram Moolenaarfunc MouseLeftClick(row, col)
26*3fbd2d7cSBram Moolenaar  call TerminalEscapeCode(0x20, 0, a:row, a:col, 'M')
27*3fbd2d7cSBram Moolenaarendfunc
28*3fbd2d7cSBram Moolenaar
29*3fbd2d7cSBram Moolenaarfunc MouseLeftRelease(row, col)
30*3fbd2d7cSBram Moolenaar  call TerminalEscapeCode(0x23, 3, a:row, a:col, 'm')
31*3fbd2d7cSBram Moolenaarendfunc
32*3fbd2d7cSBram Moolenaar
33*3fbd2d7cSBram Moolenaarfunc MouseLeftDrag(row, col)
34*3fbd2d7cSBram Moolenaar  call TerminalEscapeCode(0x43, 0x20, a:row, a:col, 'M')
35*3fbd2d7cSBram Moolenaarendfunc
36*3fbd2d7cSBram Moolenaar
37*3fbd2d7cSBram Moolenaarfunc MouseWheelUp(row, col)
38*3fbd2d7cSBram Moolenaar  call TerminalEscapeCode(0x40, 0x40, a:row, a:col, 'M')
39*3fbd2d7cSBram Moolenaarendfunc
40*3fbd2d7cSBram Moolenaar
41*3fbd2d7cSBram Moolenaarfunc MouseWheelDown(row, col)
42*3fbd2d7cSBram Moolenaar  call TerminalEscapeCode(0x41, 0x41, a:row, a:col, 'M')
43*3fbd2d7cSBram Moolenaarendfunc
44*3fbd2d7cSBram Moolenaar
45905dd905SBram Moolenaarfunc Test_xterm_mouse_click()
46905dd905SBram Moolenaar  new
47905dd905SBram Moolenaar  let save_mouse = &mouse
48905dd905SBram Moolenaar  let save_term = &term
49905dd905SBram Moolenaar  let save_ttymouse = &ttymouse
50*3fbd2d7cSBram Moolenaar  set mouse=a term=xterm
51905dd905SBram Moolenaar  call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer'])
52905dd905SBram Moolenaar
53*3fbd2d7cSBram Moolenaar  for ttymouse_val in ['xterm', 'sgr']
54*3fbd2d7cSBram Moolenaar    exe 'set ttymouse=' . ttymouse_val
55*3fbd2d7cSBram Moolenaar    go
56*3fbd2d7cSBram Moolenaar    call assert_equal([0, 1, 1, 0], getpos('.'))
57*3fbd2d7cSBram Moolenaar    let row = 2
58*3fbd2d7cSBram Moolenaar    let col = 6
59*3fbd2d7cSBram Moolenaar    call MouseLeftClick(row, col)
60*3fbd2d7cSBram Moolenaar    call MouseLeftRelease(row, col)
61905dd905SBram Moolenaar    call assert_equal([0, 2, 6, 0], getpos('.'))
62*3fbd2d7cSBram Moolenaar  endfor
63905dd905SBram Moolenaar
64905dd905SBram Moolenaar  let &mouse = save_mouse
65905dd905SBram Moolenaar  let &term = save_term
66905dd905SBram Moolenaar  let &ttymouse = save_ttymouse
67905dd905SBram Moolenaar  bwipe!
68905dd905SBram Moolenaarendfunc
69905dd905SBram Moolenaar
70049736faSBram Moolenaarfunc Test_xterm_mouse_wheel()
71049736faSBram Moolenaar  new
72049736faSBram Moolenaar  let save_mouse = &mouse
73049736faSBram Moolenaar  let save_term = &term
74049736faSBram Moolenaar  let save_ttymouse = &ttymouse
75*3fbd2d7cSBram Moolenaar  set mouse=a term=xterm
76049736faSBram Moolenaar  call setline(1, range(1, 100))
77049736faSBram Moolenaar
78*3fbd2d7cSBram Moolenaar  for ttymouse_val in ['xterm', 'sgr']
79*3fbd2d7cSBram Moolenaar    exe 'set ttymouse=' . ttymouse_val
80049736faSBram Moolenaar    go
81049736faSBram Moolenaar    call assert_equal(1, line('w0'))
82049736faSBram Moolenaar    call assert_equal([0, 1, 1, 0], getpos('.'))
83*3fbd2d7cSBram Moolenaar
84*3fbd2d7cSBram Moolenaar    call MouseWheelDown(1, 1)
85049736faSBram Moolenaar    call assert_equal(4, line('w0'))
86049736faSBram Moolenaar    call assert_equal([0, 4, 1, 0], getpos('.'))
87*3fbd2d7cSBram Moolenaar
88*3fbd2d7cSBram Moolenaar    call MouseWheelDown(1, 1)
89049736faSBram Moolenaar    call assert_equal(7, line('w0'))
90049736faSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'))
91049736faSBram Moolenaar
92*3fbd2d7cSBram Moolenaar    call MouseWheelUp(1, 1)
93049736faSBram Moolenaar    call assert_equal(4, line('w0'))
94049736faSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'))
95*3fbd2d7cSBram Moolenaar
96*3fbd2d7cSBram Moolenaar    call MouseWheelUp(1, 1)
97049736faSBram Moolenaar    call assert_equal(1, line('w0'))
98049736faSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'))
99*3fbd2d7cSBram Moolenaar  endfor
100049736faSBram Moolenaar
101049736faSBram Moolenaar  let &mouse = save_mouse
102049736faSBram Moolenaar  let &term = save_term
103049736faSBram Moolenaar  let &ttymouse = save_ttymouse
104049736faSBram Moolenaar  bwipe!
105049736faSBram Moolenaarendfunc
1063fb01a53SBram Moolenaar
1073fb01a53SBram Moolenaarfunc Test_xterm_mouse_drag_window_separator()
1083fb01a53SBram Moolenaar  let save_mouse = &mouse
1093fb01a53SBram Moolenaar  let save_term = &term
1103fb01a53SBram Moolenaar  let save_ttymouse = &ttymouse
111*3fbd2d7cSBram Moolenaar  set mouse=a term=xterm
112*3fbd2d7cSBram Moolenaar
113*3fbd2d7cSBram Moolenaar  for ttymouse_val in ['xterm', 'sgr']
114*3fbd2d7cSBram Moolenaar    exe 'set ttymouse=' . ttymouse_val
1153fb01a53SBram Moolenaar
1163fb01a53SBram Moolenaar    " Split horizontally and test dragging the horizontal window separator.
1173fb01a53SBram Moolenaar    split
1183fb01a53SBram Moolenaar    let rowseparator = winheight(0) + 1
1193fb01a53SBram Moolenaar    let row = rowseparator
1203fb01a53SBram Moolenaar    let col = 1
121*3fbd2d7cSBram Moolenaar    call MouseLeftClick(row, col)
1223fb01a53SBram Moolenaar
1233fb01a53SBram Moolenaar    let row -= 1
124*3fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
1253fb01a53SBram Moolenaar    call assert_equal(rowseparator - 1, winheight(0) + 1)
1263fb01a53SBram Moolenaar    let row += 1
127*3fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
1283fb01a53SBram Moolenaar    call assert_equal(rowseparator, winheight(0) + 1)
129*3fbd2d7cSBram Moolenaar    call MouseLeftRelease(row, col)
1303fb01a53SBram Moolenaar    call assert_equal(rowseparator, winheight(0) + 1)
1313fb01a53SBram Moolenaar
1323fb01a53SBram Moolenaar    bwipe!
1333fb01a53SBram Moolenaar
1343fb01a53SBram Moolenaar    " Split vertically and test dragging the vertical window separator.
1353fb01a53SBram Moolenaar    vsplit
1363fb01a53SBram Moolenaar    let colseparator = winwidth(0) + 1
1373fb01a53SBram Moolenaar
1383fb01a53SBram Moolenaar    let row = 1
1393fb01a53SBram Moolenaar    let col = colseparator
140*3fbd2d7cSBram Moolenaar    call MouseLeftClick(row, col)
1413fb01a53SBram Moolenaar    let col -= 1
142*3fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
1433fb01a53SBram Moolenaar    call assert_equal(colseparator - 1, winwidth(0) + 1)
1443fb01a53SBram Moolenaar    let col += 1
145*3fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
1463fb01a53SBram Moolenaar    call assert_equal(colseparator, winwidth(0) + 1)
147*3fbd2d7cSBram Moolenaar    call MouseLeftRelease(row, col)
1483fb01a53SBram Moolenaar    call assert_equal(colseparator, winwidth(0) + 1)
1493fb01a53SBram Moolenaar
1503fb01a53SBram Moolenaar    bwipe!
151*3fbd2d7cSBram Moolenaar  endfor
152*3fbd2d7cSBram Moolenaar
153*3fbd2d7cSBram Moolenaar  let &mouse = save_mouse
154*3fbd2d7cSBram Moolenaar  let &term = save_term
155*3fbd2d7cSBram Moolenaar  let &ttymouse = save_ttymouse
156*3fbd2d7cSBram Moolenaarendfunc
157*3fbd2d7cSBram Moolenaar
158*3fbd2d7cSBram Moolenaarfunc Test_xterm_mouse_drag_statusline()
159*3fbd2d7cSBram Moolenaar  let save_mouse = &mouse
160*3fbd2d7cSBram Moolenaar  let save_term = &term
161*3fbd2d7cSBram Moolenaar  let save_ttymouse = &ttymouse
162*3fbd2d7cSBram Moolenaar  set mouse=a term=xterm
163*3fbd2d7cSBram Moolenaar
164*3fbd2d7cSBram Moolenaar  for ttymouse_val in ['xterm', 'sgr']
165*3fbd2d7cSBram Moolenaar    exe 'set ttymouse=' . ttymouse_val
166*3fbd2d7cSBram Moolenaar
167*3fbd2d7cSBram Moolenaar    call assert_equal(1, &cmdheight)
168*3fbd2d7cSBram Moolenaar    let rowstatusline = winheight(0) + 1
169*3fbd2d7cSBram Moolenaar    let row = rowstatusline
170*3fbd2d7cSBram Moolenaar    let col = 1
171*3fbd2d7cSBram Moolenaar    call MouseLeftClick(row, col)
172*3fbd2d7cSBram Moolenaar    let row -= 1
173*3fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
174*3fbd2d7cSBram Moolenaar    call assert_equal(2, &cmdheight)
175*3fbd2d7cSBram Moolenaar    call assert_equal(rowstatusline - 1, winheight(0) + 1)
176*3fbd2d7cSBram Moolenaar    let row += 1
177*3fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
178*3fbd2d7cSBram Moolenaar    call assert_equal(1, &cmdheight)
179*3fbd2d7cSBram Moolenaar    call assert_equal(rowstatusline, winheight(0) + 1)
180*3fbd2d7cSBram Moolenaar    call MouseLeftRelease(row, col)
181*3fbd2d7cSBram Moolenaar    call assert_equal(1, &cmdheight)
182*3fbd2d7cSBram Moolenaar    call assert_equal(rowstatusline, winheight(0) + 1)
183*3fbd2d7cSBram Moolenaar  endfor
184*3fbd2d7cSBram Moolenaar
1853fb01a53SBram Moolenaar  let &mouse = save_mouse
1863fb01a53SBram Moolenaar  let &term = save_term
1873fb01a53SBram Moolenaar  let &ttymouse = save_ttymouse
1883fb01a53SBram Moolenaarendfunc
189