1905dd905SBram Moolenaar" Tests for decoding escape sequences sent by the terminal.
2905dd905SBram Moolenaar
3905dd905SBram Moolenaar" This only works for Unix in a terminal
48c5a278fSBram Moolenaarsource check.vim
58c5a278fSBram MoolenaarCheckNotGui
68c5a278fSBram MoolenaarCheckUnix
7905dd905SBram Moolenaar
8564344acSBram Moolenaarsource shared.vim
9564344acSBram Moolenaar
10d0621d85SBram Moolenaar" xterm2 and sgr always work, urxvt is optional.
1192fd599eSBram Moolenaarlet s:ttymouse_values = ['xterm2', 'sgr']
12d0621d85SBram Moolenaarif has('mouse_urxvt')
1392fd599eSBram Moolenaar  call add(s:ttymouse_values, 'urxvt')
1492fd599eSBram Moolenaarendif
1592fd599eSBram Moolenaar
1692fd599eSBram Moolenaar" dec doesn't support all the functionality
1792fd599eSBram Moolenaarif has('mouse_dec')
1892fd599eSBram Moolenaar  let s:ttymouse_dec = ['dec']
1992fd599eSBram Moolenaarelse
2092fd599eSBram Moolenaar  let s:ttymouse_dec = []
21d0621d85SBram Moolenaarendif
22d0621d85SBram Moolenaar
23d788543aSBram Moolenaar" netterm only supports left click
24d788543aSBram Moolenaarif has('mouse_netterm')
25d788543aSBram Moolenaar  let s:ttymouse_netterm = ['netterm']
26d788543aSBram Moolenaarelse
27d788543aSBram Moolenaar  let s:ttymouse_netterm = []
28d788543aSBram Moolenaarendif
29d788543aSBram Moolenaar
303fbd2d7cSBram Moolenaar" Helper function to emit a terminal escape code.
31d0621d85SBram Moolenaarfunc TerminalEscapeCode(code, row, col, m)
322b00b9b0SBram Moolenaar  if &ttymouse ==# 'xterm2'
333fbd2d7cSBram Moolenaar    " need to use byte encoding here.
34d0621d85SBram Moolenaar    let str = list2str([a:code + 0x20, a:col + 0x20, a:row + 0x20])
353fbd2d7cSBram Moolenaar    if has('iconv')
36f9f24ce7SBram Moolenaar      let bytes = str->iconv('utf-8', 'latin1')
373fbd2d7cSBram Moolenaar    else
383fbd2d7cSBram Moolenaar      " Hopefully the numbers are not too big.
393fbd2d7cSBram Moolenaar      let bytes = str
403fbd2d7cSBram Moolenaar    endif
413fbd2d7cSBram Moolenaar    call feedkeys("\<Esc>[M" .. bytes, 'Lx!')
423fbd2d7cSBram Moolenaar  elseif &ttymouse ==# 'sgr'
43d0621d85SBram Moolenaar    call feedkeys(printf("\<Esc>[<%d;%d;%d%s", a:code, a:col, a:row, a:m), 'Lx!')
44d0621d85SBram Moolenaar  elseif &ttymouse ==# 'urxvt'
45d0621d85SBram Moolenaar    call feedkeys(printf("\<Esc>[%d;%d;%dM", a:code + 0x20, a:col, a:row), 'Lx!')
463fbd2d7cSBram Moolenaar  endif
473fbd2d7cSBram Moolenaarendfunc
483fbd2d7cSBram Moolenaar
4992fd599eSBram Moolenaarfunc DecEscapeCode(code, down, row, col)
5092fd599eSBram Moolenaar    call feedkeys(printf("\<Esc>[%d;%d;%d;%d&w", a:code, a:down, a:row, a:col), 'Lx!')
5192fd599eSBram Moolenaarendfunc
5292fd599eSBram Moolenaar
53d788543aSBram Moolenaarfunc NettermEscapeCode(row, col)
54d788543aSBram Moolenaar    call feedkeys(printf("\<Esc>}%d,%d\r", a:row, a:col), 'Lx!')
55d788543aSBram Moolenaarendfunc
56d788543aSBram Moolenaar
573fbd2d7cSBram Moolenaarfunc MouseLeftClick(row, col)
5892fd599eSBram Moolenaar  if &ttymouse ==# 'dec'
5992fd599eSBram Moolenaar    call DecEscapeCode(2, 4, a:row, a:col)
60d788543aSBram Moolenaar  elseif &ttymouse ==# 'netterm'
61d788543aSBram Moolenaar    call NettermEscapeCode(a:row, a:col)
6292fd599eSBram Moolenaar  else
63d0621d85SBram Moolenaar    call TerminalEscapeCode(0, a:row, a:col, 'M')
6492fd599eSBram Moolenaar  endif
653fbd2d7cSBram Moolenaarendfunc
663fbd2d7cSBram Moolenaar
67c1b8160bSBram Moolenaarfunc MouseMiddleClick(row, col)
6892fd599eSBram Moolenaar  if &ttymouse ==# 'dec'
6992fd599eSBram Moolenaar    call DecEscapeCode(4, 2, a:row, a:col)
7092fd599eSBram Moolenaar  else
71d0621d85SBram Moolenaar    call TerminalEscapeCode(1, a:row, a:col, 'M')
7292fd599eSBram Moolenaar  endif
73c1b8160bSBram Moolenaarendfunc
74c1b8160bSBram Moolenaar
756aa7523bSBram Moolenaarfunc MouseRightClick(row, col)
766aa7523bSBram Moolenaar  if &ttymouse ==# 'dec'
776aa7523bSBram Moolenaar    call DecEscapeCode(6, 1, a:row, a:col)
786aa7523bSBram Moolenaar  else
796aa7523bSBram Moolenaar    call TerminalEscapeCode(2, a:row, a:col, 'M')
806aa7523bSBram Moolenaar  endif
816aa7523bSBram Moolenaarendfunc
826aa7523bSBram Moolenaar
831ee36d6fSBram Moolenaarfunc MouseCtrlLeftClick(row, col)
841ee36d6fSBram Moolenaar  let ctrl = 0x10
85d0621d85SBram Moolenaar  call TerminalEscapeCode(0 + ctrl, a:row, a:col, 'M')
861ee36d6fSBram Moolenaarendfunc
871ee36d6fSBram Moolenaar
881ee36d6fSBram Moolenaarfunc MouseCtrlRightClick(row, col)
891ee36d6fSBram Moolenaar  let ctrl = 0x10
90d0621d85SBram Moolenaar  call TerminalEscapeCode(2 + ctrl, a:row, a:col, 'M')
911ee36d6fSBram Moolenaarendfunc
921ee36d6fSBram Moolenaar
933fbd2d7cSBram Moolenaarfunc MouseLeftRelease(row, col)
9492fd599eSBram Moolenaar  if &ttymouse ==# 'dec'
9592fd599eSBram Moolenaar    call DecEscapeCode(3, 0, a:row, a:col)
96d788543aSBram Moolenaar  elseif &ttymouse ==# 'netterm'
97d788543aSBram Moolenaar    " send nothing
9892fd599eSBram Moolenaar  else
99d0621d85SBram Moolenaar    call TerminalEscapeCode(3, a:row, a:col, 'm')
10092fd599eSBram Moolenaar  endif
1013fbd2d7cSBram Moolenaarendfunc
1023fbd2d7cSBram Moolenaar
103c1b8160bSBram Moolenaarfunc MouseMiddleRelease(row, col)
10492fd599eSBram Moolenaar  if &ttymouse ==# 'dec'
10592fd599eSBram Moolenaar    call DecEscapeCode(5, 0, a:row, a:col)
10692fd599eSBram Moolenaar  else
107d0621d85SBram Moolenaar    call TerminalEscapeCode(3, a:row, a:col, 'm')
10892fd599eSBram Moolenaar  endif
109c1b8160bSBram Moolenaarendfunc
110c1b8160bSBram Moolenaar
1111ee36d6fSBram Moolenaarfunc MouseRightRelease(row, col)
1126aa7523bSBram Moolenaar  if &ttymouse ==# 'dec'
1136aa7523bSBram Moolenaar    call DecEscapeCode(7, 0, a:row, a:col)
1146aa7523bSBram Moolenaar  else
115d0621d85SBram Moolenaar    call TerminalEscapeCode(3, a:row, a:col, 'm')
1166aa7523bSBram Moolenaar  endif
1171ee36d6fSBram Moolenaarendfunc
1181ee36d6fSBram Moolenaar
1193fbd2d7cSBram Moolenaarfunc MouseLeftDrag(row, col)
12092fd599eSBram Moolenaar  if &ttymouse ==# 'dec'
12192fd599eSBram Moolenaar    call DecEscapeCode(1, 4, a:row, a:col)
12292fd599eSBram Moolenaar  else
123d0621d85SBram Moolenaar    call TerminalEscapeCode(0x20, a:row, a:col, 'M')
12492fd599eSBram Moolenaar  endif
1253fbd2d7cSBram Moolenaarendfunc
1263fbd2d7cSBram Moolenaar
1273fbd2d7cSBram Moolenaarfunc MouseWheelUp(row, col)
128d0621d85SBram Moolenaar  call TerminalEscapeCode(0x40, a:row, a:col, 'M')
1293fbd2d7cSBram Moolenaarendfunc
1303fbd2d7cSBram Moolenaar
1313fbd2d7cSBram Moolenaarfunc MouseWheelDown(row, col)
132d0621d85SBram Moolenaar  call TerminalEscapeCode(0x41, a:row, a:col, 'M')
1333fbd2d7cSBram Moolenaarendfunc
1343fbd2d7cSBram Moolenaar
13592fd599eSBram Moolenaarfunc Test_term_mouse_left_click()
136905dd905SBram Moolenaar  new
137905dd905SBram Moolenaar  let save_mouse = &mouse
138905dd905SBram Moolenaar  let save_term = &term
139905dd905SBram Moolenaar  let save_ttymouse = &ttymouse
14092fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
1413fbd2d7cSBram Moolenaar  set mouse=a term=xterm
142905dd905SBram Moolenaar  call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer'])
143905dd905SBram Moolenaar
144d788543aSBram Moolenaar  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec + s:ttymouse_netterm
1454945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
1461ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
1473fbd2d7cSBram Moolenaar    go
1484945219bSBram Moolenaar    call assert_equal([0, 1, 1, 0], getpos('.'), msg)
1493fbd2d7cSBram Moolenaar    let row = 2
1503fbd2d7cSBram Moolenaar    let col = 6
1513fbd2d7cSBram Moolenaar    call MouseLeftClick(row, col)
1523fbd2d7cSBram Moolenaar    call MouseLeftRelease(row, col)
1534945219bSBram Moolenaar    call assert_equal([0, 2, 6, 0], getpos('.'), msg)
1543fbd2d7cSBram Moolenaar  endfor
155905dd905SBram Moolenaar
156905dd905SBram Moolenaar  let &mouse = save_mouse
157905dd905SBram Moolenaar  let &term = save_term
158905dd905SBram Moolenaar  let &ttymouse = save_ttymouse
15992fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
160905dd905SBram Moolenaar  bwipe!
161905dd905SBram Moolenaarendfunc
162905dd905SBram Moolenaar
1636aa7523bSBram Moolenaarfunc Test_xterm_mouse_right_click_extends_visual()
1646aa7523bSBram Moolenaar  if has('mac')
1656aa7523bSBram Moolenaar    throw "Skipped: test right click in visual mode does not work on macOs (why?)"
1666aa7523bSBram Moolenaar  endif
1676aa7523bSBram Moolenaar  let save_mouse = &mouse
1686aa7523bSBram Moolenaar  let save_term = &term
1696aa7523bSBram Moolenaar  let save_ttymouse = &ttymouse
1706aa7523bSBram Moolenaar  call test_override('no_query_mouse', 1)
1716aa7523bSBram Moolenaar  set mouse=a term=xterm
1726aa7523bSBram Moolenaar
1736aa7523bSBram Moolenaar  for visual_mode in ["v", "V", "\<C-V>"]
1746aa7523bSBram Moolenaar    for ttymouse_val in s:ttymouse_values + s:ttymouse_dec
1756aa7523bSBram Moolenaar      let msg = 'visual=' .. visual_mode .. ' ttymouse=' .. ttymouse_val
1766aa7523bSBram Moolenaar      exe 'set ttymouse=' .. ttymouse_val
1776aa7523bSBram Moolenaar
1786aa7523bSBram Moolenaar      call setline(1, repeat([repeat('-', 7)], 7))
1796aa7523bSBram Moolenaar      call MouseLeftClick(4, 4)
1806aa7523bSBram Moolenaar      call MouseLeftRelease(4, 4)
1816aa7523bSBram Moolenaar      exe  "norm! " .. visual_mode
1826aa7523bSBram Moolenaar
1836aa7523bSBram Moolenaar      " Right click extends top left of visual area.
1846aa7523bSBram Moolenaar      call MouseRightClick(2, 2)
1856aa7523bSBram Moolenaar      call MouseRightRelease(2, 2)
1866aa7523bSBram Moolenaar
1876aa7523bSBram Moolenaar      " Right click extends bottom bottom right of visual area.
1886aa7523bSBram Moolenaar      call MouseRightClick(6, 6)
1896aa7523bSBram Moolenaar      call MouseRightRelease(6, 6)
1906aa7523bSBram Moolenaar      norm! r1gv
1916aa7523bSBram Moolenaar
1926aa7523bSBram Moolenaar      " Right click shrinks top left of visual area.
1936aa7523bSBram Moolenaar      call MouseRightClick(3, 3)
1946aa7523bSBram Moolenaar      call MouseRightRelease(3, 3)
1956aa7523bSBram Moolenaar
1966aa7523bSBram Moolenaar      " Right click shrinks bottom right of visual area.
1976aa7523bSBram Moolenaar      call MouseRightClick(5, 5)
1986aa7523bSBram Moolenaar      call MouseRightRelease(5, 5)
1996aa7523bSBram Moolenaar      norm! r2
2006aa7523bSBram Moolenaar
2016aa7523bSBram Moolenaar      if visual_mode ==# 'v'
2026aa7523bSBram Moolenaar        call assert_equal(['-------',
2036aa7523bSBram Moolenaar              \            '-111111',
2046aa7523bSBram Moolenaar              \            '1122222',
2056aa7523bSBram Moolenaar              \            '2222222',
2066aa7523bSBram Moolenaar              \            '2222211',
2076aa7523bSBram Moolenaar              \            '111111-',
2086aa7523bSBram Moolenaar              \            '-------'], getline(1, '$'), msg)
2096aa7523bSBram Moolenaar      elseif visual_mode ==# 'V'
2106aa7523bSBram Moolenaar        call assert_equal(['-------',
2116aa7523bSBram Moolenaar              \            '1111111',
2126aa7523bSBram Moolenaar              \            '2222222',
2136aa7523bSBram Moolenaar              \            '2222222',
2146aa7523bSBram Moolenaar              \            '2222222',
2156aa7523bSBram Moolenaar              \            '1111111',
2166aa7523bSBram Moolenaar              \            '-------'], getline(1, '$'), msg)
2176aa7523bSBram Moolenaar      else
2186aa7523bSBram Moolenaar        call assert_equal(['-------',
2196aa7523bSBram Moolenaar              \            '-11111-',
2206aa7523bSBram Moolenaar              \            '-12221-',
2216aa7523bSBram Moolenaar              \            '-12221-',
2226aa7523bSBram Moolenaar              \            '-12221-',
2236aa7523bSBram Moolenaar              \            '-11111-',
2246aa7523bSBram Moolenaar              \            '-------'], getline(1, '$'), msg)
2256aa7523bSBram Moolenaar      endif
2266aa7523bSBram Moolenaar    endfor
2276aa7523bSBram Moolenaar  endfor
2286aa7523bSBram Moolenaar
2296aa7523bSBram Moolenaar  let &mouse = save_mouse
2306aa7523bSBram Moolenaar  let &term = save_term
2316aa7523bSBram Moolenaar  let &ttymouse = save_ttymouse
2326aa7523bSBram Moolenaar  call test_override('no_query_mouse', 0)
2336aa7523bSBram Moolenaar  bwipe!
2346aa7523bSBram Moolenaarendfunc
2356aa7523bSBram Moolenaar
2361ee36d6fSBram Moolenaar" Test that <C-LeftMouse> jumps to help tag and <C-RightMouse> jumps back.
2371ee36d6fSBram Moolenaarfunc Test_xterm_mouse_ctrl_click()
2381ee36d6fSBram Moolenaar  let save_mouse = &mouse
2391ee36d6fSBram Moolenaar  let save_term = &term
2401ee36d6fSBram Moolenaar  let save_ttymouse = &ttymouse
2411ee36d6fSBram Moolenaar  set mouse=a term=xterm
2421ee36d6fSBram Moolenaar
24392fd599eSBram Moolenaar  for ttymouse_val in s:ttymouse_values
2441ee36d6fSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
2451ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
2461ee36d6fSBram Moolenaar    help
2471ee36d6fSBram Moolenaar    /usr_02.txt
2481ee36d6fSBram Moolenaar    norm! zt
2491ee36d6fSBram Moolenaar    let row = 1
2501ee36d6fSBram Moolenaar    let col = 1
2511ee36d6fSBram Moolenaar    call MouseCtrlLeftClick(row, col)
2521ee36d6fSBram Moolenaar    call MouseLeftRelease(row, col)
2531ee36d6fSBram Moolenaar    call assert_match('usr_02.txt$', bufname('%'), msg)
254b4367b7fSBram Moolenaar    call assert_equal('*usr_02.txt*', expand('<cWORD>'), msg)
2551ee36d6fSBram Moolenaar
2561ee36d6fSBram Moolenaar    call MouseCtrlRightClick(row, col)
25792fd599eSBram Moolenaar    call MouseRightRelease(row, col)
2581ee36d6fSBram Moolenaar    call assert_match('help.txt$', bufname('%'), msg)
259b4367b7fSBram Moolenaar    call assert_equal('|usr_02.txt|', expand('<cWORD>'), msg)
2601ee36d6fSBram Moolenaar
2611ee36d6fSBram Moolenaar    helpclose
2621ee36d6fSBram Moolenaar  endfor
2631ee36d6fSBram Moolenaar
2641ee36d6fSBram Moolenaar  let &mouse = save_mouse
2651ee36d6fSBram Moolenaar  let &term = save_term
2661ee36d6fSBram Moolenaar  let &ttymouse = save_ttymouse
2671ee36d6fSBram Moolenaarendfunc
2681ee36d6fSBram Moolenaar
26992fd599eSBram Moolenaarfunc Test_term_mouse_middle_click()
27052992feaSBram Moolenaar  CheckFeature clipboard_working
271564344acSBram Moolenaar
272c1b8160bSBram Moolenaar  new
273c1b8160bSBram Moolenaar  let save_mouse = &mouse
274c1b8160bSBram Moolenaar  let save_term = &term
275c1b8160bSBram Moolenaar  let save_ttymouse = &ttymouse
27692fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
277c1b8160bSBram Moolenaar  let save_quotestar = @*
278c1b8160bSBram Moolenaar  let @* = 'abc'
279c1b8160bSBram Moolenaar  set mouse=a term=xterm
280c1b8160bSBram Moolenaar
28192fd599eSBram Moolenaar  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec
282c1b8160bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
2831ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
284c1b8160bSBram Moolenaar    call setline(1, ['123456789', '123456789'])
285c1b8160bSBram Moolenaar
286c1b8160bSBram Moolenaar    " Middle-click in the middle of the line pastes text where clicked.
287c1b8160bSBram Moolenaar    let row = 1
288c1b8160bSBram Moolenaar    let col = 6
289c1b8160bSBram Moolenaar    call MouseMiddleClick(row, col)
290c1b8160bSBram Moolenaar    call MouseMiddleRelease(row, col)
291c1b8160bSBram Moolenaar    call assert_equal(['12345abc6789', '123456789'], getline(1, '$'), msg)
292c1b8160bSBram Moolenaar
293c1b8160bSBram Moolenaar    " Middle-click beyond end of the line pastes text at the end of the line.
294c1b8160bSBram Moolenaar    let col = 20
295c1b8160bSBram Moolenaar    call MouseMiddleClick(row, col)
296c1b8160bSBram Moolenaar    call MouseMiddleRelease(row, col)
297c1b8160bSBram Moolenaar    call assert_equal(['12345abc6789abc', '123456789'], getline(1, '$'), msg)
298c1b8160bSBram Moolenaar
299c1b8160bSBram Moolenaar    " Middle-click beyond the last line pastes in the last line.
300c1b8160bSBram Moolenaar    let row = 5
301c1b8160bSBram Moolenaar    let col = 3
302c1b8160bSBram Moolenaar    call MouseMiddleClick(row, col)
303c1b8160bSBram Moolenaar    call MouseMiddleRelease(row, col)
304c1b8160bSBram Moolenaar    call assert_equal(['12345abc6789abc', '12abc3456789'], getline(1, '$'), msg)
305c1b8160bSBram Moolenaar  endfor
306c1b8160bSBram Moolenaar
307c1b8160bSBram Moolenaar  let &mouse = save_mouse
308c1b8160bSBram Moolenaar  let &term = save_term
309c1b8160bSBram Moolenaar  let &ttymouse = save_ttymouse
31092fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
311c1b8160bSBram Moolenaar  let @* = save_quotestar
312c1b8160bSBram Moolenaar  bwipe!
313c1b8160bSBram Moolenaarendfunc
314c1b8160bSBram Moolenaar
31592fd599eSBram Moolenaar" TODO: for unclear reasons this test fails if it comes after
31692fd599eSBram Moolenaar" Test_xterm_mouse_ctrl_click()
31792fd599eSBram Moolenaarfunc Test_1xterm_mouse_wheel()
318049736faSBram Moolenaar  new
319049736faSBram Moolenaar  let save_mouse = &mouse
320049736faSBram Moolenaar  let save_term = &term
321049736faSBram Moolenaar  let save_ttymouse = &ttymouse
3223fbd2d7cSBram Moolenaar  set mouse=a term=xterm
323049736faSBram Moolenaar  call setline(1, range(1, 100))
324049736faSBram Moolenaar
32592fd599eSBram Moolenaar  for ttymouse_val in s:ttymouse_values
3264945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
3271ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
328049736faSBram Moolenaar    go
3294945219bSBram Moolenaar    call assert_equal(1, line('w0'), msg)
3304945219bSBram Moolenaar    call assert_equal([0, 1, 1, 0], getpos('.'), msg)
3313fbd2d7cSBram Moolenaar
3323fbd2d7cSBram Moolenaar    call MouseWheelDown(1, 1)
3334945219bSBram Moolenaar    call assert_equal(4, line('w0'), msg)
3344945219bSBram Moolenaar    call assert_equal([0, 4, 1, 0], getpos('.'), msg)
3353fbd2d7cSBram Moolenaar
3363fbd2d7cSBram Moolenaar    call MouseWheelDown(1, 1)
3374945219bSBram Moolenaar    call assert_equal(7, line('w0'), msg)
3384945219bSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
339049736faSBram Moolenaar
3403fbd2d7cSBram Moolenaar    call MouseWheelUp(1, 1)
3414945219bSBram Moolenaar    call assert_equal(4, line('w0'), msg)
3424945219bSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
3433fbd2d7cSBram Moolenaar
3443fbd2d7cSBram Moolenaar    call MouseWheelUp(1, 1)
3454945219bSBram Moolenaar    call assert_equal(1, line('w0'), msg)
3464945219bSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
3473fbd2d7cSBram Moolenaar  endfor
348049736faSBram Moolenaar
349049736faSBram Moolenaar  let &mouse = save_mouse
350049736faSBram Moolenaar  let &term = save_term
351049736faSBram Moolenaar  let &ttymouse = save_ttymouse
352049736faSBram Moolenaar  bwipe!
353049736faSBram Moolenaarendfunc
3543fb01a53SBram Moolenaar
355b4367b7fSBram Moolenaar" Test that dragging beyond the window (at the bottom and at the top)
356b4367b7fSBram Moolenaar" scrolls window content by the number of of lines beyond the window.
357b4367b7fSBram Moolenaarfunc Test_term_mouse_drag_beyond_window()
358b4367b7fSBram Moolenaar  let save_mouse = &mouse
359b4367b7fSBram Moolenaar  let save_term = &term
360b4367b7fSBram Moolenaar  let save_ttymouse = &ttymouse
361b4367b7fSBram Moolenaar  call test_override('no_query_mouse', 1)
362b4367b7fSBram Moolenaar  set mouse=a term=xterm
363b4367b7fSBram Moolenaar  let col = 1
364b4367b7fSBram Moolenaar  call setline(1, range(1, 100))
365b4367b7fSBram Moolenaar
366b4367b7fSBram Moolenaar  " Split into 3 windows, and go into the middle window
367b4367b7fSBram Moolenaar  " so we test dragging mouse below and above the window.
368b4367b7fSBram Moolenaar  2split
369b4367b7fSBram Moolenaar  wincmd j
370b4367b7fSBram Moolenaar  2split
371b4367b7fSBram Moolenaar
372b4367b7fSBram Moolenaar  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec
373b4367b7fSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
374b4367b7fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
375b4367b7fSBram Moolenaar
376b4367b7fSBram Moolenaar    " Line #10 at the top.
377b4367b7fSBram Moolenaar    norm! 10zt
378b4367b7fSBram Moolenaar    redraw
379b4367b7fSBram Moolenaar    call assert_equal(10, winsaveview().topline, msg)
380b4367b7fSBram Moolenaar    call assert_equal(2, winheight(0), msg)
381b4367b7fSBram Moolenaar
382b4367b7fSBram Moolenaar    let row = 4
383b4367b7fSBram Moolenaar    call MouseLeftClick(row, col)
384b4367b7fSBram Moolenaar    call assert_equal(10, winsaveview().topline, msg)
385b4367b7fSBram Moolenaar
386b4367b7fSBram Moolenaar    " Drag downwards. We're still in the window so topline should
387b4367b7fSBram Moolenaar    " not change yet.
388b4367b7fSBram Moolenaar    let row += 1
389b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
390b4367b7fSBram Moolenaar    call assert_equal(10, winsaveview().topline, msg)
391b4367b7fSBram Moolenaar
392b4367b7fSBram Moolenaar    " We now leave the window at the bottom, so the window content should
393b4367b7fSBram Moolenaar    " scroll by 1 line, then 2 lines (etc) as we drag further away.
394b4367b7fSBram Moolenaar    let row += 1
395b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
396b4367b7fSBram Moolenaar    call assert_equal(11, winsaveview().topline, msg)
397b4367b7fSBram Moolenaar
398b4367b7fSBram Moolenaar    let row += 1
399b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
400b4367b7fSBram Moolenaar    call assert_equal(13, winsaveview().topline, msg)
401b4367b7fSBram Moolenaar
402b4367b7fSBram Moolenaar    " Now drag upwards.
403b4367b7fSBram Moolenaar    let row -= 1
404b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
405b4367b7fSBram Moolenaar    call assert_equal(14, winsaveview().topline, msg)
406b4367b7fSBram Moolenaar
407b4367b7fSBram Moolenaar    " We're now back in the window so the topline should not change.
408b4367b7fSBram Moolenaar    let row -= 1
409b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
410b4367b7fSBram Moolenaar    call assert_equal(14, winsaveview().topline, msg)
411b4367b7fSBram Moolenaar
412b4367b7fSBram Moolenaar    let row -= 1
413b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
414b4367b7fSBram Moolenaar    call assert_equal(14, winsaveview().topline, msg)
415b4367b7fSBram Moolenaar
416b4367b7fSBram Moolenaar    " We now leave the window at the top so the window content should
417b4367b7fSBram Moolenaar    " scroll by 1 line, then 2, then 3 (etc) in the opposite direction.
418b4367b7fSBram Moolenaar    let row -= 1
419b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
420b4367b7fSBram Moolenaar    call assert_equal(13, winsaveview().topline, msg)
421b4367b7fSBram Moolenaar
422b4367b7fSBram Moolenaar    let row -= 1
423b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
424b4367b7fSBram Moolenaar    call assert_equal(11, winsaveview().topline, msg)
425b4367b7fSBram Moolenaar
426b4367b7fSBram Moolenaar    let row -= 1
427b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
428b4367b7fSBram Moolenaar    call assert_equal(8, winsaveview().topline, msg)
429b4367b7fSBram Moolenaar
430b4367b7fSBram Moolenaar    call MouseLeftRelease(row, col)
431b4367b7fSBram Moolenaar    call assert_equal(8, winsaveview().topline, msg)
432b4367b7fSBram Moolenaar    call assert_equal(2, winheight(0), msg)
433b4367b7fSBram Moolenaar  endfor
434b4367b7fSBram Moolenaar
435b4367b7fSBram Moolenaar  let &mouse = save_mouse
436b4367b7fSBram Moolenaar  let &term = save_term
437b4367b7fSBram Moolenaar  let &ttymouse = save_ttymouse
438b4367b7fSBram Moolenaar  call test_override('no_query_mouse', 0)
439b4367b7fSBram Moolenaar  bwipe!
440b4367b7fSBram Moolenaarendfunc
441b4367b7fSBram Moolenaar
44292fd599eSBram Moolenaarfunc Test_term_mouse_drag_window_separator()
4433fb01a53SBram Moolenaar  let save_mouse = &mouse
4443fb01a53SBram Moolenaar  let save_term = &term
4453fb01a53SBram Moolenaar  let save_ttymouse = &ttymouse
44692fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
4473fbd2d7cSBram Moolenaar  set mouse=a term=xterm
4483fbd2d7cSBram Moolenaar
44992fd599eSBram Moolenaar  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec
4504945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
4511ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
4523fb01a53SBram Moolenaar
4533fb01a53SBram Moolenaar    " Split horizontally and test dragging the horizontal window separator.
4543fb01a53SBram Moolenaar    split
4553fb01a53SBram Moolenaar    let rowseparator = winheight(0) + 1
4563fb01a53SBram Moolenaar    let row = rowseparator
4573fb01a53SBram Moolenaar    let col = 1
458c8b3ddabSBram Moolenaar
4592b00b9b0SBram Moolenaar    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
4602b00b9b0SBram Moolenaar    if ttymouse_val !=# 'xterm2' || row <= 223
4613fbd2d7cSBram Moolenaar      call MouseLeftClick(row, col)
4623fb01a53SBram Moolenaar      let row -= 1
4633fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
4644945219bSBram Moolenaar      call assert_equal(rowseparator - 1, winheight(0) + 1, msg)
4653fb01a53SBram Moolenaar      let row += 1
4663fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
4674945219bSBram Moolenaar      call assert_equal(rowseparator, winheight(0) + 1, msg)
4683fbd2d7cSBram Moolenaar      call MouseLeftRelease(row, col)
4694945219bSBram Moolenaar      call assert_equal(rowseparator, winheight(0) + 1, msg)
47039f76c6aSBram Moolenaar    endif
4713fb01a53SBram Moolenaar    bwipe!
4723fb01a53SBram Moolenaar
4733fb01a53SBram Moolenaar    " Split vertically and test dragging the vertical window separator.
4743fb01a53SBram Moolenaar    vsplit
4753fb01a53SBram Moolenaar    let colseparator = winwidth(0) + 1
4763fb01a53SBram Moolenaar    let row = 1
4773fb01a53SBram Moolenaar    let col = colseparator
47839f76c6aSBram Moolenaar
4792b00b9b0SBram Moolenaar    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
4802b00b9b0SBram Moolenaar    if ttymouse_val !=# 'xterm2' || col <= 223
4813fbd2d7cSBram Moolenaar      call MouseLeftClick(row, col)
4823fb01a53SBram Moolenaar      let col -= 1
4833fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
4844945219bSBram Moolenaar      call assert_equal(colseparator - 1, winwidth(0) + 1, msg)
4853fb01a53SBram Moolenaar      let col += 1
4863fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
4874945219bSBram Moolenaar      call assert_equal(colseparator, winwidth(0) + 1, msg)
4883fbd2d7cSBram Moolenaar      call MouseLeftRelease(row, col)
4894945219bSBram Moolenaar      call assert_equal(colseparator, winwidth(0) + 1, msg)
49039f76c6aSBram Moolenaar    endif
4913fb01a53SBram Moolenaar    bwipe!
4923fbd2d7cSBram Moolenaar  endfor
4933fbd2d7cSBram Moolenaar
4943fbd2d7cSBram Moolenaar  let &mouse = save_mouse
4953fbd2d7cSBram Moolenaar  let &term = save_term
4963fbd2d7cSBram Moolenaar  let &ttymouse = save_ttymouse
49792fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
4983fbd2d7cSBram Moolenaarendfunc
4993fbd2d7cSBram Moolenaar
50092fd599eSBram Moolenaarfunc Test_term_mouse_drag_statusline()
5013fbd2d7cSBram Moolenaar  let save_mouse = &mouse
5023fbd2d7cSBram Moolenaar  let save_term = &term
5033fbd2d7cSBram Moolenaar  let save_ttymouse = &ttymouse
50492fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
505ca57ab54SBram Moolenaar  let save_laststatus = &laststatus
506ca57ab54SBram Moolenaar  set mouse=a term=xterm laststatus=2
5073fbd2d7cSBram Moolenaar
50892fd599eSBram Moolenaar  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec
5094945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
5101ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
5113fbd2d7cSBram Moolenaar
5124945219bSBram Moolenaar    call assert_equal(1, &cmdheight, msg)
5133fbd2d7cSBram Moolenaar    let rowstatusline = winheight(0) + 1
5143fbd2d7cSBram Moolenaar    let row = rowstatusline
5153fbd2d7cSBram Moolenaar    let col = 1
516c8b3ddabSBram Moolenaar
5172b00b9b0SBram Moolenaar    if ttymouse_val ==# 'xterm2' && row > 223
5182b00b9b0SBram Moolenaar      " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
519c8b3ddabSBram Moolenaar      continue
520c8b3ddabSBram Moolenaar    endif
521c8b3ddabSBram Moolenaar
5223fbd2d7cSBram Moolenaar    call MouseLeftClick(row, col)
5233fbd2d7cSBram Moolenaar    let row -= 1
5243fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
5254945219bSBram Moolenaar    call assert_equal(2, &cmdheight, msg)
5264945219bSBram Moolenaar    call assert_equal(rowstatusline - 1, winheight(0) + 1, msg)
5273fbd2d7cSBram Moolenaar    let row += 1
5283fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
5294945219bSBram Moolenaar    call assert_equal(1, &cmdheight, msg)
5304945219bSBram Moolenaar    call assert_equal(rowstatusline, winheight(0) + 1, msg)
5313fbd2d7cSBram Moolenaar    call MouseLeftRelease(row, col)
5324945219bSBram Moolenaar    call assert_equal(1, &cmdheight, msg)
5334945219bSBram Moolenaar    call assert_equal(rowstatusline, winheight(0) + 1, msg)
5343fbd2d7cSBram Moolenaar  endfor
5353fbd2d7cSBram Moolenaar
5363fb01a53SBram Moolenaar  let &mouse = save_mouse
5373fb01a53SBram Moolenaar  let &term = save_term
5383fb01a53SBram Moolenaar  let &ttymouse = save_ttymouse
53992fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
540ca57ab54SBram Moolenaar  let &laststatus = save_laststatus
541ca57ab54SBram Moolenaarendfunc
542ca57ab54SBram Moolenaar
54392fd599eSBram Moolenaarfunc Test_term_mouse_click_tab()
544ca57ab54SBram Moolenaar  let save_mouse = &mouse
545ca57ab54SBram Moolenaar  let save_term = &term
546ca57ab54SBram Moolenaar  let save_ttymouse = &ttymouse
54792fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
548ca57ab54SBram Moolenaar  set mouse=a term=xterm
549ca57ab54SBram Moolenaar  let row = 1
550ca57ab54SBram Moolenaar
551d788543aSBram Moolenaar  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec + s:ttymouse_netterm
5524945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
5531ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
554ca57ab54SBram Moolenaar    e Xfoo
555ca57ab54SBram Moolenaar    tabnew Xbar
556ca57ab54SBram Moolenaar
557ca57ab54SBram Moolenaar    let a = split(execute(':tabs'), "\n")
558ca57ab54SBram Moolenaar    call assert_equal(['Tab page 1',
559ca57ab54SBram Moolenaar        \              '    Xfoo',
560ca57ab54SBram Moolenaar        \              'Tab page 2',
5614945219bSBram Moolenaar        \              '>   Xbar'], a, msg)
562ca57ab54SBram Moolenaar
563ca57ab54SBram Moolenaar    " Test clicking on tab names in the tabline at the top.
564ca57ab54SBram Moolenaar    let col = 2
56539f76c6aSBram Moolenaar    redraw
566ca57ab54SBram Moolenaar    call MouseLeftClick(row, col)
567ca57ab54SBram Moolenaar    call MouseLeftRelease(row, col)
568ca57ab54SBram Moolenaar    let a = split(execute(':tabs'), "\n")
569ca57ab54SBram Moolenaar    call assert_equal(['Tab page 1',
570ca57ab54SBram Moolenaar        \              '>   Xfoo',
571ca57ab54SBram Moolenaar        \              'Tab page 2',
5724945219bSBram Moolenaar        \              '    Xbar'], a, msg)
573ca57ab54SBram Moolenaar
574ca57ab54SBram Moolenaar    let col = 9
575ca57ab54SBram Moolenaar    call MouseLeftClick(row, col)
576ca57ab54SBram Moolenaar    call MouseLeftRelease(row, col)
577ca57ab54SBram Moolenaar    let a = split(execute(':tabs'), "\n")
578ca57ab54SBram Moolenaar    call assert_equal(['Tab page 1',
579ca57ab54SBram Moolenaar        \              '    Xfoo',
580ca57ab54SBram Moolenaar        \              'Tab page 2',
5814945219bSBram Moolenaar        \              '>   Xbar'], a, msg)
582ca57ab54SBram Moolenaar
583ca57ab54SBram Moolenaar    %bwipe!
584ca57ab54SBram Moolenaar  endfor
585ca57ab54SBram Moolenaar
586ca57ab54SBram Moolenaar  let &mouse = save_mouse
587ca57ab54SBram Moolenaar  let &term = save_term
588ca57ab54SBram Moolenaar  let &ttymouse = save_ttymouse
58992fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
5903fb01a53SBram Moolenaarendfunc
59139f76c6aSBram Moolenaar
59292fd599eSBram Moolenaarfunc Test_term_mouse_click_X_to_close_tab()
59339f76c6aSBram Moolenaar  let save_mouse = &mouse
59439f76c6aSBram Moolenaar  let save_term = &term
59539f76c6aSBram Moolenaar  let save_ttymouse = &ttymouse
59692fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
59739f76c6aSBram Moolenaar  set mouse=a term=xterm
59839f76c6aSBram Moolenaar  let row = 1
59939f76c6aSBram Moolenaar  let col = &columns
60039f76c6aSBram Moolenaar
601d788543aSBram Moolenaar  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec + s:ttymouse_netterm
6022b00b9b0SBram Moolenaar    if ttymouse_val ==# 'xterm2' && col > 223
6032b00b9b0SBram Moolenaar      " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
60439f76c6aSBram Moolenaar      continue
60539f76c6aSBram Moolenaar    endif
6064945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
6071ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
60839f76c6aSBram Moolenaar    e Xtab1
60939f76c6aSBram Moolenaar    tabnew Xtab2
61039f76c6aSBram Moolenaar    tabnew Xtab3
61139f76c6aSBram Moolenaar    tabn 2
61239f76c6aSBram Moolenaar
61339f76c6aSBram Moolenaar    let a = split(execute(':tabs'), "\n")
61439f76c6aSBram Moolenaar    call assert_equal(['Tab page 1',
61539f76c6aSBram Moolenaar        \              '    Xtab1',
61639f76c6aSBram Moolenaar        \              'Tab page 2',
61739f76c6aSBram Moolenaar        \              '>   Xtab2',
61839f76c6aSBram Moolenaar        \              'Tab page 3',
6194945219bSBram Moolenaar        \              '    Xtab3'], a, msg)
62039f76c6aSBram Moolenaar
62139f76c6aSBram Moolenaar    " Click on "X" in tabline to close current tab i.e. Xtab2.
62239f76c6aSBram Moolenaar    redraw
62339f76c6aSBram Moolenaar    call MouseLeftClick(row, col)
62439f76c6aSBram Moolenaar    call MouseLeftRelease(row, col)
62539f76c6aSBram Moolenaar    let a = split(execute(':tabs'), "\n")
62639f76c6aSBram Moolenaar    call assert_equal(['Tab page 1',
62739f76c6aSBram Moolenaar        \              '    Xtab1',
62839f76c6aSBram Moolenaar        \              'Tab page 2',
6294945219bSBram Moolenaar        \              '>   Xtab3'], a, msg)
63039f76c6aSBram Moolenaar
63139f76c6aSBram Moolenaar    %bwipe!
63239f76c6aSBram Moolenaar  endfor
63339f76c6aSBram Moolenaar
63439f76c6aSBram Moolenaar  let &mouse = save_mouse
63539f76c6aSBram Moolenaar  let &term = save_term
63639f76c6aSBram Moolenaar  let &ttymouse = save_ttymouse
63792fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
63839f76c6aSBram Moolenaarendfunc
639e3e3828fSBram Moolenaar
64092fd599eSBram Moolenaarfunc Test_term_mouse_drag_to_move_tab()
641e3e3828fSBram Moolenaar  let save_mouse = &mouse
642e3e3828fSBram Moolenaar  let save_term = &term
643e3e3828fSBram Moolenaar  let save_ttymouse = &ttymouse
64492fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
645e3e3828fSBram Moolenaar  " Set 'mousetime' to 1 to avoid recognizing a double-click in the loop
646e3e3828fSBram Moolenaar  set mouse=a term=xterm mousetime=1
647e3e3828fSBram Moolenaar  let row = 1
648e3e3828fSBram Moolenaar
64992fd599eSBram Moolenaar  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec
6504945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
6511ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
652e3e3828fSBram Moolenaar    e Xtab1
653e3e3828fSBram Moolenaar    tabnew Xtab2
654e3e3828fSBram Moolenaar
655e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
656e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
657e3e3828fSBram Moolenaar        \              '    Xtab1',
658e3e3828fSBram Moolenaar        \              'Tab page 2',
6594945219bSBram Moolenaar        \              '>   Xtab2'], a, msg)
660e3e3828fSBram Moolenaar    redraw
661e3e3828fSBram Moolenaar
662e3e3828fSBram Moolenaar    " Click in tab2 and drag it to tab1.
663e3e3828fSBram Moolenaar    " Check getcharmod() to verify that click is not
664e3e3828fSBram Moolenaar    " interpreted as a spurious double-click.
665e3e3828fSBram Moolenaar    call MouseLeftClick(row, 10)
6664945219bSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
667e3e3828fSBram Moolenaar    for col in [9, 8, 7, 6]
668e3e3828fSBram Moolenaar      call MouseLeftDrag(row, col)
669e3e3828fSBram Moolenaar    endfor
670e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
671e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
672e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
673e3e3828fSBram Moolenaar        \              '>   Xtab2',
674e3e3828fSBram Moolenaar        \              'Tab page 2',
6754945219bSBram Moolenaar        \              '    Xtab1'], a, msg)
676e3e3828fSBram Moolenaar
6777f279765SBram Moolenaar    " brief sleep to avoid causing a double-click
6787f279765SBram Moolenaar    sleep 20m
679e3e3828fSBram Moolenaar    %bwipe!
680e3e3828fSBram Moolenaar  endfor
681e3e3828fSBram Moolenaar
682e3e3828fSBram Moolenaar  let &mouse = save_mouse
683e3e3828fSBram Moolenaar  let &term = save_term
684e3e3828fSBram Moolenaar  let &ttymouse = save_ttymouse
68592fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
686e3e3828fSBram Moolenaar  set mousetime&
687e3e3828fSBram Moolenaarendfunc
688e3e3828fSBram Moolenaar
68992fd599eSBram Moolenaarfunc Test_term_mouse_double_click_to_create_tab()
690e3e3828fSBram Moolenaar  let save_mouse = &mouse
691e3e3828fSBram Moolenaar  let save_term = &term
692e3e3828fSBram Moolenaar  let save_ttymouse = &ttymouse
69392fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
694e3e3828fSBram Moolenaar  " Set 'mousetime' to a small value, so that double-click works but we don't
695e3e3828fSBram Moolenaar  " have to wait long to avoid a triple-click.
696e3e3828fSBram Moolenaar  set mouse=a term=xterm mousetime=100
697e3e3828fSBram Moolenaar  let row = 1
698e3e3828fSBram Moolenaar  let col = 10
699e3e3828fSBram Moolenaar
700d0621d85SBram Moolenaar  let round = 0
70192fd599eSBram Moolenaar  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec
7024945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
7031ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
704e3e3828fSBram Moolenaar    e Xtab1
705e3e3828fSBram Moolenaar    tabnew Xtab2
706e3e3828fSBram Moolenaar
707d0621d85SBram Moolenaar    if round > 0
708d0621d85SBram Moolenaar      " We need to sleep, or else the first MouseLeftClick() will be
709d0621d85SBram Moolenaar      " interpreted as a spurious triple-click.
710d0621d85SBram Moolenaar      sleep 100m
711d0621d85SBram Moolenaar    endif
712d0621d85SBram Moolenaar    let round += 1
713d0621d85SBram Moolenaar
714e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
715e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
716e3e3828fSBram Moolenaar        \              '    Xtab1',
717e3e3828fSBram Moolenaar        \              'Tab page 2',
7184945219bSBram Moolenaar        \              '>   Xtab2'], a, msg)
719e3e3828fSBram Moolenaar
720e3e3828fSBram Moolenaar    redraw
721e3e3828fSBram Moolenaar    call MouseLeftClick(row, col)
722e3e3828fSBram Moolenaar    " Check getcharmod() to verify that first click is not
723e3e3828fSBram Moolenaar    " interpreted as a spurious double-click.
7244945219bSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
725e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
726e3e3828fSBram Moolenaar    call MouseLeftClick(row, col)
7274945219bSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
728e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
729e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
730e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
731e3e3828fSBram Moolenaar        \              '    Xtab1',
732e3e3828fSBram Moolenaar        \              'Tab page 2',
733e3e3828fSBram Moolenaar        \              '>   [No Name]',
734e3e3828fSBram Moolenaar        \              'Tab page 3',
7354945219bSBram Moolenaar        \              '    Xtab2'], a, msg)
736e3e3828fSBram Moolenaar
737e3e3828fSBram Moolenaar    %bwipe!
738e3e3828fSBram Moolenaar  endfor
739e3e3828fSBram Moolenaar
740e3e3828fSBram Moolenaar  let &mouse = save_mouse
741e3e3828fSBram Moolenaar  let &term = save_term
742e3e3828fSBram Moolenaar  let &ttymouse = save_ttymouse
74392fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
744e3e3828fSBram Moolenaar  set mousetime&
745e3e3828fSBram Moolenaarendfunc
746696d6377SBram Moolenaar
747696d6377SBram Moolenaarfunc Test_xterm_mouse_click_in_fold_columns()
748696d6377SBram Moolenaar  new
749696d6377SBram Moolenaar  let save_mouse = &mouse
750696d6377SBram Moolenaar  let save_term = &term
751696d6377SBram Moolenaar  let save_ttymouse = &ttymouse
752696d6377SBram Moolenaar  let save_foldcolumn = &foldcolumn
7532b00b9b0SBram Moolenaar  set mouse=a term=xterm foldcolumn=3 ttymouse=xterm2
754696d6377SBram Moolenaar
755696d6377SBram Moolenaar  " Create 2 nested folds.
756696d6377SBram Moolenaar  call setline(1, range(1, 7))
757696d6377SBram Moolenaar  2,6fold
758696d6377SBram Moolenaar  norm! zR
759696d6377SBram Moolenaar  4,5fold
760696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
761696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
762696d6377SBram Moolenaar
763696d6377SBram Moolenaar  " Click in "+" of inner fold in foldcolumn should open it.
764696d6377SBram Moolenaar  redraw
765696d6377SBram Moolenaar  let row = 4
766696d6377SBram Moolenaar  let col = 2
767696d6377SBram Moolenaar  call MouseLeftClick(row, col)
768696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
769696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, -1, -1, -1, -1],
770696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
771696d6377SBram Moolenaar
772696d6377SBram Moolenaar  " Click in "-" of outer fold in foldcolumn should close it.
773696d6377SBram Moolenaar  redraw
774696d6377SBram Moolenaar  let row = 2
775696d6377SBram Moolenaar  let col = 1
776696d6377SBram Moolenaar  call MouseLeftClick(row, col)
777696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
778696d6377SBram Moolenaar  call assert_equal([-1, 2, 2, 2, 2, 2, -1],
779696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
780696d6377SBram Moolenaar  norm! zR
781696d6377SBram Moolenaar
782696d6377SBram Moolenaar  " Click in "|" of inner fold in foldcolumn should close it.
783696d6377SBram Moolenaar  redraw
784696d6377SBram Moolenaar  let row = 5
785696d6377SBram Moolenaar  let col = 2
786696d6377SBram Moolenaar  call MouseLeftClick(row, col)
787696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
788696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
789696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
790696d6377SBram Moolenaar
791696d6377SBram Moolenaar  let &foldcolumn = save_foldcolumn
792696d6377SBram Moolenaar  let &ttymouse = save_ttymouse
793696d6377SBram Moolenaar  let &term = save_term
794696d6377SBram Moolenaar  let &mouse = save_mouse
795696d6377SBram Moolenaar  bwipe!
796696d6377SBram Moolenaarendfunc
79766761db1SBram Moolenaar
79866761db1SBram Moolenaar" This only checks if the sequence is recognized.
79966761db1SBram Moolenaarfunc Test_term_rgb_response()
80066761db1SBram Moolenaar  set t_RF=x
80166761db1SBram Moolenaar  set t_RB=y
80266761db1SBram Moolenaar
80366761db1SBram Moolenaar  " response to t_RF, 4 digits
80466761db1SBram Moolenaar  let red = 0x12
80566761db1SBram Moolenaar  let green = 0x34
80666761db1SBram Moolenaar  let blue = 0x56
80766761db1SBram Moolenaar  let seq = printf("\<Esc>]10;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
80866761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
80966761db1SBram Moolenaar  call assert_equal(seq, v:termrfgresp)
81066761db1SBram Moolenaar
81166761db1SBram Moolenaar  " response to t_RF, 2 digits
81266761db1SBram Moolenaar  let red = 0x78
81366761db1SBram Moolenaar  let green = 0x9a
81466761db1SBram Moolenaar  let blue = 0xbc
81566761db1SBram Moolenaar  let seq = printf("\<Esc>]10;rgb:%02x/%02x/%02x\x07", red, green, blue)
81666761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
81766761db1SBram Moolenaar  call assert_equal(seq, v:termrfgresp)
81866761db1SBram Moolenaar
81932e19770SBram Moolenaar  " response to t_RB, 4 digits, dark
82032e19770SBram Moolenaar  set background=light
821ce90e36fSBram Moolenaar  eval 'background'->test_option_not_set()
82232e19770SBram Moolenaar  let red = 0x29
82332e19770SBram Moolenaar  let green = 0x4a
82432e19770SBram Moolenaar  let blue = 0x6b
82532e19770SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
82632e19770SBram Moolenaar  call feedkeys(seq, 'Lx!')
82732e19770SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
82832e19770SBram Moolenaar  call assert_equal('dark', &background)
82932e19770SBram Moolenaar
83032e19770SBram Moolenaar  " response to t_RB, 4 digits, light
83132e19770SBram Moolenaar  set background=dark
83232e19770SBram Moolenaar  call test_option_not_set('background')
83332e19770SBram Moolenaar  let red = 0x81
83432e19770SBram Moolenaar  let green = 0x63
83566761db1SBram Moolenaar  let blue = 0x65
83666761db1SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
83766761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
83866761db1SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
83932e19770SBram Moolenaar  call assert_equal('light', &background)
84066761db1SBram Moolenaar
84132e19770SBram Moolenaar  " response to t_RB, 2 digits, dark
84232e19770SBram Moolenaar  set background=light
84332e19770SBram Moolenaar  call test_option_not_set('background')
84432e19770SBram Moolenaar  let red = 0x47
84532e19770SBram Moolenaar  let green = 0x59
84632e19770SBram Moolenaar  let blue = 0x5b
84766761db1SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
84866761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
84966761db1SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
85032e19770SBram Moolenaar  call assert_equal('dark', &background)
85132e19770SBram Moolenaar
85232e19770SBram Moolenaar  " response to t_RB, 2 digits, light
85332e19770SBram Moolenaar  set background=dark
85432e19770SBram Moolenaar  call test_option_not_set('background')
85532e19770SBram Moolenaar  let red = 0x83
85632e19770SBram Moolenaar  let green = 0xa4
85732e19770SBram Moolenaar  let blue = 0xc2
85832e19770SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
85932e19770SBram Moolenaar  call feedkeys(seq, 'Lx!')
86032e19770SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
86132e19770SBram Moolenaar  call assert_equal('light', &background)
86266761db1SBram Moolenaar
86366761db1SBram Moolenaar  set t_RF= t_RB=
86466761db1SBram Moolenaarendfunc
86566761db1SBram Moolenaar
86666761db1SBram Moolenaar" This only checks if the sequence is recognized.
8671a4cbb19SBram Moolenaar" This must be after other tests, because it has side effects to xterm
8681a4cbb19SBram Moolenaar" properties.
8691a4cbb19SBram Moolenaarfunc Test_xx01_term_style_response()
87066761db1SBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
87166761db1SBram Moolenaar  set t_RV=x
87266761db1SBram Moolenaar
87366761db1SBram Moolenaar  " send the termresponse to trigger requesting the XT codes
87466761db1SBram Moolenaar  let seq = "\<Esc>[>41;337;0c"
87566761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
87666761db1SBram Moolenaar  call assert_equal(seq, v:termresponse)
87766761db1SBram Moolenaar
87866761db1SBram Moolenaar  let seq = "\<Esc>P1$r2 q\<Esc>\\"
87966761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
88066761db1SBram Moolenaar  call assert_equal(seq, v:termstyleresp)
88166761db1SBram Moolenaar
88266761db1SBram Moolenaar  set t_RV=
88366761db1SBram Moolenaarendfunc
884de6dbb45SBram Moolenaar
8851a4cbb19SBram Moolenaar" This checks the libvterm version response.
8861a4cbb19SBram Moolenaar" This must be after other tests, because it has side effects to xterm
8871a4cbb19SBram Moolenaar" properties.
8881a4cbb19SBram Moolenaarfunc Test_xx02_libvterm_response()
8891a4cbb19SBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
8901a4cbb19SBram Moolenaar  set t_RV=x
89103b00476SBram Moolenaar
8921a4cbb19SBram Moolenaar  set ttymouse=xterm
8931a4cbb19SBram Moolenaar  call test_option_not_set('ttymouse')
8941a4cbb19SBram Moolenaar  let seq = "\<Esc>[>0;100;0c"
8951a4cbb19SBram Moolenaar  call feedkeys(seq, 'Lx!')
8961a4cbb19SBram Moolenaar  call assert_equal(seq, v:termresponse)
8971a4cbb19SBram Moolenaar  call assert_equal('sgr', &ttymouse)
8981a4cbb19SBram Moolenaar
8991a4cbb19SBram Moolenaar  set t_RV=
9001a4cbb19SBram Moolenaarendfunc
9011a4cbb19SBram Moolenaar
90203b00476SBram Moolenaar" This checks the xterm version response.
90303b00476SBram Moolenaar" This must be after other tests, because it has side effects to xterm
90403b00476SBram Moolenaar" properties.
90503b00476SBram Moolenaarfunc Test_xx03_xterm_response()
90603b00476SBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
90703b00476SBram Moolenaar  set t_RV=x
90803b00476SBram Moolenaar
909*3cea8a9aSBram Moolenaar  " Do Terminal.app first to check that is_mac_terminal is reset.
910*3cea8a9aSBram Moolenaar  set ttymouse=xterm
911*3cea8a9aSBram Moolenaar  call test_option_not_set('ttymouse')
912*3cea8a9aSBram Moolenaar  let seq = "\<Esc>[>1;95;0c"
913*3cea8a9aSBram Moolenaar  call feedkeys(seq, 'Lx!')
914*3cea8a9aSBram Moolenaar  call assert_equal(seq, v:termresponse)
915*3cea8a9aSBram Moolenaar  call assert_equal('sgr', &ttymouse)
916*3cea8a9aSBram Moolenaar
91703b00476SBram Moolenaar  " xterm < 95: "xterm" (actually unmodified)
918*3cea8a9aSBram Moolenaar  set t_RV=
919*3cea8a9aSBram Moolenaar  set term=xterm
920*3cea8a9aSBram Moolenaar  set t_RV=x
92103b00476SBram Moolenaar  set ttymouse=xterm
92203b00476SBram Moolenaar  call test_option_not_set('ttymouse')
92303b00476SBram Moolenaar  let seq = "\<Esc>[>0;94;0c"
92403b00476SBram Moolenaar  call feedkeys(seq, 'Lx!')
92503b00476SBram Moolenaar  call assert_equal(seq, v:termresponse)
92603b00476SBram Moolenaar  call assert_equal('xterm', &ttymouse)
92703b00476SBram Moolenaar
92803b00476SBram Moolenaar  " xterm >= 95 < 277 "xterm2"
92903b00476SBram Moolenaar  set ttymouse=xterm
93003b00476SBram Moolenaar  call test_option_not_set('ttymouse')
93103b00476SBram Moolenaar  let seq = "\<Esc>[>0;267;0c"
93203b00476SBram Moolenaar  call feedkeys(seq, 'Lx!')
93303b00476SBram Moolenaar  call assert_equal(seq, v:termresponse)
93403b00476SBram Moolenaar  call assert_equal('xterm2', &ttymouse)
93503b00476SBram Moolenaar
93603b00476SBram Moolenaar  " xterm >= 277: "sgr"
93703b00476SBram Moolenaar  set ttymouse=xterm
93803b00476SBram Moolenaar  call test_option_not_set('ttymouse')
93903b00476SBram Moolenaar  let seq = "\<Esc>[>0;277;0c"
94003b00476SBram Moolenaar  call feedkeys(seq, 'Lx!')
94103b00476SBram Moolenaar  call assert_equal(seq, v:termresponse)
94203b00476SBram Moolenaar  call assert_equal('sgr', &ttymouse)
94303b00476SBram Moolenaar
94403b00476SBram Moolenaar  set t_RV=
94503b00476SBram Moolenaarendfunc
94603b00476SBram Moolenaar
94703b00476SBram Moolenaar" TODO: check other terminals response
94803b00476SBram Moolenaar
949de6dbb45SBram Moolenaarfunc Test_get_termcode()
950eb66328bSBram Moolenaar  try
951de6dbb45SBram Moolenaar    let k1 = &t_k1
952eb66328bSBram Moolenaar  catch /E113/
953eb66328bSBram Moolenaar    throw 'Skipped: Unable to query termcodes'
954eb66328bSBram Moolenaar  endtry
955de6dbb45SBram Moolenaar  set t_k1=
956de6dbb45SBram Moolenaar  set t_k1&
957de6dbb45SBram Moolenaar  call assert_equal(k1, &t_k1)
9589aeb3363SBram Moolenaar
9599aeb3363SBram Moolenaar  " use external termcap first
9609aeb3363SBram Moolenaar  set nottybuiltin
9619aeb3363SBram Moolenaar  set t_k1=
9629aeb3363SBram Moolenaar  set t_k1&
9639aeb3363SBram Moolenaar  " when using external termcap may get something else, but it must not be
9649aeb3363SBram Moolenaar  " empty, since we would fallback to the builtin one.
9659aeb3363SBram Moolenaar  call assert_notequal('', &t_k1)
9669aeb3363SBram Moolenaar
9679aeb3363SBram Moolenaar  if &term =~ 'xterm'
9689aeb3363SBram Moolenaar    " use internal termcap first
9699aeb3363SBram Moolenaar    let term_save = &term
9709aeb3363SBram Moolenaar    let &term = 'builtin_' .. &term
9719aeb3363SBram Moolenaar    set t_k1=
9729aeb3363SBram Moolenaar    set t_k1&
9739aeb3363SBram Moolenaar    call assert_equal(k1, &t_k1)
9749aeb3363SBram Moolenaar    let &term = term_save
9759aeb3363SBram Moolenaar  endif
9769aeb3363SBram Moolenaar
9779aeb3363SBram Moolenaar  set ttybuiltin
978de6dbb45SBram Moolenaarendfunc
97918a79a68SBram Moolenaar
98018a79a68SBram Moolenaarfunc GetEscCodeCSI27(key, modifier)
98118a79a68SBram Moolenaar  let key = printf("%d", char2nr(a:key))
98218a79a68SBram Moolenaar  let mod = printf("%d", a:modifier)
98318a79a68SBram Moolenaar  return "\<Esc>[27;" .. mod .. ';' .. key .. '~'
98418a79a68SBram Moolenaarendfunc
98518a79a68SBram Moolenaar
98618a79a68SBram Moolenaarfunc GetEscCodeCSIu(key, modifier)
98718a79a68SBram Moolenaar  let key = printf("%d", char2nr(a:key))
98818a79a68SBram Moolenaar  let mod = printf("%d", a:modifier)
98918a79a68SBram Moolenaar  return "\<Esc>[" .. key .. ';' .. mod .. 'u'
99018a79a68SBram Moolenaarendfunc
99118a79a68SBram Moolenaar
99218a79a68SBram Moolenaar" This checks the CSI sequences when in modifyOtherKeys mode.
99318a79a68SBram Moolenaar" The mode doesn't need to be enabled, the codes are always detected.
99418a79a68SBram Moolenaarfunc RunTest_modifyOtherKeys(func)
99518a79a68SBram Moolenaar  new
996459fd785SBram Moolenaar  set timeoutlen=10
99718a79a68SBram Moolenaar
99818a79a68SBram Moolenaar  " Shift-X is send as 'X' with the shift modifier
99918a79a68SBram Moolenaar  call feedkeys('a' .. a:func('X', 2) .. "\<Esc>", 'Lx!')
100018a79a68SBram Moolenaar  call assert_equal('X', getline(1))
100118a79a68SBram Moolenaar
100218a79a68SBram Moolenaar  " Ctrl-i is Tab
100318a79a68SBram Moolenaar  call setline(1, '')
100418a79a68SBram Moolenaar  call feedkeys('a' .. a:func('i', 5) .. "\<Esc>", 'Lx!')
100518a79a68SBram Moolenaar  call assert_equal("\t", getline(1))
100618a79a68SBram Moolenaar
100718a79a68SBram Moolenaar  " Ctrl-I is also Tab
100818a79a68SBram Moolenaar  call setline(1, '')
100918a79a68SBram Moolenaar  call feedkeys('a' .. a:func('I', 5) .. "\<Esc>", 'Lx!')
101018a79a68SBram Moolenaar  call assert_equal("\t", getline(1))
101118a79a68SBram Moolenaar
101218a79a68SBram Moolenaar  " Alt-x is ø
101318a79a68SBram Moolenaar  call setline(1, '')
101418a79a68SBram Moolenaar  call feedkeys('a' .. a:func('x', 3) .. "\<Esc>", 'Lx!')
101518a79a68SBram Moolenaar  call assert_equal("ø", getline(1))
101618a79a68SBram Moolenaar
101718a79a68SBram Moolenaar  " Meta-x is also ø
101818a79a68SBram Moolenaar  call setline(1, '')
101918a79a68SBram Moolenaar  call feedkeys('a' .. a:func('x', 9) .. "\<Esc>", 'Lx!')
102018a79a68SBram Moolenaar  call assert_equal("ø", getline(1))
102118a79a68SBram Moolenaar
102218a79a68SBram Moolenaar  " Alt-X is Ø
102318a79a68SBram Moolenaar  call setline(1, '')
102418a79a68SBram Moolenaar  call feedkeys('a' .. a:func('X', 3) .. "\<Esc>", 'Lx!')
102518a79a68SBram Moolenaar  call assert_equal("Ø", getline(1))
102618a79a68SBram Moolenaar
102718a79a68SBram Moolenaar  " Meta-X is ø
102818a79a68SBram Moolenaar  call setline(1, '')
102918a79a68SBram Moolenaar  call feedkeys('a' .. a:func('X', 9) .. "\<Esc>", 'Lx!')
103018a79a68SBram Moolenaar  call assert_equal("Ø", getline(1))
103118a79a68SBram Moolenaar
103218a79a68SBram Moolenaar  bwipe!
103318a79a68SBram Moolenaar  set timeoutlen&
103418a79a68SBram Moolenaarendfunc
103518a79a68SBram Moolenaar
1036459fd785SBram Moolenaarfunc Test_modifyOtherKeys_basic()
103718a79a68SBram Moolenaar  call RunTest_modifyOtherKeys(function('GetEscCodeCSI27'))
103818a79a68SBram Moolenaar  call RunTest_modifyOtherKeys(function('GetEscCodeCSIu'))
103918a79a68SBram Moolenaarendfunc
1040d1e2f398SBram Moolenaar
1041d1e2f398SBram Moolenaarfunc RunTest_mapping_shift(key, func)
1042d1e2f398SBram Moolenaar  call setline(1, '')
1043d1e2f398SBram Moolenaar  if a:key == '|'
1044d1e2f398SBram Moolenaar    exe 'inoremap \| xyz'
1045d1e2f398SBram Moolenaar  else
1046d1e2f398SBram Moolenaar    exe 'inoremap ' .. a:key .. ' xyz'
1047d1e2f398SBram Moolenaar  endif
1048d1e2f398SBram Moolenaar  call feedkeys('a' .. a:func(a:key, 2) .. "\<Esc>", 'Lx!')
1049d1e2f398SBram Moolenaar  call assert_equal("xyz", getline(1))
1050d1e2f398SBram Moolenaar  if a:key == '|'
1051d1e2f398SBram Moolenaar    exe 'iunmap \|'
1052d1e2f398SBram Moolenaar  else
1053d1e2f398SBram Moolenaar    exe 'iunmap ' .. a:key
1054d1e2f398SBram Moolenaar  endif
1055d1e2f398SBram Moolenaarendfunc
1056d1e2f398SBram Moolenaar
1057d1e2f398SBram Moolenaarfunc RunTest_mapping_works_with_shift(func)
1058d1e2f398SBram Moolenaar  new
1059459fd785SBram Moolenaar  set timeoutlen=10
1060d1e2f398SBram Moolenaar
1061d1e2f398SBram Moolenaar  call RunTest_mapping_shift('@', a:func)
1062d1e2f398SBram Moolenaar  call RunTest_mapping_shift('A', a:func)
1063d1e2f398SBram Moolenaar  call RunTest_mapping_shift('Z', a:func)
1064d1e2f398SBram Moolenaar  call RunTest_mapping_shift('^', a:func)
1065d1e2f398SBram Moolenaar  call RunTest_mapping_shift('_', a:func)
1066d1e2f398SBram Moolenaar  call RunTest_mapping_shift('{', a:func)
1067d1e2f398SBram Moolenaar  call RunTest_mapping_shift('|', a:func)
1068d1e2f398SBram Moolenaar  call RunTest_mapping_shift('}', a:func)
1069d1e2f398SBram Moolenaar  call RunTest_mapping_shift('~', a:func)
1070d1e2f398SBram Moolenaar
1071d1e2f398SBram Moolenaar  bwipe!
1072d1e2f398SBram Moolenaar  set timeoutlen&
1073d1e2f398SBram Moolenaarendfunc
1074d1e2f398SBram Moolenaar
1075459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_plain()
1076d1e2f398SBram Moolenaar  call RunTest_mapping_works_with_shift(function('GetEscCodeCSI27'))
1077d1e2f398SBram Moolenaar  call RunTest_mapping_works_with_shift(function('GetEscCodeCSIu'))
1078d1e2f398SBram Moolenaarendfunc
1079459fd785SBram Moolenaar
1080459fd785SBram Moolenaarfunc RunTest_mapping_mods(map, key, func, code)
1081459fd785SBram Moolenaar  call setline(1, '')
1082459fd785SBram Moolenaar  exe 'inoremap ' .. a:map .. ' xyz'
1083459fd785SBram Moolenaar  call feedkeys('a' .. a:func(a:key, a:code) .. "\<Esc>", 'Lx!')
1084459fd785SBram Moolenaar  call assert_equal("xyz", getline(1))
1085459fd785SBram Moolenaar  exe 'iunmap ' .. a:map
1086459fd785SBram Moolenaarendfunc
1087459fd785SBram Moolenaar
1088459fd785SBram Moolenaarfunc RunTest_mapping_works_with_mods(func, mods, code)
1089459fd785SBram Moolenaar  new
1090459fd785SBram Moolenaar  set timeoutlen=10
1091459fd785SBram Moolenaar
1092459fd785SBram Moolenaar  if a:mods !~ 'S'
1093459fd785SBram Moolenaar    " Shift by itself has no effect
1094459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-@>', '@', a:func, a:code)
1095459fd785SBram Moolenaar  endif
1096459fd785SBram Moolenaar  call RunTest_mapping_mods('<' .. a:mods .. '-A>', 'A', a:func, a:code)
1097459fd785SBram Moolenaar  call RunTest_mapping_mods('<' .. a:mods .. '-Z>', 'Z', a:func, a:code)
1098459fd785SBram Moolenaar  if a:mods !~ 'S'
1099459fd785SBram Moolenaar    " with Shift code is always upper case
1100459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-a>', 'a', a:func, a:code)
1101459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-z>', 'z', a:func, a:code)
1102459fd785SBram Moolenaar  endif
1103459fd785SBram Moolenaar  if a:mods != 'A'
1104459fd785SBram Moolenaar    " with Alt code is not in upper case
1105459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-a>', 'A', a:func, a:code)
1106459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-z>', 'Z', a:func, a:code)
1107459fd785SBram Moolenaar  endif
1108459fd785SBram Moolenaar  call RunTest_mapping_mods('<' .. a:mods .. '-á>', 'á', a:func, a:code)
1109459fd785SBram Moolenaar  if a:mods !~ 'S'
1110459fd785SBram Moolenaar    " Shift by itself has no effect
1111459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-^>', '^', a:func, a:code)
1112459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-_>', '_', a:func, a:code)
1113459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-{>', '{', a:func, a:code)
1114459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-\|>', '|', a:func, a:code)
1115459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-}>', '}', a:func, a:code)
1116459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-~>', '~', a:func, a:code)
1117459fd785SBram Moolenaar  endif
1118459fd785SBram Moolenaar
1119459fd785SBram Moolenaar  bwipe!
1120459fd785SBram Moolenaar  set timeoutlen&
1121459fd785SBram Moolenaarendfunc
1122459fd785SBram Moolenaar
1123459fd785SBram Moolenaarfunc Test_mapping_works_with_shift()
1124459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'S', 2)
1125459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'S', 2)
1126459fd785SBram Moolenaarendfunc
1127459fd785SBram Moolenaar
1128459fd785SBram Moolenaarfunc Test_mapping_works_with_ctrl()
1129459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C', 5)
1130459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C', 5)
1131459fd785SBram Moolenaarendfunc
1132459fd785SBram Moolenaar
1133459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_ctrl()
1134459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-S', 6)
1135459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-S', 6)
1136459fd785SBram Moolenaarendfunc
1137459fd785SBram Moolenaar
1138459fd785SBram Moolenaar" Below we also test the "u" code with Alt, This works, but libvterm would not
1139459fd785SBram Moolenaar" send the Alt key like this but by prefixing an Esc.
1140459fd785SBram Moolenaar
1141459fd785SBram Moolenaarfunc Test_mapping_works_with_alt()
1142459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'A', 3)
1143459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'A', 3)
1144459fd785SBram Moolenaarendfunc
1145459fd785SBram Moolenaar
1146459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_alt()
1147459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'S-A', 4)
1148459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'S-A', 4)
1149459fd785SBram Moolenaarendfunc
1150459fd785SBram Moolenaar
1151459fd785SBram Moolenaarfunc Test_mapping_works_with_ctrl_alt()
1152459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-A', 7)
1153459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-A', 7)
1154459fd785SBram Moolenaarendfunc
1155459fd785SBram Moolenaar
1156459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_ctrl_alt()
1157459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-S-A', 8)
1158459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-S-A', 8)
1159459fd785SBram Moolenaarendfunc
1160