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
11*e46a2ed0SBram 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    return
274297bec07SBram Moolenaar  endif
275297bec07SBram Moolenaar  new
276297bec07SBram Moolenaar  let save_mouse = &mouse
277297bec07SBram Moolenaar  let save_term = &term
278297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
279297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
280297bec07SBram Moolenaar  set mouse=a term=xterm
281297bec07SBram Moolenaar
282297bec07SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
283297bec07SBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
284297bec07SBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
285297bec07SBram Moolenaar    call setline(1, ['123456789', '123456789'])
286297bec07SBram Moolenaar
287297bec07SBram Moolenaar    " Clicking middle mouse in visual mode, yanks the selection and pastes it
288297bec07SBram Moolenaar    call cursor(1, 1)
289297bec07SBram Moolenaar    call feedkeys("v3l" ..
290297bec07SBram Moolenaar          \ MouseMiddleClickCode(2, 7) .. MouseMiddleReleaseCode(2, 7), 'Lx!')
291297bec07SBram Moolenaar    call assert_equal(['123456789', '1234561234789'],
292297bec07SBram Moolenaar          \ getline(1, '$'), msg)
293297bec07SBram Moolenaar  endfor
294297bec07SBram Moolenaar
295297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
296297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
297297bec07SBram Moolenaar  let &term = save_term
298297bec07SBram Moolenaar  let &mouse = save_mouse
299297bec07SBram Moolenaar  close!
300297bec07SBram Moolenaarendfunc
301297bec07SBram Moolenaar
302297bec07SBram Moolenaarfunc Test_term_mouse_middle_click_insert_mode()
303297bec07SBram Moolenaar  CheckFeature clipboard_working
304297bec07SBram Moolenaar
305297bec07SBram Moolenaar  new
306297bec07SBram Moolenaar  let save_mouse = &mouse
307297bec07SBram Moolenaar  let save_term = &term
308297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
309297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
310297bec07SBram Moolenaar  set mouse=a term=xterm
311297bec07SBram Moolenaar
312297bec07SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
313297bec07SBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
314297bec07SBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
315297bec07SBram Moolenaar    call setline(1, ['123456789', '123456789'])
316297bec07SBram Moolenaar    let @* = 'abc'
317297bec07SBram Moolenaar
318297bec07SBram Moolenaar    " Middle-click in inesrt mode doesn't move the cursor but inserts the
319297bec07SBram Moolenaar    " contents of aregister
320297bec07SBram Moolenaar    call cursor(1, 4)
321297bec07SBram Moolenaar    call feedkeys('i' ..
322297bec07SBram Moolenaar          \ MouseMiddleClickCode(2, 7) .. MouseMiddleReleaseCode(2, 7) ..
323297bec07SBram Moolenaar          \ "\<C-C>", 'Lx!')
324297bec07SBram Moolenaar    call assert_equal(['123abc456789', '123456789'],
325297bec07SBram Moolenaar          \ getline(1, '$'), msg)
3262764d06aSBram Moolenaar    call assert_equal([1, 6], [line('.'), col('.')], msg)
327297bec07SBram Moolenaar
328297bec07SBram Moolenaar    " Middle-click in replace mode
329297bec07SBram Moolenaar    call cursor(1, 1)
330297bec07SBram Moolenaar    call feedkeys('$R' ..
331297bec07SBram Moolenaar          \ MouseMiddleClickCode(2, 7) .. MouseMiddleReleaseCode(2, 7) ..
332297bec07SBram Moolenaar          \ "\<C-C>", 'Lx!')
333297bec07SBram Moolenaar    call assert_equal(['123abc45678abc', '123456789'],
334297bec07SBram Moolenaar          \ getline(1, '$'), msg)
3352764d06aSBram Moolenaar    call assert_equal([1, 14], [line('.'), col('.')], msg)
336297bec07SBram Moolenaar  endfor
337297bec07SBram Moolenaar
338297bec07SBram Moolenaar  let &mouse = save_mouse
339297bec07SBram Moolenaar  let &term = save_term
340297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
341297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
342297bec07SBram Moolenaar  close!
343297bec07SBram Moolenaarendfunc
344297bec07SBram Moolenaar
345297bec07SBram Moolenaar" Test for switching window using mouse in insert mode
346297bec07SBram Moolenaarfunc Test_term_mouse_switch_win_insert_mode()
347297bec07SBram Moolenaar  5new
348297bec07SBram Moolenaar  let save_mouse = &mouse
349297bec07SBram Moolenaar  let save_term = &term
350297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
351297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
352297bec07SBram Moolenaar  set mouse=a term=xterm ttymouse=xterm2
353297bec07SBram Moolenaar
354297bec07SBram Moolenaar  call feedkeys('ivim' ..
355297bec07SBram Moolenaar        \ MouseLeftClickCode(8, 6) .. MouseLeftReleaseCode(8, 6) ..
356297bec07SBram Moolenaar        \ "\<C-C>", 'Lx!')
357297bec07SBram Moolenaar  call assert_equal(2, winnr())
358297bec07SBram Moolenaar  wincmd w
359297bec07SBram Moolenaar  call assert_equal('n', mode())
360297bec07SBram Moolenaar  call assert_equal(['vim'], getline(1, '$'))
361297bec07SBram Moolenaar
362297bec07SBram Moolenaar  let &mouse = save_mouse
363297bec07SBram Moolenaar  let &term = save_term
364297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
365297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
366297bec07SBram Moolenaar  close!
367297bec07SBram Moolenaarendfunc
368297bec07SBram Moolenaar
369297bec07SBram Moolenaar" Test for using the mouse to increaes the height of the cmdline window
370297bec07SBram Moolenaarfunc Test_mouse_cmdwin_resize()
371297bec07SBram Moolenaar  let save_mouse = &mouse
372297bec07SBram Moolenaar  let save_term = &term
373297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
374297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
375297bec07SBram Moolenaar  set mouse=a term=xterm ttymouse=xterm2
376297bec07SBram Moolenaar  5new
377297bec07SBram Moolenaar  redraw!
378297bec07SBram Moolenaar
379297bec07SBram Moolenaar  let h = 0
380297bec07SBram Moolenaar  let row = &lines - &cmdwinheight - 2
381297bec07SBram Moolenaar  call feedkeys("q:" ..
382297bec07SBram Moolenaar        \ MouseLeftClickCode(row, 1) ..
383297bec07SBram Moolenaar        \ MouseLeftDragCode(row - 1, 1) ..
384297bec07SBram Moolenaar        \ MouseLeftReleaseCode(row - 2, 1) ..
385297bec07SBram Moolenaar        \ "alet h = \<C-R>=winheight(0)\<CR>\<CR>", 'Lx!')
386297bec07SBram Moolenaar  call assert_equal(&cmdwinheight + 2, h)
387297bec07SBram Moolenaar
388297bec07SBram Moolenaar  let &mouse = save_mouse
389297bec07SBram Moolenaar  let &term = save_term
390297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
391297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
392297bec07SBram Moolenaar  close!
393297bec07SBram Moolenaarendfunc
394297bec07SBram Moolenaar
39592fd599eSBram Moolenaar" TODO: for unclear reasons this test fails if it comes after
39692fd599eSBram Moolenaar" Test_xterm_mouse_ctrl_click()
39792fd599eSBram Moolenaarfunc Test_1xterm_mouse_wheel()
398049736faSBram Moolenaar  new
399049736faSBram Moolenaar  let save_mouse = &mouse
400049736faSBram Moolenaar  let save_term = &term
401d58d4f90SBram Moolenaar  let save_wrap = &wrap
402049736faSBram Moolenaar  let save_ttymouse = &ttymouse
403d58d4f90SBram Moolenaar  set mouse=a term=xterm nowrap
404d58d4f90SBram Moolenaar  call setline(1, range(100000000000000, 100000000000100))
405049736faSBram Moolenaar
406515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values
4074945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
4081ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
409049736faSBram Moolenaar    go
4104945219bSBram Moolenaar    call assert_equal(1, line('w0'), msg)
4114945219bSBram Moolenaar    call assert_equal([0, 1, 1, 0], getpos('.'), msg)
4123fbd2d7cSBram Moolenaar
4133fbd2d7cSBram Moolenaar    call MouseWheelDown(1, 1)
4144945219bSBram Moolenaar    call assert_equal(4, line('w0'), msg)
4154945219bSBram Moolenaar    call assert_equal([0, 4, 1, 0], getpos('.'), msg)
4163fbd2d7cSBram Moolenaar
4173fbd2d7cSBram Moolenaar    call MouseWheelDown(1, 1)
4184945219bSBram Moolenaar    call assert_equal(7, line('w0'), msg)
4194945219bSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
420049736faSBram Moolenaar
4213fbd2d7cSBram Moolenaar    call MouseWheelUp(1, 1)
4224945219bSBram Moolenaar    call assert_equal(4, line('w0'), msg)
4234945219bSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
4243fbd2d7cSBram Moolenaar
4253fbd2d7cSBram Moolenaar    call MouseWheelUp(1, 1)
4264945219bSBram Moolenaar    call assert_equal(1, line('w0'), msg)
4274945219bSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
428d58d4f90SBram Moolenaar
429d58d4f90SBram Moolenaar    if has('gui')
430d58d4f90SBram Moolenaar      " Horizontal wheel scrolling currently only works when vim is
431d58d4f90SBram Moolenaar      " compiled with gui enabled.
432d58d4f90SBram Moolenaar      call MouseWheelRight(1, 1)
433d58d4f90SBram Moolenaar      call assert_equal(7, 1 + virtcol(".") - wincol(), msg)
434d58d4f90SBram Moolenaar      call assert_equal([0, 7, 7, 0], getpos('.'), msg)
435d58d4f90SBram Moolenaar
436d58d4f90SBram Moolenaar      call MouseWheelRight(1, 1)
437d58d4f90SBram Moolenaar      call assert_equal(13, 1 + virtcol(".") - wincol(), msg)
438d58d4f90SBram Moolenaar      call assert_equal([0, 7, 13, 0], getpos('.'), msg)
439d58d4f90SBram Moolenaar
440d58d4f90SBram Moolenaar      call MouseWheelLeft(1, 1)
441d58d4f90SBram Moolenaar      call assert_equal(7, 1 + virtcol(".") - wincol(), msg)
442d58d4f90SBram Moolenaar      call assert_equal([0, 7, 13, 0], getpos('.'), msg)
443d58d4f90SBram Moolenaar
444d58d4f90SBram Moolenaar      call MouseWheelLeft(1, 1)
445d58d4f90SBram Moolenaar      call assert_equal(1, 1 + virtcol(".") - wincol(), msg)
446d58d4f90SBram Moolenaar      call assert_equal([0, 7, 13, 0], getpos('.'), msg)
447d58d4f90SBram Moolenaar    endif
4483fbd2d7cSBram Moolenaar  endfor
449049736faSBram Moolenaar
450049736faSBram Moolenaar  let &mouse = save_mouse
451049736faSBram Moolenaar  let &term = save_term
452d58d4f90SBram Moolenaar  let &wrap = save_wrap
453049736faSBram Moolenaar  let &ttymouse = save_ttymouse
454049736faSBram Moolenaar  bwipe!
455049736faSBram Moolenaarendfunc
4563fb01a53SBram Moolenaar
457b4367b7fSBram Moolenaar" Test that dragging beyond the window (at the bottom and at the top)
458f19f8d1aSBram Moolenaar" scrolls window content by the number of lines beyond the window.
459b4367b7fSBram Moolenaarfunc Test_term_mouse_drag_beyond_window()
460b4367b7fSBram Moolenaar  let save_mouse = &mouse
461b4367b7fSBram Moolenaar  let save_term = &term
462b4367b7fSBram Moolenaar  let save_ttymouse = &ttymouse
463b4367b7fSBram Moolenaar  call test_override('no_query_mouse', 1)
464b4367b7fSBram Moolenaar  set mouse=a term=xterm
465b4367b7fSBram Moolenaar  let col = 1
466b4367b7fSBram Moolenaar  call setline(1, range(1, 100))
467b4367b7fSBram Moolenaar
468b4367b7fSBram Moolenaar  " Split into 3 windows, and go into the middle window
469b4367b7fSBram Moolenaar  " so we test dragging mouse below and above the window.
470b4367b7fSBram Moolenaar  2split
471b4367b7fSBram Moolenaar  wincmd j
472b4367b7fSBram Moolenaar  2split
473b4367b7fSBram Moolenaar
474515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
475b4367b7fSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
476b4367b7fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
477b4367b7fSBram Moolenaar
478b4367b7fSBram Moolenaar    " Line #10 at the top.
479b4367b7fSBram Moolenaar    norm! 10zt
480b4367b7fSBram Moolenaar    redraw
481b4367b7fSBram Moolenaar    call assert_equal(10, winsaveview().topline, msg)
482b4367b7fSBram Moolenaar    call assert_equal(2, winheight(0), msg)
483b4367b7fSBram Moolenaar
484b4367b7fSBram Moolenaar    let row = 4
485b4367b7fSBram Moolenaar    call MouseLeftClick(row, col)
486b4367b7fSBram Moolenaar    call assert_equal(10, winsaveview().topline, msg)
487b4367b7fSBram Moolenaar
488b4367b7fSBram Moolenaar    " Drag downwards. We're still in the window so topline should
489b4367b7fSBram Moolenaar    " not change yet.
490b4367b7fSBram Moolenaar    let row += 1
491b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
492b4367b7fSBram Moolenaar    call assert_equal(10, winsaveview().topline, msg)
493b4367b7fSBram Moolenaar
494b4367b7fSBram Moolenaar    " We now leave the window at the bottom, so the window content should
495b4367b7fSBram Moolenaar    " scroll by 1 line, then 2 lines (etc) as we drag further away.
496b4367b7fSBram Moolenaar    let row += 1
497b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
498b4367b7fSBram Moolenaar    call assert_equal(11, winsaveview().topline, msg)
499b4367b7fSBram Moolenaar
500b4367b7fSBram Moolenaar    let row += 1
501b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
502b4367b7fSBram Moolenaar    call assert_equal(13, winsaveview().topline, msg)
503b4367b7fSBram Moolenaar
504b4367b7fSBram Moolenaar    " Now drag upwards.
505b4367b7fSBram Moolenaar    let row -= 1
506b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
507b4367b7fSBram Moolenaar    call assert_equal(14, winsaveview().topline, msg)
508b4367b7fSBram Moolenaar
509b4367b7fSBram Moolenaar    " We're now back in the window so the topline should not change.
510b4367b7fSBram Moolenaar    let row -= 1
511b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
512b4367b7fSBram Moolenaar    call assert_equal(14, winsaveview().topline, msg)
513b4367b7fSBram Moolenaar
514b4367b7fSBram Moolenaar    let row -= 1
515b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
516b4367b7fSBram Moolenaar    call assert_equal(14, winsaveview().topline, msg)
517b4367b7fSBram Moolenaar
518b4367b7fSBram Moolenaar    " We now leave the window at the top so the window content should
519b4367b7fSBram Moolenaar    " scroll by 1 line, then 2, then 3 (etc) in the opposite direction.
520b4367b7fSBram Moolenaar    let row -= 1
521b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
522b4367b7fSBram Moolenaar    call assert_equal(13, winsaveview().topline, msg)
523b4367b7fSBram Moolenaar
524b4367b7fSBram Moolenaar    let row -= 1
525b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
526b4367b7fSBram Moolenaar    call assert_equal(11, winsaveview().topline, msg)
527b4367b7fSBram Moolenaar
528b4367b7fSBram Moolenaar    let row -= 1
529b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
530b4367b7fSBram Moolenaar    call assert_equal(8, winsaveview().topline, msg)
531b4367b7fSBram Moolenaar
532b4367b7fSBram Moolenaar    call MouseLeftRelease(row, col)
533b4367b7fSBram Moolenaar    call assert_equal(8, winsaveview().topline, msg)
534b4367b7fSBram Moolenaar    call assert_equal(2, winheight(0), msg)
535b4367b7fSBram Moolenaar  endfor
536b4367b7fSBram Moolenaar
537b4367b7fSBram Moolenaar  let &mouse = save_mouse
538b4367b7fSBram Moolenaar  let &term = save_term
539b4367b7fSBram Moolenaar  let &ttymouse = save_ttymouse
540b4367b7fSBram Moolenaar  call test_override('no_query_mouse', 0)
541b4367b7fSBram Moolenaar  bwipe!
542b4367b7fSBram Moolenaarendfunc
543b4367b7fSBram Moolenaar
54492fd599eSBram Moolenaarfunc Test_term_mouse_drag_window_separator()
5453fb01a53SBram Moolenaar  let save_mouse = &mouse
5463fb01a53SBram Moolenaar  let save_term = &term
5473fb01a53SBram Moolenaar  let save_ttymouse = &ttymouse
54892fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
5493fbd2d7cSBram Moolenaar  set mouse=a term=xterm
5503fbd2d7cSBram Moolenaar
551515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
5524945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
5531ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
5543fb01a53SBram Moolenaar
5553fb01a53SBram Moolenaar    " Split horizontally and test dragging the horizontal window separator.
5563fb01a53SBram Moolenaar    split
5573fb01a53SBram Moolenaar    let rowseparator = winheight(0) + 1
5583fb01a53SBram Moolenaar    let row = rowseparator
5593fb01a53SBram Moolenaar    let col = 1
560c8b3ddabSBram Moolenaar
5612b00b9b0SBram Moolenaar    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
5622b00b9b0SBram Moolenaar    if ttymouse_val !=# 'xterm2' || row <= 223
5633fbd2d7cSBram Moolenaar      call MouseLeftClick(row, col)
5643fb01a53SBram Moolenaar      let row -= 1
5653fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
5664945219bSBram Moolenaar      call assert_equal(rowseparator - 1, winheight(0) + 1, msg)
5673fb01a53SBram Moolenaar      let row += 1
5683fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
5694945219bSBram Moolenaar      call assert_equal(rowseparator, winheight(0) + 1, msg)
5703fbd2d7cSBram Moolenaar      call MouseLeftRelease(row, col)
5714945219bSBram Moolenaar      call assert_equal(rowseparator, winheight(0) + 1, msg)
57239f76c6aSBram Moolenaar    endif
5733fb01a53SBram Moolenaar    bwipe!
5743fb01a53SBram Moolenaar
5753fb01a53SBram Moolenaar    " Split vertically and test dragging the vertical window separator.
5763fb01a53SBram Moolenaar    vsplit
5773fb01a53SBram Moolenaar    let colseparator = winwidth(0) + 1
5783fb01a53SBram Moolenaar    let row = 1
5793fb01a53SBram Moolenaar    let col = colseparator
58039f76c6aSBram Moolenaar
5812b00b9b0SBram Moolenaar    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
5822b00b9b0SBram Moolenaar    if ttymouse_val !=# 'xterm2' || col <= 223
5833fbd2d7cSBram Moolenaar      call MouseLeftClick(row, col)
5843fb01a53SBram Moolenaar      let col -= 1
5853fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
5864945219bSBram Moolenaar      call assert_equal(colseparator - 1, winwidth(0) + 1, msg)
5873fb01a53SBram Moolenaar      let col += 1
5883fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
5894945219bSBram Moolenaar      call assert_equal(colseparator, winwidth(0) + 1, msg)
5903fbd2d7cSBram Moolenaar      call MouseLeftRelease(row, col)
5914945219bSBram Moolenaar      call assert_equal(colseparator, winwidth(0) + 1, msg)
59239f76c6aSBram Moolenaar    endif
5933fb01a53SBram Moolenaar    bwipe!
5943fbd2d7cSBram Moolenaar  endfor
5953fbd2d7cSBram Moolenaar
5963fbd2d7cSBram Moolenaar  let &mouse = save_mouse
5973fbd2d7cSBram Moolenaar  let &term = save_term
5983fbd2d7cSBram Moolenaar  let &ttymouse = save_ttymouse
59992fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
6003fbd2d7cSBram Moolenaarendfunc
6013fbd2d7cSBram Moolenaar
60292fd599eSBram Moolenaarfunc Test_term_mouse_drag_statusline()
6033fbd2d7cSBram Moolenaar  let save_mouse = &mouse
6043fbd2d7cSBram Moolenaar  let save_term = &term
6053fbd2d7cSBram Moolenaar  let save_ttymouse = &ttymouse
60692fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
607ca57ab54SBram Moolenaar  let save_laststatus = &laststatus
608ca57ab54SBram Moolenaar  set mouse=a term=xterm laststatus=2
6093fbd2d7cSBram Moolenaar
610515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
6114945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
6121ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
6133fbd2d7cSBram Moolenaar
6144945219bSBram Moolenaar    call assert_equal(1, &cmdheight, msg)
6153fbd2d7cSBram Moolenaar    let rowstatusline = winheight(0) + 1
6163fbd2d7cSBram Moolenaar    let row = rowstatusline
6173fbd2d7cSBram Moolenaar    let col = 1
618c8b3ddabSBram Moolenaar
6192b00b9b0SBram Moolenaar    if ttymouse_val ==# 'xterm2' && row > 223
6202b00b9b0SBram Moolenaar      " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
621c8b3ddabSBram Moolenaar      continue
622c8b3ddabSBram Moolenaar    endif
623c8b3ddabSBram Moolenaar
6243fbd2d7cSBram Moolenaar    call MouseLeftClick(row, col)
6253fbd2d7cSBram Moolenaar    let row -= 1
6263fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
6274945219bSBram Moolenaar    call assert_equal(2, &cmdheight, msg)
6284945219bSBram Moolenaar    call assert_equal(rowstatusline - 1, winheight(0) + 1, msg)
6293fbd2d7cSBram Moolenaar    let row += 1
6303fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
6314945219bSBram Moolenaar    call assert_equal(1, &cmdheight, msg)
6324945219bSBram Moolenaar    call assert_equal(rowstatusline, winheight(0) + 1, msg)
6333fbd2d7cSBram Moolenaar    call MouseLeftRelease(row, col)
6344945219bSBram Moolenaar    call assert_equal(1, &cmdheight, msg)
6354945219bSBram Moolenaar    call assert_equal(rowstatusline, winheight(0) + 1, msg)
6363fbd2d7cSBram Moolenaar  endfor
6373fbd2d7cSBram Moolenaar
6383fb01a53SBram Moolenaar  let &mouse = save_mouse
6393fb01a53SBram Moolenaar  let &term = save_term
6403fb01a53SBram Moolenaar  let &ttymouse = save_ttymouse
64192fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
642ca57ab54SBram Moolenaar  let &laststatus = save_laststatus
643ca57ab54SBram Moolenaarendfunc
644ca57ab54SBram Moolenaar
64592fd599eSBram Moolenaarfunc Test_term_mouse_click_tab()
646ca57ab54SBram Moolenaar  let save_mouse = &mouse
647ca57ab54SBram Moolenaar  let save_term = &term
648ca57ab54SBram Moolenaar  let save_ttymouse = &ttymouse
64992fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
650ca57ab54SBram Moolenaar  set mouse=a term=xterm
651ca57ab54SBram Moolenaar  let row = 1
652ca57ab54SBram Moolenaar
653515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
6544945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
6551ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
656ca57ab54SBram Moolenaar    e Xfoo
657ca57ab54SBram Moolenaar    tabnew Xbar
658ca57ab54SBram Moolenaar
659ca57ab54SBram Moolenaar    let a = split(execute(':tabs'), "\n")
660ca57ab54SBram Moolenaar    call assert_equal(['Tab page 1',
661ca57ab54SBram Moolenaar        \              '    Xfoo',
662ca57ab54SBram Moolenaar        \              'Tab page 2',
6634945219bSBram Moolenaar        \              '>   Xbar'], a, msg)
664ca57ab54SBram Moolenaar
665ca57ab54SBram Moolenaar    " Test clicking on tab names in the tabline at the top.
666ca57ab54SBram Moolenaar    let col = 2
66739f76c6aSBram Moolenaar    redraw
668ca57ab54SBram Moolenaar    call MouseLeftClick(row, col)
669ca57ab54SBram Moolenaar    call MouseLeftRelease(row, col)
670ca57ab54SBram Moolenaar    let a = split(execute(':tabs'), "\n")
671ca57ab54SBram Moolenaar    call assert_equal(['Tab page 1',
672ca57ab54SBram Moolenaar        \              '>   Xfoo',
673ca57ab54SBram Moolenaar        \              'Tab page 2',
6744945219bSBram Moolenaar        \              '    Xbar'], a, msg)
675ca57ab54SBram Moolenaar
676ca57ab54SBram Moolenaar    let col = 9
677ca57ab54SBram Moolenaar    call MouseLeftClick(row, col)
678ca57ab54SBram Moolenaar    call MouseLeftRelease(row, col)
679ca57ab54SBram Moolenaar    let a = split(execute(':tabs'), "\n")
680ca57ab54SBram Moolenaar    call assert_equal(['Tab page 1',
681ca57ab54SBram Moolenaar        \              '    Xfoo',
682ca57ab54SBram Moolenaar        \              'Tab page 2',
6834945219bSBram Moolenaar        \              '>   Xbar'], a, msg)
684ca57ab54SBram Moolenaar
685ca57ab54SBram Moolenaar    %bwipe!
686ca57ab54SBram Moolenaar  endfor
687ca57ab54SBram Moolenaar
688ca57ab54SBram Moolenaar  let &mouse = save_mouse
689ca57ab54SBram Moolenaar  let &term = save_term
690ca57ab54SBram Moolenaar  let &ttymouse = save_ttymouse
69192fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
6923fb01a53SBram Moolenaarendfunc
69339f76c6aSBram Moolenaar
69492fd599eSBram Moolenaarfunc Test_term_mouse_click_X_to_close_tab()
69539f76c6aSBram Moolenaar  let save_mouse = &mouse
69639f76c6aSBram Moolenaar  let save_term = &term
69739f76c6aSBram Moolenaar  let save_ttymouse = &ttymouse
69892fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
69939f76c6aSBram Moolenaar  set mouse=a term=xterm
70039f76c6aSBram Moolenaar  let row = 1
70139f76c6aSBram Moolenaar  let col = &columns
70239f76c6aSBram Moolenaar
703515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
7042b00b9b0SBram Moolenaar    if ttymouse_val ==# 'xterm2' && col > 223
7052b00b9b0SBram Moolenaar      " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
70639f76c6aSBram Moolenaar      continue
70739f76c6aSBram Moolenaar    endif
7084945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
7091ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
71039f76c6aSBram Moolenaar    e Xtab1
71139f76c6aSBram Moolenaar    tabnew Xtab2
71239f76c6aSBram Moolenaar    tabnew Xtab3
71339f76c6aSBram Moolenaar    tabn 2
71439f76c6aSBram Moolenaar
71539f76c6aSBram Moolenaar    let a = split(execute(':tabs'), "\n")
71639f76c6aSBram Moolenaar    call assert_equal(['Tab page 1',
71739f76c6aSBram Moolenaar        \              '    Xtab1',
71839f76c6aSBram Moolenaar        \              'Tab page 2',
71939f76c6aSBram Moolenaar        \              '>   Xtab2',
72039f76c6aSBram Moolenaar        \              'Tab page 3',
7214945219bSBram Moolenaar        \              '    Xtab3'], a, msg)
72239f76c6aSBram Moolenaar
72339f76c6aSBram Moolenaar    " Click on "X" in tabline to close current tab i.e. Xtab2.
72439f76c6aSBram Moolenaar    redraw
72539f76c6aSBram Moolenaar    call MouseLeftClick(row, col)
72639f76c6aSBram Moolenaar    call MouseLeftRelease(row, col)
72739f76c6aSBram Moolenaar    let a = split(execute(':tabs'), "\n")
72839f76c6aSBram Moolenaar    call assert_equal(['Tab page 1',
72939f76c6aSBram Moolenaar        \              '    Xtab1',
73039f76c6aSBram Moolenaar        \              'Tab page 2',
7314945219bSBram Moolenaar        \              '>   Xtab3'], a, msg)
73239f76c6aSBram Moolenaar
73339f76c6aSBram Moolenaar    %bwipe!
73439f76c6aSBram Moolenaar  endfor
73539f76c6aSBram Moolenaar
73639f76c6aSBram Moolenaar  let &mouse = save_mouse
73739f76c6aSBram Moolenaar  let &term = save_term
73839f76c6aSBram Moolenaar  let &ttymouse = save_ttymouse
73992fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
74039f76c6aSBram Moolenaarendfunc
741e3e3828fSBram Moolenaar
74292fd599eSBram Moolenaarfunc Test_term_mouse_drag_to_move_tab()
743e3e3828fSBram Moolenaar  let save_mouse = &mouse
744e3e3828fSBram Moolenaar  let save_term = &term
745e3e3828fSBram Moolenaar  let save_ttymouse = &ttymouse
74692fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
747e3e3828fSBram Moolenaar  " Set 'mousetime' to 1 to avoid recognizing a double-click in the loop
748e3e3828fSBram Moolenaar  set mouse=a term=xterm mousetime=1
749e3e3828fSBram Moolenaar  let row = 1
750e3e3828fSBram Moolenaar
751515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
7524945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
7531ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
754e3e3828fSBram Moolenaar    e Xtab1
755e3e3828fSBram Moolenaar    tabnew Xtab2
756e3e3828fSBram Moolenaar
757e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
758e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
759e3e3828fSBram Moolenaar        \              '    Xtab1',
760e3e3828fSBram Moolenaar        \              'Tab page 2',
7614945219bSBram Moolenaar        \              '>   Xtab2'], a, msg)
762e3e3828fSBram Moolenaar    redraw
763e3e3828fSBram Moolenaar
764e3e3828fSBram Moolenaar    " Click in tab2 and drag it to tab1.
765e3e3828fSBram Moolenaar    " Check getcharmod() to verify that click is not
766e3e3828fSBram Moolenaar    " interpreted as a spurious double-click.
767e3e3828fSBram Moolenaar    call MouseLeftClick(row, 10)
7684945219bSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
769e3e3828fSBram Moolenaar    for col in [9, 8, 7, 6]
770e3e3828fSBram Moolenaar      call MouseLeftDrag(row, col)
771e3e3828fSBram Moolenaar    endfor
772e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
773e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
774e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
775e3e3828fSBram Moolenaar        \              '>   Xtab2',
776e3e3828fSBram Moolenaar        \              'Tab page 2',
7774945219bSBram Moolenaar        \              '    Xtab1'], a, msg)
778e3e3828fSBram Moolenaar
779f36a2c7eSBram Moolenaar    " Click elsewhere so that click in next iteration is not
780f36a2c7eSBram Moolenaar    " interpreted as unwanted double-click.
781f36a2c7eSBram Moolenaar    call MouseLeftClick(row, 11)
782f36a2c7eSBram Moolenaar    call MouseLeftRelease(row, 11)
783f36a2c7eSBram Moolenaar
784e3e3828fSBram Moolenaar    %bwipe!
785e3e3828fSBram Moolenaar  endfor
786e3e3828fSBram Moolenaar
787e3e3828fSBram Moolenaar  let &mouse = save_mouse
788e3e3828fSBram Moolenaar  let &term = save_term
789e3e3828fSBram Moolenaar  let &ttymouse = save_ttymouse
79092fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
791e3e3828fSBram Moolenaar  set mousetime&
792e3e3828fSBram Moolenaarendfunc
793e3e3828fSBram Moolenaar
79492fd599eSBram Moolenaarfunc Test_term_mouse_double_click_to_create_tab()
795e3e3828fSBram Moolenaar  let save_mouse = &mouse
796e3e3828fSBram Moolenaar  let save_term = &term
797e3e3828fSBram Moolenaar  let save_ttymouse = &ttymouse
79892fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
799e3e3828fSBram Moolenaar  " Set 'mousetime' to a small value, so that double-click works but we don't
800e3e3828fSBram Moolenaar  " have to wait long to avoid a triple-click.
801f36a2c7eSBram Moolenaar  set mouse=a term=xterm mousetime=200
802e3e3828fSBram Moolenaar  let row = 1
803e3e3828fSBram Moolenaar  let col = 10
804e3e3828fSBram Moolenaar
805515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
8064945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
8071ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
808e3e3828fSBram Moolenaar    e Xtab1
809e3e3828fSBram Moolenaar    tabnew Xtab2
810e3e3828fSBram Moolenaar
811e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
812e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
813e3e3828fSBram Moolenaar        \              '    Xtab1',
814e3e3828fSBram Moolenaar        \              'Tab page 2',
8154945219bSBram Moolenaar        \              '>   Xtab2'], a, msg)
816e3e3828fSBram Moolenaar
817e3e3828fSBram Moolenaar    redraw
818e3e3828fSBram Moolenaar    call MouseLeftClick(row, col)
819e3e3828fSBram Moolenaar    " Check getcharmod() to verify that first click is not
820e3e3828fSBram Moolenaar    " interpreted as a spurious double-click.
8214945219bSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
822e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
823e3e3828fSBram Moolenaar    call MouseLeftClick(row, col)
8244945219bSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
825e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
826e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
827e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
828e3e3828fSBram Moolenaar        \              '    Xtab1',
829e3e3828fSBram Moolenaar        \              'Tab page 2',
830e3e3828fSBram Moolenaar        \              '>   [No Name]',
831e3e3828fSBram Moolenaar        \              'Tab page 3',
8324945219bSBram Moolenaar        \              '    Xtab2'], a, msg)
833e3e3828fSBram Moolenaar
834f36a2c7eSBram Moolenaar    " Click elsewhere so that click in next iteration is not
835f36a2c7eSBram Moolenaar    " interpreted as unwanted double click.
836f36a2c7eSBram Moolenaar    call MouseLeftClick(row, col + 1)
837f36a2c7eSBram Moolenaar    call MouseLeftRelease(row, col + 1)
838f36a2c7eSBram Moolenaar
839e3e3828fSBram Moolenaar    %bwipe!
840e3e3828fSBram Moolenaar  endfor
841e3e3828fSBram Moolenaar
842e3e3828fSBram Moolenaar  let &mouse = save_mouse
843e3e3828fSBram Moolenaar  let &term = save_term
844e3e3828fSBram Moolenaar  let &ttymouse = save_ttymouse
84592fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
846e3e3828fSBram Moolenaar  set mousetime&
847e3e3828fSBram Moolenaarendfunc
848696d6377SBram Moolenaar
849f36a2c7eSBram Moolenaar" Test double/triple/quadruple click in normal mode to visually select.
850f36a2c7eSBram Moolenaarfunc Test_term_mouse_multiple_clicks_to_visually_select()
851f36a2c7eSBram Moolenaar  let save_mouse = &mouse
852f36a2c7eSBram Moolenaar  let save_term = &term
853f36a2c7eSBram Moolenaar  let save_ttymouse = &ttymouse
854f36a2c7eSBram Moolenaar  call test_override('no_query_mouse', 1)
855f36a2c7eSBram Moolenaar  set mouse=a term=xterm mousetime=200
856f36a2c7eSBram Moolenaar  new
857f36a2c7eSBram Moolenaar
858515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
859f36a2c7eSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
860f36a2c7eSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
861f36a2c7eSBram Moolenaar    call setline(1, ['foo [foo bar] foo', 'foo'])
862f36a2c7eSBram Moolenaar
863f36a2c7eSBram Moolenaar    " Double-click on word should visually select the word.
864f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
865f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
866f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
867f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
868f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
869f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
870f36a2c7eSBram Moolenaar    call assert_equal('v', mode(), msg)
871f36a2c7eSBram Moolenaar    norm! r1
872f36a2c7eSBram Moolenaar    call assert_equal(['111 [foo bar] foo', 'foo'], getline(1, '$'), msg)
873f36a2c7eSBram Moolenaar
874f36a2c7eSBram Moolenaar    " Double-click on opening square bracket should visually
875f36a2c7eSBram Moolenaar    " select the whole [foo bar].
876f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 5)
877f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
878f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 5)
879f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 5)
880f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
881f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 5)
882f36a2c7eSBram Moolenaar    call assert_equal('v', mode(), msg)
883f36a2c7eSBram Moolenaar    norm! r2
884f36a2c7eSBram Moolenaar    call assert_equal(['111 222222222 foo', 'foo'], getline(1, '$'), msg)
885f36a2c7eSBram Moolenaar
886f36a2c7eSBram Moolenaar    " Triple-click should visually select the whole line.
887f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 3)
888f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
889f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 3)
890f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 3)
891f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
892f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 3)
893f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 3)
894f36a2c7eSBram Moolenaar    call assert_equal(64, getcharmod(), msg) " triple-click
895f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 3)
896f36a2c7eSBram Moolenaar    call assert_equal('V', mode(), msg)
897f36a2c7eSBram Moolenaar    norm! r3
898f36a2c7eSBram Moolenaar    call assert_equal(['33333333333333333', 'foo'], getline(1, '$'), msg)
899f36a2c7eSBram Moolenaar
900f36a2c7eSBram Moolenaar    " Quadruple-click should start visual block select.
901f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
902f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
903f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
904f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
905f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
906f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
907f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
908f36a2c7eSBram Moolenaar    call assert_equal(64, getcharmod(), msg) " triple-click
909f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
910f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
911f36a2c7eSBram Moolenaar    call assert_equal(96, getcharmod(), msg) " quadruple-click
912f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
913f36a2c7eSBram Moolenaar    call assert_equal("\<c-v>", mode(), msg)
914f36a2c7eSBram Moolenaar    norm! r4
915f36a2c7eSBram Moolenaar    call assert_equal(['34333333333333333', 'foo'], getline(1, '$'), msg)
9162764d06aSBram Moolenaar
9172764d06aSBram Moolenaar    " Double-click on a space character should visually select all the
9182764d06aSBram Moolenaar    " consecutive space characters.
9192764d06aSBram Moolenaar    %d
9202764d06aSBram Moolenaar    call setline(1, '    one two')
9212764d06aSBram Moolenaar    call MouseLeftClick(1, 2)
9222764d06aSBram Moolenaar    call MouseLeftRelease(1, 2)
9232764d06aSBram Moolenaar    call MouseLeftClick(1, 2)
9242764d06aSBram Moolenaar    call MouseLeftRelease(1, 2)
9252764d06aSBram Moolenaar    call assert_equal('v', mode(), msg)
9262764d06aSBram Moolenaar    norm! r1
9272764d06aSBram Moolenaar    call assert_equal(['1111one two'], getline(1, '$'), msg)
9282764d06aSBram Moolenaar
9292764d06aSBram Moolenaar    " Double-click on a word with exclusive selection
9302764d06aSBram Moolenaar    set selection=exclusive
9312764d06aSBram Moolenaar    let @" = ''
9322764d06aSBram Moolenaar    call MouseLeftClick(1, 10)
9332764d06aSBram Moolenaar    call MouseLeftRelease(1, 10)
9342764d06aSBram Moolenaar    call MouseLeftClick(1, 10)
9352764d06aSBram Moolenaar    call MouseLeftRelease(1, 10)
9362764d06aSBram Moolenaar    norm! y
9372764d06aSBram Moolenaar    call assert_equal('two', @", msg)
9382764d06aSBram Moolenaar
9392764d06aSBram Moolenaar    " Double click to select a block of text with exclusive selection
9402764d06aSBram Moolenaar    %d
9412764d06aSBram Moolenaar    call setline(1, 'one (two) three')
9422764d06aSBram Moolenaar    call MouseLeftClick(1, 5)
9432764d06aSBram Moolenaar    call MouseLeftRelease(1, 5)
9442764d06aSBram Moolenaar    call MouseLeftClick(1, 5)
9452764d06aSBram Moolenaar    call MouseLeftRelease(1, 5)
9462764d06aSBram Moolenaar    norm! y
9472764d06aSBram Moolenaar    call assert_equal(5, col("'<"), msg)
9482764d06aSBram Moolenaar    call assert_equal(10, col("'>"), msg)
9492764d06aSBram Moolenaar
9502764d06aSBram Moolenaar    call MouseLeftClick(1, 9)
9512764d06aSBram Moolenaar    call MouseLeftRelease(1, 9)
9522764d06aSBram Moolenaar    call MouseLeftClick(1, 9)
9532764d06aSBram Moolenaar    call MouseLeftRelease(1, 9)
9542764d06aSBram Moolenaar    norm! y
9552764d06aSBram Moolenaar    call assert_equal(5, col("'<"), msg)
9562764d06aSBram Moolenaar    call assert_equal(10, col("'>"), msg)
9572764d06aSBram Moolenaar    set selection&
9582764d06aSBram Moolenaar
9592764d06aSBram Moolenaar    " Click somewhere else so that the clicks above is not combined with the
9602764d06aSBram Moolenaar    " clicks in the next iteration.
9612764d06aSBram Moolenaar    call MouseRightClick(3, 10)
9622764d06aSBram Moolenaar    call MouseRightRelease(3, 10)
963f36a2c7eSBram Moolenaar  endfor
964f36a2c7eSBram Moolenaar
965f36a2c7eSBram Moolenaar  let &mouse = save_mouse
966f36a2c7eSBram Moolenaar  let &term = save_term
967f36a2c7eSBram Moolenaar  let &ttymouse = save_ttymouse
968f36a2c7eSBram Moolenaar  set mousetime&
969f36a2c7eSBram Moolenaar  call test_override('no_query_mouse', 0)
970f36a2c7eSBram Moolenaar  bwipe!
971f36a2c7eSBram Moolenaarendfunc
972f36a2c7eSBram Moolenaar
9732764d06aSBram Moolenaar" Test for selecting text in visual blockwise mode using Alt-LeftClick
9742764d06aSBram Moolenaarfunc Test_mouse_alt_leftclick()
9752764d06aSBram Moolenaar  let save_mouse = &mouse
9762764d06aSBram Moolenaar  let save_term = &term
9772764d06aSBram Moolenaar  let save_ttymouse = &ttymouse
9782764d06aSBram Moolenaar  call test_override('no_query_mouse', 1)
9792764d06aSBram Moolenaar  set mouse=a term=xterm mousetime=200
9802764d06aSBram Moolenaar  set mousemodel=popup
9812764d06aSBram Moolenaar  new
9822764d06aSBram Moolenaar  call setline(1, 'one (two) three')
9832764d06aSBram Moolenaar
9842764d06aSBram Moolenaar  for ttymouse_val in g:Ttymouse_values
9852764d06aSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
9862764d06aSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
9872764d06aSBram Moolenaar
9882764d06aSBram Moolenaar    " Left click with the Alt modifier key should extend the selection in
9892764d06aSBram Moolenaar    " blockwise visual mode.
9902764d06aSBram Moolenaar    let @" = ''
9912764d06aSBram Moolenaar    call MouseLeftClick(1, 3)
9922764d06aSBram Moolenaar    call MouseLeftRelease(1, 3)
9932764d06aSBram Moolenaar    call MouseAltLeftClick(1, 11)
9942764d06aSBram Moolenaar    call MouseLeftRelease(1, 11)
9952764d06aSBram Moolenaar    call assert_equal("\<C-V>", mode(), msg)
9962764d06aSBram Moolenaar    normal! y
9972764d06aSBram Moolenaar    call assert_equal('e (two) t', @")
9982764d06aSBram Moolenaar  endfor
9992764d06aSBram Moolenaar
10002764d06aSBram Moolenaar  let &mouse = save_mouse
10012764d06aSBram Moolenaar  let &term = save_term
10022764d06aSBram Moolenaar  let &ttymouse = save_ttymouse
10032764d06aSBram Moolenaar  set mousetime& mousemodel&
10042764d06aSBram Moolenaar  call test_override('no_query_mouse', 0)
10052764d06aSBram Moolenaar  close!
10062764d06aSBram Moolenaarendfunc
10072764d06aSBram Moolenaar
1008696d6377SBram Moolenaarfunc Test_xterm_mouse_click_in_fold_columns()
1009696d6377SBram Moolenaar  new
1010696d6377SBram Moolenaar  let save_mouse = &mouse
1011696d6377SBram Moolenaar  let save_term = &term
1012696d6377SBram Moolenaar  let save_ttymouse = &ttymouse
1013696d6377SBram Moolenaar  let save_foldcolumn = &foldcolumn
10142b00b9b0SBram Moolenaar  set mouse=a term=xterm foldcolumn=3 ttymouse=xterm2
1015696d6377SBram Moolenaar
1016696d6377SBram Moolenaar  " Create 2 nested folds.
1017696d6377SBram Moolenaar  call setline(1, range(1, 7))
1018696d6377SBram Moolenaar  2,6fold
1019696d6377SBram Moolenaar  norm! zR
1020696d6377SBram Moolenaar  4,5fold
1021696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
1022696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
1023696d6377SBram Moolenaar
1024696d6377SBram Moolenaar  " Click in "+" of inner fold in foldcolumn should open it.
1025696d6377SBram Moolenaar  redraw
1026696d6377SBram Moolenaar  let row = 4
1027696d6377SBram Moolenaar  let col = 2
1028696d6377SBram Moolenaar  call MouseLeftClick(row, col)
1029696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
1030696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, -1, -1, -1, -1],
1031696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
1032696d6377SBram Moolenaar
1033696d6377SBram Moolenaar  " Click in "-" of outer fold in foldcolumn should close it.
1034696d6377SBram Moolenaar  redraw
1035696d6377SBram Moolenaar  let row = 2
1036696d6377SBram Moolenaar  let col = 1
1037696d6377SBram Moolenaar  call MouseLeftClick(row, col)
1038696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
1039696d6377SBram Moolenaar  call assert_equal([-1, 2, 2, 2, 2, 2, -1],
1040696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
1041696d6377SBram Moolenaar  norm! zR
1042696d6377SBram Moolenaar
1043696d6377SBram Moolenaar  " Click in "|" of inner fold in foldcolumn should close it.
1044696d6377SBram Moolenaar  redraw
1045696d6377SBram Moolenaar  let row = 5
1046696d6377SBram Moolenaar  let col = 2
1047696d6377SBram Moolenaar  call MouseLeftClick(row, col)
1048696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
1049696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
1050696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
1051696d6377SBram Moolenaar
1052696d6377SBram Moolenaar  let &foldcolumn = save_foldcolumn
1053696d6377SBram Moolenaar  let &ttymouse = save_ttymouse
1054696d6377SBram Moolenaar  let &term = save_term
1055696d6377SBram Moolenaar  let &mouse = save_mouse
1056696d6377SBram Moolenaar  bwipe!
1057696d6377SBram Moolenaarendfunc
105866761db1SBram Moolenaar
1059f19f8d1aSBram Moolenaar" Left or right click in Ex command line sets position of the cursor.
1060f19f8d1aSBram Moolenaarfunc Test_term_mouse_click_in_cmdline_to_set_pos()
1061f19f8d1aSBram Moolenaar  let save_mouse = &mouse
1062f19f8d1aSBram Moolenaar  let save_term = &term
1063f19f8d1aSBram Moolenaar  let save_ttymouse = &ttymouse
1064f19f8d1aSBram Moolenaar  call test_override('no_query_mouse', 1)
1065f19f8d1aSBram Moolenaar  set mouse=a term=xterm
1066f19f8d1aSBram Moolenaar  let row = &lines
1067f19f8d1aSBram Moolenaar
1068515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
1069ab505b1aSBram Moolenaar    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
1070ab505b1aSBram Moolenaar    if ttymouse_val !=# 'xterm2' || row <= 223
1071f19f8d1aSBram Moolenaar      let msg = 'ttymouse=' .. ttymouse_val
1072f19f8d1aSBram Moolenaar      exe 'set ttymouse=' .. ttymouse_val
1073f19f8d1aSBram Moolenaar
1074ab505b1aSBram Moolenaar
1075f19f8d1aSBram Moolenaar      call feedkeys(':"3456789'
1076f19f8d1aSBram Moolenaar            \       .. MouseLeftClickCode(row, 7)
1077f19f8d1aSBram Moolenaar            \       .. MouseLeftReleaseCode(row, 7) .. 'L'
1078f19f8d1aSBram Moolenaar            \       .. MouseRightClickCode(row, 4)
1079f19f8d1aSBram Moolenaar            \       .. MouseRightReleaseCode(row, 4) .. 'R'
1080f19f8d1aSBram Moolenaar            \       .. "\<CR>", 'Lx!')
1081f19f8d1aSBram Moolenaar      call assert_equal('"3R456L789', @:, msg)
1082ab505b1aSBram Moolenaar    endif
1083f19f8d1aSBram Moolenaar  endfor
1084f19f8d1aSBram Moolenaar
1085f19f8d1aSBram Moolenaar  let &mouse = save_mouse
1086f19f8d1aSBram Moolenaar  let &term = save_term
1087f19f8d1aSBram Moolenaar  let &ttymouse = save_ttymouse
1088f19f8d1aSBram Moolenaar  set mousetime&
1089f19f8d1aSBram Moolenaar  call test_override('no_query_mouse', 0)
1090f19f8d1aSBram Moolenaarendfunc
1091f19f8d1aSBram Moolenaar
1092f19f8d1aSBram Moolenaar" Middle click in command line pastes at position of cursor.
1093f19f8d1aSBram Moolenaarfunc Test_term_mouse_middle_click_in_cmdline_to_paste()
1094f19f8d1aSBram Moolenaar  CheckFeature clipboard_working
1095f19f8d1aSBram Moolenaar  let save_mouse = &mouse
1096f19f8d1aSBram Moolenaar  let save_term = &term
1097f19f8d1aSBram Moolenaar  let save_ttymouse = &ttymouse
1098f19f8d1aSBram Moolenaar  call test_override('no_query_mouse', 1)
1099f19f8d1aSBram Moolenaar  set mouse=a term=xterm
1100f19f8d1aSBram Moolenaar  let row = &lines
1101f19f8d1aSBram Moolenaar  " Column values does not matter, paste is done at position of cursor.
1102f19f8d1aSBram Moolenaar  let col = 1
1103f19f8d1aSBram Moolenaar  let @* = 'paste'
1104f19f8d1aSBram Moolenaar
1105515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
1106f19f8d1aSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
1107f19f8d1aSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
1108f19f8d1aSBram Moolenaar
1109f19f8d1aSBram Moolenaar    call feedkeys(":\"->"
1110f19f8d1aSBram Moolenaar          \       .. MouseMiddleReleaseCode(row, col)
1111f19f8d1aSBram Moolenaar          \       .. MouseMiddleClickCode(row, col)
1112f19f8d1aSBram Moolenaar          \       .. "<-"
1113f19f8d1aSBram Moolenaar          \       .. MouseMiddleReleaseCode(row, col)
1114f19f8d1aSBram Moolenaar          \       .. MouseMiddleClickCode(row, col)
1115f19f8d1aSBram Moolenaar          \       .. "\<CR>", 'Lx!')
1116f19f8d1aSBram Moolenaar    call assert_equal('"->paste<-paste', @:, msg)
1117f19f8d1aSBram Moolenaar  endfor
1118f19f8d1aSBram Moolenaar
1119f19f8d1aSBram Moolenaar  let &mouse = save_mouse
1120f19f8d1aSBram Moolenaar  let &term = save_term
1121f19f8d1aSBram Moolenaar  let &ttymouse = save_ttymouse
1122f19f8d1aSBram Moolenaar  let @* = ''
1123f19f8d1aSBram Moolenaar  call test_override('no_query_mouse', 0)
1124f19f8d1aSBram Moolenaarendfunc
1125f19f8d1aSBram Moolenaar
1126297bec07SBram Moolenaar" Test for making sure S-Middlemouse doesn't do anything
1127297bec07SBram Moolenaarfunc Test_term_mouse_shift_middle_click()
1128297bec07SBram Moolenaar  new
1129297bec07SBram Moolenaar  let save_mouse = &mouse
1130297bec07SBram Moolenaar  let save_term = &term
1131297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
1132297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
1133297bec07SBram Moolenaar  set mouse=a term=xterm ttymouse=xterm2 mousemodel=
1134297bec07SBram Moolenaar
1135297bec07SBram Moolenaar  call test_setmouse(1, 1)
1136297bec07SBram Moolenaar  exe "normal \<S-MiddleMouse>"
1137297bec07SBram Moolenaar  call assert_equal([''], getline(1, '$'))
1138297bec07SBram Moolenaar  call assert_equal(1, winnr())
1139297bec07SBram Moolenaar
1140297bec07SBram Moolenaar  let &mouse = save_mouse
1141297bec07SBram Moolenaar  let &term = save_term
1142297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
1143297bec07SBram Moolenaar  set mousemodel&
1144297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
1145297bec07SBram Moolenaar  close!
1146297bec07SBram Moolenaarendfunc
1147297bec07SBram Moolenaar
1148297bec07SBram Moolenaar" Test for using mouse in visual mode
1149297bec07SBram Moolenaarfunc Test_term_mouse_visual_mode()
1150297bec07SBram Moolenaar  new
1151297bec07SBram Moolenaar  let save_mouse = &mouse
1152297bec07SBram Moolenaar  let save_term = &term
1153297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
1154297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
1155297bec07SBram Moolenaar  set term=xterm ttymouse=xterm2
1156297bec07SBram Moolenaar
1157297bec07SBram Moolenaar  " If visual mode is not present in 'mouse', then left click should not
1158297bec07SBram Moolenaar  " do anything in visal mode.
1159297bec07SBram Moolenaar  call setline(1, ['one two three four'])
1160297bec07SBram Moolenaar  set mouse=nci
1161297bec07SBram Moolenaar  call cursor(1, 5)
1162297bec07SBram Moolenaar  let @" = ''
1163297bec07SBram Moolenaar  call feedkeys("ve"
1164297bec07SBram Moolenaar        \ .. MouseLeftClickCode(1, 15) .. MouseLeftReleaseCode(1, 15)
1165297bec07SBram Moolenaar        \ .. 'y', 'Lx!')
1166297bec07SBram Moolenaar  call assert_equal(5, col('.'))
1167297bec07SBram Moolenaar  call assert_equal('two', @")
1168297bec07SBram Moolenaar
1169297bec07SBram Moolenaar  " Pressing right click in visual mode should change the visual selection
1170297bec07SBram Moolenaar  " if 'mousemodel' doesn't contain popup.
1171297bec07SBram Moolenaar  " Right click after the visual selection
1172297bec07SBram Moolenaar  set mousemodel=
1173297bec07SBram Moolenaar  set mouse=a
1174297bec07SBram Moolenaar  call test_setmouse(1, 13)
1175297bec07SBram Moolenaar  exe "normal 5|ve\<RightMouse>y"
1176297bec07SBram Moolenaar  call assert_equal('two three', @")
1177297bec07SBram Moolenaar  call assert_equal(5, col('.'))
1178297bec07SBram Moolenaar
1179297bec07SBram Moolenaar  " Right click before the visual selection
1180297bec07SBram Moolenaar  call test_setmouse(1, 9)
1181297bec07SBram Moolenaar  exe "normal 15|ve\<RightMouse>y"
1182297bec07SBram Moolenaar  call assert_equal('three four', @")
1183297bec07SBram Moolenaar  call assert_equal(9, col('.'))
1184297bec07SBram Moolenaar
11852764d06aSBram Moolenaar  " Right click inside the selection closer to the start of the selection
11862764d06aSBram Moolenaar  call test_setmouse(1, 7)
11872764d06aSBram Moolenaar  exe "normal 5|vee\<RightMouse>lly"
11882764d06aSBram Moolenaar  call assert_equal('three', @")
11892764d06aSBram Moolenaar  call assert_equal(9, col('.'))
11902764d06aSBram Moolenaar  call assert_equal(9, col("'<"))
11912764d06aSBram Moolenaar  call assert_equal(13, col("'>"))
11922764d06aSBram Moolenaar
11932764d06aSBram Moolenaar  " Right click inside the selection closer to the end of the selection
11942764d06aSBram Moolenaar  call test_setmouse(1, 11)
11952764d06aSBram Moolenaar  exe "normal 5|vee\<RightMouse>ly"
11962764d06aSBram Moolenaar  call assert_equal('two thre', @")
11972764d06aSBram Moolenaar  call assert_equal(5, col('.'))
11982764d06aSBram Moolenaar  call assert_equal(5, col("'<"))
11992764d06aSBram Moolenaar  call assert_equal(12, col("'>"))
12002764d06aSBram Moolenaar
12012764d06aSBram Moolenaar  " Multi-line selection. Right click inside thse selection.
12022764d06aSBram Moolenaar  call setline(1, repeat(['aaaaaa'], 7))
1203297bec07SBram Moolenaar  call test_setmouse(3, 1)
1204297bec07SBram Moolenaar  exe "normal ggVG\<RightMouse>y"
1205297bec07SBram Moolenaar  call assert_equal(3, line("'<"))
12062764d06aSBram Moolenaar  call test_setmouse(5, 1)
1207297bec07SBram Moolenaar  exe "normal ggVG\<RightMouse>y"
12082764d06aSBram Moolenaar  call assert_equal(5, line("'>"))
12092764d06aSBram Moolenaar
12102764d06aSBram Moolenaar  " Click right in the middle line of the selection
12112764d06aSBram Moolenaar  call test_setmouse(4, 3)
12122764d06aSBram Moolenaar  exe "normal ggVG$\<RightMouse>y"
12132764d06aSBram Moolenaar  call assert_equal(4, line("'<"))
12142764d06aSBram Moolenaar  call test_setmouse(4, 4)
12152764d06aSBram Moolenaar  exe "normal ggVG$\<RightMouse>y"
1216297bec07SBram Moolenaar  call assert_equal(4, line("'>"))
1217297bec07SBram Moolenaar
1218297bec07SBram Moolenaar  set mousemodel&
1219297bec07SBram Moolenaar  let &mouse = save_mouse
1220297bec07SBram Moolenaar  let &term = save_term
1221297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
1222297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
1223297bec07SBram Moolenaar  close!
1224297bec07SBram Moolenaarendfunc
1225297bec07SBram Moolenaar
12260eabd4dcSBram Moolenaar" Test for displaying the popup menu using the right mouse click
1227297bec07SBram Moolenaarfunc Test_term_mouse_popup_menu()
12280eabd4dcSBram Moolenaar  CheckFeature menu
12290eabd4dcSBram Moolenaar  new
12300eabd4dcSBram Moolenaar  call setline(1, 'popup menu test')
12310eabd4dcSBram Moolenaar  let save_mouse = &mouse
12320eabd4dcSBram Moolenaar  let save_term = &term
12330eabd4dcSBram Moolenaar  let save_ttymouse = &ttymouse
12340eabd4dcSBram Moolenaar  let save_mousemodel = &mousemodel
12350eabd4dcSBram Moolenaar  call test_override('no_query_mouse', 1)
12360eabd4dcSBram Moolenaar  set mouse=a term=xterm mousemodel=popup
12370eabd4dcSBram Moolenaar
12380eabd4dcSBram Moolenaar  menu PopUp.foo :let g:menustr = 'foo'<CR>
12390eabd4dcSBram Moolenaar  menu PopUp.bar :let g:menustr = 'bar'<CR>
12400eabd4dcSBram Moolenaar  menu PopUp.baz :let g:menustr = 'baz'<CR>
12410eabd4dcSBram Moolenaar
1242515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values
12432764d06aSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
12440eabd4dcSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
12450eabd4dcSBram Moolenaar    let g:menustr = ''
12460eabd4dcSBram Moolenaar    call feedkeys(MouseRightClickCode(1, 4)
12470eabd4dcSBram Moolenaar		\ .. MouseRightReleaseCode(1, 4) .. "\<Down>\<Down>\<CR>", "x")
12482764d06aSBram Moolenaar    call assert_equal('bar', g:menustr, msg)
12490eabd4dcSBram Moolenaar  endfor
12500eabd4dcSBram Moolenaar
12510eabd4dcSBram Moolenaar  unmenu PopUp
12520eabd4dcSBram Moolenaar  let &mouse = save_mouse
12530eabd4dcSBram Moolenaar  let &term = save_term
12540eabd4dcSBram Moolenaar  let &ttymouse = save_ttymouse
12550eabd4dcSBram Moolenaar  let &mousemodel = save_mousemodel
12560eabd4dcSBram Moolenaar  call test_override('no_query_mouse', 0)
12570eabd4dcSBram Moolenaar  close!
12580eabd4dcSBram Moolenaarendfunc
12590eabd4dcSBram Moolenaar
1260297bec07SBram Moolenaar" Test for 'mousemodel' set to popup_setpos to move the cursor where the popup
1261297bec07SBram Moolenaar" menu is displayed.
1262297bec07SBram Moolenaarfunc Test_term_mouse_popup_menu_setpos()
1263297bec07SBram Moolenaar  CheckFeature menu
1264297bec07SBram Moolenaar  5new
1265297bec07SBram Moolenaar  call setline(1, ['the dish ran away with the spoon',
1266297bec07SBram Moolenaar        \ 'the cow jumped over the moon' ])
1267297bec07SBram Moolenaar  let save_mouse = &mouse
1268297bec07SBram Moolenaar  let save_term = &term
1269297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
1270297bec07SBram Moolenaar  let save_mousemodel = &mousemodel
1271297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
1272297bec07SBram Moolenaar  set mouse=a term=xterm mousemodel=popup_setpos
1273297bec07SBram Moolenaar
1274297bec07SBram Moolenaar  nmenu PopUp.foo :let g:menustr = 'foo'<CR>
1275297bec07SBram Moolenaar  nmenu PopUp.bar :let g:menustr = 'bar'<CR>
1276297bec07SBram Moolenaar  nmenu PopUp.baz :let g:menustr = 'baz'<CR>
1277297bec07SBram Moolenaar  vmenu PopUp.foo y:<C-U>let g:menustr = 'foo'<CR>
1278297bec07SBram Moolenaar  vmenu PopUp.bar y:<C-U>let g:menustr = 'bar'<CR>
1279297bec07SBram Moolenaar  vmenu PopUp.baz y:<C-U>let g:menustr = 'baz'<CR>
1280297bec07SBram Moolenaar
1281297bec07SBram Moolenaar  for ttymouse_val in g:Ttymouse_values
12822764d06aSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
1283297bec07SBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
1284297bec07SBram Moolenaar    let g:menustr = ''
1285297bec07SBram Moolenaar    call cursor(1, 1)
1286297bec07SBram Moolenaar    call feedkeys(MouseRightClickCode(1, 5)
1287297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(1, 5) .. "\<Down>\<Down>\<CR>", "x")
12882764d06aSBram Moolenaar    call assert_equal('bar', g:menustr, msg)
12892764d06aSBram Moolenaar    call assert_equal([1, 5], [line('.'), col('.')], msg)
1290297bec07SBram Moolenaar
1291297bec07SBram Moolenaar    " Test for right click in visual mode inside the selection
1292297bec07SBram Moolenaar    let @" = ''
1293297bec07SBram Moolenaar    call cursor(1, 10)
1294297bec07SBram Moolenaar    call feedkeys('vee' .. MouseRightClickCode(1, 12)
1295297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(1, 12) .. "\<Down>\<CR>", "x")
12962764d06aSBram Moolenaar    call assert_equal([1, 10], [line('.'), col('.')], msg)
12972764d06aSBram Moolenaar    call assert_equal('ran away', @", msg)
1298297bec07SBram Moolenaar
1299297bec07SBram Moolenaar    " Test for right click in visual mode before the selection
1300297bec07SBram Moolenaar    let @" = ''
1301297bec07SBram Moolenaar    call cursor(1, 10)
1302297bec07SBram Moolenaar    call feedkeys('vee' .. MouseRightClickCode(1, 2)
1303297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(1, 2) .. "\<Down>\<CR>", "x")
13042764d06aSBram Moolenaar    call assert_equal([1, 2], [line('.'), col('.')], msg)
13052764d06aSBram Moolenaar    call assert_equal('', @", msg)
1306297bec07SBram Moolenaar
1307297bec07SBram Moolenaar    " Test for right click in visual mode after the selection
1308297bec07SBram Moolenaar    let @" = ''
1309297bec07SBram Moolenaar    call cursor(1, 10)
1310297bec07SBram Moolenaar    call feedkeys('vee' .. MouseRightClickCode(1, 20)
1311297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(1, 20) .. "\<Down>\<CR>", "x")
13122764d06aSBram Moolenaar    call assert_equal([1, 20], [line('.'), col('.')], msg)
13132764d06aSBram Moolenaar    call assert_equal('', @", msg)
1314297bec07SBram Moolenaar
1315297bec07SBram Moolenaar    " Test for right click in block-wise visual mode inside the selection
1316297bec07SBram Moolenaar    let @" = ''
1317297bec07SBram Moolenaar    call cursor(1, 16)
1318297bec07SBram Moolenaar    call feedkeys("\<C-V>j3l" .. MouseRightClickCode(2, 17)
1319297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(2, 17) .. "\<Down>\<CR>", "x")
13202764d06aSBram Moolenaar    call assert_equal([1, 16], [line('.'), col('.')], msg)
13212764d06aSBram Moolenaar    call assert_equal("\<C-V>4", getregtype('"'), msg)
1322297bec07SBram Moolenaar
1323297bec07SBram Moolenaar    " Test for right click in block-wise visual mode outside the selection
1324297bec07SBram Moolenaar    let @" = ''
1325297bec07SBram Moolenaar    call cursor(1, 16)
1326297bec07SBram Moolenaar    call feedkeys("\<C-V>j3l" .. MouseRightClickCode(2, 2)
1327297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(2, 2) .. "\<Down>\<CR>", "x")
13282764d06aSBram Moolenaar    call assert_equal([2, 2], [line('.'), col('.')], msg)
13292764d06aSBram Moolenaar    call assert_equal('v', getregtype('"'), msg)
13302764d06aSBram Moolenaar    call assert_equal('', @", msg)
1331297bec07SBram Moolenaar
1332297bec07SBram Moolenaar    " Try clicking on the status line
1333297bec07SBram Moolenaar    let @" = ''
1334297bec07SBram Moolenaar    call cursor(1, 10)
1335297bec07SBram Moolenaar    call feedkeys('vee' .. MouseRightClickCode(6, 2)
1336297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(6, 2) .. "\<Down>\<CR>", "x")
13372764d06aSBram Moolenaar    call assert_equal([1, 10], [line('.'), col('.')], msg)
13382764d06aSBram Moolenaar    call assert_equal('ran away', @", msg)
1339297bec07SBram Moolenaar
1340297bec07SBram Moolenaar    " Try clicking outside the window
1341297bec07SBram Moolenaar    let @" = ''
1342297bec07SBram Moolenaar    call cursor(7, 2)
1343297bec07SBram Moolenaar    call feedkeys('vee' .. MouseRightClickCode(7, 2)
1344297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(7, 2) .. "\<Down>\<CR>", "x")
13452764d06aSBram Moolenaar    call assert_equal(2, winnr(), msg)
13462764d06aSBram Moolenaar    call assert_equal('', @", msg)
1347297bec07SBram Moolenaar    wincmd w
1348297bec07SBram Moolenaar  endfor
1349297bec07SBram Moolenaar
1350297bec07SBram Moolenaar  unmenu PopUp
1351297bec07SBram Moolenaar  let &mouse = save_mouse
1352297bec07SBram Moolenaar  let &term = save_term
1353297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
1354297bec07SBram Moolenaar  let &mousemodel = save_mousemodel
1355297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
1356297bec07SBram Moolenaar  close!
1357297bec07SBram Moolenaarendfunc
1358297bec07SBram Moolenaar
1359297bec07SBram Moolenaar" Test for searching for the word under the cursor using Shift-Right or
1360297bec07SBram Moolenaar" Shift-Left click.
1361297bec07SBram Moolenaarfunc Test_term_mouse_search()
1362297bec07SBram Moolenaar  new
1363297bec07SBram Moolenaar  let save_mouse = &mouse
1364297bec07SBram Moolenaar  let save_term = &term
1365297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
1366297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
1367297bec07SBram Moolenaar  set mouse=a term=xterm ttymouse=xterm2
1368297bec07SBram Moolenaar  set mousemodel=
1369297bec07SBram Moolenaar
1370297bec07SBram Moolenaar  " In normal mode, Shift-Left or Shift-Right click should search for the word
1371297bec07SBram Moolenaar  " under the cursor.
1372297bec07SBram Moolenaar  call setline(1, ['one two three four', 'four three two one'])
1373297bec07SBram Moolenaar  call test_setmouse(1, 4)
1374297bec07SBram Moolenaar  exe "normal \<S-LeftMouse>"
1375297bec07SBram Moolenaar  call assert_equal([2, 12], [line('.'), col('.')])
1376297bec07SBram Moolenaar  call test_setmouse(2, 16)
1377297bec07SBram Moolenaar  exe "normal \<S-RightMouse>"
1378297bec07SBram Moolenaar  call assert_equal([1, 1], [line('.'), col('.')])
1379297bec07SBram Moolenaar
1380297bec07SBram Moolenaar  " In visual mode, Shift-Left or Shift-Right click should search for the word
1381297bec07SBram Moolenaar  " under the cursor and extend the selection.
1382297bec07SBram Moolenaar  call test_setmouse(1, 4)
1383297bec07SBram Moolenaar  exe "normal 4|ve\<S-LeftMouse>y"
1384297bec07SBram Moolenaar  call assert_equal([2, 12], [line("'>"), col("'>")])
1385297bec07SBram Moolenaar  call test_setmouse(2, 16)
1386297bec07SBram Moolenaar  exe "normal 2G16|ve\<S-RightMouse>y"
1387297bec07SBram Moolenaar  call assert_equal([1, 1], [line("'<"), col("'<")])
1388297bec07SBram Moolenaar
1389297bec07SBram Moolenaar  set mousemodel&
1390297bec07SBram Moolenaar  let &mouse = save_mouse
1391297bec07SBram Moolenaar  let &term = save_term
1392297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
1393297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
1394297bec07SBram Moolenaar  close!
1395297bec07SBram Moolenaarendfunc
1396297bec07SBram Moolenaar
1397297bec07SBram Moolenaar" Test for selecting an entry in the quickfix/location list window using the
1398297bec07SBram Moolenaar" mouse.
1399297bec07SBram Moolenaarfunc Test_term_mouse_quickfix_window()
1400297bec07SBram Moolenaar  let save_mouse = &mouse
1401297bec07SBram Moolenaar  let save_term = &term
1402297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
1403297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
1404297bec07SBram Moolenaar  set mouse=a term=xterm ttymouse=xterm2
1405297bec07SBram Moolenaar  set mousemodel=
1406297bec07SBram Moolenaar
1407297bec07SBram Moolenaar  cgetexpr "Xfile1:1:L1"
1408297bec07SBram Moolenaar  copen 5
1409297bec07SBram Moolenaar  call test_setmouse(&lines - 7, 1)
1410297bec07SBram Moolenaar  exe "normal \<2-LeftMouse>"
1411297bec07SBram Moolenaar  call assert_equal('Xfile1', @%)
1412297bec07SBram Moolenaar  %bw!
1413297bec07SBram Moolenaar
1414297bec07SBram Moolenaar  lgetexpr "Xfile2:1:L1"
1415297bec07SBram Moolenaar  lopen 5
1416297bec07SBram Moolenaar  call test_setmouse(&lines - 7, 1)
1417297bec07SBram Moolenaar  exe "normal \<2-LeftMouse>"
1418297bec07SBram Moolenaar  call assert_equal('Xfile2', @%)
1419297bec07SBram Moolenaar  %bw!
1420297bec07SBram Moolenaar
1421297bec07SBram Moolenaar  set mousemodel&
1422297bec07SBram Moolenaar  let &mouse = save_mouse
1423297bec07SBram Moolenaar  let &term = save_term
1424297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
1425297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
1426297bec07SBram Moolenaarendfunc
1427297bec07SBram Moolenaar
14282764d06aSBram Moolenaar" Test for the 'h' flag in the 'mouse' option. Using mouse in the help window.
14292764d06aSBram Moolenaarfunc Test_term_mouse_help_window()
14302764d06aSBram Moolenaar  let save_mouse = &mouse
14312764d06aSBram Moolenaar  let save_term = &term
14322764d06aSBram Moolenaar  let save_ttymouse = &ttymouse
14332764d06aSBram Moolenaar  call test_override('no_query_mouse', 1)
14342764d06aSBram Moolenaar  set mouse=h term=xterm mousetime=200
14352764d06aSBram Moolenaar
14362764d06aSBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
14372764d06aSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
14382764d06aSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
14392764d06aSBram Moolenaar    help
14402764d06aSBram Moolenaar    let @" = ''
14412764d06aSBram Moolenaar    call MouseLeftClick(2, 5)
14422764d06aSBram Moolenaar    call MouseLeftRelease(2, 5)
14432764d06aSBram Moolenaar    call MouseLeftClick(1, 1)
14442764d06aSBram Moolenaar    call MouseLeftDrag(1, 10)
14452764d06aSBram Moolenaar    call MouseLeftRelease(1, 10)
14462764d06aSBram Moolenaar    norm! y
14472764d06aSBram Moolenaar    call assert_equal('*help.txt*', @", msg)
14482764d06aSBram Moolenaar    helpclose
14492764d06aSBram Moolenaar
14502764d06aSBram Moolenaar    " Click somewhere else to make sure the left click above is not combined
14512764d06aSBram Moolenaar    " with the next left click and treated as a double click
14522764d06aSBram Moolenaar    call MouseRightClick(5, 10)
14532764d06aSBram Moolenaar    call MouseRightRelease(5, 10)
14542764d06aSBram Moolenaar  endfor
14552764d06aSBram Moolenaar
14562764d06aSBram Moolenaar  let &mouse = save_mouse
14572764d06aSBram Moolenaar  let &term = save_term
14582764d06aSBram Moolenaar  let &ttymouse = save_ttymouse
14592764d06aSBram Moolenaar  set mousetime&
14602764d06aSBram Moolenaar  call test_override('no_query_mouse', 0)
14612764d06aSBram Moolenaar  %bw!
14622764d06aSBram Moolenaarendfunc
14632764d06aSBram Moolenaar
14642764d06aSBram Moolenaar" Test for the translation of various mouse terminal codes
14652764d06aSBram Moolenaarfunc Test_mouse_termcodes()
14662764d06aSBram Moolenaar  let save_mouse = &mouse
14672764d06aSBram Moolenaar  let save_term = &term
14682764d06aSBram Moolenaar  let save_ttymouse = &ttymouse
14692764d06aSBram Moolenaar  call test_override('no_query_mouse', 1)
14702764d06aSBram Moolenaar  set mouse=a term=xterm mousetime=200
14712764d06aSBram Moolenaar
14722764d06aSBram Moolenaar  new
14732764d06aSBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
14742764d06aSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
14752764d06aSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
14762764d06aSBram Moolenaar
14772764d06aSBram Moolenaar    let mouse_codes = [
14782764d06aSBram Moolenaar          \ ["\<LeftMouse>", "<LeftMouse>"],
14792764d06aSBram Moolenaar          \ ["\<MiddleMouse>", "<MiddleMouse>"],
14802764d06aSBram Moolenaar          \ ["\<RightMouse>", "<RightMouse>"],
14812764d06aSBram Moolenaar          \ ["\<S-LeftMouse>", "<S-LeftMouse>"],
14822764d06aSBram Moolenaar          \ ["\<S-MiddleMouse>", "<S-MiddleMouse>"],
14832764d06aSBram Moolenaar          \ ["\<S-RightMouse>", "<S-RightMouse>"],
14842764d06aSBram Moolenaar          \ ["\<C-LeftMouse>", "<C-LeftMouse>"],
14852764d06aSBram Moolenaar          \ ["\<C-MiddleMouse>", "<C-MiddleMouse>"],
14862764d06aSBram Moolenaar          \ ["\<C-RightMouse>", "<C-RightMouse>"],
14872764d06aSBram Moolenaar          \ ["\<M-LeftMouse>", "<M-LeftMouse>"],
14882764d06aSBram Moolenaar          \ ["\<M-MiddleMouse>", "<M-MiddleMouse>"],
14892764d06aSBram Moolenaar          \ ["\<M-RightMouse>", "<M-RightMouse>"],
14902764d06aSBram Moolenaar          \ ["\<2-LeftMouse>", "<2-LeftMouse>"],
14912764d06aSBram Moolenaar          \ ["\<2-MiddleMouse>", "<2-MiddleMouse>"],
14922764d06aSBram Moolenaar          \ ["\<2-RightMouse>", "<2-RightMouse>"],
14932764d06aSBram Moolenaar          \ ["\<3-LeftMouse>", "<3-LeftMouse>"],
14942764d06aSBram Moolenaar          \ ["\<3-MiddleMouse>", "<3-MiddleMouse>"],
14952764d06aSBram Moolenaar          \ ["\<3-RightMouse>", "<3-RightMouse>"],
14962764d06aSBram Moolenaar          \ ["\<4-LeftMouse>", "<4-LeftMouse>"],
14972764d06aSBram Moolenaar          \ ["\<4-MiddleMouse>", "<4-MiddleMouse>"],
14982764d06aSBram Moolenaar          \ ["\<4-RightMouse>", "<4-RightMouse>"],
14992764d06aSBram Moolenaar          \ ["\<LeftDrag>", "<LeftDrag>"],
15002764d06aSBram Moolenaar          \ ["\<MiddleDrag>", "<MiddleDrag>"],
15012764d06aSBram Moolenaar          \ ["\<RightDrag>", "<RightDrag>"],
15022764d06aSBram Moolenaar          \ ["\<LeftRelease>", "<LeftRelease>"],
15032764d06aSBram Moolenaar          \ ["\<MiddleRelease>", "<MiddleRelease>"],
15042764d06aSBram Moolenaar          \ ["\<RightRelease>", "<RightRelease>"],
15052764d06aSBram Moolenaar          \ ["\<ScrollWheelUp>", "<ScrollWheelUp>"],
15062764d06aSBram Moolenaar          \ ["\<S-ScrollWheelUp>", "<S-ScrollWheelUp>"],
15072764d06aSBram Moolenaar          \ ["\<C-ScrollWheelUp>", "<C-ScrollWheelUp>"],
15082764d06aSBram Moolenaar          \ ["\<ScrollWheelDown>", "<ScrollWheelDown>"],
15092764d06aSBram Moolenaar          \ ["\<S-ScrollWheelDown>", "<S-ScrollWheelDown>"],
15102764d06aSBram Moolenaar          \ ["\<C-ScrollWheelDown>", "<C-ScrollWheelDown>"],
15112764d06aSBram Moolenaar          \ ["\<ScrollWheelLeft>", "<ScrollWheelLeft>"],
15122764d06aSBram Moolenaar          \ ["\<S-ScrollWheelLeft>", "<S-ScrollWheelLeft>"],
15132764d06aSBram Moolenaar          \ ["\<C-ScrollWheelLeft>", "<C-ScrollWheelLeft>"],
15142764d06aSBram Moolenaar          \ ["\<ScrollWheelRight>", "<ScrollWheelRight>"],
15152764d06aSBram Moolenaar          \ ["\<S-ScrollWheelRight>", "<S-ScrollWheelRight>"],
15162764d06aSBram Moolenaar          \ ["\<C-ScrollWheelRight>", "<C-ScrollWheelRight>"]
15172764d06aSBram Moolenaar          \ ]
15182764d06aSBram Moolenaar
15192764d06aSBram Moolenaar    for [code, outstr] in mouse_codes
15202764d06aSBram Moolenaar      exe "normal ggC\<C-K>" . code
15212764d06aSBram Moolenaar      call assert_equal(outstr, getline(1), msg)
15222764d06aSBram Moolenaar    endfor
15232764d06aSBram Moolenaar  endfor
15242764d06aSBram Moolenaar
15252764d06aSBram Moolenaar  let &mouse = save_mouse
15262764d06aSBram Moolenaar  let &term = save_term
15272764d06aSBram Moolenaar  let &ttymouse = save_ttymouse
15282764d06aSBram Moolenaar  set mousetime&
15292764d06aSBram Moolenaar  call test_override('no_query_mouse', 0)
15302764d06aSBram Moolenaar  %bw!
15312764d06aSBram Moolenaarendfunc
15322764d06aSBram Moolenaar
153366761db1SBram Moolenaar" This only checks if the sequence is recognized.
153466761db1SBram Moolenaarfunc Test_term_rgb_response()
153566761db1SBram Moolenaar  set t_RF=x
153666761db1SBram Moolenaar  set t_RB=y
153766761db1SBram Moolenaar
153866761db1SBram Moolenaar  " response to t_RF, 4 digits
153966761db1SBram Moolenaar  let red = 0x12
154066761db1SBram Moolenaar  let green = 0x34
154166761db1SBram Moolenaar  let blue = 0x56
154266761db1SBram Moolenaar  let seq = printf("\<Esc>]10;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
154366761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
154466761db1SBram Moolenaar  call assert_equal(seq, v:termrfgresp)
154566761db1SBram Moolenaar
154666761db1SBram Moolenaar  " response to t_RF, 2 digits
154766761db1SBram Moolenaar  let red = 0x78
154866761db1SBram Moolenaar  let green = 0x9a
154966761db1SBram Moolenaar  let blue = 0xbc
155066761db1SBram Moolenaar  let seq = printf("\<Esc>]10;rgb:%02x/%02x/%02x\x07", red, green, blue)
155166761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
155266761db1SBram Moolenaar  call assert_equal(seq, v:termrfgresp)
155366761db1SBram Moolenaar
155432e19770SBram Moolenaar  " response to t_RB, 4 digits, dark
155532e19770SBram Moolenaar  set background=light
1556ce90e36fSBram Moolenaar  eval 'background'->test_option_not_set()
155732e19770SBram Moolenaar  let red = 0x29
155832e19770SBram Moolenaar  let green = 0x4a
155932e19770SBram Moolenaar  let blue = 0x6b
156032e19770SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
156132e19770SBram Moolenaar  call feedkeys(seq, 'Lx!')
156232e19770SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
156332e19770SBram Moolenaar  call assert_equal('dark', &background)
156432e19770SBram Moolenaar
156532e19770SBram Moolenaar  " response to t_RB, 4 digits, light
156632e19770SBram Moolenaar  set background=dark
156732e19770SBram Moolenaar  call test_option_not_set('background')
156832e19770SBram Moolenaar  let red = 0x81
156932e19770SBram Moolenaar  let green = 0x63
157066761db1SBram Moolenaar  let blue = 0x65
157166761db1SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
157266761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
157366761db1SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
157432e19770SBram Moolenaar  call assert_equal('light', &background)
157566761db1SBram Moolenaar
157632e19770SBram Moolenaar  " response to t_RB, 2 digits, dark
157732e19770SBram Moolenaar  set background=light
157832e19770SBram Moolenaar  call test_option_not_set('background')
157932e19770SBram Moolenaar  let red = 0x47
158032e19770SBram Moolenaar  let green = 0x59
158132e19770SBram Moolenaar  let blue = 0x5b
158266761db1SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
158366761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
158466761db1SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
158532e19770SBram Moolenaar  call assert_equal('dark', &background)
158632e19770SBram Moolenaar
158732e19770SBram Moolenaar  " response to t_RB, 2 digits, light
158832e19770SBram Moolenaar  set background=dark
158932e19770SBram Moolenaar  call test_option_not_set('background')
159032e19770SBram Moolenaar  let red = 0x83
159132e19770SBram Moolenaar  let green = 0xa4
159232e19770SBram Moolenaar  let blue = 0xc2
159332e19770SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
159432e19770SBram Moolenaar  call feedkeys(seq, 'Lx!')
159532e19770SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
159632e19770SBram Moolenaar  call assert_equal('light', &background)
159766761db1SBram Moolenaar
159866761db1SBram Moolenaar  set t_RF= t_RB=
159966761db1SBram Moolenaarendfunc
160066761db1SBram Moolenaar
160166761db1SBram Moolenaar" This only checks if the sequence is recognized.
16021a4cbb19SBram Moolenaar" This must be after other tests, because it has side effects to xterm
16031a4cbb19SBram Moolenaar" properties.
16041a4cbb19SBram Moolenaarfunc Test_xx01_term_style_response()
160566761db1SBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
160666761db1SBram Moolenaar  set t_RV=x
16070c0eddd3SBram Moolenaar  call test_override('term_props', 1)
160866761db1SBram Moolenaar
160966761db1SBram Moolenaar  " send the termresponse to trigger requesting the XT codes
161066761db1SBram Moolenaar  let seq = "\<Esc>[>41;337;0c"
161166761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
161266761db1SBram Moolenaar  call assert_equal(seq, v:termresponse)
161366761db1SBram Moolenaar
161466761db1SBram Moolenaar  let seq = "\<Esc>P1$r2 q\<Esc>\\"
161566761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
161666761db1SBram Moolenaar  call assert_equal(seq, v:termstyleresp)
161766761db1SBram Moolenaar
16180c0eddd3SBram Moolenaar  call assert_equal(#{
16190c0eddd3SBram Moolenaar        \ cursor_style: 'u',
16200c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
16210c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
16220c0eddd3SBram Moolenaar        \ mouse: 's'
16230c0eddd3SBram Moolenaar        \ }, terminalprops())
16240c0eddd3SBram Moolenaar
162566761db1SBram Moolenaar  set t_RV=
16260c0eddd3SBram Moolenaar  call test_override('term_props', 0)
162766761db1SBram Moolenaarendfunc
1628de6dbb45SBram Moolenaar
162989577b3bSBram Moolenaar" This checks the iTerm2 version response.
163089577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
163189577b3bSBram Moolenaar" properties.
163289577b3bSBram Moolenaarfunc Test_xx02_iTerm2_response()
163389577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
163489577b3bSBram Moolenaar  set t_RV=x
16350c0eddd3SBram Moolenaar  call test_override('term_props', 1)
163689577b3bSBram Moolenaar
163789577b3bSBram Moolenaar  " Old versions of iTerm2 used a different style term response.
163889577b3bSBram Moolenaar  set ttymouse=xterm
163989577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
164089577b3bSBram Moolenaar  let seq = "\<Esc>[>0;95;c"
164189577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
164289577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
164389577b3bSBram Moolenaar  call assert_equal('xterm', &ttymouse)
164489577b3bSBram Moolenaar
164589577b3bSBram Moolenaar  set ttymouse=xterm
164689577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
164789577b3bSBram Moolenaar  let seq = "\<Esc>[>0;95;0c"
164889577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
164989577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
165089577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
165189577b3bSBram Moolenaar
16520c0eddd3SBram Moolenaar  call assert_equal(#{
16530c0eddd3SBram Moolenaar        \ cursor_style: 'n',
16540c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
16550c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
16560c0eddd3SBram Moolenaar        \ mouse: 's'
16570c0eddd3SBram Moolenaar        \ }, terminalprops())
16580c0eddd3SBram Moolenaar
165989577b3bSBram Moolenaar  set t_RV=
16600c0eddd3SBram Moolenaar  call test_override('term_props', 0)
166189577b3bSBram Moolenaarendfunc
166289577b3bSBram Moolenaar
16631a4cbb19SBram Moolenaar" This checks the libvterm version response.
16641a4cbb19SBram Moolenaar" This must be after other tests, because it has side effects to xterm
16651a4cbb19SBram Moolenaar" properties.
166689577b3bSBram Moolenaarfunc Test_xx03_libvterm_response()
16671a4cbb19SBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
16681a4cbb19SBram Moolenaar  set t_RV=x
16690c0eddd3SBram Moolenaar  call test_override('term_props', 1)
167003b00476SBram Moolenaar
16711a4cbb19SBram Moolenaar  set ttymouse=xterm
16721a4cbb19SBram Moolenaar  call test_option_not_set('ttymouse')
16731a4cbb19SBram Moolenaar  let seq = "\<Esc>[>0;100;0c"
16741a4cbb19SBram Moolenaar  call feedkeys(seq, 'Lx!')
16751a4cbb19SBram Moolenaar  call assert_equal(seq, v:termresponse)
16761a4cbb19SBram Moolenaar  call assert_equal('sgr', &ttymouse)
16771a4cbb19SBram Moolenaar
16780c0eddd3SBram Moolenaar  call assert_equal(#{
16790c0eddd3SBram Moolenaar        \ cursor_style: 'n',
16800c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
16810c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
16820c0eddd3SBram Moolenaar        \ mouse: 's'
16830c0eddd3SBram Moolenaar        \ }, terminalprops())
16840c0eddd3SBram Moolenaar
16851a4cbb19SBram Moolenaar  set t_RV=
16860c0eddd3SBram Moolenaar  call test_override('term_props', 0)
16871a4cbb19SBram Moolenaarendfunc
16881a4cbb19SBram Moolenaar
168989577b3bSBram Moolenaar" This checks the Mac Terminal.app version response.
169089577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
169189577b3bSBram Moolenaar" properties.
169289577b3bSBram Moolenaarfunc Test_xx04_Mac_Terminal_response()
169389577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
169489577b3bSBram Moolenaar  set t_RV=x
16950c0eddd3SBram Moolenaar  call test_override('term_props', 1)
169689577b3bSBram Moolenaar
169789577b3bSBram Moolenaar  set ttymouse=xterm
16988dff4cbfSBram Moolenaar  " t_8u is not reset
16998dff4cbfSBram Moolenaar  let &t_8u = "\<Esc>[58;2;%lu;%lu;%lum"
170089577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
170189577b3bSBram Moolenaar  let seq = "\<Esc>[>1;95;0c"
170289577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
170389577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
170489577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
170589577b3bSBram Moolenaar
17060c0eddd3SBram Moolenaar  call assert_equal(#{
17070c0eddd3SBram Moolenaar        \ cursor_style: 'n',
17080c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
17090c0eddd3SBram Moolenaar        \ underline_rgb: 'y',
17100c0eddd3SBram Moolenaar        \ mouse: 's'
17110c0eddd3SBram Moolenaar        \ }, terminalprops())
17128dff4cbfSBram Moolenaar  call assert_equal("\<Esc>[58;2;%lu;%lu;%lum", &t_8u)
17130c0eddd3SBram Moolenaar
171489577b3bSBram Moolenaar  " Reset is_not_xterm and is_mac_terminal.
171589577b3bSBram Moolenaar  set t_RV=
171689577b3bSBram Moolenaar  set term=xterm
171789577b3bSBram Moolenaar  set t_RV=x
17180c0eddd3SBram Moolenaar  call test_override('term_props', 0)
171989577b3bSBram Moolenaarendfunc
172089577b3bSBram Moolenaar
172189577b3bSBram Moolenaar" This checks the mintty version response.
172289577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
172389577b3bSBram Moolenaar" properties.
172489577b3bSBram Moolenaarfunc Test_xx05_mintty_response()
172589577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
172689577b3bSBram Moolenaar  set t_RV=x
17270c0eddd3SBram Moolenaar  call test_override('term_props', 1)
172889577b3bSBram Moolenaar
172989577b3bSBram Moolenaar  set ttymouse=xterm
173089577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
173189577b3bSBram Moolenaar  let seq = "\<Esc>[>77;20905;0c"
173289577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
173389577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
173489577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
173589577b3bSBram Moolenaar
17360c0eddd3SBram Moolenaar  call assert_equal(#{
17370c0eddd3SBram Moolenaar        \ cursor_style: 'n',
17380c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
17390c0eddd3SBram Moolenaar        \ underline_rgb: 'y',
17400c0eddd3SBram Moolenaar        \ mouse: 's'
17410c0eddd3SBram Moolenaar        \ }, terminalprops())
17420c0eddd3SBram Moolenaar
174389577b3bSBram Moolenaar  set t_RV=
17440c0eddd3SBram Moolenaar  call test_override('term_props', 0)
174589577b3bSBram Moolenaarendfunc
174689577b3bSBram Moolenaar
174789577b3bSBram Moolenaar" This checks the screen version response.
174889577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
174989577b3bSBram Moolenaar" properties.
175089577b3bSBram Moolenaarfunc Test_xx06_screen_response()
175189577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
175289577b3bSBram Moolenaar  set t_RV=x
17530c0eddd3SBram Moolenaar  call test_override('term_props', 1)
175489577b3bSBram Moolenaar
175589577b3bSBram Moolenaar  " Old versions of screen don't support SGR mouse mode.
175689577b3bSBram Moolenaar  set ttymouse=xterm
175789577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
175889577b3bSBram Moolenaar  let seq = "\<Esc>[>83;40500;0c"
175989577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
176089577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
176189577b3bSBram Moolenaar  call assert_equal('xterm', &ttymouse)
176289577b3bSBram Moolenaar
176389577b3bSBram Moolenaar  " screen supports SGR mouse mode starting in version 4.7.
176489577b3bSBram Moolenaar  set ttymouse=xterm
176589577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
176689577b3bSBram Moolenaar  let seq = "\<Esc>[>83;40700;0c"
176789577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
176889577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
176989577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
177089577b3bSBram Moolenaar
17710c0eddd3SBram Moolenaar  call assert_equal(#{
17720c0eddd3SBram Moolenaar        \ cursor_style: 'n',
17730c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'n',
17740c0eddd3SBram Moolenaar        \ underline_rgb: 'y',
17750c0eddd3SBram Moolenaar        \ mouse: 's'
17760c0eddd3SBram Moolenaar        \ }, terminalprops())
17770c0eddd3SBram Moolenaar
177889577b3bSBram Moolenaar  set t_RV=
17790c0eddd3SBram Moolenaar  call test_override('term_props', 0)
178089577b3bSBram Moolenaarendfunc
178189577b3bSBram Moolenaar
178203b00476SBram Moolenaar" This checks the xterm version response.
178303b00476SBram Moolenaar" This must be after other tests, because it has side effects to xterm
178403b00476SBram Moolenaar" properties.
178589577b3bSBram Moolenaarfunc Test_xx07_xterm_response()
178603b00476SBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
178703b00476SBram Moolenaar  set t_RV=x
17880c0eddd3SBram Moolenaar  call test_override('term_props', 1)
178903b00476SBram Moolenaar
17903cea8a9aSBram Moolenaar  " Do Terminal.app first to check that is_mac_terminal is reset.
17913cea8a9aSBram Moolenaar  set ttymouse=xterm
17923cea8a9aSBram Moolenaar  call test_option_not_set('ttymouse')
17933cea8a9aSBram Moolenaar  let seq = "\<Esc>[>1;95;0c"
17943cea8a9aSBram Moolenaar  call feedkeys(seq, 'Lx!')
17953cea8a9aSBram Moolenaar  call assert_equal(seq, v:termresponse)
17963cea8a9aSBram Moolenaar  call assert_equal('sgr', &ttymouse)
17973cea8a9aSBram Moolenaar
179803b00476SBram Moolenaar  " xterm < 95: "xterm" (actually unmodified)
17993cea8a9aSBram Moolenaar  set t_RV=
18003cea8a9aSBram Moolenaar  set term=xterm
18013cea8a9aSBram Moolenaar  set t_RV=x
180203b00476SBram Moolenaar  set ttymouse=xterm
180303b00476SBram Moolenaar  call test_option_not_set('ttymouse')
180403b00476SBram Moolenaar  let seq = "\<Esc>[>0;94;0c"
180503b00476SBram Moolenaar  call feedkeys(seq, 'Lx!')
180603b00476SBram Moolenaar  call assert_equal(seq, v:termresponse)
180703b00476SBram Moolenaar  call assert_equal('xterm', &ttymouse)
180803b00476SBram Moolenaar
18090c0eddd3SBram Moolenaar  call assert_equal(#{
18100c0eddd3SBram Moolenaar        \ cursor_style: 'n',
18110c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
18120c0eddd3SBram Moolenaar        \ underline_rgb: 'y',
18130c0eddd3SBram Moolenaar        \ mouse: 'u'
18140c0eddd3SBram Moolenaar        \ }, terminalprops())
18150c0eddd3SBram Moolenaar
181603b00476SBram Moolenaar  " xterm >= 95 < 277 "xterm2"
181703b00476SBram Moolenaar  set ttymouse=xterm
181803b00476SBram Moolenaar  call test_option_not_set('ttymouse')
181903b00476SBram Moolenaar  let seq = "\<Esc>[>0;267;0c"
182003b00476SBram Moolenaar  call feedkeys(seq, 'Lx!')
182103b00476SBram Moolenaar  call assert_equal(seq, v:termresponse)
182203b00476SBram Moolenaar  call assert_equal('xterm2', &ttymouse)
182303b00476SBram Moolenaar
18240c0eddd3SBram Moolenaar  call assert_equal(#{
18250c0eddd3SBram Moolenaar        \ cursor_style: 'n',
18260c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
18270c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
18280c0eddd3SBram Moolenaar        \ mouse: '2'
18290c0eddd3SBram Moolenaar        \ }, terminalprops())
18300c0eddd3SBram Moolenaar
183103b00476SBram Moolenaar  " xterm >= 277: "sgr"
183203b00476SBram Moolenaar  set ttymouse=xterm
183303b00476SBram Moolenaar  call test_option_not_set('ttymouse')
183403b00476SBram Moolenaar  let seq = "\<Esc>[>0;277;0c"
183503b00476SBram Moolenaar  call feedkeys(seq, 'Lx!')
183603b00476SBram Moolenaar  call assert_equal(seq, v:termresponse)
183703b00476SBram Moolenaar  call assert_equal('sgr', &ttymouse)
183803b00476SBram Moolenaar
18390c0eddd3SBram Moolenaar  call assert_equal(#{
18400c0eddd3SBram Moolenaar        \ cursor_style: 'n',
18410c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
18420c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
18430c0eddd3SBram Moolenaar        \ mouse: 's'
18440c0eddd3SBram Moolenaar        \ }, terminalprops())
18450c0eddd3SBram Moolenaar
18468dff4cbfSBram Moolenaar  " xterm >= 279: "sgr" and cursor_style not reset; also check t_8u reset
18470c0eddd3SBram Moolenaar  set ttymouse=xterm
18480c0eddd3SBram Moolenaar  call test_option_not_set('ttymouse')
18498dff4cbfSBram Moolenaar  let &t_8u = "\<Esc>[58;2;%lu;%lu;%lum"
18500c0eddd3SBram Moolenaar  let seq = "\<Esc>[>0;279;0c"
18510c0eddd3SBram Moolenaar  call feedkeys(seq, 'Lx!')
18520c0eddd3SBram Moolenaar  call assert_equal(seq, v:termresponse)
18530c0eddd3SBram Moolenaar  call assert_equal('sgr', &ttymouse)
18540c0eddd3SBram Moolenaar
18550c0eddd3SBram Moolenaar  call assert_equal(#{
18560c0eddd3SBram Moolenaar        \ cursor_style: 'u',
18570c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
18580c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
18590c0eddd3SBram Moolenaar        \ mouse: 's'
18600c0eddd3SBram Moolenaar        \ }, terminalprops())
18618dff4cbfSBram Moolenaar  call assert_equal('', &t_8u)
18620c0eddd3SBram Moolenaar
186303b00476SBram Moolenaar  set t_RV=
18640c0eddd3SBram Moolenaar  call test_override('term_props', 0)
186503b00476SBram Moolenaarendfunc
186603b00476SBram Moolenaar
1867de6dbb45SBram Moolenaarfunc Test_get_termcode()
1868eb66328bSBram Moolenaar  try
1869de6dbb45SBram Moolenaar    let k1 = &t_k1
1870eb66328bSBram Moolenaar  catch /E113/
1871eb66328bSBram Moolenaar    throw 'Skipped: Unable to query termcodes'
1872eb66328bSBram Moolenaar  endtry
1873de6dbb45SBram Moolenaar  set t_k1=
1874de6dbb45SBram Moolenaar  set t_k1&
1875de6dbb45SBram Moolenaar  call assert_equal(k1, &t_k1)
18769aeb3363SBram Moolenaar
18779aeb3363SBram Moolenaar  " use external termcap first
18789aeb3363SBram Moolenaar  set nottybuiltin
18799aeb3363SBram Moolenaar  set t_k1=
18809aeb3363SBram Moolenaar  set t_k1&
18819aeb3363SBram Moolenaar  " when using external termcap may get something else, but it must not be
18829aeb3363SBram Moolenaar  " empty, since we would fallback to the builtin one.
18839aeb3363SBram Moolenaar  call assert_notequal('', &t_k1)
18849aeb3363SBram Moolenaar
18859aeb3363SBram Moolenaar  if &term =~ 'xterm'
18869aeb3363SBram Moolenaar    " use internal termcap first
18879aeb3363SBram Moolenaar    let term_save = &term
18889aeb3363SBram Moolenaar    let &term = 'builtin_' .. &term
18899aeb3363SBram Moolenaar    set t_k1=
18909aeb3363SBram Moolenaar    set t_k1&
18919aeb3363SBram Moolenaar    call assert_equal(k1, &t_k1)
18929aeb3363SBram Moolenaar    let &term = term_save
18939aeb3363SBram Moolenaar  endif
18949aeb3363SBram Moolenaar
18959aeb3363SBram Moolenaar  set ttybuiltin
1896de6dbb45SBram Moolenaarendfunc
189718a79a68SBram Moolenaar
1898ecd34bf5SBram Moolenaarfunc Test_list_builtin_terminals()
1899*e46a2ed0SBram Moolenaar  CheckRunVimInTerminal
1900ecd34bf5SBram Moolenaar  let buf = RunVimInTerminal('', #{rows: 14})
1901ecd34bf5SBram Moolenaar  call term_sendkeys(buf, ":set cmdheight=3\<CR>")
1902ecd34bf5SBram Moolenaar  call term_wait(buf, 100)
1903ecd34bf5SBram Moolenaar  call term_sendkeys(buf, ":set term=xxx\<CR>")
1904ecd34bf5SBram Moolenaar  call term_wait(buf, 100)
1905ecd34bf5SBram Moolenaar  call assert_match('builtin_dumb', term_getline(buf, 11))
1906ecd34bf5SBram Moolenaar  call assert_match('Not found in termcap', term_getline(buf, 12))
1907ecd34bf5SBram Moolenaar  call StopVimInTerminal(buf)
1908ecd34bf5SBram Moolenaarendfunc
1909ecd34bf5SBram Moolenaar
191018a79a68SBram Moolenaarfunc GetEscCodeCSI27(key, modifier)
191118a79a68SBram Moolenaar  let key = printf("%d", char2nr(a:key))
191218a79a68SBram Moolenaar  let mod = printf("%d", a:modifier)
191318a79a68SBram Moolenaar  return "\<Esc>[27;" .. mod .. ';' .. key .. '~'
191418a79a68SBram Moolenaarendfunc
191518a79a68SBram Moolenaar
191618a79a68SBram Moolenaarfunc GetEscCodeCSIu(key, modifier)
191718a79a68SBram Moolenaar  let key = printf("%d", char2nr(a:key))
191818a79a68SBram Moolenaar  let mod = printf("%d", a:modifier)
191918a79a68SBram Moolenaar  return "\<Esc>[" .. key .. ';' .. mod .. 'u'
192018a79a68SBram Moolenaarendfunc
192118a79a68SBram Moolenaar
192218a79a68SBram Moolenaar" This checks the CSI sequences when in modifyOtherKeys mode.
192318a79a68SBram Moolenaar" The mode doesn't need to be enabled, the codes are always detected.
192418a79a68SBram Moolenaarfunc RunTest_modifyOtherKeys(func)
192518a79a68SBram Moolenaar  new
1926459fd785SBram Moolenaar  set timeoutlen=10
192718a79a68SBram Moolenaar
1928f19f8d1aSBram Moolenaar  " Shift-X is sent as 'X' with the shift modifier
192918a79a68SBram Moolenaar  call feedkeys('a' .. a:func('X', 2) .. "\<Esc>", 'Lx!')
193018a79a68SBram Moolenaar  call assert_equal('X', getline(1))
193118a79a68SBram Moolenaar
193218a79a68SBram Moolenaar  " Ctrl-i is Tab
193318a79a68SBram Moolenaar  call setline(1, '')
193418a79a68SBram Moolenaar  call feedkeys('a' .. a:func('i', 5) .. "\<Esc>", 'Lx!')
193518a79a68SBram Moolenaar  call assert_equal("\t", getline(1))
193618a79a68SBram Moolenaar
193718a79a68SBram Moolenaar  " Ctrl-I is also Tab
193818a79a68SBram Moolenaar  call setline(1, '')
193918a79a68SBram Moolenaar  call feedkeys('a' .. a:func('I', 5) .. "\<Esc>", 'Lx!')
194018a79a68SBram Moolenaar  call assert_equal("\t", getline(1))
194118a79a68SBram Moolenaar
194218a79a68SBram Moolenaar  " Alt-x is ø
194318a79a68SBram Moolenaar  call setline(1, '')
194418a79a68SBram Moolenaar  call feedkeys('a' .. a:func('x', 3) .. "\<Esc>", 'Lx!')
194518a79a68SBram Moolenaar  call assert_equal("ø", getline(1))
194618a79a68SBram Moolenaar
194718a79a68SBram Moolenaar  " Meta-x is also ø
194818a79a68SBram Moolenaar  call setline(1, '')
194918a79a68SBram Moolenaar  call feedkeys('a' .. a:func('x', 9) .. "\<Esc>", 'Lx!')
195018a79a68SBram Moolenaar  call assert_equal("ø", getline(1))
195118a79a68SBram Moolenaar
195218a79a68SBram Moolenaar  " Alt-X is Ø
195318a79a68SBram Moolenaar  call setline(1, '')
195418a79a68SBram Moolenaar  call feedkeys('a' .. a:func('X', 3) .. "\<Esc>", 'Lx!')
195518a79a68SBram Moolenaar  call assert_equal("Ø", getline(1))
195618a79a68SBram Moolenaar
195718a79a68SBram Moolenaar  " Meta-X is ø
195818a79a68SBram Moolenaar  call setline(1, '')
195918a79a68SBram Moolenaar  call feedkeys('a' .. a:func('X', 9) .. "\<Esc>", 'Lx!')
196018a79a68SBram Moolenaar  call assert_equal("Ø", getline(1))
196118a79a68SBram Moolenaar
1962828ffd59SBram Moolenaar  " Ctrl-6 is Ctrl-^
1963828ffd59SBram Moolenaar  split aaa
1964828ffd59SBram Moolenaar  edit bbb
1965828ffd59SBram Moolenaar  call feedkeys(a:func('6', 5), 'Lx!')
1966828ffd59SBram Moolenaar  call assert_equal("aaa", bufname())
1967828ffd59SBram Moolenaar  bwipe aaa
1968828ffd59SBram Moolenaar  bwipe bbb
1969828ffd59SBram Moolenaar
197018a79a68SBram Moolenaar  bwipe!
197118a79a68SBram Moolenaar  set timeoutlen&
197218a79a68SBram Moolenaarendfunc
197318a79a68SBram Moolenaar
1974459fd785SBram Moolenaarfunc Test_modifyOtherKeys_basic()
197518a79a68SBram Moolenaar  call RunTest_modifyOtherKeys(function('GetEscCodeCSI27'))
197618a79a68SBram Moolenaar  call RunTest_modifyOtherKeys(function('GetEscCodeCSIu'))
197718a79a68SBram Moolenaarendfunc
1978d1e2f398SBram Moolenaar
197938571a04SBram Moolenaarfunc Test_modifyOtherKeys_no_mapping()
198038571a04SBram Moolenaar  set timeoutlen=10
198138571a04SBram Moolenaar
198238571a04SBram Moolenaar  let @a = 'aaa'
198338571a04SBram Moolenaar  call feedkeys(":let x = '" .. GetEscCodeCSI27('R', 5) .. GetEscCodeCSI27('R', 5) .. "a'\<CR>", 'Lx!')
198438571a04SBram Moolenaar  call assert_equal("let x = 'aaa'", @:)
198538571a04SBram Moolenaar
198638571a04SBram Moolenaar  new
198738571a04SBram Moolenaar  call feedkeys("a" .. GetEscCodeCSI27('R', 5) .. GetEscCodeCSI27('R', 5) .. "a\<Esc>", 'Lx!')
198838571a04SBram Moolenaar  call assert_equal("aaa", getline(1))
198938571a04SBram Moolenaar  bwipe!
199038571a04SBram Moolenaar
199138571a04SBram Moolenaar  new
199238571a04SBram Moolenaar  call feedkeys("axx\<CR>yy" .. GetEscCodeCSI27('G', 5) .. GetEscCodeCSI27('K', 5) .. "a\<Esc>", 'Lx!')
199338571a04SBram Moolenaar  call assert_equal("axx", getline(1))
199438571a04SBram Moolenaar  call assert_equal("yy", getline(2))
199538571a04SBram Moolenaar  bwipe!
199638571a04SBram Moolenaar
199738571a04SBram Moolenaar  set timeoutlen&
199838571a04SBram Moolenaarendfunc
199938571a04SBram Moolenaar
2000d1e2f398SBram Moolenaarfunc RunTest_mapping_shift(key, func)
2001d1e2f398SBram Moolenaar  call setline(1, '')
2002d1e2f398SBram Moolenaar  if a:key == '|'
2003d1e2f398SBram Moolenaar    exe 'inoremap \| xyz'
2004d1e2f398SBram Moolenaar  else
2005d1e2f398SBram Moolenaar    exe 'inoremap ' .. a:key .. ' xyz'
2006d1e2f398SBram Moolenaar  endif
2007d1e2f398SBram Moolenaar  call feedkeys('a' .. a:func(a:key, 2) .. "\<Esc>", 'Lx!')
2008d1e2f398SBram Moolenaar  call assert_equal("xyz", getline(1))
2009d1e2f398SBram Moolenaar  if a:key == '|'
2010d1e2f398SBram Moolenaar    exe 'iunmap \|'
2011d1e2f398SBram Moolenaar  else
2012d1e2f398SBram Moolenaar    exe 'iunmap ' .. a:key
2013d1e2f398SBram Moolenaar  endif
2014d1e2f398SBram Moolenaarendfunc
2015d1e2f398SBram Moolenaar
2016975a880aSBram Moolenaarfunc Test_modifyOtherKeys_mapped()
2017975a880aSBram Moolenaar  set timeoutlen=10
2018975a880aSBram Moolenaar  imap ' <C-W>
2019975a880aSBram Moolenaar  imap <C-W><C-A> c-a
2020975a880aSBram Moolenaar  call setline(1, '')
2021975a880aSBram Moolenaar
2022975a880aSBram Moolenaar  " single quote is turned into single byte CTRL-W
2023975a880aSBram Moolenaar  " CTRL-A is added with a separate modifier, and needs to be simplified before
2024975a880aSBram Moolenaar  " the mapping can match.
2025975a880aSBram Moolenaar  call feedkeys("a'" .. GetEscCodeCSI27('A', 5) .. "\<Esc>", 'Lx!')
2026975a880aSBram Moolenaar  call assert_equal('c-a', getline(1))
2027975a880aSBram Moolenaar
2028975a880aSBram Moolenaar  iunmap '
2029975a880aSBram Moolenaar  iunmap <C-W><C-A>
2030975a880aSBram Moolenaar  set timeoutlen&
2031975a880aSBram Moolenaarendfunc
2032975a880aSBram Moolenaar
2033d1e2f398SBram Moolenaarfunc RunTest_mapping_works_with_shift(func)
2034d1e2f398SBram Moolenaar  new
2035459fd785SBram Moolenaar  set timeoutlen=10
2036d1e2f398SBram Moolenaar
2037d1e2f398SBram Moolenaar  call RunTest_mapping_shift('@', a:func)
2038d1e2f398SBram Moolenaar  call RunTest_mapping_shift('A', a:func)
2039d1e2f398SBram Moolenaar  call RunTest_mapping_shift('Z', a:func)
2040d1e2f398SBram Moolenaar  call RunTest_mapping_shift('^', a:func)
2041d1e2f398SBram Moolenaar  call RunTest_mapping_shift('_', a:func)
2042d1e2f398SBram Moolenaar  call RunTest_mapping_shift('{', a:func)
2043d1e2f398SBram Moolenaar  call RunTest_mapping_shift('|', a:func)
2044d1e2f398SBram Moolenaar  call RunTest_mapping_shift('}', a:func)
2045d1e2f398SBram Moolenaar  call RunTest_mapping_shift('~', a:func)
2046d1e2f398SBram Moolenaar
2047d1e2f398SBram Moolenaar  bwipe!
2048d1e2f398SBram Moolenaar  set timeoutlen&
2049d1e2f398SBram Moolenaarendfunc
2050d1e2f398SBram Moolenaar
2051459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_plain()
2052d1e2f398SBram Moolenaar  call RunTest_mapping_works_with_shift(function('GetEscCodeCSI27'))
2053d1e2f398SBram Moolenaar  call RunTest_mapping_works_with_shift(function('GetEscCodeCSIu'))
2054d1e2f398SBram Moolenaarendfunc
2055459fd785SBram Moolenaar
2056459fd785SBram Moolenaarfunc RunTest_mapping_mods(map, key, func, code)
2057459fd785SBram Moolenaar  call setline(1, '')
2058459fd785SBram Moolenaar  exe 'inoremap ' .. a:map .. ' xyz'
2059459fd785SBram Moolenaar  call feedkeys('a' .. a:func(a:key, a:code) .. "\<Esc>", 'Lx!')
2060459fd785SBram Moolenaar  call assert_equal("xyz", getline(1))
2061459fd785SBram Moolenaar  exe 'iunmap ' .. a:map
2062459fd785SBram Moolenaarendfunc
2063459fd785SBram Moolenaar
2064459fd785SBram Moolenaarfunc RunTest_mapping_works_with_mods(func, mods, code)
2065459fd785SBram Moolenaar  new
2066459fd785SBram Moolenaar  set timeoutlen=10
2067459fd785SBram Moolenaar
2068459fd785SBram Moolenaar  if a:mods !~ 'S'
2069459fd785SBram Moolenaar    " Shift by itself has no effect
2070459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-@>', '@', a:func, a:code)
2071459fd785SBram Moolenaar  endif
2072459fd785SBram Moolenaar  call RunTest_mapping_mods('<' .. a:mods .. '-A>', 'A', a:func, a:code)
2073459fd785SBram Moolenaar  call RunTest_mapping_mods('<' .. a:mods .. '-Z>', 'Z', a:func, a:code)
2074459fd785SBram Moolenaar  if a:mods !~ 'S'
2075459fd785SBram Moolenaar    " with Shift code is always upper case
2076459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-a>', 'a', a:func, a:code)
2077459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-z>', 'z', a:func, a:code)
2078459fd785SBram Moolenaar  endif
2079459fd785SBram Moolenaar  if a:mods != 'A'
2080459fd785SBram Moolenaar    " with Alt code is not in upper case
2081459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-a>', 'A', a:func, a:code)
2082459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-z>', 'Z', a:func, a:code)
2083459fd785SBram Moolenaar  endif
2084459fd785SBram Moolenaar  call RunTest_mapping_mods('<' .. a:mods .. '-á>', 'á', a:func, a:code)
2085459fd785SBram Moolenaar  if a:mods !~ 'S'
2086459fd785SBram Moolenaar    " Shift by itself has no effect
2087459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-^>', '^', a:func, a:code)
2088459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-_>', '_', a:func, a:code)
2089459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-{>', '{', a:func, a:code)
2090459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-\|>', '|', a:func, a:code)
2091459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-}>', '}', a:func, a:code)
2092459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-~>', '~', a:func, a:code)
2093459fd785SBram Moolenaar  endif
2094459fd785SBram Moolenaar
2095459fd785SBram Moolenaar  bwipe!
2096459fd785SBram Moolenaar  set timeoutlen&
2097459fd785SBram Moolenaarendfunc
2098459fd785SBram Moolenaar
2099459fd785SBram Moolenaarfunc Test_mapping_works_with_shift()
2100459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'S', 2)
2101459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'S', 2)
2102459fd785SBram Moolenaarendfunc
2103459fd785SBram Moolenaar
2104459fd785SBram Moolenaarfunc Test_mapping_works_with_ctrl()
2105459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C', 5)
2106459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C', 5)
2107459fd785SBram Moolenaarendfunc
2108459fd785SBram Moolenaar
2109459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_ctrl()
2110459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-S', 6)
2111459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-S', 6)
2112459fd785SBram Moolenaarendfunc
2113459fd785SBram Moolenaar
2114459fd785SBram Moolenaar" Below we also test the "u" code with Alt, This works, but libvterm would not
2115459fd785SBram Moolenaar" send the Alt key like this but by prefixing an Esc.
2116459fd785SBram Moolenaar
2117459fd785SBram Moolenaarfunc Test_mapping_works_with_alt()
2118459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'A', 3)
2119459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'A', 3)
2120459fd785SBram Moolenaarendfunc
2121459fd785SBram Moolenaar
2122459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_alt()
2123459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'S-A', 4)
2124459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'S-A', 4)
2125459fd785SBram Moolenaarendfunc
2126459fd785SBram Moolenaar
2127459fd785SBram Moolenaarfunc Test_mapping_works_with_ctrl_alt()
2128459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-A', 7)
2129459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-A', 7)
2130459fd785SBram Moolenaarendfunc
2131459fd785SBram Moolenaar
2132459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_ctrl_alt()
2133459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-S-A', 8)
2134459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-S-A', 8)
2135459fd785SBram Moolenaarendfunc
2136fc4ea2a7SBram Moolenaar
2137fc4ea2a7SBram Moolenaarfunc Test_insert_literal()
2138fc4ea2a7SBram Moolenaar  set timeoutlen=10
2139fc4ea2a7SBram Moolenaar  new
2140fc4ea2a7SBram Moolenaar  " CTRL-V CTRL-X inserts a ^X
2141fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSIu('V', '5') .. GetEscCodeCSIu('X', '5') .. "\<Esc>", 'Lx!')
2142fc4ea2a7SBram Moolenaar  call assert_equal("\<C-X>", getline(1))
2143fc4ea2a7SBram Moolenaar
2144fc4ea2a7SBram Moolenaar  call setline(1, '')
2145fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSI27('V', '5') .. GetEscCodeCSI27('X', '5') .. "\<Esc>", 'Lx!')
2146fc4ea2a7SBram Moolenaar  call assert_equal("\<C-X>", getline(1))
2147fc4ea2a7SBram Moolenaar
2148f19f8d1aSBram Moolenaar  " CTRL-SHIFT-V CTRL-X inserts escape sequence
2149fc4ea2a7SBram Moolenaar  call setline(1, '')
2150fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSIu('V', '6') .. GetEscCodeCSIu('X', '5') .. "\<Esc>", 'Lx!')
2151fc4ea2a7SBram Moolenaar  call assert_equal("\<Esc>[88;5u", getline(1))
2152fc4ea2a7SBram Moolenaar
2153fc4ea2a7SBram Moolenaar  call setline(1, '')
2154fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSI27('V', '6') .. GetEscCodeCSI27('X', '5') .. "\<Esc>", 'Lx!')
2155fc4ea2a7SBram Moolenaar  call assert_equal("\<Esc>[27;5;88~", getline(1))
2156fc4ea2a7SBram Moolenaar
2157fc4ea2a7SBram Moolenaar  bwipe!
2158fc4ea2a7SBram Moolenaar  set timeoutlen&
2159fc4ea2a7SBram Moolenaarendfunc
2160fc4ea2a7SBram Moolenaar
2161fc4ea2a7SBram Moolenaarfunc Test_cmdline_literal()
2162fc4ea2a7SBram Moolenaar  set timeoutlen=10
2163fc4ea2a7SBram Moolenaar
2164fc4ea2a7SBram Moolenaar  " CTRL-V CTRL-Y inserts a ^Y
2165fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSIu('V', '5') .. GetEscCodeCSIu('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2166fc4ea2a7SBram Moolenaar  call assert_equal("\"\<C-Y>", @:)
2167fc4ea2a7SBram Moolenaar
2168fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSI27('V', '5') .. GetEscCodeCSI27('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2169fc4ea2a7SBram Moolenaar  call assert_equal("\"\<C-Y>", @:)
2170fc4ea2a7SBram Moolenaar
2171f19f8d1aSBram Moolenaar  " CTRL-SHIFT-V CTRL-Y inserts escape sequence
2172fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSIu('V', '6') .. GetEscCodeCSIu('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2173fc4ea2a7SBram Moolenaar  call assert_equal("\"\<Esc>[89;5u", @:)
2174fc4ea2a7SBram Moolenaar
2175fc4ea2a7SBram Moolenaar  call setline(1, '')
2176fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSI27('V', '6') .. GetEscCodeCSI27('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2177fc4ea2a7SBram Moolenaar  call assert_equal("\"\<Esc>[27;5;89~", @:)
2178fc4ea2a7SBram Moolenaar
2179fc4ea2a7SBram Moolenaar  set timeoutlen&
2180fc4ea2a7SBram Moolenaarendfunc
21810eabd4dcSBram Moolenaar
21820ff5dedfSBram Moolenaar" Test for translation of special key codes (<xF1>, <xF2>, etc.)
21830ff5dedfSBram Moolenaarfunc Test_Keycode_Tranlsation()
21840ff5dedfSBram Moolenaar  let keycodes = [
21850ff5dedfSBram Moolenaar        \ ["<xUp>", "<Up>"],
21860ff5dedfSBram Moolenaar        \ ["<xDown>", "<Down>"],
21870ff5dedfSBram Moolenaar        \ ["<xLeft>", "<Left>"],
21880ff5dedfSBram Moolenaar        \ ["<xRight>", "<Right>"],
21890ff5dedfSBram Moolenaar        \ ["<xHome>", "<Home>"],
21900ff5dedfSBram Moolenaar        \ ["<xEnd>", "<End>"],
21910ff5dedfSBram Moolenaar        \ ["<zHome>", "<Home>"],
21920ff5dedfSBram Moolenaar        \ ["<zEnd>", "<End>"],
21930ff5dedfSBram Moolenaar        \ ["<xF1>", "<F1>"],
21940ff5dedfSBram Moolenaar        \ ["<xF2>", "<F2>"],
21950ff5dedfSBram Moolenaar        \ ["<xF3>", "<F3>"],
21960ff5dedfSBram Moolenaar        \ ["<xF4>", "<F4>"],
21970ff5dedfSBram Moolenaar        \ ["<S-xF1>", "<S-F1>"],
21980ff5dedfSBram Moolenaar        \ ["<S-xF2>", "<S-F2>"],
21990ff5dedfSBram Moolenaar        \ ["<S-xF3>", "<S-F3>"],
22000ff5dedfSBram Moolenaar        \ ["<S-xF4>", "<S-F4>"]]
22010ff5dedfSBram Moolenaar  for [k1, k2] in keycodes
22020ff5dedfSBram Moolenaar    exe "nnoremap " .. k1 .. " 2wx"
22030ff5dedfSBram Moolenaar    call assert_true(maparg(k1, 'n', 0, 1).lhs == k2)
22040ff5dedfSBram Moolenaar    exe "nunmap " .. k1
22050ff5dedfSBram Moolenaar  endfor
22060ff5dedfSBram Moolenaarendfunc
22070ff5dedfSBram Moolenaar
22080eabd4dcSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
2209