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
83fbd2d7cSBram Moolenaar" Helper function to emit a terminal escape code.
93fbd2d7cSBram Moolenaarfunc TerminalEscapeCode(code_xterm, code_sgr, row, col, m)
103fbd2d7cSBram Moolenaar  if &ttymouse ==# 'xterm'
113fbd2d7cSBram Moolenaar    " need to use byte encoding here.
123fbd2d7cSBram Moolenaar    let str = list2str([a:code_xterm, a:col + 0x20, a:row + 0x20])
133fbd2d7cSBram Moolenaar    if has('iconv')
143fbd2d7cSBram Moolenaar      let bytes = iconv(str, 'utf-8', 'latin1')
153fbd2d7cSBram Moolenaar    else
163fbd2d7cSBram Moolenaar      " Hopefully the numbers are not too big.
173fbd2d7cSBram Moolenaar      let bytes = str
183fbd2d7cSBram Moolenaar    endif
193fbd2d7cSBram Moolenaar    call feedkeys("\<Esc>[M" .. bytes, 'Lx!')
203fbd2d7cSBram Moolenaar  elseif &ttymouse ==# 'sgr'
213fbd2d7cSBram Moolenaar    call feedkeys(printf("\<Esc>[<%d;%d;%d%s", a:code_sgr, a:col, a:row, a:m), 'Lx!')
223fbd2d7cSBram Moolenaar  endif
233fbd2d7cSBram Moolenaarendfunc
243fbd2d7cSBram Moolenaar
253fbd2d7cSBram Moolenaarfunc MouseLeftClick(row, col)
263fbd2d7cSBram Moolenaar  call TerminalEscapeCode(0x20, 0, a:row, a:col, 'M')
273fbd2d7cSBram Moolenaarendfunc
283fbd2d7cSBram Moolenaar
293fbd2d7cSBram Moolenaarfunc MouseLeftRelease(row, col)
303fbd2d7cSBram Moolenaar  call TerminalEscapeCode(0x23, 3, a:row, a:col, 'm')
313fbd2d7cSBram Moolenaarendfunc
323fbd2d7cSBram Moolenaar
333fbd2d7cSBram Moolenaarfunc MouseLeftDrag(row, col)
343fbd2d7cSBram Moolenaar  call TerminalEscapeCode(0x43, 0x20, a:row, a:col, 'M')
353fbd2d7cSBram Moolenaarendfunc
363fbd2d7cSBram Moolenaar
373fbd2d7cSBram Moolenaarfunc MouseWheelUp(row, col)
383fbd2d7cSBram Moolenaar  call TerminalEscapeCode(0x40, 0x40, a:row, a:col, 'M')
393fbd2d7cSBram Moolenaarendfunc
403fbd2d7cSBram Moolenaar
413fbd2d7cSBram Moolenaarfunc MouseWheelDown(row, col)
423fbd2d7cSBram Moolenaar  call TerminalEscapeCode(0x41, 0x41, a:row, a:col, 'M')
433fbd2d7cSBram Moolenaarendfunc
443fbd2d7cSBram 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
503fbd2d7cSBram Moolenaar  set mouse=a term=xterm
51905dd905SBram Moolenaar  call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer'])
52905dd905SBram Moolenaar
533fbd2d7cSBram Moolenaar  for ttymouse_val in ['xterm', 'sgr']
543fbd2d7cSBram Moolenaar    exe 'set ttymouse=' . ttymouse_val
553fbd2d7cSBram Moolenaar    go
563fbd2d7cSBram Moolenaar    call assert_equal([0, 1, 1, 0], getpos('.'))
573fbd2d7cSBram Moolenaar    let row = 2
583fbd2d7cSBram Moolenaar    let col = 6
593fbd2d7cSBram Moolenaar    call MouseLeftClick(row, col)
603fbd2d7cSBram Moolenaar    call MouseLeftRelease(row, col)
61905dd905SBram Moolenaar    call assert_equal([0, 2, 6, 0], getpos('.'))
623fbd2d7cSBram 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
753fbd2d7cSBram Moolenaar  set mouse=a term=xterm
76049736faSBram Moolenaar  call setline(1, range(1, 100))
77049736faSBram Moolenaar
783fbd2d7cSBram Moolenaar  for ttymouse_val in ['xterm', 'sgr']
793fbd2d7cSBram 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('.'))
833fbd2d7cSBram Moolenaar
843fbd2d7cSBram Moolenaar    call MouseWheelDown(1, 1)
85049736faSBram Moolenaar    call assert_equal(4, line('w0'))
86049736faSBram Moolenaar    call assert_equal([0, 4, 1, 0], getpos('.'))
873fbd2d7cSBram Moolenaar
883fbd2d7cSBram 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
923fbd2d7cSBram Moolenaar    call MouseWheelUp(1, 1)
93049736faSBram Moolenaar    call assert_equal(4, line('w0'))
94049736faSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'))
953fbd2d7cSBram Moolenaar
963fbd2d7cSBram Moolenaar    call MouseWheelUp(1, 1)
97049736faSBram Moolenaar    call assert_equal(1, line('w0'))
98049736faSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'))
993fbd2d7cSBram 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
1113fbd2d7cSBram Moolenaar  set mouse=a term=xterm
1123fbd2d7cSBram Moolenaar
1133fbd2d7cSBram Moolenaar  for ttymouse_val in ['xterm', 'sgr']
1143fbd2d7cSBram 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*c8b3ddabSBram Moolenaar
122*c8b3ddabSBram Moolenaar    if ttymouse_val ==# 'xterm' && row > 223
123*c8b3ddabSBram Moolenaar      " When 'ttymouse' is 'xterm', row/col bigger than 223 are not supported.
124*c8b3ddabSBram Moolenaar      continue
125*c8b3ddabSBram Moolenaar    endif
126*c8b3ddabSBram Moolenaar
1273fbd2d7cSBram Moolenaar    call MouseLeftClick(row, col)
1283fb01a53SBram Moolenaar
1293fb01a53SBram Moolenaar    let row -= 1
1303fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
1313fb01a53SBram Moolenaar    call assert_equal(rowseparator - 1, winheight(0) + 1)
1323fb01a53SBram Moolenaar    let row += 1
1333fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
1343fb01a53SBram Moolenaar    call assert_equal(rowseparator, winheight(0) + 1)
1353fbd2d7cSBram Moolenaar    call MouseLeftRelease(row, col)
1363fb01a53SBram Moolenaar    call assert_equal(rowseparator, winheight(0) + 1)
1373fb01a53SBram Moolenaar
1383fb01a53SBram Moolenaar    bwipe!
1393fb01a53SBram Moolenaar
1403fb01a53SBram Moolenaar    " Split vertically and test dragging the vertical window separator.
1413fb01a53SBram Moolenaar    vsplit
1423fb01a53SBram Moolenaar    let colseparator = winwidth(0) + 1
1433fb01a53SBram Moolenaar
1443fb01a53SBram Moolenaar    let row = 1
1453fb01a53SBram Moolenaar    let col = colseparator
1463fbd2d7cSBram Moolenaar    call MouseLeftClick(row, col)
1473fb01a53SBram Moolenaar    let col -= 1
1483fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
1493fb01a53SBram Moolenaar    call assert_equal(colseparator - 1, winwidth(0) + 1)
1503fb01a53SBram Moolenaar    let col += 1
1513fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
1523fb01a53SBram Moolenaar    call assert_equal(colseparator, winwidth(0) + 1)
1533fbd2d7cSBram Moolenaar    call MouseLeftRelease(row, col)
1543fb01a53SBram Moolenaar    call assert_equal(colseparator, winwidth(0) + 1)
1553fb01a53SBram Moolenaar
1563fb01a53SBram Moolenaar    bwipe!
1573fbd2d7cSBram Moolenaar  endfor
1583fbd2d7cSBram Moolenaar
1593fbd2d7cSBram Moolenaar  let &mouse = save_mouse
1603fbd2d7cSBram Moolenaar  let &term = save_term
1613fbd2d7cSBram Moolenaar  let &ttymouse = save_ttymouse
1623fbd2d7cSBram Moolenaarendfunc
1633fbd2d7cSBram Moolenaar
1643fbd2d7cSBram Moolenaarfunc Test_xterm_mouse_drag_statusline()
1653fbd2d7cSBram Moolenaar  let save_mouse = &mouse
1663fbd2d7cSBram Moolenaar  let save_term = &term
1673fbd2d7cSBram Moolenaar  let save_ttymouse = &ttymouse
1683fbd2d7cSBram Moolenaar  set mouse=a term=xterm
1693fbd2d7cSBram Moolenaar
1703fbd2d7cSBram Moolenaar  for ttymouse_val in ['xterm', 'sgr']
1713fbd2d7cSBram Moolenaar    exe 'set ttymouse=' . ttymouse_val
1723fbd2d7cSBram Moolenaar
1733fbd2d7cSBram Moolenaar    call assert_equal(1, &cmdheight)
1743fbd2d7cSBram Moolenaar    let rowstatusline = winheight(0) + 1
1753fbd2d7cSBram Moolenaar    let row = rowstatusline
1763fbd2d7cSBram Moolenaar    let col = 1
177*c8b3ddabSBram Moolenaar
178*c8b3ddabSBram Moolenaar    if ttymouse_val ==# 'xterm' && row > 223
179*c8b3ddabSBram Moolenaar      " When 'ttymouse' is 'xterm', row/col bigger than 223 are not supported.
180*c8b3ddabSBram Moolenaar      continue
181*c8b3ddabSBram Moolenaar    endif
182*c8b3ddabSBram Moolenaar
1833fbd2d7cSBram Moolenaar    call MouseLeftClick(row, col)
1843fbd2d7cSBram Moolenaar    let row -= 1
1853fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
1863fbd2d7cSBram Moolenaar    call assert_equal(2, &cmdheight)
1873fbd2d7cSBram Moolenaar    call assert_equal(rowstatusline - 1, winheight(0) + 1)
1883fbd2d7cSBram Moolenaar    let row += 1
1893fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
1903fbd2d7cSBram Moolenaar    call assert_equal(1, &cmdheight)
1913fbd2d7cSBram Moolenaar    call assert_equal(rowstatusline, winheight(0) + 1)
1923fbd2d7cSBram Moolenaar    call MouseLeftRelease(row, col)
1933fbd2d7cSBram Moolenaar    call assert_equal(1, &cmdheight)
1943fbd2d7cSBram Moolenaar    call assert_equal(rowstatusline, winheight(0) + 1)
1953fbd2d7cSBram Moolenaar  endfor
1963fbd2d7cSBram Moolenaar
1973fb01a53SBram Moolenaar  let &mouse = save_mouse
1983fb01a53SBram Moolenaar  let &term = save_term
1993fb01a53SBram Moolenaar  let &ttymouse = save_ttymouse
2003fb01a53SBram Moolenaarendfunc
201