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
10ecd34bf5SBram Moolenaarsource view_util.vim
11e46a2ed0SBram Moolenaarsource term_util.vim
123fbd2d7cSBram Moolenaar
1392fd599eSBram Moolenaarfunc Test_term_mouse_left_click()
14905dd905SBram Moolenaar  new
15905dd905SBram Moolenaar  let save_mouse = &mouse
16905dd905SBram Moolenaar  let save_term = &term
17905dd905SBram Moolenaar  let save_ttymouse = &ttymouse
1892fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
193fbd2d7cSBram Moolenaar  set mouse=a term=xterm
20905dd905SBram Moolenaar  call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer'])
21905dd905SBram Moolenaar
22515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
234945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
241ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
253fbd2d7cSBram Moolenaar    go
264945219bSBram Moolenaar    call assert_equal([0, 1, 1, 0], getpos('.'), msg)
273fbd2d7cSBram Moolenaar    let row = 2
283fbd2d7cSBram Moolenaar    let col = 6
293fbd2d7cSBram Moolenaar    call MouseLeftClick(row, col)
303fbd2d7cSBram Moolenaar    call MouseLeftRelease(row, col)
314945219bSBram Moolenaar    call assert_equal([0, 2, 6, 0], getpos('.'), msg)
323fbd2d7cSBram Moolenaar  endfor
33905dd905SBram Moolenaar
34905dd905SBram Moolenaar  let &mouse = save_mouse
35905dd905SBram Moolenaar  let &term = save_term
36905dd905SBram Moolenaar  let &ttymouse = save_ttymouse
3792fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
38905dd905SBram Moolenaar  bwipe!
39905dd905SBram Moolenaarendfunc
40905dd905SBram Moolenaar
416aa7523bSBram Moolenaarfunc Test_xterm_mouse_right_click_extends_visual()
426aa7523bSBram Moolenaar  if has('mac')
436aa7523bSBram Moolenaar    throw "Skipped: test right click in visual mode does not work on macOs (why?)"
446aa7523bSBram Moolenaar  endif
456aa7523bSBram Moolenaar  let save_mouse = &mouse
466aa7523bSBram Moolenaar  let save_term = &term
476aa7523bSBram Moolenaar  let save_ttymouse = &ttymouse
486aa7523bSBram Moolenaar  call test_override('no_query_mouse', 1)
496aa7523bSBram Moolenaar  set mouse=a term=xterm
506aa7523bSBram Moolenaar
516aa7523bSBram Moolenaar  for visual_mode in ["v", "V", "\<C-V>"]
52515545e1SBram Moolenaar    for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
536aa7523bSBram Moolenaar      let msg = 'visual=' .. visual_mode .. ' ttymouse=' .. ttymouse_val
546aa7523bSBram Moolenaar      exe 'set ttymouse=' .. ttymouse_val
556aa7523bSBram Moolenaar
566aa7523bSBram Moolenaar      call setline(1, repeat([repeat('-', 7)], 7))
576aa7523bSBram Moolenaar      call MouseLeftClick(4, 4)
586aa7523bSBram Moolenaar      call MouseLeftRelease(4, 4)
596aa7523bSBram Moolenaar      exe  "norm! " .. visual_mode
606aa7523bSBram Moolenaar
616aa7523bSBram Moolenaar      " Right click extends top left of visual area.
626aa7523bSBram Moolenaar      call MouseRightClick(2, 2)
636aa7523bSBram Moolenaar      call MouseRightRelease(2, 2)
646aa7523bSBram Moolenaar
65f19f8d1aSBram Moolenaar      " Right click extends bottom right of visual area.
666aa7523bSBram Moolenaar      call MouseRightClick(6, 6)
676aa7523bSBram Moolenaar      call MouseRightRelease(6, 6)
686aa7523bSBram Moolenaar      norm! r1gv
696aa7523bSBram Moolenaar
706aa7523bSBram Moolenaar      " Right click shrinks top left of visual area.
716aa7523bSBram Moolenaar      call MouseRightClick(3, 3)
726aa7523bSBram Moolenaar      call MouseRightRelease(3, 3)
736aa7523bSBram Moolenaar
746aa7523bSBram Moolenaar      " Right click shrinks bottom right of visual area.
756aa7523bSBram Moolenaar      call MouseRightClick(5, 5)
766aa7523bSBram Moolenaar      call MouseRightRelease(5, 5)
776aa7523bSBram Moolenaar      norm! r2
786aa7523bSBram Moolenaar
796aa7523bSBram Moolenaar      if visual_mode ==# 'v'
806aa7523bSBram Moolenaar        call assert_equal(['-------',
816aa7523bSBram Moolenaar              \            '-111111',
826aa7523bSBram Moolenaar              \            '1122222',
836aa7523bSBram Moolenaar              \            '2222222',
846aa7523bSBram Moolenaar              \            '2222211',
856aa7523bSBram Moolenaar              \            '111111-',
866aa7523bSBram Moolenaar              \            '-------'], getline(1, '$'), msg)
876aa7523bSBram Moolenaar      elseif visual_mode ==# 'V'
886aa7523bSBram Moolenaar        call assert_equal(['-------',
896aa7523bSBram Moolenaar              \            '1111111',
906aa7523bSBram Moolenaar              \            '2222222',
916aa7523bSBram Moolenaar              \            '2222222',
926aa7523bSBram Moolenaar              \            '2222222',
936aa7523bSBram Moolenaar              \            '1111111',
946aa7523bSBram Moolenaar              \            '-------'], getline(1, '$'), msg)
956aa7523bSBram Moolenaar      else
966aa7523bSBram Moolenaar        call assert_equal(['-------',
976aa7523bSBram Moolenaar              \            '-11111-',
986aa7523bSBram Moolenaar              \            '-12221-',
996aa7523bSBram Moolenaar              \            '-12221-',
1006aa7523bSBram Moolenaar              \            '-12221-',
1016aa7523bSBram Moolenaar              \            '-11111-',
1026aa7523bSBram Moolenaar              \            '-------'], getline(1, '$'), msg)
1036aa7523bSBram Moolenaar      endif
1046aa7523bSBram Moolenaar    endfor
1056aa7523bSBram Moolenaar  endfor
1066aa7523bSBram Moolenaar
1076aa7523bSBram Moolenaar  let &mouse = save_mouse
1086aa7523bSBram Moolenaar  let &term = save_term
1096aa7523bSBram Moolenaar  let &ttymouse = save_ttymouse
1106aa7523bSBram Moolenaar  call test_override('no_query_mouse', 0)
1116aa7523bSBram Moolenaar  bwipe!
1126aa7523bSBram Moolenaarendfunc
1136aa7523bSBram Moolenaar
1141ee36d6fSBram Moolenaar" Test that <C-LeftMouse> jumps to help tag and <C-RightMouse> jumps back.
115297bec07SBram Moolenaar" Also test for g<LeftMouse> and g<RightMouse>.
116297bec07SBram Moolenaarfunc Test_xterm_mouse_tagjump()
1171ee36d6fSBram Moolenaar  let save_mouse = &mouse
1181ee36d6fSBram Moolenaar  let save_term = &term
1191ee36d6fSBram Moolenaar  let save_ttymouse = &ttymouse
1201ee36d6fSBram Moolenaar  set mouse=a term=xterm
1211ee36d6fSBram Moolenaar
122515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values
1231ee36d6fSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
1241ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
1251ee36d6fSBram Moolenaar    help
1261ee36d6fSBram Moolenaar    /usr_02.txt
1271ee36d6fSBram Moolenaar    norm! zt
128297bec07SBram Moolenaar
129297bec07SBram Moolenaar    " CTRL-left click to jump to a tag
1301ee36d6fSBram Moolenaar    let row = 1
1311ee36d6fSBram Moolenaar    let col = 1
1321ee36d6fSBram Moolenaar    call MouseCtrlLeftClick(row, col)
1331ee36d6fSBram Moolenaar    call MouseLeftRelease(row, col)
1341ee36d6fSBram Moolenaar    call assert_match('usr_02.txt$', bufname('%'), msg)
135b4367b7fSBram Moolenaar    call assert_equal('*usr_02.txt*', expand('<cWORD>'), msg)
1361ee36d6fSBram Moolenaar
137297bec07SBram Moolenaar    " CTRL-right click to pop a tag
1381ee36d6fSBram Moolenaar    call MouseCtrlRightClick(row, col)
13992fd599eSBram Moolenaar    call MouseRightRelease(row, col)
1401ee36d6fSBram Moolenaar    call assert_match('help.txt$', bufname('%'), msg)
141b4367b7fSBram Moolenaar    call assert_equal('|usr_02.txt|', expand('<cWORD>'), msg)
1421ee36d6fSBram Moolenaar
143297bec07SBram Moolenaar    " Jump to a tag
144297bec07SBram Moolenaar    exe "normal \<C-]>"
145297bec07SBram Moolenaar    call assert_match('usr_02.txt$', bufname('%'), msg)
146297bec07SBram Moolenaar    call assert_equal('*usr_02.txt*', expand('<cWORD>'), msg)
147297bec07SBram Moolenaar
148297bec07SBram Moolenaar    " Use CTRL-right click in insert mode to pop the tag
149297bec07SBram Moolenaar    new
150297bec07SBram Moolenaar    let str = 'iHello' .. MouseCtrlRightClickCode(row, col)
151297bec07SBram Moolenaar          \ .. MouseRightReleaseCode(row, col) .. "\<C-C>"
1522764d06aSBram Moolenaar    call assert_fails('call feedkeys(str, "Lx!")', 'E37:', msg)
153297bec07SBram Moolenaar    close!
154297bec07SBram Moolenaar
155297bec07SBram Moolenaar    " CTRL-right click with a count
156297bec07SBram Moolenaar    let str = "4" .. MouseCtrlRightClickCode(row, col)
157297bec07SBram Moolenaar          \ .. MouseRightReleaseCode(row, col)
1582764d06aSBram Moolenaar    call assert_fails('call feedkeys(str, "Lx!")', 'E555:', msg)
159297bec07SBram Moolenaar    call assert_match('help.txt$', bufname('%'), msg)
160297bec07SBram Moolenaar    call assert_equal(1, line('.'), msg)
161297bec07SBram Moolenaar
162297bec07SBram Moolenaar    " g<LeftMouse> to jump to a tag
163297bec07SBram Moolenaar    /usr_02.txt
164297bec07SBram Moolenaar    norm! zt
165297bec07SBram Moolenaar    call test_setmouse(row, col)
166297bec07SBram Moolenaar    exe "normal g\<LeftMouse>"
167297bec07SBram Moolenaar    call assert_match('usr_02.txt$', bufname('%'), msg)
168297bec07SBram Moolenaar    call assert_equal('*usr_02.txt*', expand('<cWORD>'), msg)
169297bec07SBram Moolenaar
170297bec07SBram Moolenaar    " g<RightMouse> to pop to a tag
171297bec07SBram Moolenaar    call test_setmouse(row, col)
172297bec07SBram Moolenaar    exe "normal g\<RightMouse>"
173297bec07SBram Moolenaar    call assert_match('help.txt$', bufname('%'), msg)
174297bec07SBram Moolenaar    call assert_equal('|usr_02.txt|', expand('<cWORD>'), msg)
175297bec07SBram Moolenaar
176297bec07SBram Moolenaar    %bw!
1771ee36d6fSBram Moolenaar  endfor
1781ee36d6fSBram Moolenaar
1791ee36d6fSBram Moolenaar  let &mouse = save_mouse
1801ee36d6fSBram Moolenaar  let &term = save_term
1811ee36d6fSBram Moolenaar  let &ttymouse = save_ttymouse
1821ee36d6fSBram Moolenaarendfunc
1831ee36d6fSBram Moolenaar
18492fd599eSBram Moolenaarfunc Test_term_mouse_middle_click()
18552992feaSBram Moolenaar  CheckFeature clipboard_working
186564344acSBram Moolenaar
187c1b8160bSBram Moolenaar  new
188c1b8160bSBram Moolenaar  let save_mouse = &mouse
189c1b8160bSBram Moolenaar  let save_term = &term
190c1b8160bSBram Moolenaar  let save_ttymouse = &ttymouse
19192fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
192c1b8160bSBram Moolenaar  let save_quotestar = @*
193297bec07SBram Moolenaar  let save_quoteplus = @+
194c1b8160bSBram Moolenaar  set mouse=a term=xterm
195c1b8160bSBram Moolenaar
196515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
197c1b8160bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
1981ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
199c1b8160bSBram Moolenaar    call setline(1, ['123456789', '123456789'])
200297bec07SBram Moolenaar    let @* = 'abc'
201c1b8160bSBram Moolenaar
202c1b8160bSBram Moolenaar    " Middle-click in the middle of the line pastes text where clicked.
203c1b8160bSBram Moolenaar    let row = 1
204c1b8160bSBram Moolenaar    let col = 6
205c1b8160bSBram Moolenaar    call MouseMiddleClick(row, col)
206c1b8160bSBram Moolenaar    call MouseMiddleRelease(row, col)
207c1b8160bSBram Moolenaar    call assert_equal(['12345abc6789', '123456789'], getline(1, '$'), msg)
208c1b8160bSBram Moolenaar
209c1b8160bSBram Moolenaar    " Middle-click beyond end of the line pastes text at the end of the line.
210c1b8160bSBram Moolenaar    let col = 20
211c1b8160bSBram Moolenaar    call MouseMiddleClick(row, col)
212c1b8160bSBram Moolenaar    call MouseMiddleRelease(row, col)
213c1b8160bSBram Moolenaar    call assert_equal(['12345abc6789abc', '123456789'], getline(1, '$'), msg)
214c1b8160bSBram Moolenaar
215c1b8160bSBram Moolenaar    " Middle-click beyond the last line pastes in the last line.
216c1b8160bSBram Moolenaar    let row = 5
217c1b8160bSBram Moolenaar    let col = 3
218c1b8160bSBram Moolenaar    call MouseMiddleClick(row, col)
219c1b8160bSBram Moolenaar    call MouseMiddleRelease(row, col)
220c1b8160bSBram Moolenaar    call assert_equal(['12345abc6789abc', '12abc3456789'], getline(1, '$'), msg)
221297bec07SBram Moolenaar
222297bec07SBram Moolenaar    " Middle mouse click in operator pending mode beeps
223297bec07SBram Moolenaar    call assert_beeps('exe "normal c\<MiddleMouse>"')
224297bec07SBram Moolenaar
225297bec07SBram Moolenaar    " Clicking middle mouse in visual mode, yanks the selection and pastes the
226297bec07SBram Moolenaar    " clipboard contents
227297bec07SBram Moolenaar    let save_clipboard = &clipboard
228297bec07SBram Moolenaar    set clipboard=
229297bec07SBram Moolenaar    let @" = ''
230297bec07SBram Moolenaar    call cursor(1, 1)
231297bec07SBram Moolenaar    call feedkeys("v3l" ..
232297bec07SBram Moolenaar          \ MouseMiddleClickCode(2, 7) .. MouseMiddleReleaseCode(2, 7), 'Lx!')
233297bec07SBram Moolenaar    call assert_equal(['12345abc6789abc', '12abc3abc456789'],
234297bec07SBram Moolenaar          \ getline(1, '$'), msg)
2352764d06aSBram Moolenaar    call assert_equal('1234', @", msg)
236297bec07SBram Moolenaar    let &clipboard = save_clipboard
237297bec07SBram Moolenaar
238297bec07SBram Moolenaar    " Clicking middle mouse in select mode, replaces the selected text with
239297bec07SBram Moolenaar    " the clipboard contents
240297bec07SBram Moolenaar    let @+ = 'xyz'
241297bec07SBram Moolenaar    call cursor(1, 3)
242297bec07SBram Moolenaar    exe "normal gh\<Right>\<Right>\<MiddleMouse>"
243297bec07SBram Moolenaar    call assert_equal(['12xyzabc6789abc', '12abc3abc456789'],
244297bec07SBram Moolenaar          \ getline(1, '$'), msg)
2452764d06aSBram Moolenaar
2462764d06aSBram Moolenaar    " Prefixing middle click with [ or ] fixes the indent after pasting.
2472764d06aSBram Moolenaar    %d
2482764d06aSBram Moolenaar    call setline(1, "    one two")
2492764d06aSBram Moolenaar    call setreg('r', 'red blue', 'l')
2502764d06aSBram Moolenaar    call test_setmouse(1, 5)
2512764d06aSBram Moolenaar    exe "normal \"r[\<MiddleMouse>"
2522764d06aSBram Moolenaar    call assert_equal('    red blue', getline(1), msg)
2532764d06aSBram Moolenaar    call test_setmouse(2, 5)
2542764d06aSBram Moolenaar    exe "normal \"r]\<MiddleMouse>"
2552764d06aSBram Moolenaar    call assert_equal('    red blue', getline(3), msg)
2562764d06aSBram Moolenaar    %d
257c1b8160bSBram Moolenaar  endfor
258c1b8160bSBram Moolenaar
259c1b8160bSBram Moolenaar  let &mouse = save_mouse
260c1b8160bSBram Moolenaar  let &term = save_term
261c1b8160bSBram Moolenaar  let &ttymouse = save_ttymouse
26292fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
263c1b8160bSBram Moolenaar  let @* = save_quotestar
264297bec07SBram Moolenaar  let @+ = save_quotestar
265c1b8160bSBram Moolenaar  bwipe!
266c1b8160bSBram Moolenaarendfunc
267c1b8160bSBram Moolenaar
268297bec07SBram Moolenaar" If clipboard is not working, then clicking the middle mouse button in visual
269297bec07SBram Moolenaar" mode, will copy and paste the selected text.
270297bec07SBram Moolenaarfunc Test_term_mouse_middle_click_no_clipboard()
271297bec07SBram Moolenaar  if has('clipboard_working')
272297bec07SBram Moolenaar    throw 'Skipped: clipboard support works'
273297bec07SBram Moolenaar  endif
274297bec07SBram Moolenaar  new
275297bec07SBram Moolenaar  let save_mouse = &mouse
276297bec07SBram Moolenaar  let save_term = &term
277297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
278297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
279297bec07SBram Moolenaar  set mouse=a term=xterm
280297bec07SBram Moolenaar
281297bec07SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
282297bec07SBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
283297bec07SBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
284297bec07SBram Moolenaar    call setline(1, ['123456789', '123456789'])
285297bec07SBram Moolenaar
286297bec07SBram Moolenaar    " Clicking middle mouse in visual mode, yanks the selection and pastes it
287297bec07SBram Moolenaar    call cursor(1, 1)
288297bec07SBram Moolenaar    call feedkeys("v3l" ..
289297bec07SBram Moolenaar          \ MouseMiddleClickCode(2, 7) .. MouseMiddleReleaseCode(2, 7), 'Lx!')
290297bec07SBram Moolenaar    call assert_equal(['123456789', '1234561234789'],
291297bec07SBram Moolenaar          \ getline(1, '$'), msg)
292297bec07SBram Moolenaar  endfor
293297bec07SBram Moolenaar
294297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
295297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
296297bec07SBram Moolenaar  let &term = save_term
297297bec07SBram Moolenaar  let &mouse = save_mouse
298297bec07SBram Moolenaar  close!
299297bec07SBram Moolenaarendfunc
300297bec07SBram Moolenaar
301297bec07SBram Moolenaarfunc Test_term_mouse_middle_click_insert_mode()
302297bec07SBram Moolenaar  CheckFeature clipboard_working
303297bec07SBram Moolenaar
304297bec07SBram Moolenaar  new
305297bec07SBram Moolenaar  let save_mouse = &mouse
306297bec07SBram Moolenaar  let save_term = &term
307297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
308297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
309297bec07SBram Moolenaar  set mouse=a term=xterm
310297bec07SBram Moolenaar
311297bec07SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
312297bec07SBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
313297bec07SBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
314297bec07SBram Moolenaar    call setline(1, ['123456789', '123456789'])
315297bec07SBram Moolenaar    let @* = 'abc'
316297bec07SBram Moolenaar
317297bec07SBram Moolenaar    " Middle-click in inesrt mode doesn't move the cursor but inserts the
318297bec07SBram Moolenaar    " contents of aregister
319297bec07SBram Moolenaar    call cursor(1, 4)
320297bec07SBram Moolenaar    call feedkeys('i' ..
321297bec07SBram Moolenaar          \ MouseMiddleClickCode(2, 7) .. MouseMiddleReleaseCode(2, 7) ..
322297bec07SBram Moolenaar          \ "\<C-C>", 'Lx!')
323297bec07SBram Moolenaar    call assert_equal(['123abc456789', '123456789'],
324297bec07SBram Moolenaar          \ getline(1, '$'), msg)
3252764d06aSBram Moolenaar    call assert_equal([1, 6], [line('.'), col('.')], msg)
326297bec07SBram Moolenaar
327297bec07SBram Moolenaar    " Middle-click in replace mode
328297bec07SBram Moolenaar    call cursor(1, 1)
329297bec07SBram Moolenaar    call feedkeys('$R' ..
330297bec07SBram Moolenaar          \ MouseMiddleClickCode(2, 7) .. MouseMiddleReleaseCode(2, 7) ..
331297bec07SBram Moolenaar          \ "\<C-C>", 'Lx!')
332297bec07SBram Moolenaar    call assert_equal(['123abc45678abc', '123456789'],
333297bec07SBram Moolenaar          \ getline(1, '$'), msg)
3342764d06aSBram Moolenaar    call assert_equal([1, 14], [line('.'), col('.')], msg)
335297bec07SBram Moolenaar  endfor
336297bec07SBram Moolenaar
337297bec07SBram Moolenaar  let &mouse = save_mouse
338297bec07SBram Moolenaar  let &term = save_term
339297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
340297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
341297bec07SBram Moolenaar  close!
342297bec07SBram Moolenaarendfunc
343297bec07SBram Moolenaar
344297bec07SBram Moolenaar" Test for switching window using mouse in insert mode
345297bec07SBram Moolenaarfunc Test_term_mouse_switch_win_insert_mode()
346297bec07SBram Moolenaar  5new
347297bec07SBram Moolenaar  let save_mouse = &mouse
348297bec07SBram Moolenaar  let save_term = &term
349297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
350297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
351297bec07SBram Moolenaar  set mouse=a term=xterm ttymouse=xterm2
352297bec07SBram Moolenaar
353297bec07SBram Moolenaar  call feedkeys('ivim' ..
354297bec07SBram Moolenaar        \ MouseLeftClickCode(8, 6) .. MouseLeftReleaseCode(8, 6) ..
355297bec07SBram Moolenaar        \ "\<C-C>", 'Lx!')
356297bec07SBram Moolenaar  call assert_equal(2, winnr())
357297bec07SBram Moolenaar  wincmd w
358297bec07SBram Moolenaar  call assert_equal('n', mode())
359297bec07SBram Moolenaar  call assert_equal(['vim'], getline(1, '$'))
360297bec07SBram Moolenaar
361297bec07SBram Moolenaar  let &mouse = save_mouse
362297bec07SBram Moolenaar  let &term = save_term
363297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
364297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
365297bec07SBram Moolenaar  close!
366297bec07SBram Moolenaarendfunc
367297bec07SBram Moolenaar
368297bec07SBram Moolenaar" Test for using the mouse to increaes the height of the cmdline window
369297bec07SBram Moolenaarfunc Test_mouse_cmdwin_resize()
37021829c5fSBram Moolenaar  CheckFeature cmdwin
37121829c5fSBram Moolenaar
372297bec07SBram Moolenaar  let save_mouse = &mouse
373297bec07SBram Moolenaar  let save_term = &term
374297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
375297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
376297bec07SBram Moolenaar  set mouse=a term=xterm ttymouse=xterm2
377297bec07SBram Moolenaar  5new
378297bec07SBram Moolenaar  redraw!
379297bec07SBram Moolenaar
380297bec07SBram Moolenaar  let h = 0
381297bec07SBram Moolenaar  let row = &lines - &cmdwinheight - 2
382297bec07SBram Moolenaar  call feedkeys("q:" ..
383297bec07SBram Moolenaar        \ MouseLeftClickCode(row, 1) ..
384297bec07SBram Moolenaar        \ MouseLeftDragCode(row - 1, 1) ..
385297bec07SBram Moolenaar        \ MouseLeftReleaseCode(row - 2, 1) ..
386297bec07SBram Moolenaar        \ "alet h = \<C-R>=winheight(0)\<CR>\<CR>", 'Lx!')
387297bec07SBram Moolenaar  call assert_equal(&cmdwinheight + 2, h)
388297bec07SBram Moolenaar
389297bec07SBram Moolenaar  let &mouse = save_mouse
390297bec07SBram Moolenaar  let &term = save_term
391297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
392297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
393297bec07SBram Moolenaar  close!
394297bec07SBram Moolenaarendfunc
395297bec07SBram Moolenaar
39692fd599eSBram Moolenaar" TODO: for unclear reasons this test fails if it comes after
39792fd599eSBram Moolenaar" Test_xterm_mouse_ctrl_click()
39892fd599eSBram Moolenaarfunc Test_1xterm_mouse_wheel()
399049736faSBram Moolenaar  new
400049736faSBram Moolenaar  let save_mouse = &mouse
401049736faSBram Moolenaar  let save_term = &term
402d58d4f90SBram Moolenaar  let save_wrap = &wrap
403049736faSBram Moolenaar  let save_ttymouse = &ttymouse
404d58d4f90SBram Moolenaar  set mouse=a term=xterm nowrap
405d58d4f90SBram Moolenaar  call setline(1, range(100000000000000, 100000000000100))
406049736faSBram Moolenaar
407515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values
4084945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
4091ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
410049736faSBram Moolenaar    go
4114945219bSBram Moolenaar    call assert_equal(1, line('w0'), msg)
4124945219bSBram Moolenaar    call assert_equal([0, 1, 1, 0], getpos('.'), msg)
4133fbd2d7cSBram Moolenaar
4143fbd2d7cSBram Moolenaar    call MouseWheelDown(1, 1)
4154945219bSBram Moolenaar    call assert_equal(4, line('w0'), msg)
4164945219bSBram Moolenaar    call assert_equal([0, 4, 1, 0], getpos('.'), msg)
4173fbd2d7cSBram Moolenaar
4183fbd2d7cSBram Moolenaar    call MouseWheelDown(1, 1)
4194945219bSBram Moolenaar    call assert_equal(7, line('w0'), msg)
4204945219bSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
421049736faSBram Moolenaar
4223fbd2d7cSBram Moolenaar    call MouseWheelUp(1, 1)
4234945219bSBram Moolenaar    call assert_equal(4, line('w0'), msg)
4244945219bSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
4253fbd2d7cSBram Moolenaar
4263fbd2d7cSBram Moolenaar    call MouseWheelUp(1, 1)
4274945219bSBram Moolenaar    call assert_equal(1, line('w0'), msg)
4284945219bSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
429d58d4f90SBram Moolenaar
430d58d4f90SBram Moolenaar    if has('gui')
431d58d4f90SBram Moolenaar      " Horizontal wheel scrolling currently only works when vim is
432d58d4f90SBram Moolenaar      " compiled with gui enabled.
433d58d4f90SBram Moolenaar      call MouseWheelRight(1, 1)
434d58d4f90SBram Moolenaar      call assert_equal(7, 1 + virtcol(".") - wincol(), msg)
435d58d4f90SBram Moolenaar      call assert_equal([0, 7, 7, 0], getpos('.'), msg)
436d58d4f90SBram Moolenaar
437d58d4f90SBram Moolenaar      call MouseWheelRight(1, 1)
438d58d4f90SBram Moolenaar      call assert_equal(13, 1 + virtcol(".") - wincol(), msg)
439d58d4f90SBram Moolenaar      call assert_equal([0, 7, 13, 0], getpos('.'), msg)
440d58d4f90SBram Moolenaar
441d58d4f90SBram Moolenaar      call MouseWheelLeft(1, 1)
442d58d4f90SBram Moolenaar      call assert_equal(7, 1 + virtcol(".") - wincol(), msg)
443d58d4f90SBram Moolenaar      call assert_equal([0, 7, 13, 0], getpos('.'), msg)
444d58d4f90SBram Moolenaar
445d58d4f90SBram Moolenaar      call MouseWheelLeft(1, 1)
446d58d4f90SBram Moolenaar      call assert_equal(1, 1 + virtcol(".") - wincol(), msg)
447d58d4f90SBram Moolenaar      call assert_equal([0, 7, 13, 0], getpos('.'), msg)
448d58d4f90SBram Moolenaar    endif
4493fbd2d7cSBram Moolenaar  endfor
450049736faSBram Moolenaar
451049736faSBram Moolenaar  let &mouse = save_mouse
452049736faSBram Moolenaar  let &term = save_term
453d58d4f90SBram Moolenaar  let &wrap = save_wrap
454049736faSBram Moolenaar  let &ttymouse = save_ttymouse
455049736faSBram Moolenaar  bwipe!
456049736faSBram Moolenaarendfunc
4573fb01a53SBram Moolenaar
458b4367b7fSBram Moolenaar" Test that dragging beyond the window (at the bottom and at the top)
459f19f8d1aSBram Moolenaar" scrolls window content by the number of lines beyond the window.
460b4367b7fSBram Moolenaarfunc Test_term_mouse_drag_beyond_window()
461b4367b7fSBram Moolenaar  let save_mouse = &mouse
462b4367b7fSBram Moolenaar  let save_term = &term
463b4367b7fSBram Moolenaar  let save_ttymouse = &ttymouse
464b4367b7fSBram Moolenaar  call test_override('no_query_mouse', 1)
465b4367b7fSBram Moolenaar  set mouse=a term=xterm
466b4367b7fSBram Moolenaar  let col = 1
467b4367b7fSBram Moolenaar  call setline(1, range(1, 100))
468b4367b7fSBram Moolenaar
469b4367b7fSBram Moolenaar  " Split into 3 windows, and go into the middle window
470b4367b7fSBram Moolenaar  " so we test dragging mouse below and above the window.
471b4367b7fSBram Moolenaar  2split
472b4367b7fSBram Moolenaar  wincmd j
473b4367b7fSBram Moolenaar  2split
474b4367b7fSBram Moolenaar
475515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
476b4367b7fSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
477b4367b7fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
478b4367b7fSBram Moolenaar
479b4367b7fSBram Moolenaar    " Line #10 at the top.
480b4367b7fSBram Moolenaar    norm! 10zt
481b4367b7fSBram Moolenaar    redraw
482b4367b7fSBram Moolenaar    call assert_equal(10, winsaveview().topline, msg)
483b4367b7fSBram Moolenaar    call assert_equal(2, winheight(0), msg)
484b4367b7fSBram Moolenaar
485b4367b7fSBram Moolenaar    let row = 4
486b4367b7fSBram Moolenaar    call MouseLeftClick(row, col)
487b4367b7fSBram Moolenaar    call assert_equal(10, winsaveview().topline, msg)
488b4367b7fSBram Moolenaar
489b4367b7fSBram Moolenaar    " Drag downwards. We're still in the window so topline should
490b4367b7fSBram Moolenaar    " not change yet.
491b4367b7fSBram Moolenaar    let row += 1
492b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
493b4367b7fSBram Moolenaar    call assert_equal(10, winsaveview().topline, msg)
494b4367b7fSBram Moolenaar
495b4367b7fSBram Moolenaar    " We now leave the window at the bottom, so the window content should
496b4367b7fSBram Moolenaar    " scroll by 1 line, then 2 lines (etc) as we drag further away.
497b4367b7fSBram Moolenaar    let row += 1
498b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
499b4367b7fSBram Moolenaar    call assert_equal(11, winsaveview().topline, msg)
500b4367b7fSBram Moolenaar
501b4367b7fSBram Moolenaar    let row += 1
502b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
503b4367b7fSBram Moolenaar    call assert_equal(13, winsaveview().topline, msg)
504b4367b7fSBram Moolenaar
505b4367b7fSBram Moolenaar    " Now drag upwards.
506b4367b7fSBram Moolenaar    let row -= 1
507b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
508b4367b7fSBram Moolenaar    call assert_equal(14, winsaveview().topline, msg)
509b4367b7fSBram Moolenaar
510b4367b7fSBram Moolenaar    " We're now back in the window so the topline should not change.
511b4367b7fSBram Moolenaar    let row -= 1
512b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
513b4367b7fSBram Moolenaar    call assert_equal(14, winsaveview().topline, msg)
514b4367b7fSBram Moolenaar
515b4367b7fSBram Moolenaar    let row -= 1
516b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
517b4367b7fSBram Moolenaar    call assert_equal(14, winsaveview().topline, msg)
518b4367b7fSBram Moolenaar
519b4367b7fSBram Moolenaar    " We now leave the window at the top so the window content should
520b4367b7fSBram Moolenaar    " scroll by 1 line, then 2, then 3 (etc) in the opposite direction.
521b4367b7fSBram Moolenaar    let row -= 1
522b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
523b4367b7fSBram Moolenaar    call assert_equal(13, winsaveview().topline, msg)
524b4367b7fSBram Moolenaar
525b4367b7fSBram Moolenaar    let row -= 1
526b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
527b4367b7fSBram Moolenaar    call assert_equal(11, winsaveview().topline, msg)
528b4367b7fSBram Moolenaar
529b4367b7fSBram Moolenaar    let row -= 1
530b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
531b4367b7fSBram Moolenaar    call assert_equal(8, winsaveview().topline, msg)
532b4367b7fSBram Moolenaar
533b4367b7fSBram Moolenaar    call MouseLeftRelease(row, col)
534b4367b7fSBram Moolenaar    call assert_equal(8, winsaveview().topline, msg)
535b4367b7fSBram Moolenaar    call assert_equal(2, winheight(0), msg)
536b4367b7fSBram Moolenaar  endfor
537b4367b7fSBram Moolenaar
538b4367b7fSBram Moolenaar  let &mouse = save_mouse
539b4367b7fSBram Moolenaar  let &term = save_term
540b4367b7fSBram Moolenaar  let &ttymouse = save_ttymouse
541b4367b7fSBram Moolenaar  call test_override('no_query_mouse', 0)
542b4367b7fSBram Moolenaar  bwipe!
543b4367b7fSBram Moolenaarendfunc
544b4367b7fSBram Moolenaar
54592fd599eSBram Moolenaarfunc Test_term_mouse_drag_window_separator()
5463fb01a53SBram Moolenaar  let save_mouse = &mouse
5473fb01a53SBram Moolenaar  let save_term = &term
5483fb01a53SBram Moolenaar  let save_ttymouse = &ttymouse
54992fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
5503fbd2d7cSBram Moolenaar  set mouse=a term=xterm
5513fbd2d7cSBram Moolenaar
552515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
5534945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
5541ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
5553fb01a53SBram Moolenaar
5563fb01a53SBram Moolenaar    " Split horizontally and test dragging the horizontal window separator.
5573fb01a53SBram Moolenaar    split
5583fb01a53SBram Moolenaar    let rowseparator = winheight(0) + 1
5593fb01a53SBram Moolenaar    let row = rowseparator
5603fb01a53SBram Moolenaar    let col = 1
561c8b3ddabSBram Moolenaar
5622b00b9b0SBram Moolenaar    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
5632b00b9b0SBram Moolenaar    if ttymouse_val !=# 'xterm2' || row <= 223
5643fbd2d7cSBram Moolenaar      call MouseLeftClick(row, col)
5653fb01a53SBram Moolenaar      let row -= 1
5663fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
5674945219bSBram Moolenaar      call assert_equal(rowseparator - 1, winheight(0) + 1, msg)
5683fb01a53SBram Moolenaar      let row += 1
5693fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
5704945219bSBram Moolenaar      call assert_equal(rowseparator, winheight(0) + 1, msg)
5713fbd2d7cSBram Moolenaar      call MouseLeftRelease(row, col)
5724945219bSBram Moolenaar      call assert_equal(rowseparator, winheight(0) + 1, msg)
57339f76c6aSBram Moolenaar    endif
5743fb01a53SBram Moolenaar    bwipe!
5753fb01a53SBram Moolenaar
5763fb01a53SBram Moolenaar    " Split vertically and test dragging the vertical window separator.
5773fb01a53SBram Moolenaar    vsplit
5783fb01a53SBram Moolenaar    let colseparator = winwidth(0) + 1
5793fb01a53SBram Moolenaar    let row = 1
5803fb01a53SBram Moolenaar    let col = colseparator
58139f76c6aSBram Moolenaar
5822b00b9b0SBram Moolenaar    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
5832b00b9b0SBram Moolenaar    if ttymouse_val !=# 'xterm2' || col <= 223
5843fbd2d7cSBram Moolenaar      call MouseLeftClick(row, col)
5853fb01a53SBram Moolenaar      let col -= 1
5863fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
5874945219bSBram Moolenaar      call assert_equal(colseparator - 1, winwidth(0) + 1, msg)
5883fb01a53SBram Moolenaar      let col += 1
5893fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
5904945219bSBram Moolenaar      call assert_equal(colseparator, winwidth(0) + 1, msg)
5913fbd2d7cSBram Moolenaar      call MouseLeftRelease(row, col)
5924945219bSBram Moolenaar      call assert_equal(colseparator, winwidth(0) + 1, msg)
59339f76c6aSBram Moolenaar    endif
5943fb01a53SBram Moolenaar    bwipe!
5953fbd2d7cSBram Moolenaar  endfor
5963fbd2d7cSBram Moolenaar
5973fbd2d7cSBram Moolenaar  let &mouse = save_mouse
5983fbd2d7cSBram Moolenaar  let &term = save_term
5993fbd2d7cSBram Moolenaar  let &ttymouse = save_ttymouse
60092fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
6013fbd2d7cSBram Moolenaarendfunc
6023fbd2d7cSBram Moolenaar
60392fd599eSBram Moolenaarfunc Test_term_mouse_drag_statusline()
6043fbd2d7cSBram Moolenaar  let save_mouse = &mouse
6053fbd2d7cSBram Moolenaar  let save_term = &term
6063fbd2d7cSBram Moolenaar  let save_ttymouse = &ttymouse
60792fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
608ca57ab54SBram Moolenaar  let save_laststatus = &laststatus
609ca57ab54SBram Moolenaar  set mouse=a term=xterm laststatus=2
6103fbd2d7cSBram Moolenaar
611515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
6124945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
6131ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
6143fbd2d7cSBram Moolenaar
6154945219bSBram Moolenaar    call assert_equal(1, &cmdheight, msg)
6163fbd2d7cSBram Moolenaar    let rowstatusline = winheight(0) + 1
6173fbd2d7cSBram Moolenaar    let row = rowstatusline
6183fbd2d7cSBram Moolenaar    let col = 1
619c8b3ddabSBram Moolenaar
6202b00b9b0SBram Moolenaar    if ttymouse_val ==# 'xterm2' && row > 223
6212b00b9b0SBram Moolenaar      " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
622c8b3ddabSBram Moolenaar      continue
623c8b3ddabSBram Moolenaar    endif
624c8b3ddabSBram Moolenaar
6253fbd2d7cSBram Moolenaar    call MouseLeftClick(row, col)
6263fbd2d7cSBram Moolenaar    let row -= 1
6273fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
6284945219bSBram Moolenaar    call assert_equal(2, &cmdheight, msg)
6294945219bSBram Moolenaar    call assert_equal(rowstatusline - 1, winheight(0) + 1, msg)
6303fbd2d7cSBram Moolenaar    let row += 1
6313fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
6324945219bSBram Moolenaar    call assert_equal(1, &cmdheight, msg)
6334945219bSBram Moolenaar    call assert_equal(rowstatusline, winheight(0) + 1, msg)
6343fbd2d7cSBram Moolenaar    call MouseLeftRelease(row, col)
6354945219bSBram Moolenaar    call assert_equal(1, &cmdheight, msg)
6364945219bSBram Moolenaar    call assert_equal(rowstatusline, winheight(0) + 1, msg)
6373fbd2d7cSBram Moolenaar  endfor
6383fbd2d7cSBram Moolenaar
6393fb01a53SBram Moolenaar  let &mouse = save_mouse
6403fb01a53SBram Moolenaar  let &term = save_term
6413fb01a53SBram Moolenaar  let &ttymouse = save_ttymouse
64292fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
643ca57ab54SBram Moolenaar  let &laststatus = save_laststatus
644ca57ab54SBram Moolenaarendfunc
645ca57ab54SBram Moolenaar
64692fd599eSBram Moolenaarfunc Test_term_mouse_click_tab()
647ca57ab54SBram Moolenaar  let save_mouse = &mouse
648ca57ab54SBram Moolenaar  let save_term = &term
649ca57ab54SBram Moolenaar  let save_ttymouse = &ttymouse
65092fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
651ca57ab54SBram Moolenaar  set mouse=a term=xterm
652ca57ab54SBram Moolenaar  let row = 1
653ca57ab54SBram Moolenaar
654515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
6554945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
6561ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
657ca57ab54SBram Moolenaar    e Xfoo
658ca57ab54SBram Moolenaar    tabnew Xbar
659ca57ab54SBram Moolenaar
660ca57ab54SBram Moolenaar    let a = split(execute(':tabs'), "\n")
661ca57ab54SBram Moolenaar    call assert_equal(['Tab page 1',
662ca57ab54SBram Moolenaar        \              '    Xfoo',
663ca57ab54SBram Moolenaar        \              'Tab page 2',
6644945219bSBram Moolenaar        \              '>   Xbar'], a, msg)
665ca57ab54SBram Moolenaar
666ca57ab54SBram Moolenaar    " Test clicking on tab names in the tabline at the top.
667ca57ab54SBram Moolenaar    let col = 2
66839f76c6aSBram Moolenaar    redraw
669ca57ab54SBram Moolenaar    call MouseLeftClick(row, col)
670ca57ab54SBram Moolenaar    call MouseLeftRelease(row, col)
671ca57ab54SBram Moolenaar    let a = split(execute(':tabs'), "\n")
672ca57ab54SBram Moolenaar    call assert_equal(['Tab page 1',
673ca57ab54SBram Moolenaar        \              '>   Xfoo',
674ca57ab54SBram Moolenaar        \              'Tab page 2',
6754945219bSBram Moolenaar        \              '    Xbar'], a, msg)
676ca57ab54SBram Moolenaar
677ca57ab54SBram Moolenaar    let col = 9
678ca57ab54SBram Moolenaar    call MouseLeftClick(row, col)
679ca57ab54SBram Moolenaar    call MouseLeftRelease(row, col)
680ca57ab54SBram Moolenaar    let a = split(execute(':tabs'), "\n")
681ca57ab54SBram Moolenaar    call assert_equal(['Tab page 1',
682ca57ab54SBram Moolenaar        \              '    Xfoo',
683ca57ab54SBram Moolenaar        \              'Tab page 2',
6844945219bSBram Moolenaar        \              '>   Xbar'], a, msg)
685ca57ab54SBram Moolenaar
686ca57ab54SBram Moolenaar    %bwipe!
687ca57ab54SBram Moolenaar  endfor
688ca57ab54SBram Moolenaar
689ca57ab54SBram Moolenaar  let &mouse = save_mouse
690ca57ab54SBram Moolenaar  let &term = save_term
691ca57ab54SBram Moolenaar  let &ttymouse = save_ttymouse
69292fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
6933fb01a53SBram Moolenaarendfunc
69439f76c6aSBram Moolenaar
69592fd599eSBram Moolenaarfunc Test_term_mouse_click_X_to_close_tab()
69639f76c6aSBram Moolenaar  let save_mouse = &mouse
69739f76c6aSBram Moolenaar  let save_term = &term
69839f76c6aSBram Moolenaar  let save_ttymouse = &ttymouse
69992fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
70039f76c6aSBram Moolenaar  set mouse=a term=xterm
70139f76c6aSBram Moolenaar  let row = 1
70239f76c6aSBram Moolenaar  let col = &columns
70339f76c6aSBram Moolenaar
704515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
7052b00b9b0SBram Moolenaar    if ttymouse_val ==# 'xterm2' && col > 223
7062b00b9b0SBram Moolenaar      " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
70739f76c6aSBram Moolenaar      continue
70839f76c6aSBram Moolenaar    endif
7094945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
7101ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
71139f76c6aSBram Moolenaar    e Xtab1
71239f76c6aSBram Moolenaar    tabnew Xtab2
71339f76c6aSBram Moolenaar    tabnew Xtab3
71439f76c6aSBram Moolenaar    tabn 2
71539f76c6aSBram Moolenaar
71639f76c6aSBram Moolenaar    let a = split(execute(':tabs'), "\n")
71739f76c6aSBram Moolenaar    call assert_equal(['Tab page 1',
71839f76c6aSBram Moolenaar        \              '    Xtab1',
71939f76c6aSBram Moolenaar        \              'Tab page 2',
72039f76c6aSBram Moolenaar        \              '>   Xtab2',
72139f76c6aSBram Moolenaar        \              'Tab page 3',
7224945219bSBram Moolenaar        \              '    Xtab3'], a, msg)
72339f76c6aSBram Moolenaar
72439f76c6aSBram Moolenaar    " Click on "X" in tabline to close current tab i.e. Xtab2.
72539f76c6aSBram Moolenaar    redraw
72639f76c6aSBram Moolenaar    call MouseLeftClick(row, col)
72739f76c6aSBram Moolenaar    call MouseLeftRelease(row, col)
72839f76c6aSBram Moolenaar    let a = split(execute(':tabs'), "\n")
72939f76c6aSBram Moolenaar    call assert_equal(['Tab page 1',
73039f76c6aSBram Moolenaar        \              '    Xtab1',
73139f76c6aSBram Moolenaar        \              'Tab page 2',
7324945219bSBram Moolenaar        \              '>   Xtab3'], a, msg)
73339f76c6aSBram Moolenaar
73439f76c6aSBram Moolenaar    %bwipe!
73539f76c6aSBram Moolenaar  endfor
73639f76c6aSBram Moolenaar
73739f76c6aSBram Moolenaar  let &mouse = save_mouse
73839f76c6aSBram Moolenaar  let &term = save_term
73939f76c6aSBram Moolenaar  let &ttymouse = save_ttymouse
74092fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
74139f76c6aSBram Moolenaarendfunc
742e3e3828fSBram Moolenaar
74392fd599eSBram Moolenaarfunc Test_term_mouse_drag_to_move_tab()
744e3e3828fSBram Moolenaar  let save_mouse = &mouse
745e3e3828fSBram Moolenaar  let save_term = &term
746e3e3828fSBram Moolenaar  let save_ttymouse = &ttymouse
74792fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
748e3e3828fSBram Moolenaar  " Set 'mousetime' to 1 to avoid recognizing a double-click in the loop
749e3e3828fSBram Moolenaar  set mouse=a term=xterm mousetime=1
750e3e3828fSBram Moolenaar  let row = 1
751e3e3828fSBram Moolenaar
752515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
7534945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
7541ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
755e3e3828fSBram Moolenaar    e Xtab1
756e3e3828fSBram Moolenaar    tabnew Xtab2
757e3e3828fSBram Moolenaar
758e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
759e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
760e3e3828fSBram Moolenaar        \              '    Xtab1',
761e3e3828fSBram Moolenaar        \              'Tab page 2',
7624945219bSBram Moolenaar        \              '>   Xtab2'], a, msg)
763e3e3828fSBram Moolenaar    redraw
764e3e3828fSBram Moolenaar
765e3e3828fSBram Moolenaar    " Click in tab2 and drag it to tab1.
766e3e3828fSBram Moolenaar    " Check getcharmod() to verify that click is not
767e3e3828fSBram Moolenaar    " interpreted as a spurious double-click.
768e3e3828fSBram Moolenaar    call MouseLeftClick(row, 10)
7694945219bSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
770e3e3828fSBram Moolenaar    for col in [9, 8, 7, 6]
771e3e3828fSBram Moolenaar      call MouseLeftDrag(row, col)
772e3e3828fSBram Moolenaar    endfor
773e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
774e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
775e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
776e3e3828fSBram Moolenaar        \              '>   Xtab2',
777e3e3828fSBram Moolenaar        \              'Tab page 2',
7784945219bSBram Moolenaar        \              '    Xtab1'], a, msg)
779e3e3828fSBram Moolenaar
780f36a2c7eSBram Moolenaar    " Click elsewhere so that click in next iteration is not
781f36a2c7eSBram Moolenaar    " interpreted as unwanted double-click.
782f36a2c7eSBram Moolenaar    call MouseLeftClick(row, 11)
783f36a2c7eSBram Moolenaar    call MouseLeftRelease(row, 11)
784f36a2c7eSBram Moolenaar
785e3e3828fSBram Moolenaar    %bwipe!
786e3e3828fSBram Moolenaar  endfor
787e3e3828fSBram Moolenaar
788e3e3828fSBram Moolenaar  let &mouse = save_mouse
789e3e3828fSBram Moolenaar  let &term = save_term
790e3e3828fSBram Moolenaar  let &ttymouse = save_ttymouse
79192fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
792e3e3828fSBram Moolenaar  set mousetime&
793e3e3828fSBram Moolenaarendfunc
794e3e3828fSBram Moolenaar
79592fd599eSBram Moolenaarfunc Test_term_mouse_double_click_to_create_tab()
796e3e3828fSBram Moolenaar  let save_mouse = &mouse
797e3e3828fSBram Moolenaar  let save_term = &term
798e3e3828fSBram Moolenaar  let save_ttymouse = &ttymouse
79992fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
800e3e3828fSBram Moolenaar  " Set 'mousetime' to a small value, so that double-click works but we don't
801e3e3828fSBram Moolenaar  " have to wait long to avoid a triple-click.
802f36a2c7eSBram Moolenaar  set mouse=a term=xterm mousetime=200
803e3e3828fSBram Moolenaar  let row = 1
804e3e3828fSBram Moolenaar  let col = 10
805e3e3828fSBram Moolenaar
806515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
8074945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
8081ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
809e3e3828fSBram Moolenaar    e Xtab1
810e3e3828fSBram Moolenaar    tabnew Xtab2
811e3e3828fSBram Moolenaar
812e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
813e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
814e3e3828fSBram Moolenaar        \              '    Xtab1',
815e3e3828fSBram Moolenaar        \              'Tab page 2',
8164945219bSBram Moolenaar        \              '>   Xtab2'], a, msg)
817e3e3828fSBram Moolenaar
818e3e3828fSBram Moolenaar    redraw
819e3e3828fSBram Moolenaar    call MouseLeftClick(row, col)
820e3e3828fSBram Moolenaar    " Check getcharmod() to verify that first click is not
821e3e3828fSBram Moolenaar    " interpreted as a spurious double-click.
8224945219bSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
823e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
824e3e3828fSBram Moolenaar    call MouseLeftClick(row, col)
8254945219bSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
826e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
827e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
828e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
829e3e3828fSBram Moolenaar        \              '    Xtab1',
830e3e3828fSBram Moolenaar        \              'Tab page 2',
831e3e3828fSBram Moolenaar        \              '>   [No Name]',
832e3e3828fSBram Moolenaar        \              'Tab page 3',
8334945219bSBram Moolenaar        \              '    Xtab2'], a, msg)
834e3e3828fSBram Moolenaar
835f36a2c7eSBram Moolenaar    " Click elsewhere so that click in next iteration is not
836f36a2c7eSBram Moolenaar    " interpreted as unwanted double click.
837f36a2c7eSBram Moolenaar    call MouseLeftClick(row, col + 1)
838f36a2c7eSBram Moolenaar    call MouseLeftRelease(row, col + 1)
839f36a2c7eSBram Moolenaar
840e3e3828fSBram Moolenaar    %bwipe!
841e3e3828fSBram Moolenaar  endfor
842e3e3828fSBram Moolenaar
843e3e3828fSBram Moolenaar  let &mouse = save_mouse
844e3e3828fSBram Moolenaar  let &term = save_term
845e3e3828fSBram Moolenaar  let &ttymouse = save_ttymouse
84692fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
847e3e3828fSBram Moolenaar  set mousetime&
848e3e3828fSBram Moolenaarendfunc
849696d6377SBram Moolenaar
850f36a2c7eSBram Moolenaar" Test double/triple/quadruple click in normal mode to visually select.
851f36a2c7eSBram Moolenaarfunc Test_term_mouse_multiple_clicks_to_visually_select()
852f36a2c7eSBram Moolenaar  let save_mouse = &mouse
853f36a2c7eSBram Moolenaar  let save_term = &term
854f36a2c7eSBram Moolenaar  let save_ttymouse = &ttymouse
855f36a2c7eSBram Moolenaar  call test_override('no_query_mouse', 1)
8562a5c61a0SBram Moolenaar
8572a5c61a0SBram Moolenaar  " 'mousetime' must be sufficiently large, or else the test is flaky when
8582a5c61a0SBram Moolenaar  " using a ssh connection with X forwarding; i.e. ssh -X (issue #7563).
8592a5c61a0SBram Moolenaar  set mouse=a term=xterm mousetime=600
860f36a2c7eSBram Moolenaar  new
861f36a2c7eSBram Moolenaar
862515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
863f36a2c7eSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
864f36a2c7eSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
865f36a2c7eSBram Moolenaar    call setline(1, ['foo [foo bar] foo', 'foo'])
866f36a2c7eSBram Moolenaar
867f36a2c7eSBram Moolenaar    " Double-click on word should visually select the word.
868f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
869f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
870f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
871f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
872f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
873f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
874f36a2c7eSBram Moolenaar    call assert_equal('v', mode(), msg)
875f36a2c7eSBram Moolenaar    norm! r1
876f36a2c7eSBram Moolenaar    call assert_equal(['111 [foo bar] foo', 'foo'], getline(1, '$'), msg)
877f36a2c7eSBram Moolenaar
878f36a2c7eSBram Moolenaar    " Double-click on opening square bracket should visually
879f36a2c7eSBram Moolenaar    " select the whole [foo bar].
880f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 5)
881f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
882f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 5)
883f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 5)
884f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
885f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 5)
886f36a2c7eSBram Moolenaar    call assert_equal('v', mode(), msg)
887f36a2c7eSBram Moolenaar    norm! r2
888f36a2c7eSBram Moolenaar    call assert_equal(['111 222222222 foo', 'foo'], getline(1, '$'), msg)
889f36a2c7eSBram Moolenaar
890f36a2c7eSBram Moolenaar    " Triple-click should visually select the whole line.
891f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 3)
892f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
893f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 3)
894f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 3)
895f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
896f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 3)
897f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 3)
898f36a2c7eSBram Moolenaar    call assert_equal(64, getcharmod(), msg) " triple-click
899f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 3)
900f36a2c7eSBram Moolenaar    call assert_equal('V', mode(), msg)
901f36a2c7eSBram Moolenaar    norm! r3
902f36a2c7eSBram Moolenaar    call assert_equal(['33333333333333333', 'foo'], getline(1, '$'), msg)
903f36a2c7eSBram Moolenaar
904f36a2c7eSBram Moolenaar    " Quadruple-click should start visual block select.
905f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
906f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
907f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
908f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
909f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
910f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
911f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
912f36a2c7eSBram Moolenaar    call assert_equal(64, getcharmod(), msg) " triple-click
913f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
914f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
915f36a2c7eSBram Moolenaar    call assert_equal(96, getcharmod(), msg) " quadruple-click
916f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
917f36a2c7eSBram Moolenaar    call assert_equal("\<c-v>", mode(), msg)
918f36a2c7eSBram Moolenaar    norm! r4
919f36a2c7eSBram Moolenaar    call assert_equal(['34333333333333333', 'foo'], getline(1, '$'), msg)
9202764d06aSBram Moolenaar
9212764d06aSBram Moolenaar    " Double-click on a space character should visually select all the
9222764d06aSBram Moolenaar    " consecutive space characters.
9232764d06aSBram Moolenaar    %d
9242764d06aSBram Moolenaar    call setline(1, '    one two')
9252764d06aSBram Moolenaar    call MouseLeftClick(1, 2)
9262764d06aSBram Moolenaar    call MouseLeftRelease(1, 2)
9272764d06aSBram Moolenaar    call MouseLeftClick(1, 2)
9282764d06aSBram Moolenaar    call MouseLeftRelease(1, 2)
9292764d06aSBram Moolenaar    call assert_equal('v', mode(), msg)
9302764d06aSBram Moolenaar    norm! r1
9312764d06aSBram Moolenaar    call assert_equal(['1111one two'], getline(1, '$'), msg)
9322764d06aSBram Moolenaar
9332764d06aSBram Moolenaar    " Double-click on a word with exclusive selection
9342764d06aSBram Moolenaar    set selection=exclusive
9352764d06aSBram Moolenaar    let @" = ''
9362764d06aSBram Moolenaar    call MouseLeftClick(1, 10)
9372764d06aSBram Moolenaar    call MouseLeftRelease(1, 10)
9382764d06aSBram Moolenaar    call MouseLeftClick(1, 10)
9392764d06aSBram Moolenaar    call MouseLeftRelease(1, 10)
9402764d06aSBram Moolenaar    norm! y
9412764d06aSBram Moolenaar    call assert_equal('two', @", msg)
9422764d06aSBram Moolenaar
9432764d06aSBram Moolenaar    " Double click to select a block of text with exclusive selection
9442764d06aSBram Moolenaar    %d
9452764d06aSBram Moolenaar    call setline(1, 'one (two) three')
9462764d06aSBram Moolenaar    call MouseLeftClick(1, 5)
9472764d06aSBram Moolenaar    call MouseLeftRelease(1, 5)
9482764d06aSBram Moolenaar    call MouseLeftClick(1, 5)
9492764d06aSBram Moolenaar    call MouseLeftRelease(1, 5)
9502764d06aSBram Moolenaar    norm! y
9512764d06aSBram Moolenaar    call assert_equal(5, col("'<"), msg)
9522764d06aSBram Moolenaar    call assert_equal(10, col("'>"), msg)
9532764d06aSBram Moolenaar
9542764d06aSBram Moolenaar    call MouseLeftClick(1, 9)
9552764d06aSBram Moolenaar    call MouseLeftRelease(1, 9)
9562764d06aSBram Moolenaar    call MouseLeftClick(1, 9)
9572764d06aSBram Moolenaar    call MouseLeftRelease(1, 9)
9582764d06aSBram Moolenaar    norm! y
9592764d06aSBram Moolenaar    call assert_equal(5, col("'<"), msg)
9602764d06aSBram Moolenaar    call assert_equal(10, col("'>"), msg)
9612764d06aSBram Moolenaar    set selection&
9622764d06aSBram Moolenaar
9632764d06aSBram Moolenaar    " Click somewhere else so that the clicks above is not combined with the
9642764d06aSBram Moolenaar    " clicks in the next iteration.
9652764d06aSBram Moolenaar    call MouseRightClick(3, 10)
9662764d06aSBram Moolenaar    call MouseRightRelease(3, 10)
967f36a2c7eSBram Moolenaar  endfor
968f36a2c7eSBram Moolenaar
969f36a2c7eSBram Moolenaar  let &mouse = save_mouse
970f36a2c7eSBram Moolenaar  let &term = save_term
971f36a2c7eSBram Moolenaar  let &ttymouse = save_ttymouse
972f36a2c7eSBram Moolenaar  set mousetime&
973f36a2c7eSBram Moolenaar  call test_override('no_query_mouse', 0)
974f36a2c7eSBram Moolenaar  bwipe!
975f36a2c7eSBram Moolenaarendfunc
976f36a2c7eSBram Moolenaar
9772764d06aSBram Moolenaar" Test for selecting text in visual blockwise mode using Alt-LeftClick
9782764d06aSBram Moolenaarfunc Test_mouse_alt_leftclick()
9792764d06aSBram Moolenaar  let save_mouse = &mouse
9802764d06aSBram Moolenaar  let save_term = &term
9812764d06aSBram Moolenaar  let save_ttymouse = &ttymouse
9822764d06aSBram Moolenaar  call test_override('no_query_mouse', 1)
9832764d06aSBram Moolenaar  set mouse=a term=xterm mousetime=200
9842764d06aSBram Moolenaar  set mousemodel=popup
9852764d06aSBram Moolenaar  new
9862764d06aSBram Moolenaar  call setline(1, 'one (two) three')
9872764d06aSBram Moolenaar
9882764d06aSBram Moolenaar  for ttymouse_val in g:Ttymouse_values
9892764d06aSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
9902764d06aSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
9912764d06aSBram Moolenaar
9922764d06aSBram Moolenaar    " Left click with the Alt modifier key should extend the selection in
9932764d06aSBram Moolenaar    " blockwise visual mode.
9942764d06aSBram Moolenaar    let @" = ''
9952764d06aSBram Moolenaar    call MouseLeftClick(1, 3)
9962764d06aSBram Moolenaar    call MouseLeftRelease(1, 3)
9972764d06aSBram Moolenaar    call MouseAltLeftClick(1, 11)
9982764d06aSBram Moolenaar    call MouseLeftRelease(1, 11)
9992764d06aSBram Moolenaar    call assert_equal("\<C-V>", mode(), msg)
10002764d06aSBram Moolenaar    normal! y
10012764d06aSBram Moolenaar    call assert_equal('e (two) t', @")
10022764d06aSBram Moolenaar  endfor
10032764d06aSBram Moolenaar
10042764d06aSBram Moolenaar  let &mouse = save_mouse
10052764d06aSBram Moolenaar  let &term = save_term
10062764d06aSBram Moolenaar  let &ttymouse = save_ttymouse
10072764d06aSBram Moolenaar  set mousetime& mousemodel&
10082764d06aSBram Moolenaar  call test_override('no_query_mouse', 0)
10092764d06aSBram Moolenaar  close!
10102764d06aSBram Moolenaarendfunc
10112764d06aSBram Moolenaar
1012696d6377SBram Moolenaarfunc Test_xterm_mouse_click_in_fold_columns()
1013696d6377SBram Moolenaar  new
1014696d6377SBram Moolenaar  let save_mouse = &mouse
1015696d6377SBram Moolenaar  let save_term = &term
1016696d6377SBram Moolenaar  let save_ttymouse = &ttymouse
1017696d6377SBram Moolenaar  let save_foldcolumn = &foldcolumn
10182b00b9b0SBram Moolenaar  set mouse=a term=xterm foldcolumn=3 ttymouse=xterm2
1019696d6377SBram Moolenaar
1020696d6377SBram Moolenaar  " Create 2 nested folds.
1021696d6377SBram Moolenaar  call setline(1, range(1, 7))
1022696d6377SBram Moolenaar  2,6fold
1023696d6377SBram Moolenaar  norm! zR
1024696d6377SBram Moolenaar  4,5fold
1025696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
1026696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
1027696d6377SBram Moolenaar
1028696d6377SBram Moolenaar  " Click in "+" of inner fold in foldcolumn should open it.
1029696d6377SBram Moolenaar  redraw
1030696d6377SBram Moolenaar  let row = 4
1031696d6377SBram Moolenaar  let col = 2
1032696d6377SBram Moolenaar  call MouseLeftClick(row, col)
1033696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
1034696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, -1, -1, -1, -1],
1035696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
1036696d6377SBram Moolenaar
1037696d6377SBram Moolenaar  " Click in "-" of outer fold in foldcolumn should close it.
1038696d6377SBram Moolenaar  redraw
1039696d6377SBram Moolenaar  let row = 2
1040696d6377SBram Moolenaar  let col = 1
1041696d6377SBram Moolenaar  call MouseLeftClick(row, col)
1042696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
1043696d6377SBram Moolenaar  call assert_equal([-1, 2, 2, 2, 2, 2, -1],
1044696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
1045696d6377SBram Moolenaar  norm! zR
1046696d6377SBram Moolenaar
1047696d6377SBram Moolenaar  " Click in "|" of inner fold in foldcolumn should close it.
1048696d6377SBram Moolenaar  redraw
1049696d6377SBram Moolenaar  let row = 5
1050696d6377SBram Moolenaar  let col = 2
1051696d6377SBram Moolenaar  call MouseLeftClick(row, col)
1052696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
1053696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
1054696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
1055696d6377SBram Moolenaar
1056696d6377SBram Moolenaar  let &foldcolumn = save_foldcolumn
1057696d6377SBram Moolenaar  let &ttymouse = save_ttymouse
1058696d6377SBram Moolenaar  let &term = save_term
1059696d6377SBram Moolenaar  let &mouse = save_mouse
1060696d6377SBram Moolenaar  bwipe!
1061696d6377SBram Moolenaarendfunc
106266761db1SBram Moolenaar
1063f19f8d1aSBram Moolenaar" Left or right click in Ex command line sets position of the cursor.
1064f19f8d1aSBram Moolenaarfunc Test_term_mouse_click_in_cmdline_to_set_pos()
1065f19f8d1aSBram Moolenaar  let save_mouse = &mouse
1066f19f8d1aSBram Moolenaar  let save_term = &term
1067f19f8d1aSBram Moolenaar  let save_ttymouse = &ttymouse
1068f19f8d1aSBram Moolenaar  call test_override('no_query_mouse', 1)
1069f19f8d1aSBram Moolenaar  set mouse=a term=xterm
1070f19f8d1aSBram Moolenaar  let row = &lines
1071f19f8d1aSBram Moolenaar
1072515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
1073ab505b1aSBram Moolenaar    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
1074ab505b1aSBram Moolenaar    if ttymouse_val !=# 'xterm2' || row <= 223
1075f19f8d1aSBram Moolenaar      let msg = 'ttymouse=' .. ttymouse_val
1076f19f8d1aSBram Moolenaar      exe 'set ttymouse=' .. ttymouse_val
1077f19f8d1aSBram Moolenaar
1078ab505b1aSBram Moolenaar
1079f19f8d1aSBram Moolenaar      call feedkeys(':"3456789'
1080f19f8d1aSBram Moolenaar            \       .. MouseLeftClickCode(row, 7)
1081f19f8d1aSBram Moolenaar            \       .. MouseLeftReleaseCode(row, 7) .. 'L'
1082f19f8d1aSBram Moolenaar            \       .. MouseRightClickCode(row, 4)
1083f19f8d1aSBram Moolenaar            \       .. MouseRightReleaseCode(row, 4) .. 'R'
1084f19f8d1aSBram Moolenaar            \       .. "\<CR>", 'Lx!')
1085f19f8d1aSBram Moolenaar      call assert_equal('"3R456L789', @:, msg)
1086ab505b1aSBram Moolenaar    endif
1087f19f8d1aSBram Moolenaar  endfor
1088f19f8d1aSBram Moolenaar
1089f19f8d1aSBram Moolenaar  let &mouse = save_mouse
1090f19f8d1aSBram Moolenaar  let &term = save_term
1091f19f8d1aSBram Moolenaar  let &ttymouse = save_ttymouse
1092f19f8d1aSBram Moolenaar  set mousetime&
1093f19f8d1aSBram Moolenaar  call test_override('no_query_mouse', 0)
1094f19f8d1aSBram Moolenaarendfunc
1095f19f8d1aSBram Moolenaar
1096f19f8d1aSBram Moolenaar" Middle click in command line pastes at position of cursor.
1097f19f8d1aSBram Moolenaarfunc Test_term_mouse_middle_click_in_cmdline_to_paste()
1098f19f8d1aSBram Moolenaar  CheckFeature clipboard_working
1099f19f8d1aSBram Moolenaar  let save_mouse = &mouse
1100f19f8d1aSBram Moolenaar  let save_term = &term
1101f19f8d1aSBram Moolenaar  let save_ttymouse = &ttymouse
1102f19f8d1aSBram Moolenaar  call test_override('no_query_mouse', 1)
1103f19f8d1aSBram Moolenaar  set mouse=a term=xterm
1104f19f8d1aSBram Moolenaar  let row = &lines
1105f19f8d1aSBram Moolenaar  " Column values does not matter, paste is done at position of cursor.
1106f19f8d1aSBram Moolenaar  let col = 1
1107f19f8d1aSBram Moolenaar  let @* = 'paste'
1108f19f8d1aSBram Moolenaar
1109515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
1110f19f8d1aSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
1111f19f8d1aSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
1112f19f8d1aSBram Moolenaar
1113f19f8d1aSBram Moolenaar    call feedkeys(":\"->"
1114f19f8d1aSBram Moolenaar          \       .. MouseMiddleReleaseCode(row, col)
1115f19f8d1aSBram Moolenaar          \       .. MouseMiddleClickCode(row, col)
1116f19f8d1aSBram Moolenaar          \       .. "<-"
1117f19f8d1aSBram Moolenaar          \       .. MouseMiddleReleaseCode(row, col)
1118f19f8d1aSBram Moolenaar          \       .. MouseMiddleClickCode(row, col)
1119f19f8d1aSBram Moolenaar          \       .. "\<CR>", 'Lx!')
1120f19f8d1aSBram Moolenaar    call assert_equal('"->paste<-paste', @:, msg)
1121f19f8d1aSBram Moolenaar  endfor
1122f19f8d1aSBram Moolenaar
1123f19f8d1aSBram Moolenaar  let &mouse = save_mouse
1124f19f8d1aSBram Moolenaar  let &term = save_term
1125f19f8d1aSBram Moolenaar  let &ttymouse = save_ttymouse
1126f19f8d1aSBram Moolenaar  let @* = ''
1127f19f8d1aSBram Moolenaar  call test_override('no_query_mouse', 0)
1128f19f8d1aSBram Moolenaarendfunc
1129f19f8d1aSBram Moolenaar
1130297bec07SBram Moolenaar" Test for making sure S-Middlemouse doesn't do anything
1131297bec07SBram Moolenaarfunc Test_term_mouse_shift_middle_click()
1132297bec07SBram Moolenaar  new
1133297bec07SBram Moolenaar  let save_mouse = &mouse
1134297bec07SBram Moolenaar  let save_term = &term
1135297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
1136297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
1137297bec07SBram Moolenaar  set mouse=a term=xterm ttymouse=xterm2 mousemodel=
1138297bec07SBram Moolenaar
1139297bec07SBram Moolenaar  call test_setmouse(1, 1)
1140297bec07SBram Moolenaar  exe "normal \<S-MiddleMouse>"
1141297bec07SBram Moolenaar  call assert_equal([''], getline(1, '$'))
1142297bec07SBram Moolenaar  call assert_equal(1, winnr())
1143297bec07SBram Moolenaar
1144297bec07SBram Moolenaar  let &mouse = save_mouse
1145297bec07SBram Moolenaar  let &term = save_term
1146297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
1147297bec07SBram Moolenaar  set mousemodel&
1148297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
1149297bec07SBram Moolenaar  close!
1150297bec07SBram Moolenaarendfunc
1151297bec07SBram Moolenaar
1152297bec07SBram Moolenaar" Test for using mouse in visual mode
1153297bec07SBram Moolenaarfunc Test_term_mouse_visual_mode()
1154297bec07SBram Moolenaar  new
1155297bec07SBram Moolenaar  let save_mouse = &mouse
1156297bec07SBram Moolenaar  let save_term = &term
1157297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
1158297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
1159297bec07SBram Moolenaar  set term=xterm ttymouse=xterm2
1160297bec07SBram Moolenaar
1161297bec07SBram Moolenaar  " If visual mode is not present in 'mouse', then left click should not
1162297bec07SBram Moolenaar  " do anything in visal mode.
1163297bec07SBram Moolenaar  call setline(1, ['one two three four'])
1164297bec07SBram Moolenaar  set mouse=nci
1165297bec07SBram Moolenaar  call cursor(1, 5)
1166297bec07SBram Moolenaar  let @" = ''
1167297bec07SBram Moolenaar  call feedkeys("ve"
1168297bec07SBram Moolenaar        \ .. MouseLeftClickCode(1, 15) .. MouseLeftReleaseCode(1, 15)
1169297bec07SBram Moolenaar        \ .. 'y', 'Lx!')
1170297bec07SBram Moolenaar  call assert_equal(5, col('.'))
1171297bec07SBram Moolenaar  call assert_equal('two', @")
1172297bec07SBram Moolenaar
1173297bec07SBram Moolenaar  " Pressing right click in visual mode should change the visual selection
1174297bec07SBram Moolenaar  " if 'mousemodel' doesn't contain popup.
1175297bec07SBram Moolenaar  " Right click after the visual selection
1176297bec07SBram Moolenaar  set mousemodel=
1177297bec07SBram Moolenaar  set mouse=a
1178297bec07SBram Moolenaar  call test_setmouse(1, 13)
1179297bec07SBram Moolenaar  exe "normal 5|ve\<RightMouse>y"
1180297bec07SBram Moolenaar  call assert_equal('two three', @")
1181297bec07SBram Moolenaar  call assert_equal(5, col('.'))
1182297bec07SBram Moolenaar
1183297bec07SBram Moolenaar  " Right click before the visual selection
1184297bec07SBram Moolenaar  call test_setmouse(1, 9)
1185297bec07SBram Moolenaar  exe "normal 15|ve\<RightMouse>y"
1186297bec07SBram Moolenaar  call assert_equal('three four', @")
1187297bec07SBram Moolenaar  call assert_equal(9, col('.'))
1188297bec07SBram Moolenaar
11892764d06aSBram Moolenaar  " Right click inside the selection closer to the start of the selection
11902764d06aSBram Moolenaar  call test_setmouse(1, 7)
11912764d06aSBram Moolenaar  exe "normal 5|vee\<RightMouse>lly"
11922764d06aSBram Moolenaar  call assert_equal('three', @")
11932764d06aSBram Moolenaar  call assert_equal(9, col('.'))
11942764d06aSBram Moolenaar  call assert_equal(9, col("'<"))
11952764d06aSBram Moolenaar  call assert_equal(13, col("'>"))
11962764d06aSBram Moolenaar
11972764d06aSBram Moolenaar  " Right click inside the selection closer to the end of the selection
11982764d06aSBram Moolenaar  call test_setmouse(1, 11)
11992764d06aSBram Moolenaar  exe "normal 5|vee\<RightMouse>ly"
12002764d06aSBram Moolenaar  call assert_equal('two thre', @")
12012764d06aSBram Moolenaar  call assert_equal(5, col('.'))
12022764d06aSBram Moolenaar  call assert_equal(5, col("'<"))
12032764d06aSBram Moolenaar  call assert_equal(12, col("'>"))
12042764d06aSBram Moolenaar
12052764d06aSBram Moolenaar  " Multi-line selection. Right click inside thse selection.
12062764d06aSBram Moolenaar  call setline(1, repeat(['aaaaaa'], 7))
1207297bec07SBram Moolenaar  call test_setmouse(3, 1)
1208297bec07SBram Moolenaar  exe "normal ggVG\<RightMouse>y"
1209297bec07SBram Moolenaar  call assert_equal(3, line("'<"))
12102764d06aSBram Moolenaar  call test_setmouse(5, 1)
1211297bec07SBram Moolenaar  exe "normal ggVG\<RightMouse>y"
12122764d06aSBram Moolenaar  call assert_equal(5, line("'>"))
12132764d06aSBram Moolenaar
12142764d06aSBram Moolenaar  " Click right in the middle line of the selection
12152764d06aSBram Moolenaar  call test_setmouse(4, 3)
12162764d06aSBram Moolenaar  exe "normal ggVG$\<RightMouse>y"
12172764d06aSBram Moolenaar  call assert_equal(4, line("'<"))
12182764d06aSBram Moolenaar  call test_setmouse(4, 4)
12192764d06aSBram Moolenaar  exe "normal ggVG$\<RightMouse>y"
1220297bec07SBram Moolenaar  call assert_equal(4, line("'>"))
1221297bec07SBram Moolenaar
1222297bec07SBram Moolenaar  set mousemodel&
1223297bec07SBram Moolenaar  let &mouse = save_mouse
1224297bec07SBram Moolenaar  let &term = save_term
1225297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
1226297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
1227297bec07SBram Moolenaar  close!
1228297bec07SBram Moolenaarendfunc
1229297bec07SBram Moolenaar
12300eabd4dcSBram Moolenaar" Test for displaying the popup menu using the right mouse click
1231297bec07SBram Moolenaarfunc Test_term_mouse_popup_menu()
12320eabd4dcSBram Moolenaar  CheckFeature menu
12330eabd4dcSBram Moolenaar  new
12340eabd4dcSBram Moolenaar  call setline(1, 'popup menu test')
12350eabd4dcSBram Moolenaar  let save_mouse = &mouse
12360eabd4dcSBram Moolenaar  let save_term = &term
12370eabd4dcSBram Moolenaar  let save_ttymouse = &ttymouse
12380eabd4dcSBram Moolenaar  let save_mousemodel = &mousemodel
12390eabd4dcSBram Moolenaar  call test_override('no_query_mouse', 1)
12400eabd4dcSBram Moolenaar  set mouse=a term=xterm mousemodel=popup
12410eabd4dcSBram Moolenaar
12420eabd4dcSBram Moolenaar  menu PopUp.foo :let g:menustr = 'foo'<CR>
12430eabd4dcSBram Moolenaar  menu PopUp.bar :let g:menustr = 'bar'<CR>
12440eabd4dcSBram Moolenaar  menu PopUp.baz :let g:menustr = 'baz'<CR>
12450eabd4dcSBram Moolenaar
1246515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values
12472764d06aSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
12480eabd4dcSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
12490eabd4dcSBram Moolenaar    let g:menustr = ''
12500eabd4dcSBram Moolenaar    call feedkeys(MouseRightClickCode(1, 4)
12510eabd4dcSBram Moolenaar		\ .. MouseRightReleaseCode(1, 4) .. "\<Down>\<Down>\<CR>", "x")
12522764d06aSBram Moolenaar    call assert_equal('bar', g:menustr, msg)
12530eabd4dcSBram Moolenaar  endfor
12540eabd4dcSBram Moolenaar
12550eabd4dcSBram Moolenaar  unmenu PopUp
12560eabd4dcSBram Moolenaar  let &mouse = save_mouse
12570eabd4dcSBram Moolenaar  let &term = save_term
12580eabd4dcSBram Moolenaar  let &ttymouse = save_ttymouse
12590eabd4dcSBram Moolenaar  let &mousemodel = save_mousemodel
12600eabd4dcSBram Moolenaar  call test_override('no_query_mouse', 0)
12610eabd4dcSBram Moolenaar  close!
12620eabd4dcSBram Moolenaarendfunc
12630eabd4dcSBram Moolenaar
1264297bec07SBram Moolenaar" Test for 'mousemodel' set to popup_setpos to move the cursor where the popup
1265297bec07SBram Moolenaar" menu is displayed.
1266297bec07SBram Moolenaarfunc Test_term_mouse_popup_menu_setpos()
1267297bec07SBram Moolenaar  CheckFeature menu
1268297bec07SBram Moolenaar  5new
1269297bec07SBram Moolenaar  call setline(1, ['the dish ran away with the spoon',
1270297bec07SBram Moolenaar        \ 'the cow jumped over the moon' ])
1271297bec07SBram Moolenaar  let save_mouse = &mouse
1272297bec07SBram Moolenaar  let save_term = &term
1273297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
1274297bec07SBram Moolenaar  let save_mousemodel = &mousemodel
1275297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
1276297bec07SBram Moolenaar  set mouse=a term=xterm mousemodel=popup_setpos
1277297bec07SBram Moolenaar
1278297bec07SBram Moolenaar  nmenu PopUp.foo :let g:menustr = 'foo'<CR>
1279297bec07SBram Moolenaar  nmenu PopUp.bar :let g:menustr = 'bar'<CR>
1280297bec07SBram Moolenaar  nmenu PopUp.baz :let g:menustr = 'baz'<CR>
1281297bec07SBram Moolenaar  vmenu PopUp.foo y:<C-U>let g:menustr = 'foo'<CR>
1282297bec07SBram Moolenaar  vmenu PopUp.bar y:<C-U>let g:menustr = 'bar'<CR>
1283297bec07SBram Moolenaar  vmenu PopUp.baz y:<C-U>let g:menustr = 'baz'<CR>
1284297bec07SBram Moolenaar
1285297bec07SBram Moolenaar  for ttymouse_val in g:Ttymouse_values
12862764d06aSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
1287297bec07SBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
1288297bec07SBram Moolenaar    let g:menustr = ''
1289297bec07SBram Moolenaar    call cursor(1, 1)
1290297bec07SBram Moolenaar    call feedkeys(MouseRightClickCode(1, 5)
1291297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(1, 5) .. "\<Down>\<Down>\<CR>", "x")
12922764d06aSBram Moolenaar    call assert_equal('bar', g:menustr, msg)
12932764d06aSBram Moolenaar    call assert_equal([1, 5], [line('.'), col('.')], msg)
1294297bec07SBram Moolenaar
1295297bec07SBram Moolenaar    " Test for right click in visual mode inside the selection
1296297bec07SBram Moolenaar    let @" = ''
1297297bec07SBram Moolenaar    call cursor(1, 10)
1298297bec07SBram Moolenaar    call feedkeys('vee' .. MouseRightClickCode(1, 12)
1299297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(1, 12) .. "\<Down>\<CR>", "x")
13002764d06aSBram Moolenaar    call assert_equal([1, 10], [line('.'), col('.')], msg)
13012764d06aSBram Moolenaar    call assert_equal('ran away', @", msg)
1302297bec07SBram Moolenaar
1303297bec07SBram Moolenaar    " Test for right click in visual mode before the selection
1304297bec07SBram Moolenaar    let @" = ''
1305297bec07SBram Moolenaar    call cursor(1, 10)
1306297bec07SBram Moolenaar    call feedkeys('vee' .. MouseRightClickCode(1, 2)
1307297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(1, 2) .. "\<Down>\<CR>", "x")
13082764d06aSBram Moolenaar    call assert_equal([1, 2], [line('.'), col('.')], msg)
13092764d06aSBram Moolenaar    call assert_equal('', @", msg)
1310297bec07SBram Moolenaar
1311297bec07SBram Moolenaar    " Test for right click in visual mode after the selection
1312297bec07SBram Moolenaar    let @" = ''
1313297bec07SBram Moolenaar    call cursor(1, 10)
1314297bec07SBram Moolenaar    call feedkeys('vee' .. MouseRightClickCode(1, 20)
1315297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(1, 20) .. "\<Down>\<CR>", "x")
13162764d06aSBram Moolenaar    call assert_equal([1, 20], [line('.'), col('.')], msg)
13172764d06aSBram Moolenaar    call assert_equal('', @", msg)
1318297bec07SBram Moolenaar
1319297bec07SBram Moolenaar    " Test for right click in block-wise visual mode inside the selection
1320297bec07SBram Moolenaar    let @" = ''
1321297bec07SBram Moolenaar    call cursor(1, 16)
1322297bec07SBram Moolenaar    call feedkeys("\<C-V>j3l" .. MouseRightClickCode(2, 17)
1323297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(2, 17) .. "\<Down>\<CR>", "x")
13242764d06aSBram Moolenaar    call assert_equal([1, 16], [line('.'), col('.')], msg)
13252764d06aSBram Moolenaar    call assert_equal("\<C-V>4", getregtype('"'), msg)
1326297bec07SBram Moolenaar
1327297bec07SBram Moolenaar    " Test for right click in block-wise visual mode outside the selection
1328297bec07SBram Moolenaar    let @" = ''
1329297bec07SBram Moolenaar    call cursor(1, 16)
1330297bec07SBram Moolenaar    call feedkeys("\<C-V>j3l" .. MouseRightClickCode(2, 2)
1331297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(2, 2) .. "\<Down>\<CR>", "x")
13322764d06aSBram Moolenaar    call assert_equal([2, 2], [line('.'), col('.')], msg)
13332764d06aSBram Moolenaar    call assert_equal('v', getregtype('"'), msg)
13342764d06aSBram Moolenaar    call assert_equal('', @", msg)
1335297bec07SBram Moolenaar
1336297bec07SBram Moolenaar    " Try clicking on the status line
1337297bec07SBram Moolenaar    let @" = ''
1338297bec07SBram Moolenaar    call cursor(1, 10)
1339297bec07SBram Moolenaar    call feedkeys('vee' .. MouseRightClickCode(6, 2)
1340297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(6, 2) .. "\<Down>\<CR>", "x")
13412764d06aSBram Moolenaar    call assert_equal([1, 10], [line('.'), col('.')], msg)
13422764d06aSBram Moolenaar    call assert_equal('ran away', @", msg)
1343297bec07SBram Moolenaar
1344297bec07SBram Moolenaar    " Try clicking outside the window
1345297bec07SBram Moolenaar    let @" = ''
1346297bec07SBram Moolenaar    call cursor(7, 2)
1347297bec07SBram Moolenaar    call feedkeys('vee' .. MouseRightClickCode(7, 2)
1348297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(7, 2) .. "\<Down>\<CR>", "x")
13492764d06aSBram Moolenaar    call assert_equal(2, winnr(), msg)
13502764d06aSBram Moolenaar    call assert_equal('', @", msg)
1351297bec07SBram Moolenaar    wincmd w
1352297bec07SBram Moolenaar  endfor
1353297bec07SBram Moolenaar
1354297bec07SBram Moolenaar  unmenu PopUp
1355297bec07SBram Moolenaar  let &mouse = save_mouse
1356297bec07SBram Moolenaar  let &term = save_term
1357297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
1358297bec07SBram Moolenaar  let &mousemodel = save_mousemodel
1359297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
1360297bec07SBram Moolenaar  close!
1361297bec07SBram Moolenaarendfunc
1362297bec07SBram Moolenaar
1363297bec07SBram Moolenaar" Test for searching for the word under the cursor using Shift-Right or
1364297bec07SBram Moolenaar" Shift-Left click.
1365297bec07SBram Moolenaarfunc Test_term_mouse_search()
1366297bec07SBram Moolenaar  new
1367297bec07SBram Moolenaar  let save_mouse = &mouse
1368297bec07SBram Moolenaar  let save_term = &term
1369297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
1370297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
1371297bec07SBram Moolenaar  set mouse=a term=xterm ttymouse=xterm2
1372297bec07SBram Moolenaar  set mousemodel=
1373297bec07SBram Moolenaar
1374297bec07SBram Moolenaar  " In normal mode, Shift-Left or Shift-Right click should search for the word
1375297bec07SBram Moolenaar  " under the cursor.
1376297bec07SBram Moolenaar  call setline(1, ['one two three four', 'four three two one'])
1377297bec07SBram Moolenaar  call test_setmouse(1, 4)
1378297bec07SBram Moolenaar  exe "normal \<S-LeftMouse>"
1379297bec07SBram Moolenaar  call assert_equal([2, 12], [line('.'), col('.')])
1380297bec07SBram Moolenaar  call test_setmouse(2, 16)
1381297bec07SBram Moolenaar  exe "normal \<S-RightMouse>"
1382297bec07SBram Moolenaar  call assert_equal([1, 1], [line('.'), col('.')])
1383297bec07SBram Moolenaar
1384297bec07SBram Moolenaar  " In visual mode, Shift-Left or Shift-Right click should search for the word
1385297bec07SBram Moolenaar  " under the cursor and extend the selection.
1386297bec07SBram Moolenaar  call test_setmouse(1, 4)
1387297bec07SBram Moolenaar  exe "normal 4|ve\<S-LeftMouse>y"
1388297bec07SBram Moolenaar  call assert_equal([2, 12], [line("'>"), col("'>")])
1389297bec07SBram Moolenaar  call test_setmouse(2, 16)
1390297bec07SBram Moolenaar  exe "normal 2G16|ve\<S-RightMouse>y"
1391297bec07SBram Moolenaar  call assert_equal([1, 1], [line("'<"), col("'<")])
1392297bec07SBram Moolenaar
1393297bec07SBram Moolenaar  set mousemodel&
1394297bec07SBram Moolenaar  let &mouse = save_mouse
1395297bec07SBram Moolenaar  let &term = save_term
1396297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
1397297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
1398297bec07SBram Moolenaar  close!
1399297bec07SBram Moolenaarendfunc
1400297bec07SBram Moolenaar
1401297bec07SBram Moolenaar" Test for selecting an entry in the quickfix/location list window using the
1402297bec07SBram Moolenaar" mouse.
1403297bec07SBram Moolenaarfunc Test_term_mouse_quickfix_window()
1404297bec07SBram Moolenaar  let save_mouse = &mouse
1405297bec07SBram Moolenaar  let save_term = &term
1406297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
1407297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
1408297bec07SBram Moolenaar  set mouse=a term=xterm ttymouse=xterm2
1409297bec07SBram Moolenaar  set mousemodel=
1410297bec07SBram Moolenaar
1411297bec07SBram Moolenaar  cgetexpr "Xfile1:1:L1"
1412297bec07SBram Moolenaar  copen 5
1413297bec07SBram Moolenaar  call test_setmouse(&lines - 7, 1)
1414297bec07SBram Moolenaar  exe "normal \<2-LeftMouse>"
1415297bec07SBram Moolenaar  call assert_equal('Xfile1', @%)
1416297bec07SBram Moolenaar  %bw!
1417297bec07SBram Moolenaar
1418297bec07SBram Moolenaar  lgetexpr "Xfile2:1:L1"
1419297bec07SBram Moolenaar  lopen 5
1420297bec07SBram Moolenaar  call test_setmouse(&lines - 7, 1)
1421297bec07SBram Moolenaar  exe "normal \<2-LeftMouse>"
1422297bec07SBram Moolenaar  call assert_equal('Xfile2', @%)
1423297bec07SBram Moolenaar  %bw!
1424297bec07SBram Moolenaar
1425297bec07SBram Moolenaar  set mousemodel&
1426297bec07SBram Moolenaar  let &mouse = save_mouse
1427297bec07SBram Moolenaar  let &term = save_term
1428297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
1429297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
1430297bec07SBram Moolenaarendfunc
1431297bec07SBram Moolenaar
14322764d06aSBram Moolenaar" Test for the 'h' flag in the 'mouse' option. Using mouse in the help window.
14332764d06aSBram Moolenaarfunc Test_term_mouse_help_window()
14342764d06aSBram Moolenaar  let save_mouse = &mouse
14352764d06aSBram Moolenaar  let save_term = &term
14362764d06aSBram Moolenaar  let save_ttymouse = &ttymouse
14372764d06aSBram Moolenaar  call test_override('no_query_mouse', 1)
14382764d06aSBram Moolenaar  set mouse=h term=xterm mousetime=200
14392764d06aSBram Moolenaar
14402764d06aSBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
14412764d06aSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
14422764d06aSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
14432764d06aSBram Moolenaar    help
14442764d06aSBram Moolenaar    let @" = ''
14452764d06aSBram Moolenaar    call MouseLeftClick(2, 5)
14462764d06aSBram Moolenaar    call MouseLeftRelease(2, 5)
14472764d06aSBram Moolenaar    call MouseLeftClick(1, 1)
14482764d06aSBram Moolenaar    call MouseLeftDrag(1, 10)
14492764d06aSBram Moolenaar    call MouseLeftRelease(1, 10)
14502764d06aSBram Moolenaar    norm! y
14512764d06aSBram Moolenaar    call assert_equal('*help.txt*', @", msg)
14522764d06aSBram Moolenaar    helpclose
14532764d06aSBram Moolenaar
14542764d06aSBram Moolenaar    " Click somewhere else to make sure the left click above is not combined
14552764d06aSBram Moolenaar    " with the next left click and treated as a double click
14562764d06aSBram Moolenaar    call MouseRightClick(5, 10)
14572764d06aSBram Moolenaar    call MouseRightRelease(5, 10)
14582764d06aSBram Moolenaar  endfor
14592764d06aSBram Moolenaar
14602764d06aSBram Moolenaar  let &mouse = save_mouse
14612764d06aSBram Moolenaar  let &term = save_term
14622764d06aSBram Moolenaar  let &ttymouse = save_ttymouse
14632764d06aSBram Moolenaar  set mousetime&
14642764d06aSBram Moolenaar  call test_override('no_query_mouse', 0)
14652764d06aSBram Moolenaar  %bw!
14662764d06aSBram Moolenaarendfunc
14672764d06aSBram Moolenaar
14682764d06aSBram Moolenaar" Test for the translation of various mouse terminal codes
14692764d06aSBram Moolenaarfunc Test_mouse_termcodes()
14702764d06aSBram Moolenaar  let save_mouse = &mouse
14712764d06aSBram Moolenaar  let save_term = &term
14722764d06aSBram Moolenaar  let save_ttymouse = &ttymouse
14732764d06aSBram Moolenaar  call test_override('no_query_mouse', 1)
14742764d06aSBram Moolenaar  set mouse=a term=xterm mousetime=200
14752764d06aSBram Moolenaar
14762764d06aSBram Moolenaar  new
14772764d06aSBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
14782764d06aSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
14792764d06aSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
14802764d06aSBram Moolenaar
14812764d06aSBram Moolenaar    let mouse_codes = [
14822764d06aSBram Moolenaar          \ ["\<LeftMouse>", "<LeftMouse>"],
14832764d06aSBram Moolenaar          \ ["\<MiddleMouse>", "<MiddleMouse>"],
14842764d06aSBram Moolenaar          \ ["\<RightMouse>", "<RightMouse>"],
14852764d06aSBram Moolenaar          \ ["\<S-LeftMouse>", "<S-LeftMouse>"],
14862764d06aSBram Moolenaar          \ ["\<S-MiddleMouse>", "<S-MiddleMouse>"],
14872764d06aSBram Moolenaar          \ ["\<S-RightMouse>", "<S-RightMouse>"],
14882764d06aSBram Moolenaar          \ ["\<C-LeftMouse>", "<C-LeftMouse>"],
14892764d06aSBram Moolenaar          \ ["\<C-MiddleMouse>", "<C-MiddleMouse>"],
14902764d06aSBram Moolenaar          \ ["\<C-RightMouse>", "<C-RightMouse>"],
14912764d06aSBram Moolenaar          \ ["\<M-LeftMouse>", "<M-LeftMouse>"],
14922764d06aSBram Moolenaar          \ ["\<M-MiddleMouse>", "<M-MiddleMouse>"],
14932764d06aSBram Moolenaar          \ ["\<M-RightMouse>", "<M-RightMouse>"],
14942764d06aSBram Moolenaar          \ ["\<2-LeftMouse>", "<2-LeftMouse>"],
14952764d06aSBram Moolenaar          \ ["\<2-MiddleMouse>", "<2-MiddleMouse>"],
14962764d06aSBram Moolenaar          \ ["\<2-RightMouse>", "<2-RightMouse>"],
14972764d06aSBram Moolenaar          \ ["\<3-LeftMouse>", "<3-LeftMouse>"],
14982764d06aSBram Moolenaar          \ ["\<3-MiddleMouse>", "<3-MiddleMouse>"],
14992764d06aSBram Moolenaar          \ ["\<3-RightMouse>", "<3-RightMouse>"],
15002764d06aSBram Moolenaar          \ ["\<4-LeftMouse>", "<4-LeftMouse>"],
15012764d06aSBram Moolenaar          \ ["\<4-MiddleMouse>", "<4-MiddleMouse>"],
15022764d06aSBram Moolenaar          \ ["\<4-RightMouse>", "<4-RightMouse>"],
15032764d06aSBram Moolenaar          \ ["\<LeftDrag>", "<LeftDrag>"],
15042764d06aSBram Moolenaar          \ ["\<MiddleDrag>", "<MiddleDrag>"],
15052764d06aSBram Moolenaar          \ ["\<RightDrag>", "<RightDrag>"],
15062764d06aSBram Moolenaar          \ ["\<LeftRelease>", "<LeftRelease>"],
15072764d06aSBram Moolenaar          \ ["\<MiddleRelease>", "<MiddleRelease>"],
15082764d06aSBram Moolenaar          \ ["\<RightRelease>", "<RightRelease>"],
15092764d06aSBram Moolenaar          \ ["\<ScrollWheelUp>", "<ScrollWheelUp>"],
15102764d06aSBram Moolenaar          \ ["\<S-ScrollWheelUp>", "<S-ScrollWheelUp>"],
15112764d06aSBram Moolenaar          \ ["\<C-ScrollWheelUp>", "<C-ScrollWheelUp>"],
15122764d06aSBram Moolenaar          \ ["\<ScrollWheelDown>", "<ScrollWheelDown>"],
15132764d06aSBram Moolenaar          \ ["\<S-ScrollWheelDown>", "<S-ScrollWheelDown>"],
15142764d06aSBram Moolenaar          \ ["\<C-ScrollWheelDown>", "<C-ScrollWheelDown>"],
15152764d06aSBram Moolenaar          \ ["\<ScrollWheelLeft>", "<ScrollWheelLeft>"],
15162764d06aSBram Moolenaar          \ ["\<S-ScrollWheelLeft>", "<S-ScrollWheelLeft>"],
15172764d06aSBram Moolenaar          \ ["\<C-ScrollWheelLeft>", "<C-ScrollWheelLeft>"],
15182764d06aSBram Moolenaar          \ ["\<ScrollWheelRight>", "<ScrollWheelRight>"],
15192764d06aSBram Moolenaar          \ ["\<S-ScrollWheelRight>", "<S-ScrollWheelRight>"],
15202764d06aSBram Moolenaar          \ ["\<C-ScrollWheelRight>", "<C-ScrollWheelRight>"]
15212764d06aSBram Moolenaar          \ ]
15222764d06aSBram Moolenaar
15232764d06aSBram Moolenaar    for [code, outstr] in mouse_codes
15242764d06aSBram Moolenaar      exe "normal ggC\<C-K>" . code
15252764d06aSBram Moolenaar      call assert_equal(outstr, getline(1), msg)
15262764d06aSBram Moolenaar    endfor
15272764d06aSBram Moolenaar  endfor
15282764d06aSBram Moolenaar
15292764d06aSBram Moolenaar  let &mouse = save_mouse
15302764d06aSBram Moolenaar  let &term = save_term
15312764d06aSBram Moolenaar  let &ttymouse = save_ttymouse
15322764d06aSBram Moolenaar  set mousetime&
15332764d06aSBram Moolenaar  call test_override('no_query_mouse', 0)
15342764d06aSBram Moolenaar  %bw!
15352764d06aSBram Moolenaarendfunc
15362764d06aSBram Moolenaar
153766761db1SBram Moolenaar" This only checks if the sequence is recognized.
153866761db1SBram Moolenaarfunc Test_term_rgb_response()
153966761db1SBram Moolenaar  set t_RF=x
154066761db1SBram Moolenaar  set t_RB=y
154166761db1SBram Moolenaar
154266761db1SBram Moolenaar  " response to t_RF, 4 digits
154366761db1SBram Moolenaar  let red = 0x12
154466761db1SBram Moolenaar  let green = 0x34
154566761db1SBram Moolenaar  let blue = 0x56
154666761db1SBram Moolenaar  let seq = printf("\<Esc>]10;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
154766761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
154866761db1SBram Moolenaar  call assert_equal(seq, v:termrfgresp)
154966761db1SBram Moolenaar
155066761db1SBram Moolenaar  " response to t_RF, 2 digits
155166761db1SBram Moolenaar  let red = 0x78
155266761db1SBram Moolenaar  let green = 0x9a
155366761db1SBram Moolenaar  let blue = 0xbc
155466761db1SBram Moolenaar  let seq = printf("\<Esc>]10;rgb:%02x/%02x/%02x\x07", red, green, blue)
155566761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
155666761db1SBram Moolenaar  call assert_equal(seq, v:termrfgresp)
155766761db1SBram Moolenaar
155832e19770SBram Moolenaar  " response to t_RB, 4 digits, dark
155932e19770SBram Moolenaar  set background=light
1560ce90e36fSBram Moolenaar  eval 'background'->test_option_not_set()
156132e19770SBram Moolenaar  let red = 0x29
156232e19770SBram Moolenaar  let green = 0x4a
156332e19770SBram Moolenaar  let blue = 0x6b
156432e19770SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
156532e19770SBram Moolenaar  call feedkeys(seq, 'Lx!')
156632e19770SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
156732e19770SBram Moolenaar  call assert_equal('dark', &background)
156832e19770SBram Moolenaar
156932e19770SBram Moolenaar  " response to t_RB, 4 digits, light
157032e19770SBram Moolenaar  set background=dark
157132e19770SBram Moolenaar  call test_option_not_set('background')
157232e19770SBram Moolenaar  let red = 0x81
157332e19770SBram Moolenaar  let green = 0x63
157466761db1SBram Moolenaar  let blue = 0x65
157566761db1SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
157666761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
157766761db1SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
157832e19770SBram Moolenaar  call assert_equal('light', &background)
157966761db1SBram Moolenaar
158032e19770SBram Moolenaar  " response to t_RB, 2 digits, dark
158132e19770SBram Moolenaar  set background=light
158232e19770SBram Moolenaar  call test_option_not_set('background')
158332e19770SBram Moolenaar  let red = 0x47
158432e19770SBram Moolenaar  let green = 0x59
158532e19770SBram Moolenaar  let blue = 0x5b
158666761db1SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
158766761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
158866761db1SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
158932e19770SBram Moolenaar  call assert_equal('dark', &background)
159032e19770SBram Moolenaar
159132e19770SBram Moolenaar  " response to t_RB, 2 digits, light
159232e19770SBram Moolenaar  set background=dark
159332e19770SBram Moolenaar  call test_option_not_set('background')
159432e19770SBram Moolenaar  let red = 0x83
159532e19770SBram Moolenaar  let green = 0xa4
159632e19770SBram Moolenaar  let blue = 0xc2
159732e19770SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
159832e19770SBram Moolenaar  call feedkeys(seq, 'Lx!')
159932e19770SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
160032e19770SBram Moolenaar  call assert_equal('light', &background)
160166761db1SBram Moolenaar
160266761db1SBram Moolenaar  set t_RF= t_RB=
160366761db1SBram Moolenaarendfunc
160466761db1SBram Moolenaar
160566761db1SBram Moolenaar" This only checks if the sequence is recognized.
16061a4cbb19SBram Moolenaar" This must be after other tests, because it has side effects to xterm
16071a4cbb19SBram Moolenaar" properties.
16081a4cbb19SBram Moolenaarfunc Test_xx01_term_style_response()
160966761db1SBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
161066761db1SBram Moolenaar  set t_RV=x
16110c0eddd3SBram Moolenaar  call test_override('term_props', 1)
161266761db1SBram Moolenaar
161366761db1SBram Moolenaar  " send the termresponse to trigger requesting the XT codes
161466761db1SBram Moolenaar  let seq = "\<Esc>[>41;337;0c"
161566761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
161666761db1SBram Moolenaar  call assert_equal(seq, v:termresponse)
161766761db1SBram Moolenaar
161866761db1SBram Moolenaar  let seq = "\<Esc>P1$r2 q\<Esc>\\"
161966761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
162066761db1SBram Moolenaar  call assert_equal(seq, v:termstyleresp)
162166761db1SBram Moolenaar
16220c0eddd3SBram Moolenaar  call assert_equal(#{
16230c0eddd3SBram Moolenaar        \ cursor_style: 'u',
16240c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
16250c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
16260c0eddd3SBram Moolenaar        \ mouse: 's'
16270c0eddd3SBram Moolenaar        \ }, terminalprops())
16280c0eddd3SBram Moolenaar
162966761db1SBram Moolenaar  set t_RV=
16300c0eddd3SBram Moolenaar  call test_override('term_props', 0)
163166761db1SBram Moolenaarendfunc
1632de6dbb45SBram Moolenaar
163389577b3bSBram Moolenaar" This checks the iTerm2 version response.
163489577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
163589577b3bSBram Moolenaar" properties.
163689577b3bSBram Moolenaarfunc Test_xx02_iTerm2_response()
163789577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
163889577b3bSBram Moolenaar  set t_RV=x
16390c0eddd3SBram Moolenaar  call test_override('term_props', 1)
164089577b3bSBram Moolenaar
164189577b3bSBram Moolenaar  " Old versions of iTerm2 used a different style term response.
164289577b3bSBram Moolenaar  set ttymouse=xterm
164389577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
164489577b3bSBram Moolenaar  let seq = "\<Esc>[>0;95;c"
164589577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
164689577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
164789577b3bSBram Moolenaar  call assert_equal('xterm', &ttymouse)
164889577b3bSBram Moolenaar
164989577b3bSBram Moolenaar  set ttymouse=xterm
165089577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
165189577b3bSBram Moolenaar  let seq = "\<Esc>[>0;95;0c"
165289577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
165389577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
165489577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
165589577b3bSBram Moolenaar
16560c0eddd3SBram Moolenaar  call assert_equal(#{
16570c0eddd3SBram Moolenaar        \ cursor_style: 'n',
16580c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
16590c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
16600c0eddd3SBram Moolenaar        \ mouse: 's'
16610c0eddd3SBram Moolenaar        \ }, terminalprops())
16620c0eddd3SBram Moolenaar
166389577b3bSBram Moolenaar  set t_RV=
16640c0eddd3SBram Moolenaar  call test_override('term_props', 0)
166589577b3bSBram Moolenaarendfunc
166689577b3bSBram Moolenaar
16671a4cbb19SBram Moolenaar" This checks the libvterm version response.
16681a4cbb19SBram Moolenaar" This must be after other tests, because it has side effects to xterm
16691a4cbb19SBram Moolenaar" properties.
167089577b3bSBram Moolenaarfunc Test_xx03_libvterm_response()
16711a4cbb19SBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
16721a4cbb19SBram Moolenaar  set t_RV=x
16730c0eddd3SBram Moolenaar  call test_override('term_props', 1)
167403b00476SBram Moolenaar
16751a4cbb19SBram Moolenaar  set ttymouse=xterm
16761a4cbb19SBram Moolenaar  call test_option_not_set('ttymouse')
16771a4cbb19SBram Moolenaar  let seq = "\<Esc>[>0;100;0c"
16781a4cbb19SBram Moolenaar  call feedkeys(seq, 'Lx!')
16791a4cbb19SBram Moolenaar  call assert_equal(seq, v:termresponse)
16801a4cbb19SBram Moolenaar  call assert_equal('sgr', &ttymouse)
16811a4cbb19SBram Moolenaar
16820c0eddd3SBram Moolenaar  call assert_equal(#{
16830c0eddd3SBram Moolenaar        \ cursor_style: 'n',
16840c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
16850c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
16860c0eddd3SBram Moolenaar        \ mouse: 's'
16870c0eddd3SBram Moolenaar        \ }, terminalprops())
16880c0eddd3SBram Moolenaar
16891a4cbb19SBram Moolenaar  set t_RV=
16900c0eddd3SBram Moolenaar  call test_override('term_props', 0)
16911a4cbb19SBram Moolenaarendfunc
16921a4cbb19SBram Moolenaar
169389577b3bSBram Moolenaar" This checks the Mac Terminal.app version response.
169489577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
169589577b3bSBram Moolenaar" properties.
169689577b3bSBram Moolenaarfunc Test_xx04_Mac_Terminal_response()
169789577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
169889577b3bSBram Moolenaar  set t_RV=x
16990c0eddd3SBram Moolenaar  call test_override('term_props', 1)
170089577b3bSBram Moolenaar
170189577b3bSBram Moolenaar  set ttymouse=xterm
17028dff4cbfSBram Moolenaar  " t_8u is not reset
17038dff4cbfSBram Moolenaar  let &t_8u = "\<Esc>[58;2;%lu;%lu;%lum"
170489577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
170589577b3bSBram Moolenaar  let seq = "\<Esc>[>1;95;0c"
170689577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
170789577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
170889577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
170989577b3bSBram Moolenaar
17100c0eddd3SBram Moolenaar  call assert_equal(#{
17110c0eddd3SBram Moolenaar        \ cursor_style: 'n',
17120c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
17130c0eddd3SBram Moolenaar        \ underline_rgb: 'y',
17140c0eddd3SBram Moolenaar        \ mouse: 's'
17150c0eddd3SBram Moolenaar        \ }, terminalprops())
17168dff4cbfSBram Moolenaar  call assert_equal("\<Esc>[58;2;%lu;%lu;%lum", &t_8u)
17170c0eddd3SBram Moolenaar
171889577b3bSBram Moolenaar  " Reset is_not_xterm and is_mac_terminal.
171989577b3bSBram Moolenaar  set t_RV=
172089577b3bSBram Moolenaar  set term=xterm
172189577b3bSBram Moolenaar  set t_RV=x
17220c0eddd3SBram Moolenaar  call test_override('term_props', 0)
172389577b3bSBram Moolenaarendfunc
172489577b3bSBram Moolenaar
172589577b3bSBram Moolenaar" This checks the mintty version response.
172689577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
172789577b3bSBram Moolenaar" properties.
172889577b3bSBram Moolenaarfunc Test_xx05_mintty_response()
172989577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
173089577b3bSBram Moolenaar  set t_RV=x
17310c0eddd3SBram Moolenaar  call test_override('term_props', 1)
173289577b3bSBram Moolenaar
173389577b3bSBram Moolenaar  set ttymouse=xterm
173489577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
173589577b3bSBram Moolenaar  let seq = "\<Esc>[>77;20905;0c"
173689577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
173789577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
173889577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
173989577b3bSBram Moolenaar
17400c0eddd3SBram Moolenaar  call assert_equal(#{
17410c0eddd3SBram Moolenaar        \ cursor_style: 'n',
17420c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
17430c0eddd3SBram Moolenaar        \ underline_rgb: 'y',
17440c0eddd3SBram Moolenaar        \ mouse: 's'
17450c0eddd3SBram Moolenaar        \ }, terminalprops())
17460c0eddd3SBram Moolenaar
174789577b3bSBram Moolenaar  set t_RV=
17480c0eddd3SBram Moolenaar  call test_override('term_props', 0)
174989577b3bSBram Moolenaarendfunc
175089577b3bSBram Moolenaar
175189577b3bSBram Moolenaar" This checks the screen version response.
175289577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
175389577b3bSBram Moolenaar" properties.
175489577b3bSBram Moolenaarfunc Test_xx06_screen_response()
175589577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
175689577b3bSBram Moolenaar  set t_RV=x
17570c0eddd3SBram Moolenaar  call test_override('term_props', 1)
175889577b3bSBram Moolenaar
175989577b3bSBram Moolenaar  " Old versions of screen don't support SGR mouse mode.
176089577b3bSBram Moolenaar  set ttymouse=xterm
176189577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
176289577b3bSBram Moolenaar  let seq = "\<Esc>[>83;40500;0c"
176389577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
176489577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
176589577b3bSBram Moolenaar  call assert_equal('xterm', &ttymouse)
176689577b3bSBram Moolenaar
176789577b3bSBram Moolenaar  " screen supports SGR mouse mode starting in version 4.7.
176889577b3bSBram Moolenaar  set ttymouse=xterm
176989577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
177089577b3bSBram Moolenaar  let seq = "\<Esc>[>83;40700;0c"
177189577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
177289577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
177389577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
177489577b3bSBram Moolenaar
17750c0eddd3SBram Moolenaar  call assert_equal(#{
17760c0eddd3SBram Moolenaar        \ cursor_style: 'n',
17770c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'n',
17780c0eddd3SBram Moolenaar        \ underline_rgb: 'y',
17790c0eddd3SBram Moolenaar        \ mouse: 's'
17800c0eddd3SBram Moolenaar        \ }, terminalprops())
17810c0eddd3SBram Moolenaar
178289577b3bSBram Moolenaar  set t_RV=
17830c0eddd3SBram Moolenaar  call test_override('term_props', 0)
178489577b3bSBram Moolenaarendfunc
178589577b3bSBram Moolenaar
178603b00476SBram Moolenaar" This checks the xterm version response.
178703b00476SBram Moolenaar" This must be after other tests, because it has side effects to xterm
178803b00476SBram Moolenaar" properties.
178989577b3bSBram Moolenaarfunc Test_xx07_xterm_response()
179003b00476SBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
179103b00476SBram Moolenaar  set t_RV=x
17920c0eddd3SBram Moolenaar  call test_override('term_props', 1)
179303b00476SBram Moolenaar
17943cea8a9aSBram Moolenaar  " Do Terminal.app first to check that is_mac_terminal is reset.
17953cea8a9aSBram Moolenaar  set ttymouse=xterm
17963cea8a9aSBram Moolenaar  call test_option_not_set('ttymouse')
17973cea8a9aSBram Moolenaar  let seq = "\<Esc>[>1;95;0c"
17983cea8a9aSBram Moolenaar  call feedkeys(seq, 'Lx!')
17993cea8a9aSBram Moolenaar  call assert_equal(seq, v:termresponse)
18003cea8a9aSBram Moolenaar  call assert_equal('sgr', &ttymouse)
18013cea8a9aSBram Moolenaar
180203b00476SBram Moolenaar  " xterm < 95: "xterm" (actually unmodified)
18033cea8a9aSBram Moolenaar  set t_RV=
18043cea8a9aSBram Moolenaar  set term=xterm
18053cea8a9aSBram Moolenaar  set t_RV=x
180603b00476SBram Moolenaar  set ttymouse=xterm
180703b00476SBram Moolenaar  call test_option_not_set('ttymouse')
180803b00476SBram Moolenaar  let seq = "\<Esc>[>0;94;0c"
180903b00476SBram Moolenaar  call feedkeys(seq, 'Lx!')
181003b00476SBram Moolenaar  call assert_equal(seq, v:termresponse)
181103b00476SBram Moolenaar  call assert_equal('xterm', &ttymouse)
181203b00476SBram Moolenaar
18130c0eddd3SBram Moolenaar  call assert_equal(#{
18140c0eddd3SBram Moolenaar        \ cursor_style: 'n',
18150c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
18160c0eddd3SBram Moolenaar        \ underline_rgb: 'y',
18170c0eddd3SBram Moolenaar        \ mouse: 'u'
18180c0eddd3SBram Moolenaar        \ }, terminalprops())
18190c0eddd3SBram Moolenaar
182003b00476SBram Moolenaar  " xterm >= 95 < 277 "xterm2"
182103b00476SBram Moolenaar  set ttymouse=xterm
182203b00476SBram Moolenaar  call test_option_not_set('ttymouse')
182303b00476SBram Moolenaar  let seq = "\<Esc>[>0;267;0c"
182403b00476SBram Moolenaar  call feedkeys(seq, 'Lx!')
182503b00476SBram Moolenaar  call assert_equal(seq, v:termresponse)
182603b00476SBram Moolenaar  call assert_equal('xterm2', &ttymouse)
182703b00476SBram Moolenaar
18280c0eddd3SBram Moolenaar  call assert_equal(#{
18290c0eddd3SBram Moolenaar        \ cursor_style: 'n',
18300c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
18310c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
18320c0eddd3SBram Moolenaar        \ mouse: '2'
18330c0eddd3SBram Moolenaar        \ }, terminalprops())
18340c0eddd3SBram Moolenaar
183503b00476SBram Moolenaar  " xterm >= 277: "sgr"
183603b00476SBram Moolenaar  set ttymouse=xterm
183703b00476SBram Moolenaar  call test_option_not_set('ttymouse')
183803b00476SBram Moolenaar  let seq = "\<Esc>[>0;277;0c"
183903b00476SBram Moolenaar  call feedkeys(seq, 'Lx!')
184003b00476SBram Moolenaar  call assert_equal(seq, v:termresponse)
184103b00476SBram Moolenaar  call assert_equal('sgr', &ttymouse)
184203b00476SBram Moolenaar
18430c0eddd3SBram Moolenaar  call assert_equal(#{
18440c0eddd3SBram Moolenaar        \ cursor_style: 'n',
18450c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
18460c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
18470c0eddd3SBram Moolenaar        \ mouse: 's'
18480c0eddd3SBram Moolenaar        \ }, terminalprops())
18490c0eddd3SBram Moolenaar
18508dff4cbfSBram Moolenaar  " xterm >= 279: "sgr" and cursor_style not reset; also check t_8u reset
18510c0eddd3SBram Moolenaar  set ttymouse=xterm
18520c0eddd3SBram Moolenaar  call test_option_not_set('ttymouse')
18538dff4cbfSBram Moolenaar  let &t_8u = "\<Esc>[58;2;%lu;%lu;%lum"
18540c0eddd3SBram Moolenaar  let seq = "\<Esc>[>0;279;0c"
18550c0eddd3SBram Moolenaar  call feedkeys(seq, 'Lx!')
18560c0eddd3SBram Moolenaar  call assert_equal(seq, v:termresponse)
18570c0eddd3SBram Moolenaar  call assert_equal('sgr', &ttymouse)
18580c0eddd3SBram Moolenaar
18590c0eddd3SBram Moolenaar  call assert_equal(#{
18600c0eddd3SBram Moolenaar        \ cursor_style: 'u',
18610c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
18620c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
18630c0eddd3SBram Moolenaar        \ mouse: 's'
18640c0eddd3SBram Moolenaar        \ }, terminalprops())
18658dff4cbfSBram Moolenaar  call assert_equal('', &t_8u)
18660c0eddd3SBram Moolenaar
186703b00476SBram Moolenaar  set t_RV=
18680c0eddd3SBram Moolenaar  call test_override('term_props', 0)
186903b00476SBram Moolenaarendfunc
187003b00476SBram Moolenaar
187192e5df80SBram Moolenaarfunc Test_focus_events()
187292e5df80SBram Moolenaar  let save_term = &term
187392e5df80SBram Moolenaar  let save_ttymouse = &ttymouse
187492e5df80SBram Moolenaar  set term=xterm ttymouse=xterm2
187592e5df80SBram Moolenaar
187692e5df80SBram Moolenaar  au FocusGained * let g:focus_gained += 1
187792e5df80SBram Moolenaar  au FocusLost * let g:focus_lost += 1
187892e5df80SBram Moolenaar  let g:focus_gained = 0
187992e5df80SBram Moolenaar  let g:focus_lost = 0
188092e5df80SBram Moolenaar
188192e5df80SBram Moolenaar  call feedkeys("\<Esc>[O", "Lx!")
188292e5df80SBram Moolenaar  call assert_equal(1, g:focus_lost)
188392e5df80SBram Moolenaar  call feedkeys("\<Esc>[I", "Lx!")
188492e5df80SBram Moolenaar  call assert_equal(1, g:focus_gained)
188592e5df80SBram Moolenaar
188692e5df80SBram Moolenaar  " still works when 'ttymouse' is empty
188792e5df80SBram Moolenaar  set ttymouse=
188892e5df80SBram Moolenaar  call feedkeys("\<Esc>[O", "Lx!")
188992e5df80SBram Moolenaar  call assert_equal(2, g:focus_lost)
189092e5df80SBram Moolenaar  call feedkeys("\<Esc>[I", "Lx!")
189192e5df80SBram Moolenaar  call assert_equal(2, g:focus_gained)
189292e5df80SBram Moolenaar
189392e5df80SBram Moolenaar  au! FocusGained
189492e5df80SBram Moolenaar  au! FocusLost
189592e5df80SBram Moolenaar  let &term = save_term
189692e5df80SBram Moolenaar  let &ttymouse = save_ttymouse
189792e5df80SBram Moolenaarendfunc
189892e5df80SBram Moolenaar
1899de6dbb45SBram Moolenaarfunc Test_get_termcode()
1900eb66328bSBram Moolenaar  try
1901de6dbb45SBram Moolenaar    let k1 = &t_k1
1902eb66328bSBram Moolenaar  catch /E113/
1903eb66328bSBram Moolenaar    throw 'Skipped: Unable to query termcodes'
1904eb66328bSBram Moolenaar  endtry
1905de6dbb45SBram Moolenaar  set t_k1=
1906de6dbb45SBram Moolenaar  set t_k1&
1907de6dbb45SBram Moolenaar  call assert_equal(k1, &t_k1)
19089aeb3363SBram Moolenaar
19099aeb3363SBram Moolenaar  " use external termcap first
19109aeb3363SBram Moolenaar  set nottybuiltin
19119aeb3363SBram Moolenaar  set t_k1=
19129aeb3363SBram Moolenaar  set t_k1&
19139aeb3363SBram Moolenaar  " when using external termcap may get something else, but it must not be
19149aeb3363SBram Moolenaar  " empty, since we would fallback to the builtin one.
19159aeb3363SBram Moolenaar  call assert_notequal('', &t_k1)
19169aeb3363SBram Moolenaar
19179aeb3363SBram Moolenaar  if &term =~ 'xterm'
19189aeb3363SBram Moolenaar    " use internal termcap first
19199aeb3363SBram Moolenaar    let term_save = &term
19209aeb3363SBram Moolenaar    let &term = 'builtin_' .. &term
19219aeb3363SBram Moolenaar    set t_k1=
19229aeb3363SBram Moolenaar    set t_k1&
19239aeb3363SBram Moolenaar    call assert_equal(k1, &t_k1)
19249aeb3363SBram Moolenaar    let &term = term_save
19259aeb3363SBram Moolenaar  endif
19269aeb3363SBram Moolenaar
19279aeb3363SBram Moolenaar  set ttybuiltin
1928de6dbb45SBram Moolenaarendfunc
192918a79a68SBram Moolenaar
1930ecd34bf5SBram Moolenaarfunc Test_list_builtin_terminals()
1931e46a2ed0SBram Moolenaar  CheckRunVimInTerminal
19324d05af0aSBram Moolenaar  call RunVimInTerminal('', #{rows: 14})
19334d05af0aSBram Moolenaar  call term_sendkeys('', ":set cmdheight=3\<CR>")
19344d05af0aSBram Moolenaar  call TermWait('', 100)
19354d05af0aSBram Moolenaar  call term_sendkeys('', ":set term=xxx\<CR>")
19364d05af0aSBram Moolenaar  call TermWait('', 100)
19374d05af0aSBram Moolenaar  call assert_match('builtin_dumb', term_getline('', 11))
19384d05af0aSBram Moolenaar  call assert_match('Not found in termcap', term_getline('', 12))
19394d05af0aSBram Moolenaar  call StopVimInTerminal('')
1940ecd34bf5SBram Moolenaarendfunc
1941ecd34bf5SBram Moolenaar
194218a79a68SBram Moolenaarfunc GetEscCodeCSI27(key, modifier)
194318a79a68SBram Moolenaar  let key = printf("%d", char2nr(a:key))
194418a79a68SBram Moolenaar  let mod = printf("%d", a:modifier)
194518a79a68SBram Moolenaar  return "\<Esc>[27;" .. mod .. ';' .. key .. '~'
194618a79a68SBram Moolenaarendfunc
194718a79a68SBram Moolenaar
194818a79a68SBram Moolenaarfunc GetEscCodeCSIu(key, modifier)
194918a79a68SBram Moolenaar  let key = printf("%d", char2nr(a:key))
195018a79a68SBram Moolenaar  let mod = printf("%d", a:modifier)
195118a79a68SBram Moolenaar  return "\<Esc>[" .. key .. ';' .. mod .. 'u'
195218a79a68SBram Moolenaarendfunc
195318a79a68SBram Moolenaar
195418a79a68SBram Moolenaar" This checks the CSI sequences when in modifyOtherKeys mode.
195518a79a68SBram Moolenaar" The mode doesn't need to be enabled, the codes are always detected.
195618a79a68SBram Moolenaarfunc RunTest_modifyOtherKeys(func)
195718a79a68SBram Moolenaar  new
1958459fd785SBram Moolenaar  set timeoutlen=10
195918a79a68SBram Moolenaar
1960f19f8d1aSBram Moolenaar  " Shift-X is sent as 'X' with the shift modifier
196118a79a68SBram Moolenaar  call feedkeys('a' .. a:func('X', 2) .. "\<Esc>", 'Lx!')
196218a79a68SBram Moolenaar  call assert_equal('X', getline(1))
196318a79a68SBram Moolenaar
196418a79a68SBram Moolenaar  " Ctrl-i is Tab
196518a79a68SBram Moolenaar  call setline(1, '')
196618a79a68SBram Moolenaar  call feedkeys('a' .. a:func('i', 5) .. "\<Esc>", 'Lx!')
196718a79a68SBram Moolenaar  call assert_equal("\t", getline(1))
196818a79a68SBram Moolenaar
196918a79a68SBram Moolenaar  " Ctrl-I is also Tab
197018a79a68SBram Moolenaar  call setline(1, '')
197118a79a68SBram Moolenaar  call feedkeys('a' .. a:func('I', 5) .. "\<Esc>", 'Lx!')
197218a79a68SBram Moolenaar  call assert_equal("\t", getline(1))
197318a79a68SBram Moolenaar
197418a79a68SBram Moolenaar  " Alt-x is ø
197518a79a68SBram Moolenaar  call setline(1, '')
197618a79a68SBram Moolenaar  call feedkeys('a' .. a:func('x', 3) .. "\<Esc>", 'Lx!')
197718a79a68SBram Moolenaar  call assert_equal("ø", getline(1))
197818a79a68SBram Moolenaar
197918a79a68SBram Moolenaar  " Meta-x is also ø
198018a79a68SBram Moolenaar  call setline(1, '')
198118a79a68SBram Moolenaar  call feedkeys('a' .. a:func('x', 9) .. "\<Esc>", 'Lx!')
198218a79a68SBram Moolenaar  call assert_equal("ø", getline(1))
198318a79a68SBram Moolenaar
198418a79a68SBram Moolenaar  " Alt-X is Ø
198518a79a68SBram Moolenaar  call setline(1, '')
198618a79a68SBram Moolenaar  call feedkeys('a' .. a:func('X', 3) .. "\<Esc>", 'Lx!')
198718a79a68SBram Moolenaar  call assert_equal("Ø", getline(1))
198818a79a68SBram Moolenaar
198918a79a68SBram Moolenaar  " Meta-X is ø
199018a79a68SBram Moolenaar  call setline(1, '')
199118a79a68SBram Moolenaar  call feedkeys('a' .. a:func('X', 9) .. "\<Esc>", 'Lx!')
199218a79a68SBram Moolenaar  call assert_equal("Ø", getline(1))
199318a79a68SBram Moolenaar
1994828ffd59SBram Moolenaar  " Ctrl-6 is Ctrl-^
1995828ffd59SBram Moolenaar  split aaa
1996828ffd59SBram Moolenaar  edit bbb
1997828ffd59SBram Moolenaar  call feedkeys(a:func('6', 5), 'Lx!')
1998828ffd59SBram Moolenaar  call assert_equal("aaa", bufname())
1999828ffd59SBram Moolenaar  bwipe aaa
2000828ffd59SBram Moolenaar  bwipe bbb
2001828ffd59SBram Moolenaar
20020684e36aSBram Moolenaar  " Ctrl-V X 33 is 3
20030684e36aSBram Moolenaar  call setline(1, '')
20040684e36aSBram Moolenaar  call feedkeys("a\<C-V>" .. a:func('X', 2) .. "33\<Esc>", 'Lx!')
20050684e36aSBram Moolenaar  call assert_equal("3", getline(1))
20060684e36aSBram Moolenaar
20070684e36aSBram Moolenaar  " Ctrl-V U 12345 is Unicode 12345
20080684e36aSBram Moolenaar  call setline(1, '')
20090684e36aSBram Moolenaar  call feedkeys("a\<C-V>" .. a:func('U', 2) .. "12345\<Esc>", 'Lx!')
20100684e36aSBram Moolenaar  call assert_equal("\U12345", getline(1))
20110684e36aSBram Moolenaar
201218a79a68SBram Moolenaar  bwipe!
201318a79a68SBram Moolenaar  set timeoutlen&
201418a79a68SBram Moolenaarendfunc
201518a79a68SBram Moolenaar
2016459fd785SBram Moolenaarfunc Test_modifyOtherKeys_basic()
201718a79a68SBram Moolenaar  call RunTest_modifyOtherKeys(function('GetEscCodeCSI27'))
201818a79a68SBram Moolenaar  call RunTest_modifyOtherKeys(function('GetEscCodeCSIu'))
201918a79a68SBram Moolenaarendfunc
2020d1e2f398SBram Moolenaar
202138571a04SBram Moolenaarfunc Test_modifyOtherKeys_no_mapping()
202238571a04SBram Moolenaar  set timeoutlen=10
202338571a04SBram Moolenaar
202438571a04SBram Moolenaar  let @a = 'aaa'
202538571a04SBram Moolenaar  call feedkeys(":let x = '" .. GetEscCodeCSI27('R', 5) .. GetEscCodeCSI27('R', 5) .. "a'\<CR>", 'Lx!')
202638571a04SBram Moolenaar  call assert_equal("let x = 'aaa'", @:)
202738571a04SBram Moolenaar
202838571a04SBram Moolenaar  new
202938571a04SBram Moolenaar  call feedkeys("a" .. GetEscCodeCSI27('R', 5) .. GetEscCodeCSI27('R', 5) .. "a\<Esc>", 'Lx!')
203038571a04SBram Moolenaar  call assert_equal("aaa", getline(1))
203138571a04SBram Moolenaar  bwipe!
203238571a04SBram Moolenaar
203338571a04SBram Moolenaar  new
203438571a04SBram Moolenaar  call feedkeys("axx\<CR>yy" .. GetEscCodeCSI27('G', 5) .. GetEscCodeCSI27('K', 5) .. "a\<Esc>", 'Lx!')
203538571a04SBram Moolenaar  call assert_equal("axx", getline(1))
203638571a04SBram Moolenaar  call assert_equal("yy", getline(2))
203738571a04SBram Moolenaar  bwipe!
203838571a04SBram Moolenaar
203938571a04SBram Moolenaar  set timeoutlen&
204038571a04SBram Moolenaarendfunc
204138571a04SBram Moolenaar
2042d1e2f398SBram Moolenaarfunc RunTest_mapping_shift(key, func)
2043d1e2f398SBram Moolenaar  call setline(1, '')
2044d1e2f398SBram Moolenaar  if a:key == '|'
2045d1e2f398SBram Moolenaar    exe 'inoremap \| xyz'
2046d1e2f398SBram Moolenaar  else
2047d1e2f398SBram Moolenaar    exe 'inoremap ' .. a:key .. ' xyz'
2048d1e2f398SBram Moolenaar  endif
2049d1e2f398SBram Moolenaar  call feedkeys('a' .. a:func(a:key, 2) .. "\<Esc>", 'Lx!')
2050d1e2f398SBram Moolenaar  call assert_equal("xyz", getline(1))
2051d1e2f398SBram Moolenaar  if a:key == '|'
2052d1e2f398SBram Moolenaar    exe 'iunmap \|'
2053d1e2f398SBram Moolenaar  else
2054d1e2f398SBram Moolenaar    exe 'iunmap ' .. a:key
2055d1e2f398SBram Moolenaar  endif
2056d1e2f398SBram Moolenaarendfunc
2057d1e2f398SBram Moolenaar
2058975a880aSBram Moolenaarfunc Test_modifyOtherKeys_mapped()
2059975a880aSBram Moolenaar  set timeoutlen=10
2060975a880aSBram Moolenaar  imap ' <C-W>
2061975a880aSBram Moolenaar  imap <C-W><C-A> c-a
2062975a880aSBram Moolenaar  call setline(1, '')
2063975a880aSBram Moolenaar
2064975a880aSBram Moolenaar  " single quote is turned into single byte CTRL-W
2065975a880aSBram Moolenaar  " CTRL-A is added with a separate modifier, and needs to be simplified before
2066975a880aSBram Moolenaar  " the mapping can match.
2067975a880aSBram Moolenaar  call feedkeys("a'" .. GetEscCodeCSI27('A', 5) .. "\<Esc>", 'Lx!')
2068975a880aSBram Moolenaar  call assert_equal('c-a', getline(1))
2069975a880aSBram Moolenaar
2070975a880aSBram Moolenaar  iunmap '
2071975a880aSBram Moolenaar  iunmap <C-W><C-A>
2072975a880aSBram Moolenaar  set timeoutlen&
2073975a880aSBram Moolenaarendfunc
2074975a880aSBram Moolenaar
2075749bc952SBram Moolenaar" Whether Shift-Tab sends "ESC [ Z" or "ESC [ 27 ; 2 ; 9 ~" is unpredictable,
2076749bc952SBram Moolenaar" both should work.
2077749bc952SBram Moolenaarfunc Test_modifyOtherKeys_shift_tab()
2078749bc952SBram Moolenaar  set timeoutlen=10
2079749bc952SBram Moolenaar
2080749bc952SBram Moolenaar  call setline(1, '')
2081749bc952SBram Moolenaar  call feedkeys("a\<C-K>" .. GetEscCodeCSI27("\t", '2') .. "\<Esc>", 'Lx!')
2082749bc952SBram Moolenaar  eval getline(1)->assert_equal('<S-Tab>')
2083749bc952SBram Moolenaar
2084749bc952SBram Moolenaar  call setline(1, '')
2085749bc952SBram Moolenaar  call feedkeys("a\<C-K>\<Esc>[Z\<Esc>", 'Lx!')
2086749bc952SBram Moolenaar  eval getline(1)->assert_equal('<S-Tab>')
2087749bc952SBram Moolenaar
2088749bc952SBram Moolenaar  set timeoutlen&
2089749bc952SBram Moolenaar  bwipe!
2090749bc952SBram Moolenaarendfunc
2091749bc952SBram Moolenaar
2092d1e2f398SBram Moolenaarfunc RunTest_mapping_works_with_shift(func)
2093d1e2f398SBram Moolenaar  new
2094459fd785SBram Moolenaar  set timeoutlen=10
2095d1e2f398SBram Moolenaar
2096d1e2f398SBram Moolenaar  call RunTest_mapping_shift('@', a:func)
2097d1e2f398SBram Moolenaar  call RunTest_mapping_shift('A', a:func)
2098d1e2f398SBram Moolenaar  call RunTest_mapping_shift('Z', a:func)
2099d1e2f398SBram Moolenaar  call RunTest_mapping_shift('^', a:func)
2100d1e2f398SBram Moolenaar  call RunTest_mapping_shift('_', a:func)
2101d1e2f398SBram Moolenaar  call RunTest_mapping_shift('{', a:func)
2102d1e2f398SBram Moolenaar  call RunTest_mapping_shift('|', a:func)
2103d1e2f398SBram Moolenaar  call RunTest_mapping_shift('}', a:func)
2104d1e2f398SBram Moolenaar  call RunTest_mapping_shift('~', a:func)
2105d1e2f398SBram Moolenaar
2106d1e2f398SBram Moolenaar  bwipe!
2107d1e2f398SBram Moolenaar  set timeoutlen&
2108d1e2f398SBram Moolenaarendfunc
2109d1e2f398SBram Moolenaar
2110459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_plain()
2111d1e2f398SBram Moolenaar  call RunTest_mapping_works_with_shift(function('GetEscCodeCSI27'))
2112d1e2f398SBram Moolenaar  call RunTest_mapping_works_with_shift(function('GetEscCodeCSIu'))
2113d1e2f398SBram Moolenaarendfunc
2114459fd785SBram Moolenaar
2115459fd785SBram Moolenaarfunc RunTest_mapping_mods(map, key, func, code)
2116459fd785SBram Moolenaar  call setline(1, '')
2117459fd785SBram Moolenaar  exe 'inoremap ' .. a:map .. ' xyz'
2118459fd785SBram Moolenaar  call feedkeys('a' .. a:func(a:key, a:code) .. "\<Esc>", 'Lx!')
2119459fd785SBram Moolenaar  call assert_equal("xyz", getline(1))
2120459fd785SBram Moolenaar  exe 'iunmap ' .. a:map
2121459fd785SBram Moolenaarendfunc
2122459fd785SBram Moolenaar
2123459fd785SBram Moolenaarfunc RunTest_mapping_works_with_mods(func, mods, code)
2124459fd785SBram Moolenaar  new
2125459fd785SBram Moolenaar  set timeoutlen=10
2126459fd785SBram Moolenaar
2127459fd785SBram Moolenaar  if a:mods !~ 'S'
2128459fd785SBram Moolenaar    " Shift by itself has no effect
2129459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-@>', '@', a:func, a:code)
2130459fd785SBram Moolenaar  endif
2131459fd785SBram Moolenaar  call RunTest_mapping_mods('<' .. a:mods .. '-A>', 'A', a:func, a:code)
2132459fd785SBram Moolenaar  call RunTest_mapping_mods('<' .. a:mods .. '-Z>', 'Z', a:func, a:code)
2133459fd785SBram Moolenaar  if a:mods !~ 'S'
2134459fd785SBram Moolenaar    " with Shift code is always upper case
2135459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-a>', 'a', a:func, a:code)
2136459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-z>', 'z', a:func, a:code)
2137459fd785SBram Moolenaar  endif
2138459fd785SBram Moolenaar  if a:mods != 'A'
2139459fd785SBram Moolenaar    " with Alt code is not in upper case
2140459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-a>', 'A', a:func, a:code)
2141459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-z>', 'Z', a:func, a:code)
2142459fd785SBram Moolenaar  endif
2143459fd785SBram Moolenaar  call RunTest_mapping_mods('<' .. a:mods .. '-á>', 'á', a:func, a:code)
2144459fd785SBram Moolenaar  if a:mods !~ 'S'
2145459fd785SBram Moolenaar    " Shift by itself has no effect
2146459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-^>', '^', a:func, a:code)
2147459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-_>', '_', a:func, a:code)
2148459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-{>', '{', a:func, a:code)
2149459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-\|>', '|', a:func, a:code)
2150459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-}>', '}', a:func, a:code)
2151459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-~>', '~', a:func, a:code)
2152459fd785SBram Moolenaar  endif
2153459fd785SBram Moolenaar
2154459fd785SBram Moolenaar  bwipe!
2155459fd785SBram Moolenaar  set timeoutlen&
2156459fd785SBram Moolenaarendfunc
2157459fd785SBram Moolenaar
2158459fd785SBram Moolenaarfunc Test_mapping_works_with_shift()
2159459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'S', 2)
2160459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'S', 2)
2161459fd785SBram Moolenaarendfunc
2162459fd785SBram Moolenaar
2163459fd785SBram Moolenaarfunc Test_mapping_works_with_ctrl()
2164459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C', 5)
2165459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C', 5)
21664e2114e9SBram Moolenaar
21674e2114e9SBram Moolenaar  new
21684e2114e9SBram Moolenaar  set timeoutlen=10
21694e2114e9SBram Moolenaar
21704e2114e9SBram Moolenaar  " CTRL-@ actually produces the code for CTRL-2, which is converted
21714e2114e9SBram Moolenaar  call RunTest_mapping_mods('<C-@>', '2', function('GetEscCodeCSI27'), 5)
21724e2114e9SBram Moolenaar  call RunTest_mapping_mods('<C-@>', '2', function('GetEscCodeCSIu'), 5)
21734e2114e9SBram Moolenaar
21744e2114e9SBram Moolenaar  " CTRL-^ actually produces the code for CTRL-6, which is converted
21754e2114e9SBram Moolenaar  call RunTest_mapping_mods('<C-^>', '6', function('GetEscCodeCSI27'), 5)
21764e2114e9SBram Moolenaar  call RunTest_mapping_mods('<C-^>', '6', function('GetEscCodeCSIu'), 5)
21774e2114e9SBram Moolenaar
21784e2114e9SBram Moolenaar  " CTRL-_ actually produces the code for CTRL--, which is converted
21794e2114e9SBram Moolenaar  call RunTest_mapping_mods('<C-_>', '-', function('GetEscCodeCSI27'), 5)
21804e2114e9SBram Moolenaar  call RunTest_mapping_mods('<C-_>', '-', function('GetEscCodeCSIu'), 5)
21814e2114e9SBram Moolenaar
21824e2114e9SBram Moolenaar  bwipe!
21834e2114e9SBram Moolenaar  set timeoutlen&
2184459fd785SBram Moolenaarendfunc
2185459fd785SBram Moolenaar
2186459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_ctrl()
2187459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-S', 6)
2188459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-S', 6)
21899a033d7bSBram Moolenaar
21909a033d7bSBram Moolenaar  new
21919a033d7bSBram Moolenaar  set timeoutlen=10
21929a033d7bSBram Moolenaar
21939a033d7bSBram Moolenaar  " Ctrl-Shift-[ actually produces CTRL-Shift-{ which is mapped as <C-{>
21949a033d7bSBram Moolenaar  call RunTest_mapping_mods('<C-{>', '{', function('GetEscCodeCSI27'), 6)
21959a033d7bSBram Moolenaar  call RunTest_mapping_mods('<C-{>', '{', function('GetEscCodeCSIu'), 6)
21969a033d7bSBram Moolenaar
21979a033d7bSBram Moolenaar  " Ctrl-Shift-] actually produces CTRL-Shift-} which is mapped as <C-}>
21989a033d7bSBram Moolenaar  call RunTest_mapping_mods('<C-{>', '{', function('GetEscCodeCSI27'), 6)
21999a033d7bSBram Moolenaar  call RunTest_mapping_mods('<C-{>', '{', function('GetEscCodeCSIu'), 6)
22009a033d7bSBram Moolenaar
22019a033d7bSBram Moolenaar  " Ctrl-Shift-\ actually produces CTRL-Shift-| which is mapped as <C-|>
22029a033d7bSBram Moolenaar  call RunTest_mapping_mods('<C-\|>', '|', function('GetEscCodeCSI27'), 6)
22039a033d7bSBram Moolenaar  call RunTest_mapping_mods('<C-\|>', '|', function('GetEscCodeCSIu'), 6)
22049a033d7bSBram Moolenaar
22059a033d7bSBram Moolenaar  bwipe!
22069a033d7bSBram Moolenaar  set timeoutlen&
2207459fd785SBram Moolenaarendfunc
2208459fd785SBram Moolenaar
2209459fd785SBram Moolenaar" Below we also test the "u" code with Alt, This works, but libvterm would not
2210459fd785SBram Moolenaar" send the Alt key like this but by prefixing an Esc.
2211459fd785SBram Moolenaar
2212459fd785SBram Moolenaarfunc Test_mapping_works_with_alt()
2213459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'A', 3)
2214459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'A', 3)
2215459fd785SBram Moolenaarendfunc
2216459fd785SBram Moolenaar
2217459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_alt()
2218459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'S-A', 4)
2219459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'S-A', 4)
2220459fd785SBram Moolenaarendfunc
2221459fd785SBram Moolenaar
2222daff0fb7SBram Moolenaarfunc Test_mapping_works_with_alt_and_shift()
2223daff0fb7SBram Moolenaar  new
2224daff0fb7SBram Moolenaar  set timeoutlen=10
2225daff0fb7SBram Moolenaar
2226daff0fb7SBram Moolenaar  " mapping <A-?> works even though the code is A-S-?
2227daff0fb7SBram Moolenaar  for c in ['!', '$', '+', ':', '?', '^', '~']
2228daff0fb7SBram Moolenaar    call RunTest_mapping_mods('<A-' .. c .. '>', c, function('GetEscCodeCSI27'), 4)
2229daff0fb7SBram Moolenaar    call RunTest_mapping_mods('<A-' .. c .. '>', c, function('GetEscCodeCSIu'), 4)
2230daff0fb7SBram Moolenaar  endfor
2231daff0fb7SBram Moolenaar
2232daff0fb7SBram Moolenaar  bwipe!
2233daff0fb7SBram Moolenaar  set timeoutlen&
2234daff0fb7SBram Moolenaarendfunc
2235daff0fb7SBram Moolenaar
2236459fd785SBram Moolenaarfunc Test_mapping_works_with_ctrl_alt()
2237459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-A', 7)
2238459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-A', 7)
2239459fd785SBram Moolenaarendfunc
2240459fd785SBram Moolenaar
2241459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_ctrl_alt()
2242459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-S-A', 8)
2243459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-S-A', 8)
2244459fd785SBram Moolenaarendfunc
2245fc4ea2a7SBram Moolenaar
2246fc4ea2a7SBram Moolenaarfunc Test_insert_literal()
2247fc4ea2a7SBram Moolenaar  set timeoutlen=10
2248fc4ea2a7SBram Moolenaar  new
2249fc4ea2a7SBram Moolenaar  " CTRL-V CTRL-X inserts a ^X
2250fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSIu('V', '5') .. GetEscCodeCSIu('X', '5') .. "\<Esc>", 'Lx!')
2251fc4ea2a7SBram Moolenaar  call assert_equal("\<C-X>", getline(1))
2252fc4ea2a7SBram Moolenaar
2253fc4ea2a7SBram Moolenaar  call setline(1, '')
2254fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSI27('V', '5') .. GetEscCodeCSI27('X', '5') .. "\<Esc>", 'Lx!')
2255fc4ea2a7SBram Moolenaar  call assert_equal("\<C-X>", getline(1))
2256fc4ea2a7SBram Moolenaar
2257f19f8d1aSBram Moolenaar  " CTRL-SHIFT-V CTRL-X inserts escape sequence
2258fc4ea2a7SBram Moolenaar  call setline(1, '')
2259fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSIu('V', '6') .. GetEscCodeCSIu('X', '5') .. "\<Esc>", 'Lx!')
2260fc4ea2a7SBram Moolenaar  call assert_equal("\<Esc>[88;5u", getline(1))
2261fc4ea2a7SBram Moolenaar
2262fc4ea2a7SBram Moolenaar  call setline(1, '')
2263fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSI27('V', '6') .. GetEscCodeCSI27('X', '5') .. "\<Esc>", 'Lx!')
2264fc4ea2a7SBram Moolenaar  call assert_equal("\<Esc>[27;5;88~", getline(1))
2265fc4ea2a7SBram Moolenaar
2266fc4ea2a7SBram Moolenaar  bwipe!
2267fc4ea2a7SBram Moolenaar  set timeoutlen&
2268fc4ea2a7SBram Moolenaarendfunc
2269fc4ea2a7SBram Moolenaar
2270fc4ea2a7SBram Moolenaarfunc Test_cmdline_literal()
2271fc4ea2a7SBram Moolenaar  set timeoutlen=10
2272fc4ea2a7SBram Moolenaar
2273fc4ea2a7SBram Moolenaar  " CTRL-V CTRL-Y inserts a ^Y
2274fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSIu('V', '5') .. GetEscCodeCSIu('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2275fc4ea2a7SBram Moolenaar  call assert_equal("\"\<C-Y>", @:)
2276fc4ea2a7SBram Moolenaar
2277fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSI27('V', '5') .. GetEscCodeCSI27('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2278fc4ea2a7SBram Moolenaar  call assert_equal("\"\<C-Y>", @:)
2279fc4ea2a7SBram Moolenaar
2280f19f8d1aSBram Moolenaar  " CTRL-SHIFT-V CTRL-Y inserts escape sequence
2281fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSIu('V', '6') .. GetEscCodeCSIu('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2282fc4ea2a7SBram Moolenaar  call assert_equal("\"\<Esc>[89;5u", @:)
2283fc4ea2a7SBram Moolenaar
2284fc4ea2a7SBram Moolenaar  call setline(1, '')
2285fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSI27('V', '6') .. GetEscCodeCSI27('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2286fc4ea2a7SBram Moolenaar  call assert_equal("\"\<Esc>[27;5;89~", @:)
2287fc4ea2a7SBram Moolenaar
2288fc4ea2a7SBram Moolenaar  set timeoutlen&
2289fc4ea2a7SBram Moolenaarendfunc
22900eabd4dcSBram Moolenaar
22910ff5dedfSBram Moolenaar" Test for translation of special key codes (<xF1>, <xF2>, etc.)
229292e5df80SBram Moolenaarfunc Test_Keycode_Translation()
22930ff5dedfSBram Moolenaar  let keycodes = [
22940ff5dedfSBram Moolenaar        \ ["<xUp>", "<Up>"],
22950ff5dedfSBram Moolenaar        \ ["<xDown>", "<Down>"],
22960ff5dedfSBram Moolenaar        \ ["<xLeft>", "<Left>"],
22970ff5dedfSBram Moolenaar        \ ["<xRight>", "<Right>"],
22980ff5dedfSBram Moolenaar        \ ["<xHome>", "<Home>"],
22990ff5dedfSBram Moolenaar        \ ["<xEnd>", "<End>"],
23000ff5dedfSBram Moolenaar        \ ["<zHome>", "<Home>"],
23010ff5dedfSBram Moolenaar        \ ["<zEnd>", "<End>"],
23020ff5dedfSBram Moolenaar        \ ["<xF1>", "<F1>"],
23030ff5dedfSBram Moolenaar        \ ["<xF2>", "<F2>"],
23040ff5dedfSBram Moolenaar        \ ["<xF3>", "<F3>"],
23050ff5dedfSBram Moolenaar        \ ["<xF4>", "<F4>"],
23060ff5dedfSBram Moolenaar        \ ["<S-xF1>", "<S-F1>"],
23070ff5dedfSBram Moolenaar        \ ["<S-xF2>", "<S-F2>"],
23080ff5dedfSBram Moolenaar        \ ["<S-xF3>", "<S-F3>"],
23090ff5dedfSBram Moolenaar        \ ["<S-xF4>", "<S-F4>"]]
23100ff5dedfSBram Moolenaar  for [k1, k2] in keycodes
23110ff5dedfSBram Moolenaar    exe "nnoremap " .. k1 .. " 2wx"
23120ff5dedfSBram Moolenaar    call assert_true(maparg(k1, 'n', 0, 1).lhs == k2)
23130ff5dedfSBram Moolenaar    exe "nunmap " .. k1
23140ff5dedfSBram Moolenaar  endfor
23150ff5dedfSBram Moolenaarendfunc
23160ff5dedfSBram Moolenaar
23171f448d90SBram Moolenaar" Test for terminal keycodes that doesn't have termcap entries
23181f448d90SBram Moolenaarfunc Test_special_term_keycodes()
23191f448d90SBram Moolenaar  new
23201f448d90SBram Moolenaar  " Test for <xHome>, <S-xHome> and <C-xHome>
23211f448d90SBram Moolenaar  " send <K_SPECIAL> <KS_EXTRA> keycode
23221f448d90SBram Moolenaar  call feedkeys("i\<C-K>\x80\xfd\x3f\n", 'xt')
23231f448d90SBram Moolenaar  " send <K_SPECIAL> <KS_MODIFIER> bitmap <K_SPECIAL> <KS_EXTRA> keycode
23241f448d90SBram Moolenaar  call feedkeys("i\<C-K>\x80\xfc\x2\x80\xfd\x3f\n", 'xt')
23251f448d90SBram Moolenaar  call feedkeys("i\<C-K>\x80\xfc\x4\x80\xfd\x3f\n", 'xt')
23261f448d90SBram Moolenaar  " Test for <xEnd>, <S-xEnd> and <C-xEnd>
23271f448d90SBram Moolenaar  call feedkeys("i\<C-K>\x80\xfd\x3d\n", 'xt')
23281f448d90SBram Moolenaar  call feedkeys("i\<C-K>\x80\xfc\x2\x80\xfd\x3d\n", 'xt')
23291f448d90SBram Moolenaar  call feedkeys("i\<C-K>\x80\xfc\x4\x80\xfd\x3d\n", 'xt')
23301f448d90SBram Moolenaar  " Test for <zHome>, <S-zHome> and <C-zHome>
23311f448d90SBram Moolenaar  call feedkeys("i\<C-K>\x80\xfd\x40\n", 'xt')
23321f448d90SBram Moolenaar  call feedkeys("i\<C-K>\x80\xfc\x2\x80\xfd\x40\n", 'xt')
23331f448d90SBram Moolenaar  call feedkeys("i\<C-K>\x80\xfc\x4\x80\xfd\x40\n", 'xt')
23341f448d90SBram Moolenaar  " Test for <zEnd>, <S-zEnd> and <C-zEnd>
23351f448d90SBram Moolenaar  call feedkeys("i\<C-K>\x80\xfd\x3e\n", 'xt')
23361f448d90SBram Moolenaar  call feedkeys("i\<C-K>\x80\xfc\x2\x80\xfd\x3e\n", 'xt')
23371f448d90SBram Moolenaar  call feedkeys("i\<C-K>\x80\xfc\x4\x80\xfd\x3e\n", 'xt')
23381f448d90SBram Moolenaar  " Test for <xUp>, <xDown>, <xLeft> and <xRight>
23391f448d90SBram Moolenaar  call feedkeys("i\<C-K>\x80\xfd\x41\n", 'xt')
23401f448d90SBram Moolenaar  call feedkeys("i\<C-K>\x80\xfd\x42\n", 'xt')
23411f448d90SBram Moolenaar  call feedkeys("i\<C-K>\x80\xfd\x43\n", 'xt')
23421f448d90SBram Moolenaar  call feedkeys("i\<C-K>\x80\xfd\x44\n", 'xt')
23431f448d90SBram Moolenaar  call assert_equal(['<Home>', '<S-Home>', '<C-Home>',
23441f448d90SBram Moolenaar        \ '<End>', '<S-End>', '<C-End>',
23451f448d90SBram Moolenaar        \ '<Home>', '<S-Home>', '<C-Home>',
23461f448d90SBram Moolenaar        \ '<End>', '<S-End>', '<C-End>',
23471f448d90SBram Moolenaar        \ '<Up>', '<Down>', '<Left>', '<Right>', ''], getline(1, '$'))
23481f448d90SBram Moolenaar  bw!
23491f448d90SBram Moolenaarendfunc
23501f448d90SBram Moolenaar
2351*0f5575d0SBram Moolenaarfunc Test_terminal_builtin_without_gui()
2352*0f5575d0SBram Moolenaar  CheckNotMSWindows
2353*0f5575d0SBram Moolenaar
2354*0f5575d0SBram Moolenaar  " builtin_gui should not be output by :set term=xxx
2355*0f5575d0SBram Moolenaar  let output = systemlist("TERM=dumb " .. v:progpath .. " --clean -c ':set t_ti= t_te=' -c 'set term=xxx' -c ':q!'")
2356*0f5575d0SBram Moolenaar  redraw!
2357*0f5575d0SBram Moolenaar  call map(output, {_, val -> trim(val)})
2358*0f5575d0SBram Moolenaar  call assert_equal(-1, index(output, 'builtin_gui'))
2359*0f5575d0SBram Moolenaar  call assert_notequal(-1, index(output, 'builtin_dumb'))
2360*0f5575d0SBram Moolenaarendfunc
2361*0f5575d0SBram Moolenaar
2362*0f5575d0SBram Moolenaar
23630eabd4dcSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
2364