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
677f36a2c7eSBram Moolenaar    " Click elsewhere so that click in next iteration is not
678f36a2c7eSBram Moolenaar    " interpreted as unwanted double-click.
679f36a2c7eSBram Moolenaar    call MouseLeftClick(row, 11)
680f36a2c7eSBram Moolenaar    call MouseLeftRelease(row, 11)
681f36a2c7eSBram Moolenaar
682e3e3828fSBram Moolenaar    %bwipe!
683e3e3828fSBram Moolenaar  endfor
684e3e3828fSBram Moolenaar
685e3e3828fSBram Moolenaar  let &mouse = save_mouse
686e3e3828fSBram Moolenaar  let &term = save_term
687e3e3828fSBram Moolenaar  let &ttymouse = save_ttymouse
68892fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
689e3e3828fSBram Moolenaar  set mousetime&
690e3e3828fSBram Moolenaarendfunc
691e3e3828fSBram Moolenaar
69292fd599eSBram Moolenaarfunc Test_term_mouse_double_click_to_create_tab()
693e3e3828fSBram Moolenaar  let save_mouse = &mouse
694e3e3828fSBram Moolenaar  let save_term = &term
695e3e3828fSBram Moolenaar  let save_ttymouse = &ttymouse
69692fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
697e3e3828fSBram Moolenaar  " Set 'mousetime' to a small value, so that double-click works but we don't
698e3e3828fSBram Moolenaar  " have to wait long to avoid a triple-click.
699f36a2c7eSBram Moolenaar  set mouse=a term=xterm mousetime=200
700e3e3828fSBram Moolenaar  let row = 1
701e3e3828fSBram Moolenaar  let col = 10
702e3e3828fSBram Moolenaar
70392fd599eSBram Moolenaar  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec
7044945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
7051ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
706e3e3828fSBram Moolenaar    e Xtab1
707e3e3828fSBram Moolenaar    tabnew Xtab2
708e3e3828fSBram Moolenaar
709e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
710e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
711e3e3828fSBram Moolenaar        \              '    Xtab1',
712e3e3828fSBram Moolenaar        \              'Tab page 2',
7134945219bSBram Moolenaar        \              '>   Xtab2'], a, msg)
714e3e3828fSBram Moolenaar
715e3e3828fSBram Moolenaar    redraw
716e3e3828fSBram Moolenaar    call MouseLeftClick(row, col)
717e3e3828fSBram Moolenaar    " Check getcharmod() to verify that first click is not
718e3e3828fSBram Moolenaar    " interpreted as a spurious double-click.
7194945219bSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
720e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
721e3e3828fSBram Moolenaar    call MouseLeftClick(row, col)
7224945219bSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
723e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
724e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
725e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
726e3e3828fSBram Moolenaar        \              '    Xtab1',
727e3e3828fSBram Moolenaar        \              'Tab page 2',
728e3e3828fSBram Moolenaar        \              '>   [No Name]',
729e3e3828fSBram Moolenaar        \              'Tab page 3',
7304945219bSBram Moolenaar        \              '    Xtab2'], a, msg)
731e3e3828fSBram Moolenaar
732f36a2c7eSBram Moolenaar    " Click elsewhere so that click in next iteration is not
733f36a2c7eSBram Moolenaar    " interpreted as unwanted double click.
734f36a2c7eSBram Moolenaar    call MouseLeftClick(row, col + 1)
735f36a2c7eSBram Moolenaar    call MouseLeftRelease(row, col + 1)
736f36a2c7eSBram 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
747f36a2c7eSBram Moolenaar" Test double/triple/quadruple click in normal mode to visually select.
748f36a2c7eSBram Moolenaarfunc Test_term_mouse_multiple_clicks_to_visually_select()
749f36a2c7eSBram Moolenaar  let save_mouse = &mouse
750f36a2c7eSBram Moolenaar  let save_term = &term
751f36a2c7eSBram Moolenaar  let save_ttymouse = &ttymouse
752f36a2c7eSBram Moolenaar  call test_override('no_query_mouse', 1)
753f36a2c7eSBram Moolenaar  set mouse=a term=xterm mousetime=200
754f36a2c7eSBram Moolenaar  new
755f36a2c7eSBram Moolenaar
756f36a2c7eSBram Moolenaar  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec
757f36a2c7eSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
758f36a2c7eSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
759f36a2c7eSBram Moolenaar    call setline(1, ['foo [foo bar] foo', 'foo'])
760f36a2c7eSBram Moolenaar
761f36a2c7eSBram Moolenaar    " Double-click on word should visually select the word.
762f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
763f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
764f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
765f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
766f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
767f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
768f36a2c7eSBram Moolenaar    call assert_equal('v', mode(), msg)
769f36a2c7eSBram Moolenaar    norm! r1
770f36a2c7eSBram Moolenaar    call assert_equal(['111 [foo bar] foo', 'foo'], getline(1, '$'), msg)
771f36a2c7eSBram Moolenaar
772f36a2c7eSBram Moolenaar    " Double-click on opening square bracket should visually
773f36a2c7eSBram Moolenaar    " select the whole [foo bar].
774f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 5)
775f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
776f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 5)
777f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 5)
778f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
779f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 5)
780f36a2c7eSBram Moolenaar    call assert_equal('v', mode(), msg)
781f36a2c7eSBram Moolenaar    norm! r2
782f36a2c7eSBram Moolenaar    call assert_equal(['111 222222222 foo', 'foo'], getline(1, '$'), msg)
783f36a2c7eSBram Moolenaar
784f36a2c7eSBram Moolenaar    " Triple-click should visually select the whole line.
785f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 3)
786f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
787f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 3)
788f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 3)
789f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
790f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 3)
791f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 3)
792f36a2c7eSBram Moolenaar    call assert_equal(64, getcharmod(), msg) " triple-click
793f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 3)
794f36a2c7eSBram Moolenaar    call assert_equal('V', mode(), msg)
795f36a2c7eSBram Moolenaar    norm! r3
796f36a2c7eSBram Moolenaar    call assert_equal(['33333333333333333', 'foo'], getline(1, '$'), msg)
797f36a2c7eSBram Moolenaar
798f36a2c7eSBram Moolenaar    " Quadruple-click should start visual block select.
799f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
800f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
801f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
802f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
803f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
804f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
805f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
806f36a2c7eSBram Moolenaar    call assert_equal(64, getcharmod(), msg) " triple-click
807f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
808f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
809f36a2c7eSBram Moolenaar    call assert_equal(96, getcharmod(), msg) " quadruple-click
810f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
811f36a2c7eSBram Moolenaar    call assert_equal("\<c-v>", mode(), msg)
812f36a2c7eSBram Moolenaar    norm! r4
813f36a2c7eSBram Moolenaar    call assert_equal(['34333333333333333', 'foo'], getline(1, '$'), msg)
814f36a2c7eSBram Moolenaar  endfor
815f36a2c7eSBram Moolenaar
816f36a2c7eSBram Moolenaar  let &mouse = save_mouse
817f36a2c7eSBram Moolenaar  let &term = save_term
818f36a2c7eSBram Moolenaar  let &ttymouse = save_ttymouse
819f36a2c7eSBram Moolenaar  set mousetime&
820f36a2c7eSBram Moolenaar  call test_override('no_query_mouse', 0)
821f36a2c7eSBram Moolenaar  bwipe!
822f36a2c7eSBram Moolenaarendfunc
823f36a2c7eSBram Moolenaar
824696d6377SBram Moolenaarfunc Test_xterm_mouse_click_in_fold_columns()
825696d6377SBram Moolenaar  new
826696d6377SBram Moolenaar  let save_mouse = &mouse
827696d6377SBram Moolenaar  let save_term = &term
828696d6377SBram Moolenaar  let save_ttymouse = &ttymouse
829696d6377SBram Moolenaar  let save_foldcolumn = &foldcolumn
8302b00b9b0SBram Moolenaar  set mouse=a term=xterm foldcolumn=3 ttymouse=xterm2
831696d6377SBram Moolenaar
832696d6377SBram Moolenaar  " Create 2 nested folds.
833696d6377SBram Moolenaar  call setline(1, range(1, 7))
834696d6377SBram Moolenaar  2,6fold
835696d6377SBram Moolenaar  norm! zR
836696d6377SBram Moolenaar  4,5fold
837696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
838696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
839696d6377SBram Moolenaar
840696d6377SBram Moolenaar  " Click in "+" of inner fold in foldcolumn should open it.
841696d6377SBram Moolenaar  redraw
842696d6377SBram Moolenaar  let row = 4
843696d6377SBram Moolenaar  let col = 2
844696d6377SBram Moolenaar  call MouseLeftClick(row, col)
845696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
846696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, -1, -1, -1, -1],
847696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
848696d6377SBram Moolenaar
849696d6377SBram Moolenaar  " Click in "-" of outer fold in foldcolumn should close it.
850696d6377SBram Moolenaar  redraw
851696d6377SBram Moolenaar  let row = 2
852696d6377SBram Moolenaar  let col = 1
853696d6377SBram Moolenaar  call MouseLeftClick(row, col)
854696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
855696d6377SBram Moolenaar  call assert_equal([-1, 2, 2, 2, 2, 2, -1],
856696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
857696d6377SBram Moolenaar  norm! zR
858696d6377SBram Moolenaar
859696d6377SBram Moolenaar  " Click in "|" of inner fold in foldcolumn should close it.
860696d6377SBram Moolenaar  redraw
861696d6377SBram Moolenaar  let row = 5
862696d6377SBram Moolenaar  let col = 2
863696d6377SBram Moolenaar  call MouseLeftClick(row, col)
864696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
865696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
866696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
867696d6377SBram Moolenaar
868696d6377SBram Moolenaar  let &foldcolumn = save_foldcolumn
869696d6377SBram Moolenaar  let &ttymouse = save_ttymouse
870696d6377SBram Moolenaar  let &term = save_term
871696d6377SBram Moolenaar  let &mouse = save_mouse
872696d6377SBram Moolenaar  bwipe!
873696d6377SBram Moolenaarendfunc
87466761db1SBram Moolenaar
87566761db1SBram Moolenaar" This only checks if the sequence is recognized.
87666761db1SBram Moolenaarfunc Test_term_rgb_response()
87766761db1SBram Moolenaar  set t_RF=x
87866761db1SBram Moolenaar  set t_RB=y
87966761db1SBram Moolenaar
88066761db1SBram Moolenaar  " response to t_RF, 4 digits
88166761db1SBram Moolenaar  let red = 0x12
88266761db1SBram Moolenaar  let green = 0x34
88366761db1SBram Moolenaar  let blue = 0x56
88466761db1SBram Moolenaar  let seq = printf("\<Esc>]10;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
88566761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
88666761db1SBram Moolenaar  call assert_equal(seq, v:termrfgresp)
88766761db1SBram Moolenaar
88866761db1SBram Moolenaar  " response to t_RF, 2 digits
88966761db1SBram Moolenaar  let red = 0x78
89066761db1SBram Moolenaar  let green = 0x9a
89166761db1SBram Moolenaar  let blue = 0xbc
89266761db1SBram Moolenaar  let seq = printf("\<Esc>]10;rgb:%02x/%02x/%02x\x07", red, green, blue)
89366761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
89466761db1SBram Moolenaar  call assert_equal(seq, v:termrfgresp)
89566761db1SBram Moolenaar
89632e19770SBram Moolenaar  " response to t_RB, 4 digits, dark
89732e19770SBram Moolenaar  set background=light
898ce90e36fSBram Moolenaar  eval 'background'->test_option_not_set()
89932e19770SBram Moolenaar  let red = 0x29
90032e19770SBram Moolenaar  let green = 0x4a
90132e19770SBram Moolenaar  let blue = 0x6b
90232e19770SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
90332e19770SBram Moolenaar  call feedkeys(seq, 'Lx!')
90432e19770SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
90532e19770SBram Moolenaar  call assert_equal('dark', &background)
90632e19770SBram Moolenaar
90732e19770SBram Moolenaar  " response to t_RB, 4 digits, light
90832e19770SBram Moolenaar  set background=dark
90932e19770SBram Moolenaar  call test_option_not_set('background')
91032e19770SBram Moolenaar  let red = 0x81
91132e19770SBram Moolenaar  let green = 0x63
91266761db1SBram Moolenaar  let blue = 0x65
91366761db1SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
91466761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
91566761db1SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
91632e19770SBram Moolenaar  call assert_equal('light', &background)
91766761db1SBram Moolenaar
91832e19770SBram Moolenaar  " response to t_RB, 2 digits, dark
91932e19770SBram Moolenaar  set background=light
92032e19770SBram Moolenaar  call test_option_not_set('background')
92132e19770SBram Moolenaar  let red = 0x47
92232e19770SBram Moolenaar  let green = 0x59
92332e19770SBram Moolenaar  let blue = 0x5b
92466761db1SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
92566761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
92666761db1SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
92732e19770SBram Moolenaar  call assert_equal('dark', &background)
92832e19770SBram Moolenaar
92932e19770SBram Moolenaar  " response to t_RB, 2 digits, light
93032e19770SBram Moolenaar  set background=dark
93132e19770SBram Moolenaar  call test_option_not_set('background')
93232e19770SBram Moolenaar  let red = 0x83
93332e19770SBram Moolenaar  let green = 0xa4
93432e19770SBram Moolenaar  let blue = 0xc2
93532e19770SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
93632e19770SBram Moolenaar  call feedkeys(seq, 'Lx!')
93732e19770SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
93832e19770SBram Moolenaar  call assert_equal('light', &background)
93966761db1SBram Moolenaar
94066761db1SBram Moolenaar  set t_RF= t_RB=
94166761db1SBram Moolenaarendfunc
94266761db1SBram Moolenaar
94366761db1SBram Moolenaar" This only checks if the sequence is recognized.
9441a4cbb19SBram Moolenaar" This must be after other tests, because it has side effects to xterm
9451a4cbb19SBram Moolenaar" properties.
9461a4cbb19SBram Moolenaarfunc Test_xx01_term_style_response()
94766761db1SBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
94866761db1SBram Moolenaar  set t_RV=x
94966761db1SBram Moolenaar
95066761db1SBram Moolenaar  " send the termresponse to trigger requesting the XT codes
95166761db1SBram Moolenaar  let seq = "\<Esc>[>41;337;0c"
95266761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
95366761db1SBram Moolenaar  call assert_equal(seq, v:termresponse)
95466761db1SBram Moolenaar
95566761db1SBram Moolenaar  let seq = "\<Esc>P1$r2 q\<Esc>\\"
95666761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
95766761db1SBram Moolenaar  call assert_equal(seq, v:termstyleresp)
95866761db1SBram Moolenaar
95966761db1SBram Moolenaar  set t_RV=
96066761db1SBram Moolenaarendfunc
961de6dbb45SBram Moolenaar
96289577b3bSBram Moolenaar" This checks the iTerm2 version response.
96389577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
96489577b3bSBram Moolenaar" properties.
96589577b3bSBram Moolenaarfunc Test_xx02_iTerm2_response()
96689577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
96789577b3bSBram Moolenaar  set t_RV=x
96889577b3bSBram Moolenaar
96989577b3bSBram Moolenaar  " Old versions of iTerm2 used a different style term response.
97089577b3bSBram Moolenaar  set ttymouse=xterm
97189577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
97289577b3bSBram Moolenaar  let seq = "\<Esc>[>0;95;c"
97389577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
97489577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
97589577b3bSBram Moolenaar  call assert_equal('xterm', &ttymouse)
97689577b3bSBram Moolenaar
97789577b3bSBram Moolenaar  set ttymouse=xterm
97889577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
97989577b3bSBram Moolenaar  let seq = "\<Esc>[>0;95;0c"
98089577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
98189577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
98289577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
98389577b3bSBram Moolenaar
98489577b3bSBram Moolenaar  set t_RV=
98589577b3bSBram Moolenaarendfunc
98689577b3bSBram Moolenaar
9871a4cbb19SBram Moolenaar" This checks the libvterm version response.
9881a4cbb19SBram Moolenaar" This must be after other tests, because it has side effects to xterm
9891a4cbb19SBram Moolenaar" properties.
99089577b3bSBram Moolenaarfunc Test_xx03_libvterm_response()
9911a4cbb19SBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
9921a4cbb19SBram Moolenaar  set t_RV=x
99303b00476SBram Moolenaar
9941a4cbb19SBram Moolenaar  set ttymouse=xterm
9951a4cbb19SBram Moolenaar  call test_option_not_set('ttymouse')
9961a4cbb19SBram Moolenaar  let seq = "\<Esc>[>0;100;0c"
9971a4cbb19SBram Moolenaar  call feedkeys(seq, 'Lx!')
9981a4cbb19SBram Moolenaar  call assert_equal(seq, v:termresponse)
9991a4cbb19SBram Moolenaar  call assert_equal('sgr', &ttymouse)
10001a4cbb19SBram Moolenaar
10011a4cbb19SBram Moolenaar  set t_RV=
10021a4cbb19SBram Moolenaarendfunc
10031a4cbb19SBram Moolenaar
100489577b3bSBram Moolenaar" This checks the Mac Terminal.app version response.
100589577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
100689577b3bSBram Moolenaar" properties.
100789577b3bSBram Moolenaarfunc Test_xx04_Mac_Terminal_response()
100889577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
100989577b3bSBram Moolenaar  set t_RV=x
101089577b3bSBram Moolenaar
101189577b3bSBram Moolenaar  set ttymouse=xterm
101289577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
101389577b3bSBram Moolenaar  let seq = "\<Esc>[>1;95;0c"
101489577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
101589577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
101689577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
101789577b3bSBram Moolenaar
101889577b3bSBram Moolenaar  " Reset is_not_xterm and is_mac_terminal.
101989577b3bSBram Moolenaar  set t_RV=
102089577b3bSBram Moolenaar  set term=xterm
102189577b3bSBram Moolenaar  set t_RV=x
102289577b3bSBram Moolenaarendfunc
102389577b3bSBram Moolenaar
102489577b3bSBram Moolenaar" This checks the mintty version response.
102589577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
102689577b3bSBram Moolenaar" properties.
102789577b3bSBram Moolenaarfunc Test_xx05_mintty_response()
102889577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
102989577b3bSBram Moolenaar  set t_RV=x
103089577b3bSBram Moolenaar
103189577b3bSBram Moolenaar  set ttymouse=xterm
103289577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
103389577b3bSBram Moolenaar  let seq = "\<Esc>[>77;20905;0c"
103489577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
103589577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
103689577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
103789577b3bSBram Moolenaar
103889577b3bSBram Moolenaar  set t_RV=
103989577b3bSBram Moolenaarendfunc
104089577b3bSBram Moolenaar
104189577b3bSBram Moolenaar" This checks the screen version response.
104289577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
104389577b3bSBram Moolenaar" properties.
104489577b3bSBram Moolenaarfunc Test_xx06_screen_response()
104589577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
104689577b3bSBram Moolenaar  set t_RV=x
104789577b3bSBram Moolenaar
104889577b3bSBram Moolenaar  " Old versions of screen don't support SGR mouse mode.
104989577b3bSBram Moolenaar  set ttymouse=xterm
105089577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
105189577b3bSBram Moolenaar  let seq = "\<Esc>[>83;40500;0c"
105289577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
105389577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
105489577b3bSBram Moolenaar  call assert_equal('xterm', &ttymouse)
105589577b3bSBram Moolenaar
105689577b3bSBram Moolenaar  " screen supports SGR mouse mode starting in version 4.7.
105789577b3bSBram Moolenaar  set ttymouse=xterm
105889577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
105989577b3bSBram Moolenaar  let seq = "\<Esc>[>83;40700;0c"
106089577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
106189577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
106289577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
106389577b3bSBram Moolenaar
106489577b3bSBram Moolenaar  set t_RV=
106589577b3bSBram Moolenaarendfunc
106689577b3bSBram Moolenaar
106703b00476SBram Moolenaar" This checks the xterm version response.
106803b00476SBram Moolenaar" This must be after other tests, because it has side effects to xterm
106903b00476SBram Moolenaar" properties.
107089577b3bSBram Moolenaarfunc Test_xx07_xterm_response()
107103b00476SBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
107203b00476SBram Moolenaar  set t_RV=x
107303b00476SBram Moolenaar
10743cea8a9aSBram Moolenaar  " Do Terminal.app first to check that is_mac_terminal is reset.
10753cea8a9aSBram Moolenaar  set ttymouse=xterm
10763cea8a9aSBram Moolenaar  call test_option_not_set('ttymouse')
10773cea8a9aSBram Moolenaar  let seq = "\<Esc>[>1;95;0c"
10783cea8a9aSBram Moolenaar  call feedkeys(seq, 'Lx!')
10793cea8a9aSBram Moolenaar  call assert_equal(seq, v:termresponse)
10803cea8a9aSBram Moolenaar  call assert_equal('sgr', &ttymouse)
10813cea8a9aSBram Moolenaar
108203b00476SBram Moolenaar  " xterm < 95: "xterm" (actually unmodified)
10833cea8a9aSBram Moolenaar  set t_RV=
10843cea8a9aSBram Moolenaar  set term=xterm
10853cea8a9aSBram Moolenaar  set t_RV=x
108603b00476SBram Moolenaar  set ttymouse=xterm
108703b00476SBram Moolenaar  call test_option_not_set('ttymouse')
108803b00476SBram Moolenaar  let seq = "\<Esc>[>0;94;0c"
108903b00476SBram Moolenaar  call feedkeys(seq, 'Lx!')
109003b00476SBram Moolenaar  call assert_equal(seq, v:termresponse)
109103b00476SBram Moolenaar  call assert_equal('xterm', &ttymouse)
109203b00476SBram Moolenaar
109303b00476SBram Moolenaar  " xterm >= 95 < 277 "xterm2"
109403b00476SBram Moolenaar  set ttymouse=xterm
109503b00476SBram Moolenaar  call test_option_not_set('ttymouse')
109603b00476SBram Moolenaar  let seq = "\<Esc>[>0;267;0c"
109703b00476SBram Moolenaar  call feedkeys(seq, 'Lx!')
109803b00476SBram Moolenaar  call assert_equal(seq, v:termresponse)
109903b00476SBram Moolenaar  call assert_equal('xterm2', &ttymouse)
110003b00476SBram Moolenaar
110103b00476SBram Moolenaar  " xterm >= 277: "sgr"
110203b00476SBram Moolenaar  set ttymouse=xterm
110303b00476SBram Moolenaar  call test_option_not_set('ttymouse')
110403b00476SBram Moolenaar  let seq = "\<Esc>[>0;277;0c"
110503b00476SBram Moolenaar  call feedkeys(seq, 'Lx!')
110603b00476SBram Moolenaar  call assert_equal(seq, v:termresponse)
110703b00476SBram Moolenaar  call assert_equal('sgr', &ttymouse)
110803b00476SBram Moolenaar
110903b00476SBram Moolenaar  set t_RV=
111003b00476SBram Moolenaarendfunc
111103b00476SBram Moolenaar
1112de6dbb45SBram Moolenaarfunc Test_get_termcode()
1113eb66328bSBram Moolenaar  try
1114de6dbb45SBram Moolenaar    let k1 = &t_k1
1115eb66328bSBram Moolenaar  catch /E113/
1116eb66328bSBram Moolenaar    throw 'Skipped: Unable to query termcodes'
1117eb66328bSBram Moolenaar  endtry
1118de6dbb45SBram Moolenaar  set t_k1=
1119de6dbb45SBram Moolenaar  set t_k1&
1120de6dbb45SBram Moolenaar  call assert_equal(k1, &t_k1)
11219aeb3363SBram Moolenaar
11229aeb3363SBram Moolenaar  " use external termcap first
11239aeb3363SBram Moolenaar  set nottybuiltin
11249aeb3363SBram Moolenaar  set t_k1=
11259aeb3363SBram Moolenaar  set t_k1&
11269aeb3363SBram Moolenaar  " when using external termcap may get something else, but it must not be
11279aeb3363SBram Moolenaar  " empty, since we would fallback to the builtin one.
11289aeb3363SBram Moolenaar  call assert_notequal('', &t_k1)
11299aeb3363SBram Moolenaar
11309aeb3363SBram Moolenaar  if &term =~ 'xterm'
11319aeb3363SBram Moolenaar    " use internal termcap first
11329aeb3363SBram Moolenaar    let term_save = &term
11339aeb3363SBram Moolenaar    let &term = 'builtin_' .. &term
11349aeb3363SBram Moolenaar    set t_k1=
11359aeb3363SBram Moolenaar    set t_k1&
11369aeb3363SBram Moolenaar    call assert_equal(k1, &t_k1)
11379aeb3363SBram Moolenaar    let &term = term_save
11389aeb3363SBram Moolenaar  endif
11399aeb3363SBram Moolenaar
11409aeb3363SBram Moolenaar  set ttybuiltin
1141de6dbb45SBram Moolenaarendfunc
114218a79a68SBram Moolenaar
114318a79a68SBram Moolenaarfunc GetEscCodeCSI27(key, modifier)
114418a79a68SBram Moolenaar  let key = printf("%d", char2nr(a:key))
114518a79a68SBram Moolenaar  let mod = printf("%d", a:modifier)
114618a79a68SBram Moolenaar  return "\<Esc>[27;" .. mod .. ';' .. key .. '~'
114718a79a68SBram Moolenaarendfunc
114818a79a68SBram Moolenaar
114918a79a68SBram Moolenaarfunc GetEscCodeCSIu(key, modifier)
115018a79a68SBram Moolenaar  let key = printf("%d", char2nr(a:key))
115118a79a68SBram Moolenaar  let mod = printf("%d", a:modifier)
115218a79a68SBram Moolenaar  return "\<Esc>[" .. key .. ';' .. mod .. 'u'
115318a79a68SBram Moolenaarendfunc
115418a79a68SBram Moolenaar
115518a79a68SBram Moolenaar" This checks the CSI sequences when in modifyOtherKeys mode.
115618a79a68SBram Moolenaar" The mode doesn't need to be enabled, the codes are always detected.
115718a79a68SBram Moolenaarfunc RunTest_modifyOtherKeys(func)
115818a79a68SBram Moolenaar  new
1159459fd785SBram Moolenaar  set timeoutlen=10
116018a79a68SBram Moolenaar
116118a79a68SBram Moolenaar  " Shift-X is send as 'X' with the shift modifier
116218a79a68SBram Moolenaar  call feedkeys('a' .. a:func('X', 2) .. "\<Esc>", 'Lx!')
116318a79a68SBram Moolenaar  call assert_equal('X', getline(1))
116418a79a68SBram Moolenaar
116518a79a68SBram Moolenaar  " Ctrl-i is Tab
116618a79a68SBram Moolenaar  call setline(1, '')
116718a79a68SBram Moolenaar  call feedkeys('a' .. a:func('i', 5) .. "\<Esc>", 'Lx!')
116818a79a68SBram Moolenaar  call assert_equal("\t", getline(1))
116918a79a68SBram Moolenaar
117018a79a68SBram Moolenaar  " Ctrl-I is also Tab
117118a79a68SBram Moolenaar  call setline(1, '')
117218a79a68SBram Moolenaar  call feedkeys('a' .. a:func('I', 5) .. "\<Esc>", 'Lx!')
117318a79a68SBram Moolenaar  call assert_equal("\t", getline(1))
117418a79a68SBram Moolenaar
117518a79a68SBram Moolenaar  " Alt-x is ø
117618a79a68SBram Moolenaar  call setline(1, '')
117718a79a68SBram Moolenaar  call feedkeys('a' .. a:func('x', 3) .. "\<Esc>", 'Lx!')
117818a79a68SBram Moolenaar  call assert_equal("ø", getline(1))
117918a79a68SBram Moolenaar
118018a79a68SBram Moolenaar  " Meta-x is also ø
118118a79a68SBram Moolenaar  call setline(1, '')
118218a79a68SBram Moolenaar  call feedkeys('a' .. a:func('x', 9) .. "\<Esc>", 'Lx!')
118318a79a68SBram Moolenaar  call assert_equal("ø", getline(1))
118418a79a68SBram Moolenaar
118518a79a68SBram Moolenaar  " Alt-X is Ø
118618a79a68SBram Moolenaar  call setline(1, '')
118718a79a68SBram Moolenaar  call feedkeys('a' .. a:func('X', 3) .. "\<Esc>", 'Lx!')
118818a79a68SBram Moolenaar  call assert_equal("Ø", getline(1))
118918a79a68SBram Moolenaar
119018a79a68SBram Moolenaar  " Meta-X is ø
119118a79a68SBram Moolenaar  call setline(1, '')
119218a79a68SBram Moolenaar  call feedkeys('a' .. a:func('X', 9) .. "\<Esc>", 'Lx!')
119318a79a68SBram Moolenaar  call assert_equal("Ø", getline(1))
119418a79a68SBram Moolenaar
1195828ffd59SBram Moolenaar  " Ctrl-6 is Ctrl-^
1196828ffd59SBram Moolenaar  split aaa
1197828ffd59SBram Moolenaar  edit bbb
1198828ffd59SBram Moolenaar  call feedkeys(a:func('6', 5), 'Lx!')
1199828ffd59SBram Moolenaar  call assert_equal("aaa", bufname())
1200828ffd59SBram Moolenaar  bwipe aaa
1201828ffd59SBram Moolenaar  bwipe bbb
1202828ffd59SBram Moolenaar
120318a79a68SBram Moolenaar  bwipe!
120418a79a68SBram Moolenaar  set timeoutlen&
120518a79a68SBram Moolenaarendfunc
120618a79a68SBram Moolenaar
1207459fd785SBram Moolenaarfunc Test_modifyOtherKeys_basic()
120818a79a68SBram Moolenaar  call RunTest_modifyOtherKeys(function('GetEscCodeCSI27'))
120918a79a68SBram Moolenaar  call RunTest_modifyOtherKeys(function('GetEscCodeCSIu'))
121018a79a68SBram Moolenaarendfunc
1211d1e2f398SBram Moolenaar
121238571a04SBram Moolenaarfunc Test_modifyOtherKeys_no_mapping()
121338571a04SBram Moolenaar  set timeoutlen=10
121438571a04SBram Moolenaar
121538571a04SBram Moolenaar  let @a = 'aaa'
121638571a04SBram Moolenaar  call feedkeys(":let x = '" .. GetEscCodeCSI27('R', 5) .. GetEscCodeCSI27('R', 5) .. "a'\<CR>", 'Lx!')
121738571a04SBram Moolenaar  call assert_equal("let x = 'aaa'", @:)
121838571a04SBram Moolenaar
121938571a04SBram Moolenaar  new
122038571a04SBram Moolenaar  call feedkeys("a" .. GetEscCodeCSI27('R', 5) .. GetEscCodeCSI27('R', 5) .. "a\<Esc>", 'Lx!')
122138571a04SBram Moolenaar  call assert_equal("aaa", getline(1))
122238571a04SBram Moolenaar  bwipe!
122338571a04SBram Moolenaar
122438571a04SBram Moolenaar  new
122538571a04SBram Moolenaar  call feedkeys("axx\<CR>yy" .. GetEscCodeCSI27('G', 5) .. GetEscCodeCSI27('K', 5) .. "a\<Esc>", 'Lx!')
122638571a04SBram Moolenaar  call assert_equal("axx", getline(1))
122738571a04SBram Moolenaar  call assert_equal("yy", getline(2))
122838571a04SBram Moolenaar  bwipe!
122938571a04SBram Moolenaar
123038571a04SBram Moolenaar  set timeoutlen&
123138571a04SBram Moolenaarendfunc
123238571a04SBram Moolenaar
1233d1e2f398SBram Moolenaarfunc RunTest_mapping_shift(key, func)
1234d1e2f398SBram Moolenaar  call setline(1, '')
1235d1e2f398SBram Moolenaar  if a:key == '|'
1236d1e2f398SBram Moolenaar    exe 'inoremap \| xyz'
1237d1e2f398SBram Moolenaar  else
1238d1e2f398SBram Moolenaar    exe 'inoremap ' .. a:key .. ' xyz'
1239d1e2f398SBram Moolenaar  endif
1240d1e2f398SBram Moolenaar  call feedkeys('a' .. a:func(a:key, 2) .. "\<Esc>", 'Lx!')
1241d1e2f398SBram Moolenaar  call assert_equal("xyz", getline(1))
1242d1e2f398SBram Moolenaar  if a:key == '|'
1243d1e2f398SBram Moolenaar    exe 'iunmap \|'
1244d1e2f398SBram Moolenaar  else
1245d1e2f398SBram Moolenaar    exe 'iunmap ' .. a:key
1246d1e2f398SBram Moolenaar  endif
1247d1e2f398SBram Moolenaarendfunc
1248d1e2f398SBram Moolenaar
1249d1e2f398SBram Moolenaarfunc RunTest_mapping_works_with_shift(func)
1250d1e2f398SBram Moolenaar  new
1251459fd785SBram Moolenaar  set timeoutlen=10
1252d1e2f398SBram Moolenaar
1253d1e2f398SBram Moolenaar  call RunTest_mapping_shift('@', a:func)
1254d1e2f398SBram Moolenaar  call RunTest_mapping_shift('A', a:func)
1255d1e2f398SBram Moolenaar  call RunTest_mapping_shift('Z', a:func)
1256d1e2f398SBram Moolenaar  call RunTest_mapping_shift('^', a:func)
1257d1e2f398SBram Moolenaar  call RunTest_mapping_shift('_', a:func)
1258d1e2f398SBram Moolenaar  call RunTest_mapping_shift('{', a:func)
1259d1e2f398SBram Moolenaar  call RunTest_mapping_shift('|', a:func)
1260d1e2f398SBram Moolenaar  call RunTest_mapping_shift('}', a:func)
1261d1e2f398SBram Moolenaar  call RunTest_mapping_shift('~', a:func)
1262d1e2f398SBram Moolenaar
1263d1e2f398SBram Moolenaar  bwipe!
1264d1e2f398SBram Moolenaar  set timeoutlen&
1265d1e2f398SBram Moolenaarendfunc
1266d1e2f398SBram Moolenaar
1267459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_plain()
1268d1e2f398SBram Moolenaar  call RunTest_mapping_works_with_shift(function('GetEscCodeCSI27'))
1269d1e2f398SBram Moolenaar  call RunTest_mapping_works_with_shift(function('GetEscCodeCSIu'))
1270d1e2f398SBram Moolenaarendfunc
1271459fd785SBram Moolenaar
1272459fd785SBram Moolenaarfunc RunTest_mapping_mods(map, key, func, code)
1273459fd785SBram Moolenaar  call setline(1, '')
1274459fd785SBram Moolenaar  exe 'inoremap ' .. a:map .. ' xyz'
1275459fd785SBram Moolenaar  call feedkeys('a' .. a:func(a:key, a:code) .. "\<Esc>", 'Lx!')
1276459fd785SBram Moolenaar  call assert_equal("xyz", getline(1))
1277459fd785SBram Moolenaar  exe 'iunmap ' .. a:map
1278459fd785SBram Moolenaarendfunc
1279459fd785SBram Moolenaar
1280459fd785SBram Moolenaarfunc RunTest_mapping_works_with_mods(func, mods, code)
1281459fd785SBram Moolenaar  new
1282459fd785SBram Moolenaar  set timeoutlen=10
1283459fd785SBram Moolenaar
1284459fd785SBram Moolenaar  if a:mods !~ 'S'
1285459fd785SBram Moolenaar    " Shift by itself has no effect
1286459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-@>', '@', a:func, a:code)
1287459fd785SBram Moolenaar  endif
1288459fd785SBram Moolenaar  call RunTest_mapping_mods('<' .. a:mods .. '-A>', 'A', a:func, a:code)
1289459fd785SBram Moolenaar  call RunTest_mapping_mods('<' .. a:mods .. '-Z>', 'Z', a:func, a:code)
1290459fd785SBram Moolenaar  if a:mods !~ 'S'
1291459fd785SBram Moolenaar    " with Shift code is always upper case
1292459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-a>', 'a', a:func, a:code)
1293459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-z>', 'z', a:func, a:code)
1294459fd785SBram Moolenaar  endif
1295459fd785SBram Moolenaar  if a:mods != 'A'
1296459fd785SBram Moolenaar    " with Alt code is not in upper case
1297459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-a>', 'A', a:func, a:code)
1298459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-z>', 'Z', a:func, a:code)
1299459fd785SBram Moolenaar  endif
1300459fd785SBram Moolenaar  call RunTest_mapping_mods('<' .. a:mods .. '-á>', 'á', a:func, a:code)
1301459fd785SBram Moolenaar  if a:mods !~ 'S'
1302459fd785SBram Moolenaar    " Shift by itself has no effect
1303459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-^>', '^', a:func, a:code)
1304459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-_>', '_', a:func, a:code)
1305459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-{>', '{', a:func, a:code)
1306459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-\|>', '|', a:func, a:code)
1307459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-}>', '}', a:func, a:code)
1308459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-~>', '~', a:func, a:code)
1309459fd785SBram Moolenaar  endif
1310459fd785SBram Moolenaar
1311459fd785SBram Moolenaar  bwipe!
1312459fd785SBram Moolenaar  set timeoutlen&
1313459fd785SBram Moolenaarendfunc
1314459fd785SBram Moolenaar
1315459fd785SBram Moolenaarfunc Test_mapping_works_with_shift()
1316459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'S', 2)
1317459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'S', 2)
1318459fd785SBram Moolenaarendfunc
1319459fd785SBram Moolenaar
1320459fd785SBram Moolenaarfunc Test_mapping_works_with_ctrl()
1321459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C', 5)
1322459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C', 5)
1323459fd785SBram Moolenaarendfunc
1324459fd785SBram Moolenaar
1325459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_ctrl()
1326459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-S', 6)
1327459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-S', 6)
1328459fd785SBram Moolenaarendfunc
1329459fd785SBram Moolenaar
1330459fd785SBram Moolenaar" Below we also test the "u" code with Alt, This works, but libvterm would not
1331459fd785SBram Moolenaar" send the Alt key like this but by prefixing an Esc.
1332459fd785SBram Moolenaar
1333459fd785SBram Moolenaarfunc Test_mapping_works_with_alt()
1334459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'A', 3)
1335459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'A', 3)
1336459fd785SBram Moolenaarendfunc
1337459fd785SBram Moolenaar
1338459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_alt()
1339459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'S-A', 4)
1340459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'S-A', 4)
1341459fd785SBram Moolenaarendfunc
1342459fd785SBram Moolenaar
1343459fd785SBram Moolenaarfunc Test_mapping_works_with_ctrl_alt()
1344459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-A', 7)
1345459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-A', 7)
1346459fd785SBram Moolenaarendfunc
1347459fd785SBram Moolenaar
1348459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_ctrl_alt()
1349459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-S-A', 8)
1350459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-S-A', 8)
1351459fd785SBram Moolenaarendfunc
1352*fc4ea2a7SBram Moolenaar
1353*fc4ea2a7SBram Moolenaarfunc Test_insert_literal()
1354*fc4ea2a7SBram Moolenaar  set timeoutlen=10
1355*fc4ea2a7SBram Moolenaar  new
1356*fc4ea2a7SBram Moolenaar  " CTRL-V CTRL-X inserts a ^X
1357*fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSIu('V', '5') .. GetEscCodeCSIu('X', '5') .. "\<Esc>", 'Lx!')
1358*fc4ea2a7SBram Moolenaar  call assert_equal("\<C-X>", getline(1))
1359*fc4ea2a7SBram Moolenaar
1360*fc4ea2a7SBram Moolenaar  call setline(1, '')
1361*fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSI27('V', '5') .. GetEscCodeCSI27('X', '5') .. "\<Esc>", 'Lx!')
1362*fc4ea2a7SBram Moolenaar  call assert_equal("\<C-X>", getline(1))
1363*fc4ea2a7SBram Moolenaar
1364*fc4ea2a7SBram Moolenaar  " CTRL-SHIFT-V CTRL-X inserts escape sequencd
1365*fc4ea2a7SBram Moolenaar  call setline(1, '')
1366*fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSIu('V', '6') .. GetEscCodeCSIu('X', '5') .. "\<Esc>", 'Lx!')
1367*fc4ea2a7SBram Moolenaar  call assert_equal("\<Esc>[88;5u", getline(1))
1368*fc4ea2a7SBram Moolenaar
1369*fc4ea2a7SBram Moolenaar  call setline(1, '')
1370*fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSI27('V', '6') .. GetEscCodeCSI27('X', '5') .. "\<Esc>", 'Lx!')
1371*fc4ea2a7SBram Moolenaar  call assert_equal("\<Esc>[27;5;88~", getline(1))
1372*fc4ea2a7SBram Moolenaar
1373*fc4ea2a7SBram Moolenaar  bwipe!
1374*fc4ea2a7SBram Moolenaar  set timeoutlen&
1375*fc4ea2a7SBram Moolenaarendfunc
1376*fc4ea2a7SBram Moolenaar
1377*fc4ea2a7SBram Moolenaarfunc Test_cmdline_literal()
1378*fc4ea2a7SBram Moolenaar  set timeoutlen=10
1379*fc4ea2a7SBram Moolenaar
1380*fc4ea2a7SBram Moolenaar  " CTRL-V CTRL-Y inserts a ^Y
1381*fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSIu('V', '5') .. GetEscCodeCSIu('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
1382*fc4ea2a7SBram Moolenaar  call assert_equal("\"\<C-Y>", @:)
1383*fc4ea2a7SBram Moolenaar
1384*fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSI27('V', '5') .. GetEscCodeCSI27('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
1385*fc4ea2a7SBram Moolenaar  call assert_equal("\"\<C-Y>", @:)
1386*fc4ea2a7SBram Moolenaar
1387*fc4ea2a7SBram Moolenaar  " CTRL-SHIFT-V CTRL-Y inserts escape sequencd
1388*fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSIu('V', '6') .. GetEscCodeCSIu('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
1389*fc4ea2a7SBram Moolenaar  call assert_equal("\"\<Esc>[89;5u", @:)
1390*fc4ea2a7SBram Moolenaar
1391*fc4ea2a7SBram Moolenaar  call setline(1, '')
1392*fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSI27('V', '6') .. GetEscCodeCSI27('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
1393*fc4ea2a7SBram Moolenaar  call assert_equal("\"\<Esc>[27;5;89~", @:)
1394*fc4ea2a7SBram Moolenaar
1395*fc4ea2a7SBram Moolenaar  set timeoutlen&
1396*fc4ea2a7SBram Moolenaarendfunc
1397