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
9515545e1SBram Moolenaarsource mouse.vim
103fbd2d7cSBram Moolenaar
1192fd599eSBram Moolenaarfunc Test_term_mouse_left_click()
12905dd905SBram Moolenaar  new
13905dd905SBram Moolenaar  let save_mouse = &mouse
14905dd905SBram Moolenaar  let save_term = &term
15905dd905SBram Moolenaar  let save_ttymouse = &ttymouse
1692fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
173fbd2d7cSBram Moolenaar  set mouse=a term=xterm
18905dd905SBram Moolenaar  call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer'])
19905dd905SBram Moolenaar
20515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
214945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
221ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
233fbd2d7cSBram Moolenaar    go
244945219bSBram Moolenaar    call assert_equal([0, 1, 1, 0], getpos('.'), msg)
253fbd2d7cSBram Moolenaar    let row = 2
263fbd2d7cSBram Moolenaar    let col = 6
273fbd2d7cSBram Moolenaar    call MouseLeftClick(row, col)
283fbd2d7cSBram Moolenaar    call MouseLeftRelease(row, col)
294945219bSBram Moolenaar    call assert_equal([0, 2, 6, 0], getpos('.'), msg)
303fbd2d7cSBram Moolenaar  endfor
31905dd905SBram Moolenaar
32905dd905SBram Moolenaar  let &mouse = save_mouse
33905dd905SBram Moolenaar  let &term = save_term
34905dd905SBram Moolenaar  let &ttymouse = save_ttymouse
3592fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
36905dd905SBram Moolenaar  bwipe!
37905dd905SBram Moolenaarendfunc
38905dd905SBram Moolenaar
396aa7523bSBram Moolenaarfunc Test_xterm_mouse_right_click_extends_visual()
406aa7523bSBram Moolenaar  if has('mac')
416aa7523bSBram Moolenaar    throw "Skipped: test right click in visual mode does not work on macOs (why?)"
426aa7523bSBram Moolenaar  endif
436aa7523bSBram Moolenaar  let save_mouse = &mouse
446aa7523bSBram Moolenaar  let save_term = &term
456aa7523bSBram Moolenaar  let save_ttymouse = &ttymouse
466aa7523bSBram Moolenaar  call test_override('no_query_mouse', 1)
476aa7523bSBram Moolenaar  set mouse=a term=xterm
486aa7523bSBram Moolenaar
496aa7523bSBram Moolenaar  for visual_mode in ["v", "V", "\<C-V>"]
50515545e1SBram Moolenaar    for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
516aa7523bSBram Moolenaar      let msg = 'visual=' .. visual_mode .. ' ttymouse=' .. ttymouse_val
526aa7523bSBram Moolenaar      exe 'set ttymouse=' .. ttymouse_val
536aa7523bSBram Moolenaar
546aa7523bSBram Moolenaar      call setline(1, repeat([repeat('-', 7)], 7))
556aa7523bSBram Moolenaar      call MouseLeftClick(4, 4)
566aa7523bSBram Moolenaar      call MouseLeftRelease(4, 4)
576aa7523bSBram Moolenaar      exe  "norm! " .. visual_mode
586aa7523bSBram Moolenaar
596aa7523bSBram Moolenaar      " Right click extends top left of visual area.
606aa7523bSBram Moolenaar      call MouseRightClick(2, 2)
616aa7523bSBram Moolenaar      call MouseRightRelease(2, 2)
626aa7523bSBram Moolenaar
63f19f8d1aSBram Moolenaar      " Right click extends bottom right of visual area.
646aa7523bSBram Moolenaar      call MouseRightClick(6, 6)
656aa7523bSBram Moolenaar      call MouseRightRelease(6, 6)
666aa7523bSBram Moolenaar      norm! r1gv
676aa7523bSBram Moolenaar
686aa7523bSBram Moolenaar      " Right click shrinks top left of visual area.
696aa7523bSBram Moolenaar      call MouseRightClick(3, 3)
706aa7523bSBram Moolenaar      call MouseRightRelease(3, 3)
716aa7523bSBram Moolenaar
726aa7523bSBram Moolenaar      " Right click shrinks bottom right of visual area.
736aa7523bSBram Moolenaar      call MouseRightClick(5, 5)
746aa7523bSBram Moolenaar      call MouseRightRelease(5, 5)
756aa7523bSBram Moolenaar      norm! r2
766aa7523bSBram Moolenaar
776aa7523bSBram Moolenaar      if visual_mode ==# 'v'
786aa7523bSBram Moolenaar        call assert_equal(['-------',
796aa7523bSBram Moolenaar              \            '-111111',
806aa7523bSBram Moolenaar              \            '1122222',
816aa7523bSBram Moolenaar              \            '2222222',
826aa7523bSBram Moolenaar              \            '2222211',
836aa7523bSBram Moolenaar              \            '111111-',
846aa7523bSBram Moolenaar              \            '-------'], getline(1, '$'), msg)
856aa7523bSBram Moolenaar      elseif visual_mode ==# 'V'
866aa7523bSBram Moolenaar        call assert_equal(['-------',
876aa7523bSBram Moolenaar              \            '1111111',
886aa7523bSBram Moolenaar              \            '2222222',
896aa7523bSBram Moolenaar              \            '2222222',
906aa7523bSBram Moolenaar              \            '2222222',
916aa7523bSBram Moolenaar              \            '1111111',
926aa7523bSBram Moolenaar              \            '-------'], getline(1, '$'), msg)
936aa7523bSBram Moolenaar      else
946aa7523bSBram Moolenaar        call assert_equal(['-------',
956aa7523bSBram Moolenaar              \            '-11111-',
966aa7523bSBram Moolenaar              \            '-12221-',
976aa7523bSBram Moolenaar              \            '-12221-',
986aa7523bSBram Moolenaar              \            '-12221-',
996aa7523bSBram Moolenaar              \            '-11111-',
1006aa7523bSBram Moolenaar              \            '-------'], getline(1, '$'), msg)
1016aa7523bSBram Moolenaar      endif
1026aa7523bSBram Moolenaar    endfor
1036aa7523bSBram Moolenaar  endfor
1046aa7523bSBram Moolenaar
1056aa7523bSBram Moolenaar  let &mouse = save_mouse
1066aa7523bSBram Moolenaar  let &term = save_term
1076aa7523bSBram Moolenaar  let &ttymouse = save_ttymouse
1086aa7523bSBram Moolenaar  call test_override('no_query_mouse', 0)
1096aa7523bSBram Moolenaar  bwipe!
1106aa7523bSBram Moolenaarendfunc
1116aa7523bSBram Moolenaar
1121ee36d6fSBram Moolenaar" Test that <C-LeftMouse> jumps to help tag and <C-RightMouse> jumps back.
1131ee36d6fSBram Moolenaarfunc Test_xterm_mouse_ctrl_click()
1141ee36d6fSBram Moolenaar  let save_mouse = &mouse
1151ee36d6fSBram Moolenaar  let save_term = &term
1161ee36d6fSBram Moolenaar  let save_ttymouse = &ttymouse
1171ee36d6fSBram Moolenaar  set mouse=a term=xterm
1181ee36d6fSBram Moolenaar
119515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values
1201ee36d6fSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
1211ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
1221ee36d6fSBram Moolenaar    help
1231ee36d6fSBram Moolenaar    /usr_02.txt
1241ee36d6fSBram Moolenaar    norm! zt
1251ee36d6fSBram Moolenaar    let row = 1
1261ee36d6fSBram Moolenaar    let col = 1
1271ee36d6fSBram Moolenaar    call MouseCtrlLeftClick(row, col)
1281ee36d6fSBram Moolenaar    call MouseLeftRelease(row, col)
1291ee36d6fSBram Moolenaar    call assert_match('usr_02.txt$', bufname('%'), msg)
130b4367b7fSBram Moolenaar    call assert_equal('*usr_02.txt*', expand('<cWORD>'), msg)
1311ee36d6fSBram Moolenaar
1321ee36d6fSBram Moolenaar    call MouseCtrlRightClick(row, col)
13392fd599eSBram Moolenaar    call MouseRightRelease(row, col)
1341ee36d6fSBram Moolenaar    call assert_match('help.txt$', bufname('%'), msg)
135b4367b7fSBram Moolenaar    call assert_equal('|usr_02.txt|', expand('<cWORD>'), msg)
1361ee36d6fSBram Moolenaar
1371ee36d6fSBram Moolenaar    helpclose
1381ee36d6fSBram Moolenaar  endfor
1391ee36d6fSBram Moolenaar
1401ee36d6fSBram Moolenaar  let &mouse = save_mouse
1411ee36d6fSBram Moolenaar  let &term = save_term
1421ee36d6fSBram Moolenaar  let &ttymouse = save_ttymouse
1431ee36d6fSBram Moolenaarendfunc
1441ee36d6fSBram Moolenaar
14592fd599eSBram Moolenaarfunc Test_term_mouse_middle_click()
14652992feaSBram Moolenaar  CheckFeature clipboard_working
147564344acSBram Moolenaar
148c1b8160bSBram Moolenaar  new
149c1b8160bSBram Moolenaar  let save_mouse = &mouse
150c1b8160bSBram Moolenaar  let save_term = &term
151c1b8160bSBram Moolenaar  let save_ttymouse = &ttymouse
15292fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
153c1b8160bSBram Moolenaar  let save_quotestar = @*
154c1b8160bSBram Moolenaar  let @* = 'abc'
155c1b8160bSBram Moolenaar  set mouse=a term=xterm
156c1b8160bSBram Moolenaar
157515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
158c1b8160bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
1591ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
160c1b8160bSBram Moolenaar    call setline(1, ['123456789', '123456789'])
161c1b8160bSBram Moolenaar
162c1b8160bSBram Moolenaar    " Middle-click in the middle of the line pastes text where clicked.
163c1b8160bSBram Moolenaar    let row = 1
164c1b8160bSBram Moolenaar    let col = 6
165c1b8160bSBram Moolenaar    call MouseMiddleClick(row, col)
166c1b8160bSBram Moolenaar    call MouseMiddleRelease(row, col)
167c1b8160bSBram Moolenaar    call assert_equal(['12345abc6789', '123456789'], getline(1, '$'), msg)
168c1b8160bSBram Moolenaar
169c1b8160bSBram Moolenaar    " Middle-click beyond end of the line pastes text at the end of the line.
170c1b8160bSBram Moolenaar    let col = 20
171c1b8160bSBram Moolenaar    call MouseMiddleClick(row, col)
172c1b8160bSBram Moolenaar    call MouseMiddleRelease(row, col)
173c1b8160bSBram Moolenaar    call assert_equal(['12345abc6789abc', '123456789'], getline(1, '$'), msg)
174c1b8160bSBram Moolenaar
175c1b8160bSBram Moolenaar    " Middle-click beyond the last line pastes in the last line.
176c1b8160bSBram Moolenaar    let row = 5
177c1b8160bSBram Moolenaar    let col = 3
178c1b8160bSBram Moolenaar    call MouseMiddleClick(row, col)
179c1b8160bSBram Moolenaar    call MouseMiddleRelease(row, col)
180c1b8160bSBram Moolenaar    call assert_equal(['12345abc6789abc', '12abc3456789'], getline(1, '$'), msg)
181c1b8160bSBram Moolenaar  endfor
182c1b8160bSBram Moolenaar
183c1b8160bSBram Moolenaar  let &mouse = save_mouse
184c1b8160bSBram Moolenaar  let &term = save_term
185c1b8160bSBram Moolenaar  let &ttymouse = save_ttymouse
18692fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
187c1b8160bSBram Moolenaar  let @* = save_quotestar
188c1b8160bSBram Moolenaar  bwipe!
189c1b8160bSBram Moolenaarendfunc
190c1b8160bSBram Moolenaar
19192fd599eSBram Moolenaar" TODO: for unclear reasons this test fails if it comes after
19292fd599eSBram Moolenaar" Test_xterm_mouse_ctrl_click()
19392fd599eSBram Moolenaarfunc Test_1xterm_mouse_wheel()
194049736faSBram Moolenaar  new
195049736faSBram Moolenaar  let save_mouse = &mouse
196049736faSBram Moolenaar  let save_term = &term
197049736faSBram Moolenaar  let save_ttymouse = &ttymouse
1983fbd2d7cSBram Moolenaar  set mouse=a term=xterm
199049736faSBram Moolenaar  call setline(1, range(1, 100))
200049736faSBram Moolenaar
201515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values
2024945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
2031ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
204049736faSBram Moolenaar    go
2054945219bSBram Moolenaar    call assert_equal(1, line('w0'), msg)
2064945219bSBram Moolenaar    call assert_equal([0, 1, 1, 0], getpos('.'), msg)
2073fbd2d7cSBram Moolenaar
2083fbd2d7cSBram Moolenaar    call MouseWheelDown(1, 1)
2094945219bSBram Moolenaar    call assert_equal(4, line('w0'), msg)
2104945219bSBram Moolenaar    call assert_equal([0, 4, 1, 0], getpos('.'), msg)
2113fbd2d7cSBram Moolenaar
2123fbd2d7cSBram Moolenaar    call MouseWheelDown(1, 1)
2134945219bSBram Moolenaar    call assert_equal(7, line('w0'), msg)
2144945219bSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
215049736faSBram Moolenaar
2163fbd2d7cSBram Moolenaar    call MouseWheelUp(1, 1)
2174945219bSBram Moolenaar    call assert_equal(4, line('w0'), msg)
2184945219bSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
2193fbd2d7cSBram Moolenaar
2203fbd2d7cSBram Moolenaar    call MouseWheelUp(1, 1)
2214945219bSBram Moolenaar    call assert_equal(1, line('w0'), msg)
2224945219bSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
2233fbd2d7cSBram Moolenaar  endfor
224049736faSBram Moolenaar
225049736faSBram Moolenaar  let &mouse = save_mouse
226049736faSBram Moolenaar  let &term = save_term
227049736faSBram Moolenaar  let &ttymouse = save_ttymouse
228049736faSBram Moolenaar  bwipe!
229049736faSBram Moolenaarendfunc
2303fb01a53SBram Moolenaar
231b4367b7fSBram Moolenaar" Test that dragging beyond the window (at the bottom and at the top)
232f19f8d1aSBram Moolenaar" scrolls window content by the number of lines beyond the window.
233b4367b7fSBram Moolenaarfunc Test_term_mouse_drag_beyond_window()
234b4367b7fSBram Moolenaar  let save_mouse = &mouse
235b4367b7fSBram Moolenaar  let save_term = &term
236b4367b7fSBram Moolenaar  let save_ttymouse = &ttymouse
237b4367b7fSBram Moolenaar  call test_override('no_query_mouse', 1)
238b4367b7fSBram Moolenaar  set mouse=a term=xterm
239b4367b7fSBram Moolenaar  let col = 1
240b4367b7fSBram Moolenaar  call setline(1, range(1, 100))
241b4367b7fSBram Moolenaar
242b4367b7fSBram Moolenaar  " Split into 3 windows, and go into the middle window
243b4367b7fSBram Moolenaar  " so we test dragging mouse below and above the window.
244b4367b7fSBram Moolenaar  2split
245b4367b7fSBram Moolenaar  wincmd j
246b4367b7fSBram Moolenaar  2split
247b4367b7fSBram Moolenaar
248515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
249b4367b7fSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
250b4367b7fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
251b4367b7fSBram Moolenaar
252b4367b7fSBram Moolenaar    " Line #10 at the top.
253b4367b7fSBram Moolenaar    norm! 10zt
254b4367b7fSBram Moolenaar    redraw
255b4367b7fSBram Moolenaar    call assert_equal(10, winsaveview().topline, msg)
256b4367b7fSBram Moolenaar    call assert_equal(2, winheight(0), msg)
257b4367b7fSBram Moolenaar
258b4367b7fSBram Moolenaar    let row = 4
259b4367b7fSBram Moolenaar    call MouseLeftClick(row, col)
260b4367b7fSBram Moolenaar    call assert_equal(10, winsaveview().topline, msg)
261b4367b7fSBram Moolenaar
262b4367b7fSBram Moolenaar    " Drag downwards. We're still in the window so topline should
263b4367b7fSBram Moolenaar    " not change yet.
264b4367b7fSBram Moolenaar    let row += 1
265b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
266b4367b7fSBram Moolenaar    call assert_equal(10, winsaveview().topline, msg)
267b4367b7fSBram Moolenaar
268b4367b7fSBram Moolenaar    " We now leave the window at the bottom, so the window content should
269b4367b7fSBram Moolenaar    " scroll by 1 line, then 2 lines (etc) as we drag further away.
270b4367b7fSBram Moolenaar    let row += 1
271b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
272b4367b7fSBram Moolenaar    call assert_equal(11, winsaveview().topline, msg)
273b4367b7fSBram Moolenaar
274b4367b7fSBram Moolenaar    let row += 1
275b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
276b4367b7fSBram Moolenaar    call assert_equal(13, winsaveview().topline, msg)
277b4367b7fSBram Moolenaar
278b4367b7fSBram Moolenaar    " Now drag upwards.
279b4367b7fSBram Moolenaar    let row -= 1
280b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
281b4367b7fSBram Moolenaar    call assert_equal(14, winsaveview().topline, msg)
282b4367b7fSBram Moolenaar
283b4367b7fSBram Moolenaar    " We're now back in the window so the topline should not change.
284b4367b7fSBram Moolenaar    let row -= 1
285b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
286b4367b7fSBram Moolenaar    call assert_equal(14, winsaveview().topline, msg)
287b4367b7fSBram Moolenaar
288b4367b7fSBram Moolenaar    let row -= 1
289b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
290b4367b7fSBram Moolenaar    call assert_equal(14, winsaveview().topline, msg)
291b4367b7fSBram Moolenaar
292b4367b7fSBram Moolenaar    " We now leave the window at the top so the window content should
293b4367b7fSBram Moolenaar    " scroll by 1 line, then 2, then 3 (etc) in the opposite direction.
294b4367b7fSBram Moolenaar    let row -= 1
295b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
296b4367b7fSBram Moolenaar    call assert_equal(13, winsaveview().topline, msg)
297b4367b7fSBram Moolenaar
298b4367b7fSBram Moolenaar    let row -= 1
299b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
300b4367b7fSBram Moolenaar    call assert_equal(11, winsaveview().topline, msg)
301b4367b7fSBram Moolenaar
302b4367b7fSBram Moolenaar    let row -= 1
303b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
304b4367b7fSBram Moolenaar    call assert_equal(8, winsaveview().topline, msg)
305b4367b7fSBram Moolenaar
306b4367b7fSBram Moolenaar    call MouseLeftRelease(row, col)
307b4367b7fSBram Moolenaar    call assert_equal(8, winsaveview().topline, msg)
308b4367b7fSBram Moolenaar    call assert_equal(2, winheight(0), msg)
309b4367b7fSBram Moolenaar  endfor
310b4367b7fSBram Moolenaar
311b4367b7fSBram Moolenaar  let &mouse = save_mouse
312b4367b7fSBram Moolenaar  let &term = save_term
313b4367b7fSBram Moolenaar  let &ttymouse = save_ttymouse
314b4367b7fSBram Moolenaar  call test_override('no_query_mouse', 0)
315b4367b7fSBram Moolenaar  bwipe!
316b4367b7fSBram Moolenaarendfunc
317b4367b7fSBram Moolenaar
31892fd599eSBram Moolenaarfunc Test_term_mouse_drag_window_separator()
3193fb01a53SBram Moolenaar  let save_mouse = &mouse
3203fb01a53SBram Moolenaar  let save_term = &term
3213fb01a53SBram Moolenaar  let save_ttymouse = &ttymouse
32292fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
3233fbd2d7cSBram Moolenaar  set mouse=a term=xterm
3243fbd2d7cSBram Moolenaar
325515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
3264945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
3271ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
3283fb01a53SBram Moolenaar
3293fb01a53SBram Moolenaar    " Split horizontally and test dragging the horizontal window separator.
3303fb01a53SBram Moolenaar    split
3313fb01a53SBram Moolenaar    let rowseparator = winheight(0) + 1
3323fb01a53SBram Moolenaar    let row = rowseparator
3333fb01a53SBram Moolenaar    let col = 1
334c8b3ddabSBram Moolenaar
3352b00b9b0SBram Moolenaar    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
3362b00b9b0SBram Moolenaar    if ttymouse_val !=# 'xterm2' || row <= 223
3373fbd2d7cSBram Moolenaar      call MouseLeftClick(row, col)
3383fb01a53SBram Moolenaar      let row -= 1
3393fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
3404945219bSBram Moolenaar      call assert_equal(rowseparator - 1, winheight(0) + 1, msg)
3413fb01a53SBram Moolenaar      let row += 1
3423fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
3434945219bSBram Moolenaar      call assert_equal(rowseparator, winheight(0) + 1, msg)
3443fbd2d7cSBram Moolenaar      call MouseLeftRelease(row, col)
3454945219bSBram Moolenaar      call assert_equal(rowseparator, winheight(0) + 1, msg)
34639f76c6aSBram Moolenaar    endif
3473fb01a53SBram Moolenaar    bwipe!
3483fb01a53SBram Moolenaar
3493fb01a53SBram Moolenaar    " Split vertically and test dragging the vertical window separator.
3503fb01a53SBram Moolenaar    vsplit
3513fb01a53SBram Moolenaar    let colseparator = winwidth(0) + 1
3523fb01a53SBram Moolenaar    let row = 1
3533fb01a53SBram Moolenaar    let col = colseparator
35439f76c6aSBram Moolenaar
3552b00b9b0SBram Moolenaar    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
3562b00b9b0SBram Moolenaar    if ttymouse_val !=# 'xterm2' || col <= 223
3573fbd2d7cSBram Moolenaar      call MouseLeftClick(row, col)
3583fb01a53SBram Moolenaar      let col -= 1
3593fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
3604945219bSBram Moolenaar      call assert_equal(colseparator - 1, winwidth(0) + 1, msg)
3613fb01a53SBram Moolenaar      let col += 1
3623fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
3634945219bSBram Moolenaar      call assert_equal(colseparator, winwidth(0) + 1, msg)
3643fbd2d7cSBram Moolenaar      call MouseLeftRelease(row, col)
3654945219bSBram Moolenaar      call assert_equal(colseparator, winwidth(0) + 1, msg)
36639f76c6aSBram Moolenaar    endif
3673fb01a53SBram Moolenaar    bwipe!
3683fbd2d7cSBram Moolenaar  endfor
3693fbd2d7cSBram Moolenaar
3703fbd2d7cSBram Moolenaar  let &mouse = save_mouse
3713fbd2d7cSBram Moolenaar  let &term = save_term
3723fbd2d7cSBram Moolenaar  let &ttymouse = save_ttymouse
37392fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
3743fbd2d7cSBram Moolenaarendfunc
3753fbd2d7cSBram Moolenaar
37692fd599eSBram Moolenaarfunc Test_term_mouse_drag_statusline()
3773fbd2d7cSBram Moolenaar  let save_mouse = &mouse
3783fbd2d7cSBram Moolenaar  let save_term = &term
3793fbd2d7cSBram Moolenaar  let save_ttymouse = &ttymouse
38092fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
381ca57ab54SBram Moolenaar  let save_laststatus = &laststatus
382ca57ab54SBram Moolenaar  set mouse=a term=xterm laststatus=2
3833fbd2d7cSBram Moolenaar
384515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
3854945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
3861ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
3873fbd2d7cSBram Moolenaar
3884945219bSBram Moolenaar    call assert_equal(1, &cmdheight, msg)
3893fbd2d7cSBram Moolenaar    let rowstatusline = winheight(0) + 1
3903fbd2d7cSBram Moolenaar    let row = rowstatusline
3913fbd2d7cSBram Moolenaar    let col = 1
392c8b3ddabSBram Moolenaar
3932b00b9b0SBram Moolenaar    if ttymouse_val ==# 'xterm2' && row > 223
3942b00b9b0SBram Moolenaar      " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
395c8b3ddabSBram Moolenaar      continue
396c8b3ddabSBram Moolenaar    endif
397c8b3ddabSBram Moolenaar
3983fbd2d7cSBram Moolenaar    call MouseLeftClick(row, col)
3993fbd2d7cSBram Moolenaar    let row -= 1
4003fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
4014945219bSBram Moolenaar    call assert_equal(2, &cmdheight, msg)
4024945219bSBram Moolenaar    call assert_equal(rowstatusline - 1, winheight(0) + 1, msg)
4033fbd2d7cSBram Moolenaar    let row += 1
4043fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
4054945219bSBram Moolenaar    call assert_equal(1, &cmdheight, msg)
4064945219bSBram Moolenaar    call assert_equal(rowstatusline, winheight(0) + 1, msg)
4073fbd2d7cSBram Moolenaar    call MouseLeftRelease(row, col)
4084945219bSBram Moolenaar    call assert_equal(1, &cmdheight, msg)
4094945219bSBram Moolenaar    call assert_equal(rowstatusline, winheight(0) + 1, msg)
4103fbd2d7cSBram Moolenaar  endfor
4113fbd2d7cSBram Moolenaar
4123fb01a53SBram Moolenaar  let &mouse = save_mouse
4133fb01a53SBram Moolenaar  let &term = save_term
4143fb01a53SBram Moolenaar  let &ttymouse = save_ttymouse
41592fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
416ca57ab54SBram Moolenaar  let &laststatus = save_laststatus
417ca57ab54SBram Moolenaarendfunc
418ca57ab54SBram Moolenaar
41992fd599eSBram Moolenaarfunc Test_term_mouse_click_tab()
420ca57ab54SBram Moolenaar  let save_mouse = &mouse
421ca57ab54SBram Moolenaar  let save_term = &term
422ca57ab54SBram Moolenaar  let save_ttymouse = &ttymouse
42392fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
424ca57ab54SBram Moolenaar  set mouse=a term=xterm
425ca57ab54SBram Moolenaar  let row = 1
426ca57ab54SBram Moolenaar
427515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
4284945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
4291ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
430ca57ab54SBram Moolenaar    e Xfoo
431ca57ab54SBram Moolenaar    tabnew Xbar
432ca57ab54SBram Moolenaar
433ca57ab54SBram Moolenaar    let a = split(execute(':tabs'), "\n")
434ca57ab54SBram Moolenaar    call assert_equal(['Tab page 1',
435ca57ab54SBram Moolenaar        \              '    Xfoo',
436ca57ab54SBram Moolenaar        \              'Tab page 2',
4374945219bSBram Moolenaar        \              '>   Xbar'], a, msg)
438ca57ab54SBram Moolenaar
439ca57ab54SBram Moolenaar    " Test clicking on tab names in the tabline at the top.
440ca57ab54SBram Moolenaar    let col = 2
44139f76c6aSBram Moolenaar    redraw
442ca57ab54SBram Moolenaar    call MouseLeftClick(row, col)
443ca57ab54SBram Moolenaar    call MouseLeftRelease(row, col)
444ca57ab54SBram Moolenaar    let a = split(execute(':tabs'), "\n")
445ca57ab54SBram Moolenaar    call assert_equal(['Tab page 1',
446ca57ab54SBram Moolenaar        \              '>   Xfoo',
447ca57ab54SBram Moolenaar        \              'Tab page 2',
4484945219bSBram Moolenaar        \              '    Xbar'], a, msg)
449ca57ab54SBram Moolenaar
450ca57ab54SBram Moolenaar    let col = 9
451ca57ab54SBram Moolenaar    call MouseLeftClick(row, col)
452ca57ab54SBram Moolenaar    call MouseLeftRelease(row, col)
453ca57ab54SBram Moolenaar    let a = split(execute(':tabs'), "\n")
454ca57ab54SBram Moolenaar    call assert_equal(['Tab page 1',
455ca57ab54SBram Moolenaar        \              '    Xfoo',
456ca57ab54SBram Moolenaar        \              'Tab page 2',
4574945219bSBram Moolenaar        \              '>   Xbar'], a, msg)
458ca57ab54SBram Moolenaar
459ca57ab54SBram Moolenaar    %bwipe!
460ca57ab54SBram Moolenaar  endfor
461ca57ab54SBram Moolenaar
462ca57ab54SBram Moolenaar  let &mouse = save_mouse
463ca57ab54SBram Moolenaar  let &term = save_term
464ca57ab54SBram Moolenaar  let &ttymouse = save_ttymouse
46592fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
4663fb01a53SBram Moolenaarendfunc
46739f76c6aSBram Moolenaar
46892fd599eSBram Moolenaarfunc Test_term_mouse_click_X_to_close_tab()
46939f76c6aSBram Moolenaar  let save_mouse = &mouse
47039f76c6aSBram Moolenaar  let save_term = &term
47139f76c6aSBram Moolenaar  let save_ttymouse = &ttymouse
47292fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
47339f76c6aSBram Moolenaar  set mouse=a term=xterm
47439f76c6aSBram Moolenaar  let row = 1
47539f76c6aSBram Moolenaar  let col = &columns
47639f76c6aSBram Moolenaar
477515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
4782b00b9b0SBram Moolenaar    if ttymouse_val ==# 'xterm2' && col > 223
4792b00b9b0SBram Moolenaar      " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
48039f76c6aSBram Moolenaar      continue
48139f76c6aSBram Moolenaar    endif
4824945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
4831ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
48439f76c6aSBram Moolenaar    e Xtab1
48539f76c6aSBram Moolenaar    tabnew Xtab2
48639f76c6aSBram Moolenaar    tabnew Xtab3
48739f76c6aSBram Moolenaar    tabn 2
48839f76c6aSBram Moolenaar
48939f76c6aSBram Moolenaar    let a = split(execute(':tabs'), "\n")
49039f76c6aSBram Moolenaar    call assert_equal(['Tab page 1',
49139f76c6aSBram Moolenaar        \              '    Xtab1',
49239f76c6aSBram Moolenaar        \              'Tab page 2',
49339f76c6aSBram Moolenaar        \              '>   Xtab2',
49439f76c6aSBram Moolenaar        \              'Tab page 3',
4954945219bSBram Moolenaar        \              '    Xtab3'], a, msg)
49639f76c6aSBram Moolenaar
49739f76c6aSBram Moolenaar    " Click on "X" in tabline to close current tab i.e. Xtab2.
49839f76c6aSBram Moolenaar    redraw
49939f76c6aSBram Moolenaar    call MouseLeftClick(row, col)
50039f76c6aSBram Moolenaar    call MouseLeftRelease(row, col)
50139f76c6aSBram Moolenaar    let a = split(execute(':tabs'), "\n")
50239f76c6aSBram Moolenaar    call assert_equal(['Tab page 1',
50339f76c6aSBram Moolenaar        \              '    Xtab1',
50439f76c6aSBram Moolenaar        \              'Tab page 2',
5054945219bSBram Moolenaar        \              '>   Xtab3'], a, msg)
50639f76c6aSBram Moolenaar
50739f76c6aSBram Moolenaar    %bwipe!
50839f76c6aSBram Moolenaar  endfor
50939f76c6aSBram Moolenaar
51039f76c6aSBram Moolenaar  let &mouse = save_mouse
51139f76c6aSBram Moolenaar  let &term = save_term
51239f76c6aSBram Moolenaar  let &ttymouse = save_ttymouse
51392fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
51439f76c6aSBram Moolenaarendfunc
515e3e3828fSBram Moolenaar
51692fd599eSBram Moolenaarfunc Test_term_mouse_drag_to_move_tab()
517e3e3828fSBram Moolenaar  let save_mouse = &mouse
518e3e3828fSBram Moolenaar  let save_term = &term
519e3e3828fSBram Moolenaar  let save_ttymouse = &ttymouse
52092fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
521e3e3828fSBram Moolenaar  " Set 'mousetime' to 1 to avoid recognizing a double-click in the loop
522e3e3828fSBram Moolenaar  set mouse=a term=xterm mousetime=1
523e3e3828fSBram Moolenaar  let row = 1
524e3e3828fSBram Moolenaar
525515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
5264945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
5271ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
528e3e3828fSBram Moolenaar    e Xtab1
529e3e3828fSBram Moolenaar    tabnew Xtab2
530e3e3828fSBram Moolenaar
531e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
532e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
533e3e3828fSBram Moolenaar        \              '    Xtab1',
534e3e3828fSBram Moolenaar        \              'Tab page 2',
5354945219bSBram Moolenaar        \              '>   Xtab2'], a, msg)
536e3e3828fSBram Moolenaar    redraw
537e3e3828fSBram Moolenaar
538e3e3828fSBram Moolenaar    " Click in tab2 and drag it to tab1.
539e3e3828fSBram Moolenaar    " Check getcharmod() to verify that click is not
540e3e3828fSBram Moolenaar    " interpreted as a spurious double-click.
541e3e3828fSBram Moolenaar    call MouseLeftClick(row, 10)
5424945219bSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
543e3e3828fSBram Moolenaar    for col in [9, 8, 7, 6]
544e3e3828fSBram Moolenaar      call MouseLeftDrag(row, col)
545e3e3828fSBram Moolenaar    endfor
546e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
547e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
548e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
549e3e3828fSBram Moolenaar        \              '>   Xtab2',
550e3e3828fSBram Moolenaar        \              'Tab page 2',
5514945219bSBram Moolenaar        \              '    Xtab1'], a, msg)
552e3e3828fSBram Moolenaar
553f36a2c7eSBram Moolenaar    " Click elsewhere so that click in next iteration is not
554f36a2c7eSBram Moolenaar    " interpreted as unwanted double-click.
555f36a2c7eSBram Moolenaar    call MouseLeftClick(row, 11)
556f36a2c7eSBram Moolenaar    call MouseLeftRelease(row, 11)
557f36a2c7eSBram Moolenaar
558e3e3828fSBram Moolenaar    %bwipe!
559e3e3828fSBram Moolenaar  endfor
560e3e3828fSBram Moolenaar
561e3e3828fSBram Moolenaar  let &mouse = save_mouse
562e3e3828fSBram Moolenaar  let &term = save_term
563e3e3828fSBram Moolenaar  let &ttymouse = save_ttymouse
56492fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
565e3e3828fSBram Moolenaar  set mousetime&
566e3e3828fSBram Moolenaarendfunc
567e3e3828fSBram Moolenaar
56892fd599eSBram Moolenaarfunc Test_term_mouse_double_click_to_create_tab()
569e3e3828fSBram Moolenaar  let save_mouse = &mouse
570e3e3828fSBram Moolenaar  let save_term = &term
571e3e3828fSBram Moolenaar  let save_ttymouse = &ttymouse
57292fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
573e3e3828fSBram Moolenaar  " Set 'mousetime' to a small value, so that double-click works but we don't
574e3e3828fSBram Moolenaar  " have to wait long to avoid a triple-click.
575f36a2c7eSBram Moolenaar  set mouse=a term=xterm mousetime=200
576e3e3828fSBram Moolenaar  let row = 1
577e3e3828fSBram Moolenaar  let col = 10
578e3e3828fSBram Moolenaar
579515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
5804945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
5811ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
582e3e3828fSBram Moolenaar    e Xtab1
583e3e3828fSBram Moolenaar    tabnew Xtab2
584e3e3828fSBram Moolenaar
585e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
586e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
587e3e3828fSBram Moolenaar        \              '    Xtab1',
588e3e3828fSBram Moolenaar        \              'Tab page 2',
5894945219bSBram Moolenaar        \              '>   Xtab2'], a, msg)
590e3e3828fSBram Moolenaar
591e3e3828fSBram Moolenaar    redraw
592e3e3828fSBram Moolenaar    call MouseLeftClick(row, col)
593e3e3828fSBram Moolenaar    " Check getcharmod() to verify that first click is not
594e3e3828fSBram Moolenaar    " interpreted as a spurious double-click.
5954945219bSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
596e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
597e3e3828fSBram Moolenaar    call MouseLeftClick(row, col)
5984945219bSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
599e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
600e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
601e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
602e3e3828fSBram Moolenaar        \              '    Xtab1',
603e3e3828fSBram Moolenaar        \              'Tab page 2',
604e3e3828fSBram Moolenaar        \              '>   [No Name]',
605e3e3828fSBram Moolenaar        \              'Tab page 3',
6064945219bSBram Moolenaar        \              '    Xtab2'], a, msg)
607e3e3828fSBram Moolenaar
608f36a2c7eSBram Moolenaar    " Click elsewhere so that click in next iteration is not
609f36a2c7eSBram Moolenaar    " interpreted as unwanted double click.
610f36a2c7eSBram Moolenaar    call MouseLeftClick(row, col + 1)
611f36a2c7eSBram Moolenaar    call MouseLeftRelease(row, col + 1)
612f36a2c7eSBram Moolenaar
613e3e3828fSBram Moolenaar    %bwipe!
614e3e3828fSBram Moolenaar  endfor
615e3e3828fSBram Moolenaar
616e3e3828fSBram Moolenaar  let &mouse = save_mouse
617e3e3828fSBram Moolenaar  let &term = save_term
618e3e3828fSBram Moolenaar  let &ttymouse = save_ttymouse
61992fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
620e3e3828fSBram Moolenaar  set mousetime&
621e3e3828fSBram Moolenaarendfunc
622696d6377SBram Moolenaar
623f36a2c7eSBram Moolenaar" Test double/triple/quadruple click in normal mode to visually select.
624f36a2c7eSBram Moolenaarfunc Test_term_mouse_multiple_clicks_to_visually_select()
625f36a2c7eSBram Moolenaar  let save_mouse = &mouse
626f36a2c7eSBram Moolenaar  let save_term = &term
627f36a2c7eSBram Moolenaar  let save_ttymouse = &ttymouse
628f36a2c7eSBram Moolenaar  call test_override('no_query_mouse', 1)
629f36a2c7eSBram Moolenaar  set mouse=a term=xterm mousetime=200
630f36a2c7eSBram Moolenaar  new
631f36a2c7eSBram Moolenaar
632515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
633f36a2c7eSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
634f36a2c7eSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
635f36a2c7eSBram Moolenaar    call setline(1, ['foo [foo bar] foo', 'foo'])
636f36a2c7eSBram Moolenaar
637f36a2c7eSBram Moolenaar    " Double-click on word should visually select the word.
638f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
639f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
640f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
641f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
642f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
643f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
644f36a2c7eSBram Moolenaar    call assert_equal('v', mode(), msg)
645f36a2c7eSBram Moolenaar    norm! r1
646f36a2c7eSBram Moolenaar    call assert_equal(['111 [foo bar] foo', 'foo'], getline(1, '$'), msg)
647f36a2c7eSBram Moolenaar
648f36a2c7eSBram Moolenaar    " Double-click on opening square bracket should visually
649f36a2c7eSBram Moolenaar    " select the whole [foo bar].
650f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 5)
651f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
652f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 5)
653f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 5)
654f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
655f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 5)
656f36a2c7eSBram Moolenaar    call assert_equal('v', mode(), msg)
657f36a2c7eSBram Moolenaar    norm! r2
658f36a2c7eSBram Moolenaar    call assert_equal(['111 222222222 foo', 'foo'], getline(1, '$'), msg)
659f36a2c7eSBram Moolenaar
660f36a2c7eSBram Moolenaar    " Triple-click should visually select the whole line.
661f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 3)
662f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
663f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 3)
664f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 3)
665f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
666f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 3)
667f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 3)
668f36a2c7eSBram Moolenaar    call assert_equal(64, getcharmod(), msg) " triple-click
669f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 3)
670f36a2c7eSBram Moolenaar    call assert_equal('V', mode(), msg)
671f36a2c7eSBram Moolenaar    norm! r3
672f36a2c7eSBram Moolenaar    call assert_equal(['33333333333333333', 'foo'], getline(1, '$'), msg)
673f36a2c7eSBram Moolenaar
674f36a2c7eSBram Moolenaar    " Quadruple-click should start visual block select.
675f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
676f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
677f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
678f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
679f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
680f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
681f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
682f36a2c7eSBram Moolenaar    call assert_equal(64, getcharmod(), msg) " triple-click
683f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
684f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
685f36a2c7eSBram Moolenaar    call assert_equal(96, getcharmod(), msg) " quadruple-click
686f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
687f36a2c7eSBram Moolenaar    call assert_equal("\<c-v>", mode(), msg)
688f36a2c7eSBram Moolenaar    norm! r4
689f36a2c7eSBram Moolenaar    call assert_equal(['34333333333333333', 'foo'], getline(1, '$'), msg)
690f36a2c7eSBram Moolenaar  endfor
691f36a2c7eSBram Moolenaar
692f36a2c7eSBram Moolenaar  let &mouse = save_mouse
693f36a2c7eSBram Moolenaar  let &term = save_term
694f36a2c7eSBram Moolenaar  let &ttymouse = save_ttymouse
695f36a2c7eSBram Moolenaar  set mousetime&
696f36a2c7eSBram Moolenaar  call test_override('no_query_mouse', 0)
697f36a2c7eSBram Moolenaar  bwipe!
698f36a2c7eSBram Moolenaarendfunc
699f36a2c7eSBram Moolenaar
700696d6377SBram Moolenaarfunc Test_xterm_mouse_click_in_fold_columns()
701696d6377SBram Moolenaar  new
702696d6377SBram Moolenaar  let save_mouse = &mouse
703696d6377SBram Moolenaar  let save_term = &term
704696d6377SBram Moolenaar  let save_ttymouse = &ttymouse
705696d6377SBram Moolenaar  let save_foldcolumn = &foldcolumn
7062b00b9b0SBram Moolenaar  set mouse=a term=xterm foldcolumn=3 ttymouse=xterm2
707696d6377SBram Moolenaar
708696d6377SBram Moolenaar  " Create 2 nested folds.
709696d6377SBram Moolenaar  call setline(1, range(1, 7))
710696d6377SBram Moolenaar  2,6fold
711696d6377SBram Moolenaar  norm! zR
712696d6377SBram Moolenaar  4,5fold
713696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
714696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
715696d6377SBram Moolenaar
716696d6377SBram Moolenaar  " Click in "+" of inner fold in foldcolumn should open it.
717696d6377SBram Moolenaar  redraw
718696d6377SBram Moolenaar  let row = 4
719696d6377SBram Moolenaar  let col = 2
720696d6377SBram Moolenaar  call MouseLeftClick(row, col)
721696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
722696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, -1, -1, -1, -1],
723696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
724696d6377SBram Moolenaar
725696d6377SBram Moolenaar  " Click in "-" of outer fold in foldcolumn should close it.
726696d6377SBram Moolenaar  redraw
727696d6377SBram Moolenaar  let row = 2
728696d6377SBram Moolenaar  let col = 1
729696d6377SBram Moolenaar  call MouseLeftClick(row, col)
730696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
731696d6377SBram Moolenaar  call assert_equal([-1, 2, 2, 2, 2, 2, -1],
732696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
733696d6377SBram Moolenaar  norm! zR
734696d6377SBram Moolenaar
735696d6377SBram Moolenaar  " Click in "|" of inner fold in foldcolumn should close it.
736696d6377SBram Moolenaar  redraw
737696d6377SBram Moolenaar  let row = 5
738696d6377SBram Moolenaar  let col = 2
739696d6377SBram Moolenaar  call MouseLeftClick(row, col)
740696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
741696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
742696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
743696d6377SBram Moolenaar
744696d6377SBram Moolenaar  let &foldcolumn = save_foldcolumn
745696d6377SBram Moolenaar  let &ttymouse = save_ttymouse
746696d6377SBram Moolenaar  let &term = save_term
747696d6377SBram Moolenaar  let &mouse = save_mouse
748696d6377SBram Moolenaar  bwipe!
749696d6377SBram Moolenaarendfunc
75066761db1SBram Moolenaar
751f19f8d1aSBram Moolenaar" Left or right click in Ex command line sets position of the cursor.
752f19f8d1aSBram Moolenaarfunc Test_term_mouse_click_in_cmdline_to_set_pos()
753f19f8d1aSBram Moolenaar  let save_mouse = &mouse
754f19f8d1aSBram Moolenaar  let save_term = &term
755f19f8d1aSBram Moolenaar  let save_ttymouse = &ttymouse
756f19f8d1aSBram Moolenaar  call test_override('no_query_mouse', 1)
757f19f8d1aSBram Moolenaar  set mouse=a term=xterm
758f19f8d1aSBram Moolenaar  let row = &lines
759f19f8d1aSBram Moolenaar
760515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
761ab505b1aSBram Moolenaar    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
762ab505b1aSBram Moolenaar    if ttymouse_val !=# 'xterm2' || row <= 223
763f19f8d1aSBram Moolenaar      let msg = 'ttymouse=' .. ttymouse_val
764f19f8d1aSBram Moolenaar      exe 'set ttymouse=' .. ttymouse_val
765f19f8d1aSBram Moolenaar
766ab505b1aSBram Moolenaar
767f19f8d1aSBram Moolenaar      call feedkeys(':"3456789'
768f19f8d1aSBram Moolenaar            \       .. MouseLeftClickCode(row, 7)
769f19f8d1aSBram Moolenaar            \       .. MouseLeftReleaseCode(row, 7) .. 'L'
770f19f8d1aSBram Moolenaar            \       .. MouseRightClickCode(row, 4)
771f19f8d1aSBram Moolenaar            \       .. MouseRightReleaseCode(row, 4) .. 'R'
772f19f8d1aSBram Moolenaar            \       .. "\<CR>", 'Lx!')
773f19f8d1aSBram Moolenaar      call assert_equal('"3R456L789', @:, msg)
774ab505b1aSBram Moolenaar    endif
775f19f8d1aSBram Moolenaar  endfor
776f19f8d1aSBram Moolenaar
777f19f8d1aSBram Moolenaar  let &mouse = save_mouse
778f19f8d1aSBram Moolenaar  let &term = save_term
779f19f8d1aSBram Moolenaar  let &ttymouse = save_ttymouse
780f19f8d1aSBram Moolenaar  set mousetime&
781f19f8d1aSBram Moolenaar  call test_override('no_query_mouse', 0)
782f19f8d1aSBram Moolenaarendfunc
783f19f8d1aSBram Moolenaar
784f19f8d1aSBram Moolenaar" Middle click in command line pastes at position of cursor.
785f19f8d1aSBram Moolenaarfunc Test_term_mouse_middle_click_in_cmdline_to_paste()
786f19f8d1aSBram Moolenaar  CheckFeature clipboard_working
787f19f8d1aSBram Moolenaar  let save_mouse = &mouse
788f19f8d1aSBram Moolenaar  let save_term = &term
789f19f8d1aSBram Moolenaar  let save_ttymouse = &ttymouse
790f19f8d1aSBram Moolenaar  call test_override('no_query_mouse', 1)
791f19f8d1aSBram Moolenaar  set mouse=a term=xterm
792f19f8d1aSBram Moolenaar  let row = &lines
793f19f8d1aSBram Moolenaar  " Column values does not matter, paste is done at position of cursor.
794f19f8d1aSBram Moolenaar  let col = 1
795f19f8d1aSBram Moolenaar  let @* = 'paste'
796f19f8d1aSBram Moolenaar
797515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
798f19f8d1aSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
799f19f8d1aSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
800f19f8d1aSBram Moolenaar
801f19f8d1aSBram Moolenaar    call feedkeys(":\"->"
802f19f8d1aSBram Moolenaar          \       .. MouseMiddleReleaseCode(row, col)
803f19f8d1aSBram Moolenaar          \       .. MouseMiddleClickCode(row, col)
804f19f8d1aSBram Moolenaar          \       .. "<-"
805f19f8d1aSBram Moolenaar          \       .. MouseMiddleReleaseCode(row, col)
806f19f8d1aSBram Moolenaar          \       .. MouseMiddleClickCode(row, col)
807f19f8d1aSBram Moolenaar          \       .. "\<CR>", 'Lx!')
808f19f8d1aSBram Moolenaar    call assert_equal('"->paste<-paste', @:, msg)
809f19f8d1aSBram Moolenaar  endfor
810f19f8d1aSBram Moolenaar
811f19f8d1aSBram Moolenaar  let &mouse = save_mouse
812f19f8d1aSBram Moolenaar  let &term = save_term
813f19f8d1aSBram Moolenaar  let &ttymouse = save_ttymouse
814f19f8d1aSBram Moolenaar  let @* = ''
815f19f8d1aSBram Moolenaar  call test_override('no_query_mouse', 0)
816f19f8d1aSBram Moolenaarendfunc
817f19f8d1aSBram Moolenaar
8180eabd4dcSBram Moolenaar" Test for displaying the popup menu using the right mouse click
8190eabd4dcSBram Moolenaarfunc Test_mouse_popup_menu()
8200eabd4dcSBram Moolenaar  CheckFeature menu
8210eabd4dcSBram Moolenaar  new
8220eabd4dcSBram Moolenaar  call setline(1, 'popup menu test')
8230eabd4dcSBram Moolenaar  let save_mouse = &mouse
8240eabd4dcSBram Moolenaar  let save_term = &term
8250eabd4dcSBram Moolenaar  let save_ttymouse = &ttymouse
8260eabd4dcSBram Moolenaar  let save_mousemodel = &mousemodel
8270eabd4dcSBram Moolenaar  call test_override('no_query_mouse', 1)
8280eabd4dcSBram Moolenaar  set mouse=a term=xterm mousemodel=popup
8290eabd4dcSBram Moolenaar
8300eabd4dcSBram Moolenaar  menu PopUp.foo :let g:menustr = 'foo'<CR>
8310eabd4dcSBram Moolenaar  menu PopUp.bar :let g:menustr = 'bar'<CR>
8320eabd4dcSBram Moolenaar  menu PopUp.baz :let g:menustr = 'baz'<CR>
8330eabd4dcSBram Moolenaar
834515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values
8350eabd4dcSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
8360eabd4dcSBram Moolenaar    let g:menustr = ''
8370eabd4dcSBram Moolenaar    call feedkeys(MouseRightClickCode(1, 4)
8380eabd4dcSBram Moolenaar		\ .. MouseRightReleaseCode(1, 4) .. "\<Down>\<Down>\<CR>", "x")
8390eabd4dcSBram Moolenaar    call assert_equal('bar', g:menustr)
8400eabd4dcSBram Moolenaar  endfor
8410eabd4dcSBram Moolenaar
8420eabd4dcSBram Moolenaar  unmenu PopUp
8430eabd4dcSBram Moolenaar  let &mouse = save_mouse
8440eabd4dcSBram Moolenaar  let &term = save_term
8450eabd4dcSBram Moolenaar  let &ttymouse = save_ttymouse
8460eabd4dcSBram Moolenaar  let &mousemodel = save_mousemodel
8470eabd4dcSBram Moolenaar  call test_override('no_query_mouse', 0)
8480eabd4dcSBram Moolenaar  close!
8490eabd4dcSBram Moolenaarendfunc
8500eabd4dcSBram Moolenaar
85166761db1SBram Moolenaar" This only checks if the sequence is recognized.
85266761db1SBram Moolenaarfunc Test_term_rgb_response()
85366761db1SBram Moolenaar  set t_RF=x
85466761db1SBram Moolenaar  set t_RB=y
85566761db1SBram Moolenaar
85666761db1SBram Moolenaar  " response to t_RF, 4 digits
85766761db1SBram Moolenaar  let red = 0x12
85866761db1SBram Moolenaar  let green = 0x34
85966761db1SBram Moolenaar  let blue = 0x56
86066761db1SBram Moolenaar  let seq = printf("\<Esc>]10;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
86166761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
86266761db1SBram Moolenaar  call assert_equal(seq, v:termrfgresp)
86366761db1SBram Moolenaar
86466761db1SBram Moolenaar  " response to t_RF, 2 digits
86566761db1SBram Moolenaar  let red = 0x78
86666761db1SBram Moolenaar  let green = 0x9a
86766761db1SBram Moolenaar  let blue = 0xbc
86866761db1SBram Moolenaar  let seq = printf("\<Esc>]10;rgb:%02x/%02x/%02x\x07", red, green, blue)
86966761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
87066761db1SBram Moolenaar  call assert_equal(seq, v:termrfgresp)
87166761db1SBram Moolenaar
87232e19770SBram Moolenaar  " response to t_RB, 4 digits, dark
87332e19770SBram Moolenaar  set background=light
874ce90e36fSBram Moolenaar  eval 'background'->test_option_not_set()
87532e19770SBram Moolenaar  let red = 0x29
87632e19770SBram Moolenaar  let green = 0x4a
87732e19770SBram Moolenaar  let blue = 0x6b
87832e19770SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
87932e19770SBram Moolenaar  call feedkeys(seq, 'Lx!')
88032e19770SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
88132e19770SBram Moolenaar  call assert_equal('dark', &background)
88232e19770SBram Moolenaar
88332e19770SBram Moolenaar  " response to t_RB, 4 digits, light
88432e19770SBram Moolenaar  set background=dark
88532e19770SBram Moolenaar  call test_option_not_set('background')
88632e19770SBram Moolenaar  let red = 0x81
88732e19770SBram Moolenaar  let green = 0x63
88866761db1SBram Moolenaar  let blue = 0x65
88966761db1SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
89066761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
89166761db1SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
89232e19770SBram Moolenaar  call assert_equal('light', &background)
89366761db1SBram Moolenaar
89432e19770SBram Moolenaar  " response to t_RB, 2 digits, dark
89532e19770SBram Moolenaar  set background=light
89632e19770SBram Moolenaar  call test_option_not_set('background')
89732e19770SBram Moolenaar  let red = 0x47
89832e19770SBram Moolenaar  let green = 0x59
89932e19770SBram Moolenaar  let blue = 0x5b
90066761db1SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
90166761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
90266761db1SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
90332e19770SBram Moolenaar  call assert_equal('dark', &background)
90432e19770SBram Moolenaar
90532e19770SBram Moolenaar  " response to t_RB, 2 digits, light
90632e19770SBram Moolenaar  set background=dark
90732e19770SBram Moolenaar  call test_option_not_set('background')
90832e19770SBram Moolenaar  let red = 0x83
90932e19770SBram Moolenaar  let green = 0xa4
91032e19770SBram Moolenaar  let blue = 0xc2
91132e19770SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
91232e19770SBram Moolenaar  call feedkeys(seq, 'Lx!')
91332e19770SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
91432e19770SBram Moolenaar  call assert_equal('light', &background)
91566761db1SBram Moolenaar
91666761db1SBram Moolenaar  set t_RF= t_RB=
91766761db1SBram Moolenaarendfunc
91866761db1SBram Moolenaar
91966761db1SBram Moolenaar" This only checks if the sequence is recognized.
9201a4cbb19SBram Moolenaar" This must be after other tests, because it has side effects to xterm
9211a4cbb19SBram Moolenaar" properties.
9221a4cbb19SBram Moolenaarfunc Test_xx01_term_style_response()
92366761db1SBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
92466761db1SBram Moolenaar  set t_RV=x
9250c0eddd3SBram Moolenaar  call test_override('term_props', 1)
92666761db1SBram Moolenaar
92766761db1SBram Moolenaar  " send the termresponse to trigger requesting the XT codes
92866761db1SBram Moolenaar  let seq = "\<Esc>[>41;337;0c"
92966761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
93066761db1SBram Moolenaar  call assert_equal(seq, v:termresponse)
93166761db1SBram Moolenaar
93266761db1SBram Moolenaar  let seq = "\<Esc>P1$r2 q\<Esc>\\"
93366761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
93466761db1SBram Moolenaar  call assert_equal(seq, v:termstyleresp)
93566761db1SBram Moolenaar
9360c0eddd3SBram Moolenaar  call assert_equal(#{
9370c0eddd3SBram Moolenaar        \ cursor_style: 'u',
9380c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
9390c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
9400c0eddd3SBram Moolenaar        \ mouse: 's'
9410c0eddd3SBram Moolenaar        \ }, terminalprops())
9420c0eddd3SBram Moolenaar
94366761db1SBram Moolenaar  set t_RV=
9440c0eddd3SBram Moolenaar  call test_override('term_props', 0)
94566761db1SBram Moolenaarendfunc
946de6dbb45SBram Moolenaar
94789577b3bSBram Moolenaar" This checks the iTerm2 version response.
94889577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
94989577b3bSBram Moolenaar" properties.
95089577b3bSBram Moolenaarfunc Test_xx02_iTerm2_response()
95189577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
95289577b3bSBram Moolenaar  set t_RV=x
9530c0eddd3SBram Moolenaar  call test_override('term_props', 1)
95489577b3bSBram Moolenaar
95589577b3bSBram Moolenaar  " Old versions of iTerm2 used a different style term response.
95689577b3bSBram Moolenaar  set ttymouse=xterm
95789577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
95889577b3bSBram Moolenaar  let seq = "\<Esc>[>0;95;c"
95989577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
96089577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
96189577b3bSBram Moolenaar  call assert_equal('xterm', &ttymouse)
96289577b3bSBram Moolenaar
96389577b3bSBram Moolenaar  set ttymouse=xterm
96489577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
96589577b3bSBram Moolenaar  let seq = "\<Esc>[>0;95;0c"
96689577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
96789577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
96889577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
96989577b3bSBram Moolenaar
9700c0eddd3SBram Moolenaar  call assert_equal(#{
9710c0eddd3SBram Moolenaar        \ cursor_style: 'n',
9720c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
9730c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
9740c0eddd3SBram Moolenaar        \ mouse: 's'
9750c0eddd3SBram Moolenaar        \ }, terminalprops())
9760c0eddd3SBram Moolenaar
97789577b3bSBram Moolenaar  set t_RV=
9780c0eddd3SBram Moolenaar  call test_override('term_props', 0)
97989577b3bSBram Moolenaarendfunc
98089577b3bSBram Moolenaar
9811a4cbb19SBram Moolenaar" This checks the libvterm version response.
9821a4cbb19SBram Moolenaar" This must be after other tests, because it has side effects to xterm
9831a4cbb19SBram Moolenaar" properties.
98489577b3bSBram Moolenaarfunc Test_xx03_libvterm_response()
9851a4cbb19SBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
9861a4cbb19SBram Moolenaar  set t_RV=x
9870c0eddd3SBram Moolenaar  call test_override('term_props', 1)
98803b00476SBram Moolenaar
9891a4cbb19SBram Moolenaar  set ttymouse=xterm
9901a4cbb19SBram Moolenaar  call test_option_not_set('ttymouse')
9911a4cbb19SBram Moolenaar  let seq = "\<Esc>[>0;100;0c"
9921a4cbb19SBram Moolenaar  call feedkeys(seq, 'Lx!')
9931a4cbb19SBram Moolenaar  call assert_equal(seq, v:termresponse)
9941a4cbb19SBram Moolenaar  call assert_equal('sgr', &ttymouse)
9951a4cbb19SBram Moolenaar
9960c0eddd3SBram Moolenaar  call assert_equal(#{
9970c0eddd3SBram Moolenaar        \ cursor_style: 'n',
9980c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
9990c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
10000c0eddd3SBram Moolenaar        \ mouse: 's'
10010c0eddd3SBram Moolenaar        \ }, terminalprops())
10020c0eddd3SBram Moolenaar
10031a4cbb19SBram Moolenaar  set t_RV=
10040c0eddd3SBram Moolenaar  call test_override('term_props', 0)
10051a4cbb19SBram Moolenaarendfunc
10061a4cbb19SBram Moolenaar
100789577b3bSBram Moolenaar" This checks the Mac Terminal.app version response.
100889577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
100989577b3bSBram Moolenaar" properties.
101089577b3bSBram Moolenaarfunc Test_xx04_Mac_Terminal_response()
101189577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
101289577b3bSBram Moolenaar  set t_RV=x
10130c0eddd3SBram Moolenaar  call test_override('term_props', 1)
101489577b3bSBram Moolenaar
101589577b3bSBram Moolenaar  set ttymouse=xterm
1016*8dff4cbfSBram Moolenaar  " t_8u is not reset
1017*8dff4cbfSBram Moolenaar  let &t_8u = "\<Esc>[58;2;%lu;%lu;%lum"
101889577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
101989577b3bSBram Moolenaar  let seq = "\<Esc>[>1;95;0c"
102089577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
102189577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
102289577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
102389577b3bSBram Moolenaar
10240c0eddd3SBram Moolenaar  call assert_equal(#{
10250c0eddd3SBram Moolenaar        \ cursor_style: 'n',
10260c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
10270c0eddd3SBram Moolenaar        \ underline_rgb: 'y',
10280c0eddd3SBram Moolenaar        \ mouse: 's'
10290c0eddd3SBram Moolenaar        \ }, terminalprops())
1030*8dff4cbfSBram Moolenaar  call assert_equal("\<Esc>[58;2;%lu;%lu;%lum", &t_8u)
10310c0eddd3SBram Moolenaar
103289577b3bSBram Moolenaar  " Reset is_not_xterm and is_mac_terminal.
103389577b3bSBram Moolenaar  set t_RV=
103489577b3bSBram Moolenaar  set term=xterm
103589577b3bSBram Moolenaar  set t_RV=x
10360c0eddd3SBram Moolenaar  call test_override('term_props', 0)
103789577b3bSBram Moolenaarendfunc
103889577b3bSBram Moolenaar
103989577b3bSBram Moolenaar" This checks the mintty version response.
104089577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
104189577b3bSBram Moolenaar" properties.
104289577b3bSBram Moolenaarfunc Test_xx05_mintty_response()
104389577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
104489577b3bSBram Moolenaar  set t_RV=x
10450c0eddd3SBram Moolenaar  call test_override('term_props', 1)
104689577b3bSBram Moolenaar
104789577b3bSBram Moolenaar  set ttymouse=xterm
104889577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
104989577b3bSBram Moolenaar  let seq = "\<Esc>[>77;20905;0c"
105089577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
105189577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
105289577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
105389577b3bSBram Moolenaar
10540c0eddd3SBram Moolenaar  call assert_equal(#{
10550c0eddd3SBram Moolenaar        \ cursor_style: 'n',
10560c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
10570c0eddd3SBram Moolenaar        \ underline_rgb: 'y',
10580c0eddd3SBram Moolenaar        \ mouse: 's'
10590c0eddd3SBram Moolenaar        \ }, terminalprops())
10600c0eddd3SBram Moolenaar
106189577b3bSBram Moolenaar  set t_RV=
10620c0eddd3SBram Moolenaar  call test_override('term_props', 0)
106389577b3bSBram Moolenaarendfunc
106489577b3bSBram Moolenaar
106589577b3bSBram Moolenaar" This checks the screen version response.
106689577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
106789577b3bSBram Moolenaar" properties.
106889577b3bSBram Moolenaarfunc Test_xx06_screen_response()
106989577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
107089577b3bSBram Moolenaar  set t_RV=x
10710c0eddd3SBram Moolenaar  call test_override('term_props', 1)
107289577b3bSBram Moolenaar
107389577b3bSBram Moolenaar  " Old versions of screen don't support SGR mouse mode.
107489577b3bSBram Moolenaar  set ttymouse=xterm
107589577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
107689577b3bSBram Moolenaar  let seq = "\<Esc>[>83;40500;0c"
107789577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
107889577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
107989577b3bSBram Moolenaar  call assert_equal('xterm', &ttymouse)
108089577b3bSBram Moolenaar
108189577b3bSBram Moolenaar  " screen supports SGR mouse mode starting in version 4.7.
108289577b3bSBram Moolenaar  set ttymouse=xterm
108389577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
108489577b3bSBram Moolenaar  let seq = "\<Esc>[>83;40700;0c"
108589577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
108689577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
108789577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
108889577b3bSBram Moolenaar
10890c0eddd3SBram Moolenaar  call assert_equal(#{
10900c0eddd3SBram Moolenaar        \ cursor_style: 'n',
10910c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'n',
10920c0eddd3SBram Moolenaar        \ underline_rgb: 'y',
10930c0eddd3SBram Moolenaar        \ mouse: 's'
10940c0eddd3SBram Moolenaar        \ }, terminalprops())
10950c0eddd3SBram Moolenaar
109689577b3bSBram Moolenaar  set t_RV=
10970c0eddd3SBram Moolenaar  call test_override('term_props', 0)
109889577b3bSBram Moolenaarendfunc
109989577b3bSBram Moolenaar
110003b00476SBram Moolenaar" This checks the xterm version response.
110103b00476SBram Moolenaar" This must be after other tests, because it has side effects to xterm
110203b00476SBram Moolenaar" properties.
110389577b3bSBram Moolenaarfunc Test_xx07_xterm_response()
110403b00476SBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
110503b00476SBram Moolenaar  set t_RV=x
11060c0eddd3SBram Moolenaar  call test_override('term_props', 1)
110703b00476SBram Moolenaar
11083cea8a9aSBram Moolenaar  " Do Terminal.app first to check that is_mac_terminal is reset.
11093cea8a9aSBram Moolenaar  set ttymouse=xterm
11103cea8a9aSBram Moolenaar  call test_option_not_set('ttymouse')
11113cea8a9aSBram Moolenaar  let seq = "\<Esc>[>1;95;0c"
11123cea8a9aSBram Moolenaar  call feedkeys(seq, 'Lx!')
11133cea8a9aSBram Moolenaar  call assert_equal(seq, v:termresponse)
11143cea8a9aSBram Moolenaar  call assert_equal('sgr', &ttymouse)
11153cea8a9aSBram Moolenaar
111603b00476SBram Moolenaar  " xterm < 95: "xterm" (actually unmodified)
11173cea8a9aSBram Moolenaar  set t_RV=
11183cea8a9aSBram Moolenaar  set term=xterm
11193cea8a9aSBram Moolenaar  set t_RV=x
112003b00476SBram Moolenaar  set ttymouse=xterm
112103b00476SBram Moolenaar  call test_option_not_set('ttymouse')
112203b00476SBram Moolenaar  let seq = "\<Esc>[>0;94;0c"
112303b00476SBram Moolenaar  call feedkeys(seq, 'Lx!')
112403b00476SBram Moolenaar  call assert_equal(seq, v:termresponse)
112503b00476SBram Moolenaar  call assert_equal('xterm', &ttymouse)
112603b00476SBram Moolenaar
11270c0eddd3SBram Moolenaar  call assert_equal(#{
11280c0eddd3SBram Moolenaar        \ cursor_style: 'n',
11290c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
11300c0eddd3SBram Moolenaar        \ underline_rgb: 'y',
11310c0eddd3SBram Moolenaar        \ mouse: 'u'
11320c0eddd3SBram Moolenaar        \ }, terminalprops())
11330c0eddd3SBram Moolenaar
113403b00476SBram Moolenaar  " xterm >= 95 < 277 "xterm2"
113503b00476SBram Moolenaar  set ttymouse=xterm
113603b00476SBram Moolenaar  call test_option_not_set('ttymouse')
113703b00476SBram Moolenaar  let seq = "\<Esc>[>0;267;0c"
113803b00476SBram Moolenaar  call feedkeys(seq, 'Lx!')
113903b00476SBram Moolenaar  call assert_equal(seq, v:termresponse)
114003b00476SBram Moolenaar  call assert_equal('xterm2', &ttymouse)
114103b00476SBram Moolenaar
11420c0eddd3SBram Moolenaar  call assert_equal(#{
11430c0eddd3SBram Moolenaar        \ cursor_style: 'n',
11440c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
11450c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
11460c0eddd3SBram Moolenaar        \ mouse: '2'
11470c0eddd3SBram Moolenaar        \ }, terminalprops())
11480c0eddd3SBram Moolenaar
114903b00476SBram Moolenaar  " xterm >= 277: "sgr"
115003b00476SBram Moolenaar  set ttymouse=xterm
115103b00476SBram Moolenaar  call test_option_not_set('ttymouse')
115203b00476SBram Moolenaar  let seq = "\<Esc>[>0;277;0c"
115303b00476SBram Moolenaar  call feedkeys(seq, 'Lx!')
115403b00476SBram Moolenaar  call assert_equal(seq, v:termresponse)
115503b00476SBram Moolenaar  call assert_equal('sgr', &ttymouse)
115603b00476SBram Moolenaar
11570c0eddd3SBram Moolenaar  call assert_equal(#{
11580c0eddd3SBram Moolenaar        \ cursor_style: 'n',
11590c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
11600c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
11610c0eddd3SBram Moolenaar        \ mouse: 's'
11620c0eddd3SBram Moolenaar        \ }, terminalprops())
11630c0eddd3SBram Moolenaar
1164*8dff4cbfSBram Moolenaar  " xterm >= 279: "sgr" and cursor_style not reset; also check t_8u reset
11650c0eddd3SBram Moolenaar  set ttymouse=xterm
11660c0eddd3SBram Moolenaar  call test_option_not_set('ttymouse')
1167*8dff4cbfSBram Moolenaar  let &t_8u = "\<Esc>[58;2;%lu;%lu;%lum"
11680c0eddd3SBram Moolenaar  let seq = "\<Esc>[>0;279;0c"
11690c0eddd3SBram Moolenaar  call feedkeys(seq, 'Lx!')
11700c0eddd3SBram Moolenaar  call assert_equal(seq, v:termresponse)
11710c0eddd3SBram Moolenaar  call assert_equal('sgr', &ttymouse)
11720c0eddd3SBram Moolenaar
11730c0eddd3SBram Moolenaar  call assert_equal(#{
11740c0eddd3SBram Moolenaar        \ cursor_style: 'u',
11750c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
11760c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
11770c0eddd3SBram Moolenaar        \ mouse: 's'
11780c0eddd3SBram Moolenaar        \ }, terminalprops())
1179*8dff4cbfSBram Moolenaar  call assert_equal('', &t_8u)
11800c0eddd3SBram Moolenaar
118103b00476SBram Moolenaar  set t_RV=
11820c0eddd3SBram Moolenaar  call test_override('term_props', 0)
118303b00476SBram Moolenaarendfunc
118403b00476SBram Moolenaar
1185de6dbb45SBram Moolenaarfunc Test_get_termcode()
1186eb66328bSBram Moolenaar  try
1187de6dbb45SBram Moolenaar    let k1 = &t_k1
1188eb66328bSBram Moolenaar  catch /E113/
1189eb66328bSBram Moolenaar    throw 'Skipped: Unable to query termcodes'
1190eb66328bSBram Moolenaar  endtry
1191de6dbb45SBram Moolenaar  set t_k1=
1192de6dbb45SBram Moolenaar  set t_k1&
1193de6dbb45SBram Moolenaar  call assert_equal(k1, &t_k1)
11949aeb3363SBram Moolenaar
11959aeb3363SBram Moolenaar  " use external termcap first
11969aeb3363SBram Moolenaar  set nottybuiltin
11979aeb3363SBram Moolenaar  set t_k1=
11989aeb3363SBram Moolenaar  set t_k1&
11999aeb3363SBram Moolenaar  " when using external termcap may get something else, but it must not be
12009aeb3363SBram Moolenaar  " empty, since we would fallback to the builtin one.
12019aeb3363SBram Moolenaar  call assert_notequal('', &t_k1)
12029aeb3363SBram Moolenaar
12039aeb3363SBram Moolenaar  if &term =~ 'xterm'
12049aeb3363SBram Moolenaar    " use internal termcap first
12059aeb3363SBram Moolenaar    let term_save = &term
12069aeb3363SBram Moolenaar    let &term = 'builtin_' .. &term
12079aeb3363SBram Moolenaar    set t_k1=
12089aeb3363SBram Moolenaar    set t_k1&
12099aeb3363SBram Moolenaar    call assert_equal(k1, &t_k1)
12109aeb3363SBram Moolenaar    let &term = term_save
12119aeb3363SBram Moolenaar  endif
12129aeb3363SBram Moolenaar
12139aeb3363SBram Moolenaar  set ttybuiltin
1214de6dbb45SBram Moolenaarendfunc
121518a79a68SBram Moolenaar
121618a79a68SBram Moolenaarfunc GetEscCodeCSI27(key, modifier)
121718a79a68SBram Moolenaar  let key = printf("%d", char2nr(a:key))
121818a79a68SBram Moolenaar  let mod = printf("%d", a:modifier)
121918a79a68SBram Moolenaar  return "\<Esc>[27;" .. mod .. ';' .. key .. '~'
122018a79a68SBram Moolenaarendfunc
122118a79a68SBram Moolenaar
122218a79a68SBram Moolenaarfunc GetEscCodeCSIu(key, modifier)
122318a79a68SBram Moolenaar  let key = printf("%d", char2nr(a:key))
122418a79a68SBram Moolenaar  let mod = printf("%d", a:modifier)
122518a79a68SBram Moolenaar  return "\<Esc>[" .. key .. ';' .. mod .. 'u'
122618a79a68SBram Moolenaarendfunc
122718a79a68SBram Moolenaar
122818a79a68SBram Moolenaar" This checks the CSI sequences when in modifyOtherKeys mode.
122918a79a68SBram Moolenaar" The mode doesn't need to be enabled, the codes are always detected.
123018a79a68SBram Moolenaarfunc RunTest_modifyOtherKeys(func)
123118a79a68SBram Moolenaar  new
1232459fd785SBram Moolenaar  set timeoutlen=10
123318a79a68SBram Moolenaar
1234f19f8d1aSBram Moolenaar  " Shift-X is sent as 'X' with the shift modifier
123518a79a68SBram Moolenaar  call feedkeys('a' .. a:func('X', 2) .. "\<Esc>", 'Lx!')
123618a79a68SBram Moolenaar  call assert_equal('X', getline(1))
123718a79a68SBram Moolenaar
123818a79a68SBram Moolenaar  " Ctrl-i is Tab
123918a79a68SBram Moolenaar  call setline(1, '')
124018a79a68SBram Moolenaar  call feedkeys('a' .. a:func('i', 5) .. "\<Esc>", 'Lx!')
124118a79a68SBram Moolenaar  call assert_equal("\t", getline(1))
124218a79a68SBram Moolenaar
124318a79a68SBram Moolenaar  " Ctrl-I is also Tab
124418a79a68SBram Moolenaar  call setline(1, '')
124518a79a68SBram Moolenaar  call feedkeys('a' .. a:func('I', 5) .. "\<Esc>", 'Lx!')
124618a79a68SBram Moolenaar  call assert_equal("\t", getline(1))
124718a79a68SBram Moolenaar
124818a79a68SBram Moolenaar  " Alt-x is ø
124918a79a68SBram Moolenaar  call setline(1, '')
125018a79a68SBram Moolenaar  call feedkeys('a' .. a:func('x', 3) .. "\<Esc>", 'Lx!')
125118a79a68SBram Moolenaar  call assert_equal("ø", getline(1))
125218a79a68SBram Moolenaar
125318a79a68SBram Moolenaar  " Meta-x is also ø
125418a79a68SBram Moolenaar  call setline(1, '')
125518a79a68SBram Moolenaar  call feedkeys('a' .. a:func('x', 9) .. "\<Esc>", 'Lx!')
125618a79a68SBram Moolenaar  call assert_equal("ø", getline(1))
125718a79a68SBram Moolenaar
125818a79a68SBram Moolenaar  " Alt-X is Ø
125918a79a68SBram Moolenaar  call setline(1, '')
126018a79a68SBram Moolenaar  call feedkeys('a' .. a:func('X', 3) .. "\<Esc>", 'Lx!')
126118a79a68SBram Moolenaar  call assert_equal("Ø", getline(1))
126218a79a68SBram Moolenaar
126318a79a68SBram Moolenaar  " Meta-X is ø
126418a79a68SBram Moolenaar  call setline(1, '')
126518a79a68SBram Moolenaar  call feedkeys('a' .. a:func('X', 9) .. "\<Esc>", 'Lx!')
126618a79a68SBram Moolenaar  call assert_equal("Ø", getline(1))
126718a79a68SBram Moolenaar
1268828ffd59SBram Moolenaar  " Ctrl-6 is Ctrl-^
1269828ffd59SBram Moolenaar  split aaa
1270828ffd59SBram Moolenaar  edit bbb
1271828ffd59SBram Moolenaar  call feedkeys(a:func('6', 5), 'Lx!')
1272828ffd59SBram Moolenaar  call assert_equal("aaa", bufname())
1273828ffd59SBram Moolenaar  bwipe aaa
1274828ffd59SBram Moolenaar  bwipe bbb
1275828ffd59SBram Moolenaar
127618a79a68SBram Moolenaar  bwipe!
127718a79a68SBram Moolenaar  set timeoutlen&
127818a79a68SBram Moolenaarendfunc
127918a79a68SBram Moolenaar
1280459fd785SBram Moolenaarfunc Test_modifyOtherKeys_basic()
128118a79a68SBram Moolenaar  call RunTest_modifyOtherKeys(function('GetEscCodeCSI27'))
128218a79a68SBram Moolenaar  call RunTest_modifyOtherKeys(function('GetEscCodeCSIu'))
128318a79a68SBram Moolenaarendfunc
1284d1e2f398SBram Moolenaar
128538571a04SBram Moolenaarfunc Test_modifyOtherKeys_no_mapping()
128638571a04SBram Moolenaar  set timeoutlen=10
128738571a04SBram Moolenaar
128838571a04SBram Moolenaar  let @a = 'aaa'
128938571a04SBram Moolenaar  call feedkeys(":let x = '" .. GetEscCodeCSI27('R', 5) .. GetEscCodeCSI27('R', 5) .. "a'\<CR>", 'Lx!')
129038571a04SBram Moolenaar  call assert_equal("let x = 'aaa'", @:)
129138571a04SBram Moolenaar
129238571a04SBram Moolenaar  new
129338571a04SBram Moolenaar  call feedkeys("a" .. GetEscCodeCSI27('R', 5) .. GetEscCodeCSI27('R', 5) .. "a\<Esc>", 'Lx!')
129438571a04SBram Moolenaar  call assert_equal("aaa", getline(1))
129538571a04SBram Moolenaar  bwipe!
129638571a04SBram Moolenaar
129738571a04SBram Moolenaar  new
129838571a04SBram Moolenaar  call feedkeys("axx\<CR>yy" .. GetEscCodeCSI27('G', 5) .. GetEscCodeCSI27('K', 5) .. "a\<Esc>", 'Lx!')
129938571a04SBram Moolenaar  call assert_equal("axx", getline(1))
130038571a04SBram Moolenaar  call assert_equal("yy", getline(2))
130138571a04SBram Moolenaar  bwipe!
130238571a04SBram Moolenaar
130338571a04SBram Moolenaar  set timeoutlen&
130438571a04SBram Moolenaarendfunc
130538571a04SBram Moolenaar
1306d1e2f398SBram Moolenaarfunc RunTest_mapping_shift(key, func)
1307d1e2f398SBram Moolenaar  call setline(1, '')
1308d1e2f398SBram Moolenaar  if a:key == '|'
1309d1e2f398SBram Moolenaar    exe 'inoremap \| xyz'
1310d1e2f398SBram Moolenaar  else
1311d1e2f398SBram Moolenaar    exe 'inoremap ' .. a:key .. ' xyz'
1312d1e2f398SBram Moolenaar  endif
1313d1e2f398SBram Moolenaar  call feedkeys('a' .. a:func(a:key, 2) .. "\<Esc>", 'Lx!')
1314d1e2f398SBram Moolenaar  call assert_equal("xyz", getline(1))
1315d1e2f398SBram Moolenaar  if a:key == '|'
1316d1e2f398SBram Moolenaar    exe 'iunmap \|'
1317d1e2f398SBram Moolenaar  else
1318d1e2f398SBram Moolenaar    exe 'iunmap ' .. a:key
1319d1e2f398SBram Moolenaar  endif
1320d1e2f398SBram Moolenaarendfunc
1321d1e2f398SBram Moolenaar
1322975a880aSBram Moolenaarfunc Test_modifyOtherKeys_mapped()
1323975a880aSBram Moolenaar  set timeoutlen=10
1324975a880aSBram Moolenaar  imap ' <C-W>
1325975a880aSBram Moolenaar  imap <C-W><C-A> c-a
1326975a880aSBram Moolenaar  call setline(1, '')
1327975a880aSBram Moolenaar
1328975a880aSBram Moolenaar  " single quote is turned into single byte CTRL-W
1329975a880aSBram Moolenaar  " CTRL-A is added with a separate modifier, and needs to be simplified before
1330975a880aSBram Moolenaar  " the mapping can match.
1331975a880aSBram Moolenaar  call feedkeys("a'" .. GetEscCodeCSI27('A', 5) .. "\<Esc>", 'Lx!')
1332975a880aSBram Moolenaar  call assert_equal('c-a', getline(1))
1333975a880aSBram Moolenaar
1334975a880aSBram Moolenaar  iunmap '
1335975a880aSBram Moolenaar  iunmap <C-W><C-A>
1336975a880aSBram Moolenaar  set timeoutlen&
1337975a880aSBram Moolenaarendfunc
1338975a880aSBram Moolenaar
1339d1e2f398SBram Moolenaarfunc RunTest_mapping_works_with_shift(func)
1340d1e2f398SBram Moolenaar  new
1341459fd785SBram Moolenaar  set timeoutlen=10
1342d1e2f398SBram Moolenaar
1343d1e2f398SBram Moolenaar  call RunTest_mapping_shift('@', a:func)
1344d1e2f398SBram Moolenaar  call RunTest_mapping_shift('A', a:func)
1345d1e2f398SBram Moolenaar  call RunTest_mapping_shift('Z', a:func)
1346d1e2f398SBram Moolenaar  call RunTest_mapping_shift('^', a:func)
1347d1e2f398SBram Moolenaar  call RunTest_mapping_shift('_', a:func)
1348d1e2f398SBram Moolenaar  call RunTest_mapping_shift('{', a:func)
1349d1e2f398SBram Moolenaar  call RunTest_mapping_shift('|', a:func)
1350d1e2f398SBram Moolenaar  call RunTest_mapping_shift('}', a:func)
1351d1e2f398SBram Moolenaar  call RunTest_mapping_shift('~', a:func)
1352d1e2f398SBram Moolenaar
1353d1e2f398SBram Moolenaar  bwipe!
1354d1e2f398SBram Moolenaar  set timeoutlen&
1355d1e2f398SBram Moolenaarendfunc
1356d1e2f398SBram Moolenaar
1357459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_plain()
1358d1e2f398SBram Moolenaar  call RunTest_mapping_works_with_shift(function('GetEscCodeCSI27'))
1359d1e2f398SBram Moolenaar  call RunTest_mapping_works_with_shift(function('GetEscCodeCSIu'))
1360d1e2f398SBram Moolenaarendfunc
1361459fd785SBram Moolenaar
1362459fd785SBram Moolenaarfunc RunTest_mapping_mods(map, key, func, code)
1363459fd785SBram Moolenaar  call setline(1, '')
1364459fd785SBram Moolenaar  exe 'inoremap ' .. a:map .. ' xyz'
1365459fd785SBram Moolenaar  call feedkeys('a' .. a:func(a:key, a:code) .. "\<Esc>", 'Lx!')
1366459fd785SBram Moolenaar  call assert_equal("xyz", getline(1))
1367459fd785SBram Moolenaar  exe 'iunmap ' .. a:map
1368459fd785SBram Moolenaarendfunc
1369459fd785SBram Moolenaar
1370459fd785SBram Moolenaarfunc RunTest_mapping_works_with_mods(func, mods, code)
1371459fd785SBram Moolenaar  new
1372459fd785SBram Moolenaar  set timeoutlen=10
1373459fd785SBram Moolenaar
1374459fd785SBram Moolenaar  if a:mods !~ 'S'
1375459fd785SBram Moolenaar    " Shift by itself has no effect
1376459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-@>', '@', a:func, a:code)
1377459fd785SBram Moolenaar  endif
1378459fd785SBram Moolenaar  call RunTest_mapping_mods('<' .. a:mods .. '-A>', 'A', a:func, a:code)
1379459fd785SBram Moolenaar  call RunTest_mapping_mods('<' .. a:mods .. '-Z>', 'Z', a:func, a:code)
1380459fd785SBram Moolenaar  if a:mods !~ 'S'
1381459fd785SBram Moolenaar    " with Shift code is always upper case
1382459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-a>', 'a', a:func, a:code)
1383459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-z>', 'z', a:func, a:code)
1384459fd785SBram Moolenaar  endif
1385459fd785SBram Moolenaar  if a:mods != 'A'
1386459fd785SBram Moolenaar    " with Alt code is not in upper case
1387459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-a>', 'A', a:func, a:code)
1388459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-z>', 'Z', a:func, a:code)
1389459fd785SBram Moolenaar  endif
1390459fd785SBram Moolenaar  call RunTest_mapping_mods('<' .. a:mods .. '-á>', 'á', a:func, a:code)
1391459fd785SBram Moolenaar  if a:mods !~ 'S'
1392459fd785SBram Moolenaar    " Shift by itself has no effect
1393459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-^>', '^', a:func, a:code)
1394459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-_>', '_', a:func, a:code)
1395459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-{>', '{', a:func, a:code)
1396459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-\|>', '|', a:func, a:code)
1397459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-}>', '}', a:func, a:code)
1398459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-~>', '~', a:func, a:code)
1399459fd785SBram Moolenaar  endif
1400459fd785SBram Moolenaar
1401459fd785SBram Moolenaar  bwipe!
1402459fd785SBram Moolenaar  set timeoutlen&
1403459fd785SBram Moolenaarendfunc
1404459fd785SBram Moolenaar
1405459fd785SBram Moolenaarfunc Test_mapping_works_with_shift()
1406459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'S', 2)
1407459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'S', 2)
1408459fd785SBram Moolenaarendfunc
1409459fd785SBram Moolenaar
1410459fd785SBram Moolenaarfunc Test_mapping_works_with_ctrl()
1411459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C', 5)
1412459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C', 5)
1413459fd785SBram Moolenaarendfunc
1414459fd785SBram Moolenaar
1415459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_ctrl()
1416459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-S', 6)
1417459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-S', 6)
1418459fd785SBram Moolenaarendfunc
1419459fd785SBram Moolenaar
1420459fd785SBram Moolenaar" Below we also test the "u" code with Alt, This works, but libvterm would not
1421459fd785SBram Moolenaar" send the Alt key like this but by prefixing an Esc.
1422459fd785SBram Moolenaar
1423459fd785SBram Moolenaarfunc Test_mapping_works_with_alt()
1424459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'A', 3)
1425459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'A', 3)
1426459fd785SBram Moolenaarendfunc
1427459fd785SBram Moolenaar
1428459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_alt()
1429459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'S-A', 4)
1430459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'S-A', 4)
1431459fd785SBram Moolenaarendfunc
1432459fd785SBram Moolenaar
1433459fd785SBram Moolenaarfunc Test_mapping_works_with_ctrl_alt()
1434459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-A', 7)
1435459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-A', 7)
1436459fd785SBram Moolenaarendfunc
1437459fd785SBram Moolenaar
1438459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_ctrl_alt()
1439459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-S-A', 8)
1440459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-S-A', 8)
1441459fd785SBram Moolenaarendfunc
1442fc4ea2a7SBram Moolenaar
1443fc4ea2a7SBram Moolenaarfunc Test_insert_literal()
1444fc4ea2a7SBram Moolenaar  set timeoutlen=10
1445fc4ea2a7SBram Moolenaar  new
1446fc4ea2a7SBram Moolenaar  " CTRL-V CTRL-X inserts a ^X
1447fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSIu('V', '5') .. GetEscCodeCSIu('X', '5') .. "\<Esc>", 'Lx!')
1448fc4ea2a7SBram Moolenaar  call assert_equal("\<C-X>", getline(1))
1449fc4ea2a7SBram Moolenaar
1450fc4ea2a7SBram Moolenaar  call setline(1, '')
1451fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSI27('V', '5') .. GetEscCodeCSI27('X', '5') .. "\<Esc>", 'Lx!')
1452fc4ea2a7SBram Moolenaar  call assert_equal("\<C-X>", getline(1))
1453fc4ea2a7SBram Moolenaar
1454f19f8d1aSBram Moolenaar  " CTRL-SHIFT-V CTRL-X inserts escape sequence
1455fc4ea2a7SBram Moolenaar  call setline(1, '')
1456fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSIu('V', '6') .. GetEscCodeCSIu('X', '5') .. "\<Esc>", 'Lx!')
1457fc4ea2a7SBram Moolenaar  call assert_equal("\<Esc>[88;5u", getline(1))
1458fc4ea2a7SBram Moolenaar
1459fc4ea2a7SBram Moolenaar  call setline(1, '')
1460fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSI27('V', '6') .. GetEscCodeCSI27('X', '5') .. "\<Esc>", 'Lx!')
1461fc4ea2a7SBram Moolenaar  call assert_equal("\<Esc>[27;5;88~", getline(1))
1462fc4ea2a7SBram Moolenaar
1463fc4ea2a7SBram Moolenaar  bwipe!
1464fc4ea2a7SBram Moolenaar  set timeoutlen&
1465fc4ea2a7SBram Moolenaarendfunc
1466fc4ea2a7SBram Moolenaar
1467fc4ea2a7SBram Moolenaarfunc Test_cmdline_literal()
1468fc4ea2a7SBram Moolenaar  set timeoutlen=10
1469fc4ea2a7SBram Moolenaar
1470fc4ea2a7SBram Moolenaar  " CTRL-V CTRL-Y inserts a ^Y
1471fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSIu('V', '5') .. GetEscCodeCSIu('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
1472fc4ea2a7SBram Moolenaar  call assert_equal("\"\<C-Y>", @:)
1473fc4ea2a7SBram Moolenaar
1474fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSI27('V', '5') .. GetEscCodeCSI27('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
1475fc4ea2a7SBram Moolenaar  call assert_equal("\"\<C-Y>", @:)
1476fc4ea2a7SBram Moolenaar
1477f19f8d1aSBram Moolenaar  " CTRL-SHIFT-V CTRL-Y inserts escape sequence
1478fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSIu('V', '6') .. GetEscCodeCSIu('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
1479fc4ea2a7SBram Moolenaar  call assert_equal("\"\<Esc>[89;5u", @:)
1480fc4ea2a7SBram Moolenaar
1481fc4ea2a7SBram Moolenaar  call setline(1, '')
1482fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSI27('V', '6') .. GetEscCodeCSI27('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
1483fc4ea2a7SBram Moolenaar  call assert_equal("\"\<Esc>[27;5;89~", @:)
1484fc4ea2a7SBram Moolenaar
1485fc4ea2a7SBram Moolenaar  set timeoutlen&
1486fc4ea2a7SBram Moolenaarendfunc
14870eabd4dcSBram Moolenaar
14880ff5dedfSBram Moolenaar" Test for translation of special key codes (<xF1>, <xF2>, etc.)
14890ff5dedfSBram Moolenaarfunc Test_Keycode_Tranlsation()
14900ff5dedfSBram Moolenaar  let keycodes = [
14910ff5dedfSBram Moolenaar        \ ["<xUp>", "<Up>"],
14920ff5dedfSBram Moolenaar        \ ["<xDown>", "<Down>"],
14930ff5dedfSBram Moolenaar        \ ["<xLeft>", "<Left>"],
14940ff5dedfSBram Moolenaar        \ ["<xRight>", "<Right>"],
14950ff5dedfSBram Moolenaar        \ ["<xHome>", "<Home>"],
14960ff5dedfSBram Moolenaar        \ ["<xEnd>", "<End>"],
14970ff5dedfSBram Moolenaar        \ ["<zHome>", "<Home>"],
14980ff5dedfSBram Moolenaar        \ ["<zEnd>", "<End>"],
14990ff5dedfSBram Moolenaar        \ ["<xF1>", "<F1>"],
15000ff5dedfSBram Moolenaar        \ ["<xF2>", "<F2>"],
15010ff5dedfSBram Moolenaar        \ ["<xF3>", "<F3>"],
15020ff5dedfSBram Moolenaar        \ ["<xF4>", "<F4>"],
15030ff5dedfSBram Moolenaar        \ ["<S-xF1>", "<S-F1>"],
15040ff5dedfSBram Moolenaar        \ ["<S-xF2>", "<S-F2>"],
15050ff5dedfSBram Moolenaar        \ ["<S-xF3>", "<S-F3>"],
15060ff5dedfSBram Moolenaar        \ ["<S-xF4>", "<S-F4>"]]
15070ff5dedfSBram Moolenaar  for [k1, k2] in keycodes
15080ff5dedfSBram Moolenaar    exe "nnoremap " .. k1 .. " 2wx"
15090ff5dedfSBram Moolenaar    call assert_true(maparg(k1, 'n', 0, 1).lhs == k2)
15100ff5dedfSBram Moolenaar    exe "nunmap " .. k1
15110ff5dedfSBram Moolenaar  endfor
15120ff5dedfSBram Moolenaarendfunc
15130ff5dedfSBram Moolenaar
15140eabd4dcSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
1515