1905dd905SBram Moolenaar" Tests for decoding escape sequences sent by the terminal.
2905dd905SBram Moolenaar
3905dd905SBram Moolenaar" This only works for Unix in a terminal
48c5a278fSBram Moolenaarsource check.vim
58c5a278fSBram MoolenaarCheckNotGui
68c5a278fSBram MoolenaarCheckUnix
7905dd905SBram Moolenaar
8564344acSBram Moolenaarsource shared.vim
9515545e1SBram Moolenaarsource mouse.vim
10ecd34bf5SBram Moolenaarsource view_util.vim
11e46a2ed0SBram Moolenaarsource term_util.vim
123fbd2d7cSBram Moolenaar
1392fd599eSBram Moolenaarfunc Test_term_mouse_left_click()
14905dd905SBram Moolenaar  new
15905dd905SBram Moolenaar  let save_mouse = &mouse
16905dd905SBram Moolenaar  let save_term = &term
17905dd905SBram Moolenaar  let save_ttymouse = &ttymouse
1892fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
193fbd2d7cSBram Moolenaar  set mouse=a term=xterm
20905dd905SBram Moolenaar  call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer'])
21905dd905SBram Moolenaar
22515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
234945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
241ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
253fbd2d7cSBram Moolenaar    go
264945219bSBram Moolenaar    call assert_equal([0, 1, 1, 0], getpos('.'), msg)
273fbd2d7cSBram Moolenaar    let row = 2
283fbd2d7cSBram Moolenaar    let col = 6
293fbd2d7cSBram Moolenaar    call MouseLeftClick(row, col)
303fbd2d7cSBram Moolenaar    call MouseLeftRelease(row, col)
314945219bSBram Moolenaar    call assert_equal([0, 2, 6, 0], getpos('.'), msg)
323fbd2d7cSBram Moolenaar  endfor
33905dd905SBram Moolenaar
34905dd905SBram Moolenaar  let &mouse = save_mouse
35905dd905SBram Moolenaar  let &term = save_term
36905dd905SBram Moolenaar  let &ttymouse = save_ttymouse
3792fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
38905dd905SBram Moolenaar  bwipe!
39905dd905SBram Moolenaarendfunc
40905dd905SBram Moolenaar
416aa7523bSBram Moolenaarfunc Test_xterm_mouse_right_click_extends_visual()
426aa7523bSBram Moolenaar  if has('mac')
436aa7523bSBram Moolenaar    throw "Skipped: test right click in visual mode does not work on macOs (why?)"
446aa7523bSBram Moolenaar  endif
456aa7523bSBram Moolenaar  let save_mouse = &mouse
466aa7523bSBram Moolenaar  let save_term = &term
476aa7523bSBram Moolenaar  let save_ttymouse = &ttymouse
486aa7523bSBram Moolenaar  call test_override('no_query_mouse', 1)
496aa7523bSBram Moolenaar  set mouse=a term=xterm
506aa7523bSBram Moolenaar
516aa7523bSBram Moolenaar  for visual_mode in ["v", "V", "\<C-V>"]
52515545e1SBram Moolenaar    for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
536aa7523bSBram Moolenaar      let msg = 'visual=' .. visual_mode .. ' ttymouse=' .. ttymouse_val
546aa7523bSBram Moolenaar      exe 'set ttymouse=' .. ttymouse_val
556aa7523bSBram Moolenaar
566aa7523bSBram Moolenaar      call setline(1, repeat([repeat('-', 7)], 7))
576aa7523bSBram Moolenaar      call MouseLeftClick(4, 4)
586aa7523bSBram Moolenaar      call MouseLeftRelease(4, 4)
596aa7523bSBram Moolenaar      exe  "norm! " .. visual_mode
606aa7523bSBram Moolenaar
616aa7523bSBram Moolenaar      " Right click extends top left of visual area.
626aa7523bSBram Moolenaar      call MouseRightClick(2, 2)
636aa7523bSBram Moolenaar      call MouseRightRelease(2, 2)
646aa7523bSBram Moolenaar
65f19f8d1aSBram Moolenaar      " Right click extends bottom right of visual area.
666aa7523bSBram Moolenaar      call MouseRightClick(6, 6)
676aa7523bSBram Moolenaar      call MouseRightRelease(6, 6)
686aa7523bSBram Moolenaar      norm! r1gv
696aa7523bSBram Moolenaar
706aa7523bSBram Moolenaar      " Right click shrinks top left of visual area.
716aa7523bSBram Moolenaar      call MouseRightClick(3, 3)
726aa7523bSBram Moolenaar      call MouseRightRelease(3, 3)
736aa7523bSBram Moolenaar
746aa7523bSBram Moolenaar      " Right click shrinks bottom right of visual area.
756aa7523bSBram Moolenaar      call MouseRightClick(5, 5)
766aa7523bSBram Moolenaar      call MouseRightRelease(5, 5)
776aa7523bSBram Moolenaar      norm! r2
786aa7523bSBram Moolenaar
796aa7523bSBram Moolenaar      if visual_mode ==# 'v'
806aa7523bSBram Moolenaar        call assert_equal(['-------',
816aa7523bSBram Moolenaar              \            '-111111',
826aa7523bSBram Moolenaar              \            '1122222',
836aa7523bSBram Moolenaar              \            '2222222',
846aa7523bSBram Moolenaar              \            '2222211',
856aa7523bSBram Moolenaar              \            '111111-',
866aa7523bSBram Moolenaar              \            '-------'], getline(1, '$'), msg)
876aa7523bSBram Moolenaar      elseif visual_mode ==# 'V'
886aa7523bSBram Moolenaar        call assert_equal(['-------',
896aa7523bSBram Moolenaar              \            '1111111',
906aa7523bSBram Moolenaar              \            '2222222',
916aa7523bSBram Moolenaar              \            '2222222',
926aa7523bSBram Moolenaar              \            '2222222',
936aa7523bSBram Moolenaar              \            '1111111',
946aa7523bSBram Moolenaar              \            '-------'], getline(1, '$'), msg)
956aa7523bSBram Moolenaar      else
966aa7523bSBram Moolenaar        call assert_equal(['-------',
976aa7523bSBram Moolenaar              \            '-11111-',
986aa7523bSBram Moolenaar              \            '-12221-',
996aa7523bSBram Moolenaar              \            '-12221-',
1006aa7523bSBram Moolenaar              \            '-12221-',
1016aa7523bSBram Moolenaar              \            '-11111-',
1026aa7523bSBram Moolenaar              \            '-------'], getline(1, '$'), msg)
1036aa7523bSBram Moolenaar      endif
1046aa7523bSBram Moolenaar    endfor
1056aa7523bSBram Moolenaar  endfor
1066aa7523bSBram Moolenaar
1076aa7523bSBram Moolenaar  let &mouse = save_mouse
1086aa7523bSBram Moolenaar  let &term = save_term
1096aa7523bSBram Moolenaar  let &ttymouse = save_ttymouse
1106aa7523bSBram Moolenaar  call test_override('no_query_mouse', 0)
1116aa7523bSBram Moolenaar  bwipe!
1126aa7523bSBram Moolenaarendfunc
1136aa7523bSBram Moolenaar
1141ee36d6fSBram Moolenaar" Test that <C-LeftMouse> jumps to help tag and <C-RightMouse> jumps back.
115297bec07SBram Moolenaar" Also test for g<LeftMouse> and g<RightMouse>.
116297bec07SBram Moolenaarfunc Test_xterm_mouse_tagjump()
1171ee36d6fSBram Moolenaar  let save_mouse = &mouse
1181ee36d6fSBram Moolenaar  let save_term = &term
1191ee36d6fSBram Moolenaar  let save_ttymouse = &ttymouse
1201ee36d6fSBram Moolenaar  set mouse=a term=xterm
1211ee36d6fSBram Moolenaar
122515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values
1231ee36d6fSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
1241ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
1251ee36d6fSBram Moolenaar    help
1261ee36d6fSBram Moolenaar    /usr_02.txt
1271ee36d6fSBram Moolenaar    norm! zt
128297bec07SBram Moolenaar
129297bec07SBram Moolenaar    " CTRL-left click to jump to a tag
1301ee36d6fSBram Moolenaar    let row = 1
1311ee36d6fSBram Moolenaar    let col = 1
1321ee36d6fSBram Moolenaar    call MouseCtrlLeftClick(row, col)
1331ee36d6fSBram Moolenaar    call MouseLeftRelease(row, col)
1341ee36d6fSBram Moolenaar    call assert_match('usr_02.txt$', bufname('%'), msg)
135b4367b7fSBram Moolenaar    call assert_equal('*usr_02.txt*', expand('<cWORD>'), msg)
1361ee36d6fSBram Moolenaar
137297bec07SBram Moolenaar    " CTRL-right click to pop a tag
1381ee36d6fSBram Moolenaar    call MouseCtrlRightClick(row, col)
13992fd599eSBram Moolenaar    call MouseRightRelease(row, col)
1401ee36d6fSBram Moolenaar    call assert_match('help.txt$', bufname('%'), msg)
141b4367b7fSBram Moolenaar    call assert_equal('|usr_02.txt|', expand('<cWORD>'), msg)
1421ee36d6fSBram Moolenaar
143297bec07SBram Moolenaar    " Jump to a tag
144297bec07SBram Moolenaar    exe "normal \<C-]>"
145297bec07SBram Moolenaar    call assert_match('usr_02.txt$', bufname('%'), msg)
146297bec07SBram Moolenaar    call assert_equal('*usr_02.txt*', expand('<cWORD>'), msg)
147297bec07SBram Moolenaar
148297bec07SBram Moolenaar    " Use CTRL-right click in insert mode to pop the tag
149297bec07SBram Moolenaar    new
150297bec07SBram Moolenaar    let str = 'iHello' .. MouseCtrlRightClickCode(row, col)
151297bec07SBram Moolenaar          \ .. MouseRightReleaseCode(row, col) .. "\<C-C>"
1522764d06aSBram Moolenaar    call assert_fails('call feedkeys(str, "Lx!")', 'E37:', msg)
153297bec07SBram Moolenaar    close!
154297bec07SBram Moolenaar
155297bec07SBram Moolenaar    " CTRL-right click with a count
156297bec07SBram Moolenaar    let str = "4" .. MouseCtrlRightClickCode(row, col)
157297bec07SBram Moolenaar          \ .. MouseRightReleaseCode(row, col)
1582764d06aSBram Moolenaar    call assert_fails('call feedkeys(str, "Lx!")', 'E555:', msg)
159297bec07SBram Moolenaar    call assert_match('help.txt$', bufname('%'), msg)
160297bec07SBram Moolenaar    call assert_equal(1, line('.'), msg)
161297bec07SBram Moolenaar
162297bec07SBram Moolenaar    " g<LeftMouse> to jump to a tag
163297bec07SBram Moolenaar    /usr_02.txt
164297bec07SBram Moolenaar    norm! zt
165297bec07SBram Moolenaar    call test_setmouse(row, col)
166297bec07SBram Moolenaar    exe "normal g\<LeftMouse>"
167297bec07SBram Moolenaar    call assert_match('usr_02.txt$', bufname('%'), msg)
168297bec07SBram Moolenaar    call assert_equal('*usr_02.txt*', expand('<cWORD>'), msg)
169297bec07SBram Moolenaar
170297bec07SBram Moolenaar    " g<RightMouse> to pop to a tag
171297bec07SBram Moolenaar    call test_setmouse(row, col)
172297bec07SBram Moolenaar    exe "normal g\<RightMouse>"
173297bec07SBram Moolenaar    call assert_match('help.txt$', bufname('%'), msg)
174297bec07SBram Moolenaar    call assert_equal('|usr_02.txt|', expand('<cWORD>'), msg)
175297bec07SBram Moolenaar
176297bec07SBram Moolenaar    %bw!
1771ee36d6fSBram Moolenaar  endfor
1781ee36d6fSBram Moolenaar
1791ee36d6fSBram Moolenaar  let &mouse = save_mouse
1801ee36d6fSBram Moolenaar  let &term = save_term
1811ee36d6fSBram Moolenaar  let &ttymouse = save_ttymouse
1821ee36d6fSBram Moolenaarendfunc
1831ee36d6fSBram Moolenaar
18492fd599eSBram Moolenaarfunc Test_term_mouse_middle_click()
18552992feaSBram Moolenaar  CheckFeature clipboard_working
186564344acSBram Moolenaar
187c1b8160bSBram Moolenaar  new
188c1b8160bSBram Moolenaar  let save_mouse = &mouse
189c1b8160bSBram Moolenaar  let save_term = &term
190c1b8160bSBram Moolenaar  let save_ttymouse = &ttymouse
19192fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
192c1b8160bSBram Moolenaar  let save_quotestar = @*
193297bec07SBram Moolenaar  let save_quoteplus = @+
194c1b8160bSBram Moolenaar  set mouse=a term=xterm
195c1b8160bSBram Moolenaar
196515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
197c1b8160bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
1981ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
199c1b8160bSBram Moolenaar    call setline(1, ['123456789', '123456789'])
200297bec07SBram Moolenaar    let @* = 'abc'
201c1b8160bSBram Moolenaar
202c1b8160bSBram Moolenaar    " Middle-click in the middle of the line pastes text where clicked.
203c1b8160bSBram Moolenaar    let row = 1
204c1b8160bSBram Moolenaar    let col = 6
205c1b8160bSBram Moolenaar    call MouseMiddleClick(row, col)
206c1b8160bSBram Moolenaar    call MouseMiddleRelease(row, col)
207c1b8160bSBram Moolenaar    call assert_equal(['12345abc6789', '123456789'], getline(1, '$'), msg)
208c1b8160bSBram Moolenaar
209c1b8160bSBram Moolenaar    " Middle-click beyond end of the line pastes text at the end of the line.
210c1b8160bSBram Moolenaar    let col = 20
211c1b8160bSBram Moolenaar    call MouseMiddleClick(row, col)
212c1b8160bSBram Moolenaar    call MouseMiddleRelease(row, col)
213c1b8160bSBram Moolenaar    call assert_equal(['12345abc6789abc', '123456789'], getline(1, '$'), msg)
214c1b8160bSBram Moolenaar
215c1b8160bSBram Moolenaar    " Middle-click beyond the last line pastes in the last line.
216c1b8160bSBram Moolenaar    let row = 5
217c1b8160bSBram Moolenaar    let col = 3
218c1b8160bSBram Moolenaar    call MouseMiddleClick(row, col)
219c1b8160bSBram Moolenaar    call MouseMiddleRelease(row, col)
220c1b8160bSBram Moolenaar    call assert_equal(['12345abc6789abc', '12abc3456789'], getline(1, '$'), msg)
221297bec07SBram Moolenaar
222297bec07SBram Moolenaar    " Middle mouse click in operator pending mode beeps
223297bec07SBram Moolenaar    call assert_beeps('exe "normal c\<MiddleMouse>"')
224297bec07SBram Moolenaar
225297bec07SBram Moolenaar    " Clicking middle mouse in visual mode, yanks the selection and pastes the
226297bec07SBram Moolenaar    " clipboard contents
227297bec07SBram Moolenaar    let save_clipboard = &clipboard
228297bec07SBram Moolenaar    set clipboard=
229297bec07SBram Moolenaar    let @" = ''
230297bec07SBram Moolenaar    call cursor(1, 1)
231297bec07SBram Moolenaar    call feedkeys("v3l" ..
232297bec07SBram Moolenaar          \ MouseMiddleClickCode(2, 7) .. MouseMiddleReleaseCode(2, 7), 'Lx!')
233297bec07SBram Moolenaar    call assert_equal(['12345abc6789abc', '12abc3abc456789'],
234297bec07SBram Moolenaar          \ getline(1, '$'), msg)
2352764d06aSBram Moolenaar    call assert_equal('1234', @", msg)
236297bec07SBram Moolenaar    let &clipboard = save_clipboard
237297bec07SBram Moolenaar
238297bec07SBram Moolenaar    " Clicking middle mouse in select mode, replaces the selected text with
239297bec07SBram Moolenaar    " the clipboard contents
240297bec07SBram Moolenaar    let @+ = 'xyz'
241297bec07SBram Moolenaar    call cursor(1, 3)
242297bec07SBram Moolenaar    exe "normal gh\<Right>\<Right>\<MiddleMouse>"
243297bec07SBram Moolenaar    call assert_equal(['12xyzabc6789abc', '12abc3abc456789'],
244297bec07SBram Moolenaar          \ getline(1, '$'), msg)
2452764d06aSBram Moolenaar
2462764d06aSBram Moolenaar    " Prefixing middle click with [ or ] fixes the indent after pasting.
2472764d06aSBram Moolenaar    %d
2482764d06aSBram Moolenaar    call setline(1, "    one two")
2492764d06aSBram Moolenaar    call setreg('r', 'red blue', 'l')
2502764d06aSBram Moolenaar    call test_setmouse(1, 5)
2512764d06aSBram Moolenaar    exe "normal \"r[\<MiddleMouse>"
2522764d06aSBram Moolenaar    call assert_equal('    red blue', getline(1), msg)
2532764d06aSBram Moolenaar    call test_setmouse(2, 5)
2542764d06aSBram Moolenaar    exe "normal \"r]\<MiddleMouse>"
2552764d06aSBram Moolenaar    call assert_equal('    red blue', getline(3), msg)
2562764d06aSBram Moolenaar    %d
257c1b8160bSBram Moolenaar  endfor
258c1b8160bSBram Moolenaar
259c1b8160bSBram Moolenaar  let &mouse = save_mouse
260c1b8160bSBram Moolenaar  let &term = save_term
261c1b8160bSBram Moolenaar  let &ttymouse = save_ttymouse
26292fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
263c1b8160bSBram Moolenaar  let @* = save_quotestar
264297bec07SBram Moolenaar  let @+ = save_quotestar
265c1b8160bSBram Moolenaar  bwipe!
266c1b8160bSBram Moolenaarendfunc
267c1b8160bSBram Moolenaar
268297bec07SBram Moolenaar" If clipboard is not working, then clicking the middle mouse button in visual
269297bec07SBram Moolenaar" mode, will copy and paste the selected text.
270297bec07SBram Moolenaarfunc Test_term_mouse_middle_click_no_clipboard()
271297bec07SBram Moolenaar  if has('clipboard_working')
272297bec07SBram Moolenaar    throw 'Skipped: clipboard support works'
273297bec07SBram Moolenaar  endif
274297bec07SBram Moolenaar  new
275297bec07SBram Moolenaar  let save_mouse = &mouse
276297bec07SBram Moolenaar  let save_term = &term
277297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
278297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
279297bec07SBram Moolenaar  set mouse=a term=xterm
280297bec07SBram Moolenaar
281297bec07SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
282297bec07SBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
283297bec07SBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
284297bec07SBram Moolenaar    call setline(1, ['123456789', '123456789'])
285297bec07SBram Moolenaar
286297bec07SBram Moolenaar    " Clicking middle mouse in visual mode, yanks the selection and pastes it
287297bec07SBram Moolenaar    call cursor(1, 1)
288297bec07SBram Moolenaar    call feedkeys("v3l" ..
289297bec07SBram Moolenaar          \ MouseMiddleClickCode(2, 7) .. MouseMiddleReleaseCode(2, 7), 'Lx!')
290297bec07SBram Moolenaar    call assert_equal(['123456789', '1234561234789'],
291297bec07SBram Moolenaar          \ getline(1, '$'), msg)
292297bec07SBram Moolenaar  endfor
293297bec07SBram Moolenaar
294297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
295297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
296297bec07SBram Moolenaar  let &term = save_term
297297bec07SBram Moolenaar  let &mouse = save_mouse
298297bec07SBram Moolenaar  close!
299297bec07SBram Moolenaarendfunc
300297bec07SBram Moolenaar
301297bec07SBram Moolenaarfunc Test_term_mouse_middle_click_insert_mode()
302297bec07SBram Moolenaar  CheckFeature clipboard_working
303297bec07SBram Moolenaar
304297bec07SBram Moolenaar  new
305297bec07SBram Moolenaar  let save_mouse = &mouse
306297bec07SBram Moolenaar  let save_term = &term
307297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
308297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
309297bec07SBram Moolenaar  set mouse=a term=xterm
310297bec07SBram Moolenaar
311297bec07SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
312297bec07SBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
313297bec07SBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
314297bec07SBram Moolenaar    call setline(1, ['123456789', '123456789'])
315297bec07SBram Moolenaar    let @* = 'abc'
316297bec07SBram Moolenaar
317297bec07SBram Moolenaar    " Middle-click in inesrt mode doesn't move the cursor but inserts the
318297bec07SBram Moolenaar    " contents of aregister
319297bec07SBram Moolenaar    call cursor(1, 4)
320297bec07SBram Moolenaar    call feedkeys('i' ..
321297bec07SBram Moolenaar          \ MouseMiddleClickCode(2, 7) .. MouseMiddleReleaseCode(2, 7) ..
322297bec07SBram Moolenaar          \ "\<C-C>", 'Lx!')
323297bec07SBram Moolenaar    call assert_equal(['123abc456789', '123456789'],
324297bec07SBram Moolenaar          \ getline(1, '$'), msg)
3252764d06aSBram Moolenaar    call assert_equal([1, 6], [line('.'), col('.')], msg)
326297bec07SBram Moolenaar
327297bec07SBram Moolenaar    " Middle-click in replace mode
328297bec07SBram Moolenaar    call cursor(1, 1)
329297bec07SBram Moolenaar    call feedkeys('$R' ..
330297bec07SBram Moolenaar          \ MouseMiddleClickCode(2, 7) .. MouseMiddleReleaseCode(2, 7) ..
331297bec07SBram Moolenaar          \ "\<C-C>", 'Lx!')
332297bec07SBram Moolenaar    call assert_equal(['123abc45678abc', '123456789'],
333297bec07SBram Moolenaar          \ getline(1, '$'), msg)
3342764d06aSBram Moolenaar    call assert_equal([1, 14], [line('.'), col('.')], msg)
335297bec07SBram Moolenaar  endfor
336297bec07SBram Moolenaar
337297bec07SBram Moolenaar  let &mouse = save_mouse
338297bec07SBram Moolenaar  let &term = save_term
339297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
340297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
341297bec07SBram Moolenaar  close!
342297bec07SBram Moolenaarendfunc
343297bec07SBram Moolenaar
344297bec07SBram Moolenaar" Test for switching window using mouse in insert mode
345297bec07SBram Moolenaarfunc Test_term_mouse_switch_win_insert_mode()
346297bec07SBram Moolenaar  5new
347297bec07SBram Moolenaar  let save_mouse = &mouse
348297bec07SBram Moolenaar  let save_term = &term
349297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
350297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
351297bec07SBram Moolenaar  set mouse=a term=xterm ttymouse=xterm2
352297bec07SBram Moolenaar
353297bec07SBram Moolenaar  call feedkeys('ivim' ..
354297bec07SBram Moolenaar        \ MouseLeftClickCode(8, 6) .. MouseLeftReleaseCode(8, 6) ..
355297bec07SBram Moolenaar        \ "\<C-C>", 'Lx!')
356297bec07SBram Moolenaar  call assert_equal(2, winnr())
357297bec07SBram Moolenaar  wincmd w
358297bec07SBram Moolenaar  call assert_equal('n', mode())
359297bec07SBram Moolenaar  call assert_equal(['vim'], getline(1, '$'))
360297bec07SBram Moolenaar
361297bec07SBram Moolenaar  let &mouse = save_mouse
362297bec07SBram Moolenaar  let &term = save_term
363297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
364297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
365297bec07SBram Moolenaar  close!
366297bec07SBram Moolenaarendfunc
367297bec07SBram Moolenaar
368297bec07SBram Moolenaar" Test for using the mouse to increaes the height of the cmdline window
369297bec07SBram Moolenaarfunc Test_mouse_cmdwin_resize()
370297bec07SBram Moolenaar  let save_mouse = &mouse
371297bec07SBram Moolenaar  let save_term = &term
372297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
373297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
374297bec07SBram Moolenaar  set mouse=a term=xterm ttymouse=xterm2
375297bec07SBram Moolenaar  5new
376297bec07SBram Moolenaar  redraw!
377297bec07SBram Moolenaar
378297bec07SBram Moolenaar  let h = 0
379297bec07SBram Moolenaar  let row = &lines - &cmdwinheight - 2
380297bec07SBram Moolenaar  call feedkeys("q:" ..
381297bec07SBram Moolenaar        \ MouseLeftClickCode(row, 1) ..
382297bec07SBram Moolenaar        \ MouseLeftDragCode(row - 1, 1) ..
383297bec07SBram Moolenaar        \ MouseLeftReleaseCode(row - 2, 1) ..
384297bec07SBram Moolenaar        \ "alet h = \<C-R>=winheight(0)\<CR>\<CR>", 'Lx!')
385297bec07SBram Moolenaar  call assert_equal(&cmdwinheight + 2, h)
386297bec07SBram Moolenaar
387297bec07SBram Moolenaar  let &mouse = save_mouse
388297bec07SBram Moolenaar  let &term = save_term
389297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
390297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
391297bec07SBram Moolenaar  close!
392297bec07SBram Moolenaarendfunc
393297bec07SBram Moolenaar
39492fd599eSBram Moolenaar" TODO: for unclear reasons this test fails if it comes after
39592fd599eSBram Moolenaar" Test_xterm_mouse_ctrl_click()
39692fd599eSBram Moolenaarfunc Test_1xterm_mouse_wheel()
397049736faSBram Moolenaar  new
398049736faSBram Moolenaar  let save_mouse = &mouse
399049736faSBram Moolenaar  let save_term = &term
400d58d4f90SBram Moolenaar  let save_wrap = &wrap
401049736faSBram Moolenaar  let save_ttymouse = &ttymouse
402d58d4f90SBram Moolenaar  set mouse=a term=xterm nowrap
403d58d4f90SBram Moolenaar  call setline(1, range(100000000000000, 100000000000100))
404049736faSBram Moolenaar
405515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values
4064945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
4071ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
408049736faSBram Moolenaar    go
4094945219bSBram Moolenaar    call assert_equal(1, line('w0'), msg)
4104945219bSBram Moolenaar    call assert_equal([0, 1, 1, 0], getpos('.'), msg)
4113fbd2d7cSBram Moolenaar
4123fbd2d7cSBram Moolenaar    call MouseWheelDown(1, 1)
4134945219bSBram Moolenaar    call assert_equal(4, line('w0'), msg)
4144945219bSBram Moolenaar    call assert_equal([0, 4, 1, 0], getpos('.'), msg)
4153fbd2d7cSBram Moolenaar
4163fbd2d7cSBram Moolenaar    call MouseWheelDown(1, 1)
4174945219bSBram Moolenaar    call assert_equal(7, line('w0'), msg)
4184945219bSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
419049736faSBram Moolenaar
4203fbd2d7cSBram Moolenaar    call MouseWheelUp(1, 1)
4214945219bSBram Moolenaar    call assert_equal(4, line('w0'), msg)
4224945219bSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
4233fbd2d7cSBram Moolenaar
4243fbd2d7cSBram Moolenaar    call MouseWheelUp(1, 1)
4254945219bSBram Moolenaar    call assert_equal(1, line('w0'), msg)
4264945219bSBram Moolenaar    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
427d58d4f90SBram Moolenaar
428d58d4f90SBram Moolenaar    if has('gui')
429d58d4f90SBram Moolenaar      " Horizontal wheel scrolling currently only works when vim is
430d58d4f90SBram Moolenaar      " compiled with gui enabled.
431d58d4f90SBram Moolenaar      call MouseWheelRight(1, 1)
432d58d4f90SBram Moolenaar      call assert_equal(7, 1 + virtcol(".") - wincol(), msg)
433d58d4f90SBram Moolenaar      call assert_equal([0, 7, 7, 0], getpos('.'), msg)
434d58d4f90SBram Moolenaar
435d58d4f90SBram Moolenaar      call MouseWheelRight(1, 1)
436d58d4f90SBram Moolenaar      call assert_equal(13, 1 + virtcol(".") - wincol(), msg)
437d58d4f90SBram Moolenaar      call assert_equal([0, 7, 13, 0], getpos('.'), msg)
438d58d4f90SBram Moolenaar
439d58d4f90SBram Moolenaar      call MouseWheelLeft(1, 1)
440d58d4f90SBram Moolenaar      call assert_equal(7, 1 + virtcol(".") - wincol(), msg)
441d58d4f90SBram Moolenaar      call assert_equal([0, 7, 13, 0], getpos('.'), msg)
442d58d4f90SBram Moolenaar
443d58d4f90SBram Moolenaar      call MouseWheelLeft(1, 1)
444d58d4f90SBram Moolenaar      call assert_equal(1, 1 + virtcol(".") - wincol(), msg)
445d58d4f90SBram Moolenaar      call assert_equal([0, 7, 13, 0], getpos('.'), msg)
446d58d4f90SBram Moolenaar    endif
4473fbd2d7cSBram Moolenaar  endfor
448049736faSBram Moolenaar
449049736faSBram Moolenaar  let &mouse = save_mouse
450049736faSBram Moolenaar  let &term = save_term
451d58d4f90SBram Moolenaar  let &wrap = save_wrap
452049736faSBram Moolenaar  let &ttymouse = save_ttymouse
453049736faSBram Moolenaar  bwipe!
454049736faSBram Moolenaarendfunc
4553fb01a53SBram Moolenaar
456b4367b7fSBram Moolenaar" Test that dragging beyond the window (at the bottom and at the top)
457f19f8d1aSBram Moolenaar" scrolls window content by the number of lines beyond the window.
458b4367b7fSBram Moolenaarfunc Test_term_mouse_drag_beyond_window()
459b4367b7fSBram Moolenaar  let save_mouse = &mouse
460b4367b7fSBram Moolenaar  let save_term = &term
461b4367b7fSBram Moolenaar  let save_ttymouse = &ttymouse
462b4367b7fSBram Moolenaar  call test_override('no_query_mouse', 1)
463b4367b7fSBram Moolenaar  set mouse=a term=xterm
464b4367b7fSBram Moolenaar  let col = 1
465b4367b7fSBram Moolenaar  call setline(1, range(1, 100))
466b4367b7fSBram Moolenaar
467b4367b7fSBram Moolenaar  " Split into 3 windows, and go into the middle window
468b4367b7fSBram Moolenaar  " so we test dragging mouse below and above the window.
469b4367b7fSBram Moolenaar  2split
470b4367b7fSBram Moolenaar  wincmd j
471b4367b7fSBram Moolenaar  2split
472b4367b7fSBram Moolenaar
473515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
474b4367b7fSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
475b4367b7fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
476b4367b7fSBram Moolenaar
477b4367b7fSBram Moolenaar    " Line #10 at the top.
478b4367b7fSBram Moolenaar    norm! 10zt
479b4367b7fSBram Moolenaar    redraw
480b4367b7fSBram Moolenaar    call assert_equal(10, winsaveview().topline, msg)
481b4367b7fSBram Moolenaar    call assert_equal(2, winheight(0), msg)
482b4367b7fSBram Moolenaar
483b4367b7fSBram Moolenaar    let row = 4
484b4367b7fSBram Moolenaar    call MouseLeftClick(row, col)
485b4367b7fSBram Moolenaar    call assert_equal(10, winsaveview().topline, msg)
486b4367b7fSBram Moolenaar
487b4367b7fSBram Moolenaar    " Drag downwards. We're still in the window so topline should
488b4367b7fSBram Moolenaar    " not change yet.
489b4367b7fSBram Moolenaar    let row += 1
490b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
491b4367b7fSBram Moolenaar    call assert_equal(10, winsaveview().topline, msg)
492b4367b7fSBram Moolenaar
493b4367b7fSBram Moolenaar    " We now leave the window at the bottom, so the window content should
494b4367b7fSBram Moolenaar    " scroll by 1 line, then 2 lines (etc) as we drag further away.
495b4367b7fSBram Moolenaar    let row += 1
496b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
497b4367b7fSBram Moolenaar    call assert_equal(11, winsaveview().topline, msg)
498b4367b7fSBram Moolenaar
499b4367b7fSBram Moolenaar    let row += 1
500b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
501b4367b7fSBram Moolenaar    call assert_equal(13, winsaveview().topline, msg)
502b4367b7fSBram Moolenaar
503b4367b7fSBram Moolenaar    " Now drag upwards.
504b4367b7fSBram Moolenaar    let row -= 1
505b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
506b4367b7fSBram Moolenaar    call assert_equal(14, winsaveview().topline, msg)
507b4367b7fSBram Moolenaar
508b4367b7fSBram Moolenaar    " We're now back in the window so the topline should not change.
509b4367b7fSBram Moolenaar    let row -= 1
510b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
511b4367b7fSBram Moolenaar    call assert_equal(14, winsaveview().topline, msg)
512b4367b7fSBram Moolenaar
513b4367b7fSBram Moolenaar    let row -= 1
514b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
515b4367b7fSBram Moolenaar    call assert_equal(14, winsaveview().topline, msg)
516b4367b7fSBram Moolenaar
517b4367b7fSBram Moolenaar    " We now leave the window at the top so the window content should
518b4367b7fSBram Moolenaar    " scroll by 1 line, then 2, then 3 (etc) in the opposite direction.
519b4367b7fSBram Moolenaar    let row -= 1
520b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
521b4367b7fSBram Moolenaar    call assert_equal(13, winsaveview().topline, msg)
522b4367b7fSBram Moolenaar
523b4367b7fSBram Moolenaar    let row -= 1
524b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
525b4367b7fSBram Moolenaar    call assert_equal(11, winsaveview().topline, msg)
526b4367b7fSBram Moolenaar
527b4367b7fSBram Moolenaar    let row -= 1
528b4367b7fSBram Moolenaar    call MouseLeftDrag(row, col)
529b4367b7fSBram Moolenaar    call assert_equal(8, winsaveview().topline, msg)
530b4367b7fSBram Moolenaar
531b4367b7fSBram Moolenaar    call MouseLeftRelease(row, col)
532b4367b7fSBram Moolenaar    call assert_equal(8, winsaveview().topline, msg)
533b4367b7fSBram Moolenaar    call assert_equal(2, winheight(0), msg)
534b4367b7fSBram Moolenaar  endfor
535b4367b7fSBram Moolenaar
536b4367b7fSBram Moolenaar  let &mouse = save_mouse
537b4367b7fSBram Moolenaar  let &term = save_term
538b4367b7fSBram Moolenaar  let &ttymouse = save_ttymouse
539b4367b7fSBram Moolenaar  call test_override('no_query_mouse', 0)
540b4367b7fSBram Moolenaar  bwipe!
541b4367b7fSBram Moolenaarendfunc
542b4367b7fSBram Moolenaar
54392fd599eSBram Moolenaarfunc Test_term_mouse_drag_window_separator()
5443fb01a53SBram Moolenaar  let save_mouse = &mouse
5453fb01a53SBram Moolenaar  let save_term = &term
5463fb01a53SBram Moolenaar  let save_ttymouse = &ttymouse
54792fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
5483fbd2d7cSBram Moolenaar  set mouse=a term=xterm
5493fbd2d7cSBram Moolenaar
550515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
5514945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
5521ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
5533fb01a53SBram Moolenaar
5543fb01a53SBram Moolenaar    " Split horizontally and test dragging the horizontal window separator.
5553fb01a53SBram Moolenaar    split
5563fb01a53SBram Moolenaar    let rowseparator = winheight(0) + 1
5573fb01a53SBram Moolenaar    let row = rowseparator
5583fb01a53SBram Moolenaar    let col = 1
559c8b3ddabSBram Moolenaar
5602b00b9b0SBram Moolenaar    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
5612b00b9b0SBram Moolenaar    if ttymouse_val !=# 'xterm2' || row <= 223
5623fbd2d7cSBram Moolenaar      call MouseLeftClick(row, col)
5633fb01a53SBram Moolenaar      let row -= 1
5643fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
5654945219bSBram Moolenaar      call assert_equal(rowseparator - 1, winheight(0) + 1, msg)
5663fb01a53SBram Moolenaar      let row += 1
5673fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
5684945219bSBram Moolenaar      call assert_equal(rowseparator, winheight(0) + 1, msg)
5693fbd2d7cSBram Moolenaar      call MouseLeftRelease(row, col)
5704945219bSBram Moolenaar      call assert_equal(rowseparator, winheight(0) + 1, msg)
57139f76c6aSBram Moolenaar    endif
5723fb01a53SBram Moolenaar    bwipe!
5733fb01a53SBram Moolenaar
5743fb01a53SBram Moolenaar    " Split vertically and test dragging the vertical window separator.
5753fb01a53SBram Moolenaar    vsplit
5763fb01a53SBram Moolenaar    let colseparator = winwidth(0) + 1
5773fb01a53SBram Moolenaar    let row = 1
5783fb01a53SBram Moolenaar    let col = colseparator
57939f76c6aSBram Moolenaar
5802b00b9b0SBram Moolenaar    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
5812b00b9b0SBram Moolenaar    if ttymouse_val !=# 'xterm2' || col <= 223
5823fbd2d7cSBram Moolenaar      call MouseLeftClick(row, col)
5833fb01a53SBram Moolenaar      let col -= 1
5843fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
5854945219bSBram Moolenaar      call assert_equal(colseparator - 1, winwidth(0) + 1, msg)
5863fb01a53SBram Moolenaar      let col += 1
5873fbd2d7cSBram Moolenaar      call MouseLeftDrag(row, col)
5884945219bSBram Moolenaar      call assert_equal(colseparator, winwidth(0) + 1, msg)
5893fbd2d7cSBram Moolenaar      call MouseLeftRelease(row, col)
5904945219bSBram Moolenaar      call assert_equal(colseparator, winwidth(0) + 1, msg)
59139f76c6aSBram Moolenaar    endif
5923fb01a53SBram Moolenaar    bwipe!
5933fbd2d7cSBram Moolenaar  endfor
5943fbd2d7cSBram Moolenaar
5953fbd2d7cSBram Moolenaar  let &mouse = save_mouse
5963fbd2d7cSBram Moolenaar  let &term = save_term
5973fbd2d7cSBram Moolenaar  let &ttymouse = save_ttymouse
59892fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
5993fbd2d7cSBram Moolenaarendfunc
6003fbd2d7cSBram Moolenaar
60192fd599eSBram Moolenaarfunc Test_term_mouse_drag_statusline()
6023fbd2d7cSBram Moolenaar  let save_mouse = &mouse
6033fbd2d7cSBram Moolenaar  let save_term = &term
6043fbd2d7cSBram Moolenaar  let save_ttymouse = &ttymouse
60592fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
606ca57ab54SBram Moolenaar  let save_laststatus = &laststatus
607ca57ab54SBram Moolenaar  set mouse=a term=xterm laststatus=2
6083fbd2d7cSBram Moolenaar
609515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
6104945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
6111ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
6123fbd2d7cSBram Moolenaar
6134945219bSBram Moolenaar    call assert_equal(1, &cmdheight, msg)
6143fbd2d7cSBram Moolenaar    let rowstatusline = winheight(0) + 1
6153fbd2d7cSBram Moolenaar    let row = rowstatusline
6163fbd2d7cSBram Moolenaar    let col = 1
617c8b3ddabSBram Moolenaar
6182b00b9b0SBram Moolenaar    if ttymouse_val ==# 'xterm2' && row > 223
6192b00b9b0SBram Moolenaar      " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
620c8b3ddabSBram Moolenaar      continue
621c8b3ddabSBram Moolenaar    endif
622c8b3ddabSBram Moolenaar
6233fbd2d7cSBram Moolenaar    call MouseLeftClick(row, col)
6243fbd2d7cSBram Moolenaar    let row -= 1
6253fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
6264945219bSBram Moolenaar    call assert_equal(2, &cmdheight, msg)
6274945219bSBram Moolenaar    call assert_equal(rowstatusline - 1, winheight(0) + 1, msg)
6283fbd2d7cSBram Moolenaar    let row += 1
6293fbd2d7cSBram Moolenaar    call MouseLeftDrag(row, col)
6304945219bSBram Moolenaar    call assert_equal(1, &cmdheight, msg)
6314945219bSBram Moolenaar    call assert_equal(rowstatusline, winheight(0) + 1, msg)
6323fbd2d7cSBram Moolenaar    call MouseLeftRelease(row, col)
6334945219bSBram Moolenaar    call assert_equal(1, &cmdheight, msg)
6344945219bSBram Moolenaar    call assert_equal(rowstatusline, winheight(0) + 1, msg)
6353fbd2d7cSBram Moolenaar  endfor
6363fbd2d7cSBram Moolenaar
6373fb01a53SBram Moolenaar  let &mouse = save_mouse
6383fb01a53SBram Moolenaar  let &term = save_term
6393fb01a53SBram Moolenaar  let &ttymouse = save_ttymouse
64092fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
641ca57ab54SBram Moolenaar  let &laststatus = save_laststatus
642ca57ab54SBram Moolenaarendfunc
643ca57ab54SBram Moolenaar
64492fd599eSBram Moolenaarfunc Test_term_mouse_click_tab()
645ca57ab54SBram Moolenaar  let save_mouse = &mouse
646ca57ab54SBram Moolenaar  let save_term = &term
647ca57ab54SBram Moolenaar  let save_ttymouse = &ttymouse
64892fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
649ca57ab54SBram Moolenaar  set mouse=a term=xterm
650ca57ab54SBram Moolenaar  let row = 1
651ca57ab54SBram Moolenaar
652515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
6534945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
6541ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
655ca57ab54SBram Moolenaar    e Xfoo
656ca57ab54SBram Moolenaar    tabnew Xbar
657ca57ab54SBram Moolenaar
658ca57ab54SBram Moolenaar    let a = split(execute(':tabs'), "\n")
659ca57ab54SBram Moolenaar    call assert_equal(['Tab page 1',
660ca57ab54SBram Moolenaar        \              '    Xfoo',
661ca57ab54SBram Moolenaar        \              'Tab page 2',
6624945219bSBram Moolenaar        \              '>   Xbar'], a, msg)
663ca57ab54SBram Moolenaar
664ca57ab54SBram Moolenaar    " Test clicking on tab names in the tabline at the top.
665ca57ab54SBram Moolenaar    let col = 2
66639f76c6aSBram Moolenaar    redraw
667ca57ab54SBram Moolenaar    call MouseLeftClick(row, col)
668ca57ab54SBram Moolenaar    call MouseLeftRelease(row, col)
669ca57ab54SBram Moolenaar    let a = split(execute(':tabs'), "\n")
670ca57ab54SBram Moolenaar    call assert_equal(['Tab page 1',
671ca57ab54SBram Moolenaar        \              '>   Xfoo',
672ca57ab54SBram Moolenaar        \              'Tab page 2',
6734945219bSBram Moolenaar        \              '    Xbar'], a, msg)
674ca57ab54SBram Moolenaar
675ca57ab54SBram Moolenaar    let col = 9
676ca57ab54SBram Moolenaar    call MouseLeftClick(row, col)
677ca57ab54SBram Moolenaar    call MouseLeftRelease(row, col)
678ca57ab54SBram Moolenaar    let a = split(execute(':tabs'), "\n")
679ca57ab54SBram Moolenaar    call assert_equal(['Tab page 1',
680ca57ab54SBram Moolenaar        \              '    Xfoo',
681ca57ab54SBram Moolenaar        \              'Tab page 2',
6824945219bSBram Moolenaar        \              '>   Xbar'], a, msg)
683ca57ab54SBram Moolenaar
684ca57ab54SBram Moolenaar    %bwipe!
685ca57ab54SBram Moolenaar  endfor
686ca57ab54SBram Moolenaar
687ca57ab54SBram Moolenaar  let &mouse = save_mouse
688ca57ab54SBram Moolenaar  let &term = save_term
689ca57ab54SBram Moolenaar  let &ttymouse = save_ttymouse
69092fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
6913fb01a53SBram Moolenaarendfunc
69239f76c6aSBram Moolenaar
69392fd599eSBram Moolenaarfunc Test_term_mouse_click_X_to_close_tab()
69439f76c6aSBram Moolenaar  let save_mouse = &mouse
69539f76c6aSBram Moolenaar  let save_term = &term
69639f76c6aSBram Moolenaar  let save_ttymouse = &ttymouse
69792fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
69839f76c6aSBram Moolenaar  set mouse=a term=xterm
69939f76c6aSBram Moolenaar  let row = 1
70039f76c6aSBram Moolenaar  let col = &columns
70139f76c6aSBram Moolenaar
702515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
7032b00b9b0SBram Moolenaar    if ttymouse_val ==# 'xterm2' && col > 223
7042b00b9b0SBram Moolenaar      " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
70539f76c6aSBram Moolenaar      continue
70639f76c6aSBram Moolenaar    endif
7074945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
7081ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
70939f76c6aSBram Moolenaar    e Xtab1
71039f76c6aSBram Moolenaar    tabnew Xtab2
71139f76c6aSBram Moolenaar    tabnew Xtab3
71239f76c6aSBram Moolenaar    tabn 2
71339f76c6aSBram Moolenaar
71439f76c6aSBram Moolenaar    let a = split(execute(':tabs'), "\n")
71539f76c6aSBram Moolenaar    call assert_equal(['Tab page 1',
71639f76c6aSBram Moolenaar        \              '    Xtab1',
71739f76c6aSBram Moolenaar        \              'Tab page 2',
71839f76c6aSBram Moolenaar        \              '>   Xtab2',
71939f76c6aSBram Moolenaar        \              'Tab page 3',
7204945219bSBram Moolenaar        \              '    Xtab3'], a, msg)
72139f76c6aSBram Moolenaar
72239f76c6aSBram Moolenaar    " Click on "X" in tabline to close current tab i.e. Xtab2.
72339f76c6aSBram Moolenaar    redraw
72439f76c6aSBram Moolenaar    call MouseLeftClick(row, col)
72539f76c6aSBram Moolenaar    call MouseLeftRelease(row, col)
72639f76c6aSBram Moolenaar    let a = split(execute(':tabs'), "\n")
72739f76c6aSBram Moolenaar    call assert_equal(['Tab page 1',
72839f76c6aSBram Moolenaar        \              '    Xtab1',
72939f76c6aSBram Moolenaar        \              'Tab page 2',
7304945219bSBram Moolenaar        \              '>   Xtab3'], a, msg)
73139f76c6aSBram Moolenaar
73239f76c6aSBram Moolenaar    %bwipe!
73339f76c6aSBram Moolenaar  endfor
73439f76c6aSBram Moolenaar
73539f76c6aSBram Moolenaar  let &mouse = save_mouse
73639f76c6aSBram Moolenaar  let &term = save_term
73739f76c6aSBram Moolenaar  let &ttymouse = save_ttymouse
73892fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
73939f76c6aSBram Moolenaarendfunc
740e3e3828fSBram Moolenaar
74192fd599eSBram Moolenaarfunc Test_term_mouse_drag_to_move_tab()
742e3e3828fSBram Moolenaar  let save_mouse = &mouse
743e3e3828fSBram Moolenaar  let save_term = &term
744e3e3828fSBram Moolenaar  let save_ttymouse = &ttymouse
74592fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
746e3e3828fSBram Moolenaar  " Set 'mousetime' to 1 to avoid recognizing a double-click in the loop
747e3e3828fSBram Moolenaar  set mouse=a term=xterm mousetime=1
748e3e3828fSBram Moolenaar  let row = 1
749e3e3828fSBram Moolenaar
750515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
7514945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
7521ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
753e3e3828fSBram Moolenaar    e Xtab1
754e3e3828fSBram Moolenaar    tabnew Xtab2
755e3e3828fSBram Moolenaar
756e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
757e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
758e3e3828fSBram Moolenaar        \              '    Xtab1',
759e3e3828fSBram Moolenaar        \              'Tab page 2',
7604945219bSBram Moolenaar        \              '>   Xtab2'], a, msg)
761e3e3828fSBram Moolenaar    redraw
762e3e3828fSBram Moolenaar
763e3e3828fSBram Moolenaar    " Click in tab2 and drag it to tab1.
764e3e3828fSBram Moolenaar    " Check getcharmod() to verify that click is not
765e3e3828fSBram Moolenaar    " interpreted as a spurious double-click.
766e3e3828fSBram Moolenaar    call MouseLeftClick(row, 10)
7674945219bSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
768e3e3828fSBram Moolenaar    for col in [9, 8, 7, 6]
769e3e3828fSBram Moolenaar      call MouseLeftDrag(row, col)
770e3e3828fSBram Moolenaar    endfor
771e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
772e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
773e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
774e3e3828fSBram Moolenaar        \              '>   Xtab2',
775e3e3828fSBram Moolenaar        \              'Tab page 2',
7764945219bSBram Moolenaar        \              '    Xtab1'], a, msg)
777e3e3828fSBram Moolenaar
778f36a2c7eSBram Moolenaar    " Click elsewhere so that click in next iteration is not
779f36a2c7eSBram Moolenaar    " interpreted as unwanted double-click.
780f36a2c7eSBram Moolenaar    call MouseLeftClick(row, 11)
781f36a2c7eSBram Moolenaar    call MouseLeftRelease(row, 11)
782f36a2c7eSBram Moolenaar
783e3e3828fSBram Moolenaar    %bwipe!
784e3e3828fSBram Moolenaar  endfor
785e3e3828fSBram Moolenaar
786e3e3828fSBram Moolenaar  let &mouse = save_mouse
787e3e3828fSBram Moolenaar  let &term = save_term
788e3e3828fSBram Moolenaar  let &ttymouse = save_ttymouse
78992fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
790e3e3828fSBram Moolenaar  set mousetime&
791e3e3828fSBram Moolenaarendfunc
792e3e3828fSBram Moolenaar
79392fd599eSBram Moolenaarfunc Test_term_mouse_double_click_to_create_tab()
794e3e3828fSBram Moolenaar  let save_mouse = &mouse
795e3e3828fSBram Moolenaar  let save_term = &term
796e3e3828fSBram Moolenaar  let save_ttymouse = &ttymouse
79792fd599eSBram Moolenaar  call test_override('no_query_mouse', 1)
798e3e3828fSBram Moolenaar  " Set 'mousetime' to a small value, so that double-click works but we don't
799e3e3828fSBram Moolenaar  " have to wait long to avoid a triple-click.
800f36a2c7eSBram Moolenaar  set mouse=a term=xterm mousetime=200
801e3e3828fSBram Moolenaar  let row = 1
802e3e3828fSBram Moolenaar  let col = 10
803e3e3828fSBram Moolenaar
804515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
8054945219bSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
8061ee36d6fSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
807e3e3828fSBram Moolenaar    e Xtab1
808e3e3828fSBram Moolenaar    tabnew Xtab2
809e3e3828fSBram Moolenaar
810e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
811e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
812e3e3828fSBram Moolenaar        \              '    Xtab1',
813e3e3828fSBram Moolenaar        \              'Tab page 2',
8144945219bSBram Moolenaar        \              '>   Xtab2'], a, msg)
815e3e3828fSBram Moolenaar
816e3e3828fSBram Moolenaar    redraw
817e3e3828fSBram Moolenaar    call MouseLeftClick(row, col)
818e3e3828fSBram Moolenaar    " Check getcharmod() to verify that first click is not
819e3e3828fSBram Moolenaar    " interpreted as a spurious double-click.
8204945219bSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
821e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
822e3e3828fSBram Moolenaar    call MouseLeftClick(row, col)
8234945219bSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
824e3e3828fSBram Moolenaar    call MouseLeftRelease(row, col)
825e3e3828fSBram Moolenaar    let a = split(execute(':tabs'), "\n")
826e3e3828fSBram Moolenaar    call assert_equal(['Tab page 1',
827e3e3828fSBram Moolenaar        \              '    Xtab1',
828e3e3828fSBram Moolenaar        \              'Tab page 2',
829e3e3828fSBram Moolenaar        \              '>   [No Name]',
830e3e3828fSBram Moolenaar        \              'Tab page 3',
8314945219bSBram Moolenaar        \              '    Xtab2'], a, msg)
832e3e3828fSBram Moolenaar
833f36a2c7eSBram Moolenaar    " Click elsewhere so that click in next iteration is not
834f36a2c7eSBram Moolenaar    " interpreted as unwanted double click.
835f36a2c7eSBram Moolenaar    call MouseLeftClick(row, col + 1)
836f36a2c7eSBram Moolenaar    call MouseLeftRelease(row, col + 1)
837f36a2c7eSBram Moolenaar
838e3e3828fSBram Moolenaar    %bwipe!
839e3e3828fSBram Moolenaar  endfor
840e3e3828fSBram Moolenaar
841e3e3828fSBram Moolenaar  let &mouse = save_mouse
842e3e3828fSBram Moolenaar  let &term = save_term
843e3e3828fSBram Moolenaar  let &ttymouse = save_ttymouse
84492fd599eSBram Moolenaar  call test_override('no_query_mouse', 0)
845e3e3828fSBram Moolenaar  set mousetime&
846e3e3828fSBram Moolenaarendfunc
847696d6377SBram Moolenaar
848f36a2c7eSBram Moolenaar" Test double/triple/quadruple click in normal mode to visually select.
849f36a2c7eSBram Moolenaarfunc Test_term_mouse_multiple_clicks_to_visually_select()
850f36a2c7eSBram Moolenaar  let save_mouse = &mouse
851f36a2c7eSBram Moolenaar  let save_term = &term
852f36a2c7eSBram Moolenaar  let save_ttymouse = &ttymouse
853f36a2c7eSBram Moolenaar  call test_override('no_query_mouse', 1)
854f36a2c7eSBram Moolenaar  set mouse=a term=xterm mousetime=200
855f36a2c7eSBram Moolenaar  new
856f36a2c7eSBram Moolenaar
857515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
858f36a2c7eSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
859f36a2c7eSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
860f36a2c7eSBram Moolenaar    call setline(1, ['foo [foo bar] foo', 'foo'])
861f36a2c7eSBram Moolenaar
862f36a2c7eSBram Moolenaar    " Double-click on word should visually select the word.
863f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
864f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
865f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
866f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
867f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
868f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
869f36a2c7eSBram Moolenaar    call assert_equal('v', mode(), msg)
870f36a2c7eSBram Moolenaar    norm! r1
871f36a2c7eSBram Moolenaar    call assert_equal(['111 [foo bar] foo', 'foo'], getline(1, '$'), msg)
872f36a2c7eSBram Moolenaar
873f36a2c7eSBram Moolenaar    " Double-click on opening square bracket should visually
874f36a2c7eSBram Moolenaar    " select the whole [foo bar].
875f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 5)
876f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
877f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 5)
878f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 5)
879f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
880f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 5)
881f36a2c7eSBram Moolenaar    call assert_equal('v', mode(), msg)
882f36a2c7eSBram Moolenaar    norm! r2
883f36a2c7eSBram Moolenaar    call assert_equal(['111 222222222 foo', 'foo'], getline(1, '$'), msg)
884f36a2c7eSBram Moolenaar
885f36a2c7eSBram Moolenaar    " Triple-click should visually select the whole line.
886f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 3)
887f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
888f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 3)
889f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 3)
890f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
891f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 3)
892f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 3)
893f36a2c7eSBram Moolenaar    call assert_equal(64, getcharmod(), msg) " triple-click
894f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 3)
895f36a2c7eSBram Moolenaar    call assert_equal('V', mode(), msg)
896f36a2c7eSBram Moolenaar    norm! r3
897f36a2c7eSBram Moolenaar    call assert_equal(['33333333333333333', 'foo'], getline(1, '$'), msg)
898f36a2c7eSBram Moolenaar
899f36a2c7eSBram Moolenaar    " Quadruple-click should start visual block select.
900f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
901f36a2c7eSBram Moolenaar    call assert_equal(0, getcharmod(), msg)
902f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
903f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
904f36a2c7eSBram Moolenaar    call assert_equal(32, getcharmod(), msg) " double-click
905f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
906f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
907f36a2c7eSBram Moolenaar    call assert_equal(64, getcharmod(), msg) " triple-click
908f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
909f36a2c7eSBram Moolenaar    call MouseLeftClick(1, 2)
910f36a2c7eSBram Moolenaar    call assert_equal(96, getcharmod(), msg) " quadruple-click
911f36a2c7eSBram Moolenaar    call MouseLeftRelease(1, 2)
912f36a2c7eSBram Moolenaar    call assert_equal("\<c-v>", mode(), msg)
913f36a2c7eSBram Moolenaar    norm! r4
914f36a2c7eSBram Moolenaar    call assert_equal(['34333333333333333', 'foo'], getline(1, '$'), msg)
9152764d06aSBram Moolenaar
9162764d06aSBram Moolenaar    " Double-click on a space character should visually select all the
9172764d06aSBram Moolenaar    " consecutive space characters.
9182764d06aSBram Moolenaar    %d
9192764d06aSBram Moolenaar    call setline(1, '    one two')
9202764d06aSBram Moolenaar    call MouseLeftClick(1, 2)
9212764d06aSBram Moolenaar    call MouseLeftRelease(1, 2)
9222764d06aSBram Moolenaar    call MouseLeftClick(1, 2)
9232764d06aSBram Moolenaar    call MouseLeftRelease(1, 2)
9242764d06aSBram Moolenaar    call assert_equal('v', mode(), msg)
9252764d06aSBram Moolenaar    norm! r1
9262764d06aSBram Moolenaar    call assert_equal(['1111one two'], getline(1, '$'), msg)
9272764d06aSBram Moolenaar
9282764d06aSBram Moolenaar    " Double-click on a word with exclusive selection
9292764d06aSBram Moolenaar    set selection=exclusive
9302764d06aSBram Moolenaar    let @" = ''
9312764d06aSBram Moolenaar    call MouseLeftClick(1, 10)
9322764d06aSBram Moolenaar    call MouseLeftRelease(1, 10)
9332764d06aSBram Moolenaar    call MouseLeftClick(1, 10)
9342764d06aSBram Moolenaar    call MouseLeftRelease(1, 10)
9352764d06aSBram Moolenaar    norm! y
9362764d06aSBram Moolenaar    call assert_equal('two', @", msg)
9372764d06aSBram Moolenaar
9382764d06aSBram Moolenaar    " Double click to select a block of text with exclusive selection
9392764d06aSBram Moolenaar    %d
9402764d06aSBram Moolenaar    call setline(1, 'one (two) three')
9412764d06aSBram Moolenaar    call MouseLeftClick(1, 5)
9422764d06aSBram Moolenaar    call MouseLeftRelease(1, 5)
9432764d06aSBram Moolenaar    call MouseLeftClick(1, 5)
9442764d06aSBram Moolenaar    call MouseLeftRelease(1, 5)
9452764d06aSBram Moolenaar    norm! y
9462764d06aSBram Moolenaar    call assert_equal(5, col("'<"), msg)
9472764d06aSBram Moolenaar    call assert_equal(10, col("'>"), msg)
9482764d06aSBram Moolenaar
9492764d06aSBram Moolenaar    call MouseLeftClick(1, 9)
9502764d06aSBram Moolenaar    call MouseLeftRelease(1, 9)
9512764d06aSBram Moolenaar    call MouseLeftClick(1, 9)
9522764d06aSBram Moolenaar    call MouseLeftRelease(1, 9)
9532764d06aSBram Moolenaar    norm! y
9542764d06aSBram Moolenaar    call assert_equal(5, col("'<"), msg)
9552764d06aSBram Moolenaar    call assert_equal(10, col("'>"), msg)
9562764d06aSBram Moolenaar    set selection&
9572764d06aSBram Moolenaar
9582764d06aSBram Moolenaar    " Click somewhere else so that the clicks above is not combined with the
9592764d06aSBram Moolenaar    " clicks in the next iteration.
9602764d06aSBram Moolenaar    call MouseRightClick(3, 10)
9612764d06aSBram Moolenaar    call MouseRightRelease(3, 10)
962f36a2c7eSBram Moolenaar  endfor
963f36a2c7eSBram Moolenaar
964f36a2c7eSBram Moolenaar  let &mouse = save_mouse
965f36a2c7eSBram Moolenaar  let &term = save_term
966f36a2c7eSBram Moolenaar  let &ttymouse = save_ttymouse
967f36a2c7eSBram Moolenaar  set mousetime&
968f36a2c7eSBram Moolenaar  call test_override('no_query_mouse', 0)
969f36a2c7eSBram Moolenaar  bwipe!
970f36a2c7eSBram Moolenaarendfunc
971f36a2c7eSBram Moolenaar
9722764d06aSBram Moolenaar" Test for selecting text in visual blockwise mode using Alt-LeftClick
9732764d06aSBram Moolenaarfunc Test_mouse_alt_leftclick()
9742764d06aSBram Moolenaar  let save_mouse = &mouse
9752764d06aSBram Moolenaar  let save_term = &term
9762764d06aSBram Moolenaar  let save_ttymouse = &ttymouse
9772764d06aSBram Moolenaar  call test_override('no_query_mouse', 1)
9782764d06aSBram Moolenaar  set mouse=a term=xterm mousetime=200
9792764d06aSBram Moolenaar  set mousemodel=popup
9802764d06aSBram Moolenaar  new
9812764d06aSBram Moolenaar  call setline(1, 'one (two) three')
9822764d06aSBram Moolenaar
9832764d06aSBram Moolenaar  for ttymouse_val in g:Ttymouse_values
9842764d06aSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
9852764d06aSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
9862764d06aSBram Moolenaar
9872764d06aSBram Moolenaar    " Left click with the Alt modifier key should extend the selection in
9882764d06aSBram Moolenaar    " blockwise visual mode.
9892764d06aSBram Moolenaar    let @" = ''
9902764d06aSBram Moolenaar    call MouseLeftClick(1, 3)
9912764d06aSBram Moolenaar    call MouseLeftRelease(1, 3)
9922764d06aSBram Moolenaar    call MouseAltLeftClick(1, 11)
9932764d06aSBram Moolenaar    call MouseLeftRelease(1, 11)
9942764d06aSBram Moolenaar    call assert_equal("\<C-V>", mode(), msg)
9952764d06aSBram Moolenaar    normal! y
9962764d06aSBram Moolenaar    call assert_equal('e (two) t', @")
9972764d06aSBram Moolenaar  endfor
9982764d06aSBram Moolenaar
9992764d06aSBram Moolenaar  let &mouse = save_mouse
10002764d06aSBram Moolenaar  let &term = save_term
10012764d06aSBram Moolenaar  let &ttymouse = save_ttymouse
10022764d06aSBram Moolenaar  set mousetime& mousemodel&
10032764d06aSBram Moolenaar  call test_override('no_query_mouse', 0)
10042764d06aSBram Moolenaar  close!
10052764d06aSBram Moolenaarendfunc
10062764d06aSBram Moolenaar
1007696d6377SBram Moolenaarfunc Test_xterm_mouse_click_in_fold_columns()
1008696d6377SBram Moolenaar  new
1009696d6377SBram Moolenaar  let save_mouse = &mouse
1010696d6377SBram Moolenaar  let save_term = &term
1011696d6377SBram Moolenaar  let save_ttymouse = &ttymouse
1012696d6377SBram Moolenaar  let save_foldcolumn = &foldcolumn
10132b00b9b0SBram Moolenaar  set mouse=a term=xterm foldcolumn=3 ttymouse=xterm2
1014696d6377SBram Moolenaar
1015696d6377SBram Moolenaar  " Create 2 nested folds.
1016696d6377SBram Moolenaar  call setline(1, range(1, 7))
1017696d6377SBram Moolenaar  2,6fold
1018696d6377SBram Moolenaar  norm! zR
1019696d6377SBram Moolenaar  4,5fold
1020696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
1021696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
1022696d6377SBram Moolenaar
1023696d6377SBram Moolenaar  " Click in "+" of inner fold in foldcolumn should open it.
1024696d6377SBram Moolenaar  redraw
1025696d6377SBram Moolenaar  let row = 4
1026696d6377SBram Moolenaar  let col = 2
1027696d6377SBram Moolenaar  call MouseLeftClick(row, col)
1028696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
1029696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, -1, -1, -1, -1],
1030696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
1031696d6377SBram Moolenaar
1032696d6377SBram Moolenaar  " Click in "-" of outer fold in foldcolumn should close it.
1033696d6377SBram Moolenaar  redraw
1034696d6377SBram Moolenaar  let row = 2
1035696d6377SBram Moolenaar  let col = 1
1036696d6377SBram Moolenaar  call MouseLeftClick(row, col)
1037696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
1038696d6377SBram Moolenaar  call assert_equal([-1, 2, 2, 2, 2, 2, -1],
1039696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
1040696d6377SBram Moolenaar  norm! zR
1041696d6377SBram Moolenaar
1042696d6377SBram Moolenaar  " Click in "|" of inner fold in foldcolumn should close it.
1043696d6377SBram Moolenaar  redraw
1044696d6377SBram Moolenaar  let row = 5
1045696d6377SBram Moolenaar  let col = 2
1046696d6377SBram Moolenaar  call MouseLeftClick(row, col)
1047696d6377SBram Moolenaar  call MouseLeftRelease(row, col)
1048696d6377SBram Moolenaar  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
1049696d6377SBram Moolenaar        \           map(range(1, 7), 'foldclosed(v:val)'))
1050696d6377SBram Moolenaar
1051696d6377SBram Moolenaar  let &foldcolumn = save_foldcolumn
1052696d6377SBram Moolenaar  let &ttymouse = save_ttymouse
1053696d6377SBram Moolenaar  let &term = save_term
1054696d6377SBram Moolenaar  let &mouse = save_mouse
1055696d6377SBram Moolenaar  bwipe!
1056696d6377SBram Moolenaarendfunc
105766761db1SBram Moolenaar
1058f19f8d1aSBram Moolenaar" Left or right click in Ex command line sets position of the cursor.
1059f19f8d1aSBram Moolenaarfunc Test_term_mouse_click_in_cmdline_to_set_pos()
1060f19f8d1aSBram Moolenaar  let save_mouse = &mouse
1061f19f8d1aSBram Moolenaar  let save_term = &term
1062f19f8d1aSBram Moolenaar  let save_ttymouse = &ttymouse
1063f19f8d1aSBram Moolenaar  call test_override('no_query_mouse', 1)
1064f19f8d1aSBram Moolenaar  set mouse=a term=xterm
1065f19f8d1aSBram Moolenaar  let row = &lines
1066f19f8d1aSBram Moolenaar
1067515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
1068ab505b1aSBram Moolenaar    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
1069ab505b1aSBram Moolenaar    if ttymouse_val !=# 'xterm2' || row <= 223
1070f19f8d1aSBram Moolenaar      let msg = 'ttymouse=' .. ttymouse_val
1071f19f8d1aSBram Moolenaar      exe 'set ttymouse=' .. ttymouse_val
1072f19f8d1aSBram Moolenaar
1073ab505b1aSBram Moolenaar
1074f19f8d1aSBram Moolenaar      call feedkeys(':"3456789'
1075f19f8d1aSBram Moolenaar            \       .. MouseLeftClickCode(row, 7)
1076f19f8d1aSBram Moolenaar            \       .. MouseLeftReleaseCode(row, 7) .. 'L'
1077f19f8d1aSBram Moolenaar            \       .. MouseRightClickCode(row, 4)
1078f19f8d1aSBram Moolenaar            \       .. MouseRightReleaseCode(row, 4) .. 'R'
1079f19f8d1aSBram Moolenaar            \       .. "\<CR>", 'Lx!')
1080f19f8d1aSBram Moolenaar      call assert_equal('"3R456L789', @:, msg)
1081ab505b1aSBram Moolenaar    endif
1082f19f8d1aSBram Moolenaar  endfor
1083f19f8d1aSBram Moolenaar
1084f19f8d1aSBram Moolenaar  let &mouse = save_mouse
1085f19f8d1aSBram Moolenaar  let &term = save_term
1086f19f8d1aSBram Moolenaar  let &ttymouse = save_ttymouse
1087f19f8d1aSBram Moolenaar  set mousetime&
1088f19f8d1aSBram Moolenaar  call test_override('no_query_mouse', 0)
1089f19f8d1aSBram Moolenaarendfunc
1090f19f8d1aSBram Moolenaar
1091f19f8d1aSBram Moolenaar" Middle click in command line pastes at position of cursor.
1092f19f8d1aSBram Moolenaarfunc Test_term_mouse_middle_click_in_cmdline_to_paste()
1093f19f8d1aSBram Moolenaar  CheckFeature clipboard_working
1094f19f8d1aSBram Moolenaar  let save_mouse = &mouse
1095f19f8d1aSBram Moolenaar  let save_term = &term
1096f19f8d1aSBram Moolenaar  let save_ttymouse = &ttymouse
1097f19f8d1aSBram Moolenaar  call test_override('no_query_mouse', 1)
1098f19f8d1aSBram Moolenaar  set mouse=a term=xterm
1099f19f8d1aSBram Moolenaar  let row = &lines
1100f19f8d1aSBram Moolenaar  " Column values does not matter, paste is done at position of cursor.
1101f19f8d1aSBram Moolenaar  let col = 1
1102f19f8d1aSBram Moolenaar  let @* = 'paste'
1103f19f8d1aSBram Moolenaar
1104515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
1105f19f8d1aSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
1106f19f8d1aSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
1107f19f8d1aSBram Moolenaar
1108f19f8d1aSBram Moolenaar    call feedkeys(":\"->"
1109f19f8d1aSBram Moolenaar          \       .. MouseMiddleReleaseCode(row, col)
1110f19f8d1aSBram Moolenaar          \       .. MouseMiddleClickCode(row, col)
1111f19f8d1aSBram Moolenaar          \       .. "<-"
1112f19f8d1aSBram Moolenaar          \       .. MouseMiddleReleaseCode(row, col)
1113f19f8d1aSBram Moolenaar          \       .. MouseMiddleClickCode(row, col)
1114f19f8d1aSBram Moolenaar          \       .. "\<CR>", 'Lx!')
1115f19f8d1aSBram Moolenaar    call assert_equal('"->paste<-paste', @:, msg)
1116f19f8d1aSBram Moolenaar  endfor
1117f19f8d1aSBram Moolenaar
1118f19f8d1aSBram Moolenaar  let &mouse = save_mouse
1119f19f8d1aSBram Moolenaar  let &term = save_term
1120f19f8d1aSBram Moolenaar  let &ttymouse = save_ttymouse
1121f19f8d1aSBram Moolenaar  let @* = ''
1122f19f8d1aSBram Moolenaar  call test_override('no_query_mouse', 0)
1123f19f8d1aSBram Moolenaarendfunc
1124f19f8d1aSBram Moolenaar
1125297bec07SBram Moolenaar" Test for making sure S-Middlemouse doesn't do anything
1126297bec07SBram Moolenaarfunc Test_term_mouse_shift_middle_click()
1127297bec07SBram Moolenaar  new
1128297bec07SBram Moolenaar  let save_mouse = &mouse
1129297bec07SBram Moolenaar  let save_term = &term
1130297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
1131297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
1132297bec07SBram Moolenaar  set mouse=a term=xterm ttymouse=xterm2 mousemodel=
1133297bec07SBram Moolenaar
1134297bec07SBram Moolenaar  call test_setmouse(1, 1)
1135297bec07SBram Moolenaar  exe "normal \<S-MiddleMouse>"
1136297bec07SBram Moolenaar  call assert_equal([''], getline(1, '$'))
1137297bec07SBram Moolenaar  call assert_equal(1, winnr())
1138297bec07SBram Moolenaar
1139297bec07SBram Moolenaar  let &mouse = save_mouse
1140297bec07SBram Moolenaar  let &term = save_term
1141297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
1142297bec07SBram Moolenaar  set mousemodel&
1143297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
1144297bec07SBram Moolenaar  close!
1145297bec07SBram Moolenaarendfunc
1146297bec07SBram Moolenaar
1147297bec07SBram Moolenaar" Test for using mouse in visual mode
1148297bec07SBram Moolenaarfunc Test_term_mouse_visual_mode()
1149297bec07SBram Moolenaar  new
1150297bec07SBram Moolenaar  let save_mouse = &mouse
1151297bec07SBram Moolenaar  let save_term = &term
1152297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
1153297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
1154297bec07SBram Moolenaar  set term=xterm ttymouse=xterm2
1155297bec07SBram Moolenaar
1156297bec07SBram Moolenaar  " If visual mode is not present in 'mouse', then left click should not
1157297bec07SBram Moolenaar  " do anything in visal mode.
1158297bec07SBram Moolenaar  call setline(1, ['one two three four'])
1159297bec07SBram Moolenaar  set mouse=nci
1160297bec07SBram Moolenaar  call cursor(1, 5)
1161297bec07SBram Moolenaar  let @" = ''
1162297bec07SBram Moolenaar  call feedkeys("ve"
1163297bec07SBram Moolenaar        \ .. MouseLeftClickCode(1, 15) .. MouseLeftReleaseCode(1, 15)
1164297bec07SBram Moolenaar        \ .. 'y', 'Lx!')
1165297bec07SBram Moolenaar  call assert_equal(5, col('.'))
1166297bec07SBram Moolenaar  call assert_equal('two', @")
1167297bec07SBram Moolenaar
1168297bec07SBram Moolenaar  " Pressing right click in visual mode should change the visual selection
1169297bec07SBram Moolenaar  " if 'mousemodel' doesn't contain popup.
1170297bec07SBram Moolenaar  " Right click after the visual selection
1171297bec07SBram Moolenaar  set mousemodel=
1172297bec07SBram Moolenaar  set mouse=a
1173297bec07SBram Moolenaar  call test_setmouse(1, 13)
1174297bec07SBram Moolenaar  exe "normal 5|ve\<RightMouse>y"
1175297bec07SBram Moolenaar  call assert_equal('two three', @")
1176297bec07SBram Moolenaar  call assert_equal(5, col('.'))
1177297bec07SBram Moolenaar
1178297bec07SBram Moolenaar  " Right click before the visual selection
1179297bec07SBram Moolenaar  call test_setmouse(1, 9)
1180297bec07SBram Moolenaar  exe "normal 15|ve\<RightMouse>y"
1181297bec07SBram Moolenaar  call assert_equal('three four', @")
1182297bec07SBram Moolenaar  call assert_equal(9, col('.'))
1183297bec07SBram Moolenaar
11842764d06aSBram Moolenaar  " Right click inside the selection closer to the start of the selection
11852764d06aSBram Moolenaar  call test_setmouse(1, 7)
11862764d06aSBram Moolenaar  exe "normal 5|vee\<RightMouse>lly"
11872764d06aSBram Moolenaar  call assert_equal('three', @")
11882764d06aSBram Moolenaar  call assert_equal(9, col('.'))
11892764d06aSBram Moolenaar  call assert_equal(9, col("'<"))
11902764d06aSBram Moolenaar  call assert_equal(13, col("'>"))
11912764d06aSBram Moolenaar
11922764d06aSBram Moolenaar  " Right click inside the selection closer to the end of the selection
11932764d06aSBram Moolenaar  call test_setmouse(1, 11)
11942764d06aSBram Moolenaar  exe "normal 5|vee\<RightMouse>ly"
11952764d06aSBram Moolenaar  call assert_equal('two thre', @")
11962764d06aSBram Moolenaar  call assert_equal(5, col('.'))
11972764d06aSBram Moolenaar  call assert_equal(5, col("'<"))
11982764d06aSBram Moolenaar  call assert_equal(12, col("'>"))
11992764d06aSBram Moolenaar
12002764d06aSBram Moolenaar  " Multi-line selection. Right click inside thse selection.
12012764d06aSBram Moolenaar  call setline(1, repeat(['aaaaaa'], 7))
1202297bec07SBram Moolenaar  call test_setmouse(3, 1)
1203297bec07SBram Moolenaar  exe "normal ggVG\<RightMouse>y"
1204297bec07SBram Moolenaar  call assert_equal(3, line("'<"))
12052764d06aSBram Moolenaar  call test_setmouse(5, 1)
1206297bec07SBram Moolenaar  exe "normal ggVG\<RightMouse>y"
12072764d06aSBram Moolenaar  call assert_equal(5, line("'>"))
12082764d06aSBram Moolenaar
12092764d06aSBram Moolenaar  " Click right in the middle line of the selection
12102764d06aSBram Moolenaar  call test_setmouse(4, 3)
12112764d06aSBram Moolenaar  exe "normal ggVG$\<RightMouse>y"
12122764d06aSBram Moolenaar  call assert_equal(4, line("'<"))
12132764d06aSBram Moolenaar  call test_setmouse(4, 4)
12142764d06aSBram Moolenaar  exe "normal ggVG$\<RightMouse>y"
1215297bec07SBram Moolenaar  call assert_equal(4, line("'>"))
1216297bec07SBram Moolenaar
1217297bec07SBram Moolenaar  set mousemodel&
1218297bec07SBram Moolenaar  let &mouse = save_mouse
1219297bec07SBram Moolenaar  let &term = save_term
1220297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
1221297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
1222297bec07SBram Moolenaar  close!
1223297bec07SBram Moolenaarendfunc
1224297bec07SBram Moolenaar
12250eabd4dcSBram Moolenaar" Test for displaying the popup menu using the right mouse click
1226297bec07SBram Moolenaarfunc Test_term_mouse_popup_menu()
12270eabd4dcSBram Moolenaar  CheckFeature menu
12280eabd4dcSBram Moolenaar  new
12290eabd4dcSBram Moolenaar  call setline(1, 'popup menu test')
12300eabd4dcSBram Moolenaar  let save_mouse = &mouse
12310eabd4dcSBram Moolenaar  let save_term = &term
12320eabd4dcSBram Moolenaar  let save_ttymouse = &ttymouse
12330eabd4dcSBram Moolenaar  let save_mousemodel = &mousemodel
12340eabd4dcSBram Moolenaar  call test_override('no_query_mouse', 1)
12350eabd4dcSBram Moolenaar  set mouse=a term=xterm mousemodel=popup
12360eabd4dcSBram Moolenaar
12370eabd4dcSBram Moolenaar  menu PopUp.foo :let g:menustr = 'foo'<CR>
12380eabd4dcSBram Moolenaar  menu PopUp.bar :let g:menustr = 'bar'<CR>
12390eabd4dcSBram Moolenaar  menu PopUp.baz :let g:menustr = 'baz'<CR>
12400eabd4dcSBram Moolenaar
1241515545e1SBram Moolenaar  for ttymouse_val in g:Ttymouse_values
12422764d06aSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
12430eabd4dcSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
12440eabd4dcSBram Moolenaar    let g:menustr = ''
12450eabd4dcSBram Moolenaar    call feedkeys(MouseRightClickCode(1, 4)
12460eabd4dcSBram Moolenaar		\ .. MouseRightReleaseCode(1, 4) .. "\<Down>\<Down>\<CR>", "x")
12472764d06aSBram Moolenaar    call assert_equal('bar', g:menustr, msg)
12480eabd4dcSBram Moolenaar  endfor
12490eabd4dcSBram Moolenaar
12500eabd4dcSBram Moolenaar  unmenu PopUp
12510eabd4dcSBram Moolenaar  let &mouse = save_mouse
12520eabd4dcSBram Moolenaar  let &term = save_term
12530eabd4dcSBram Moolenaar  let &ttymouse = save_ttymouse
12540eabd4dcSBram Moolenaar  let &mousemodel = save_mousemodel
12550eabd4dcSBram Moolenaar  call test_override('no_query_mouse', 0)
12560eabd4dcSBram Moolenaar  close!
12570eabd4dcSBram Moolenaarendfunc
12580eabd4dcSBram Moolenaar
1259297bec07SBram Moolenaar" Test for 'mousemodel' set to popup_setpos to move the cursor where the popup
1260297bec07SBram Moolenaar" menu is displayed.
1261297bec07SBram Moolenaarfunc Test_term_mouse_popup_menu_setpos()
1262297bec07SBram Moolenaar  CheckFeature menu
1263297bec07SBram Moolenaar  5new
1264297bec07SBram Moolenaar  call setline(1, ['the dish ran away with the spoon',
1265297bec07SBram Moolenaar        \ 'the cow jumped over the moon' ])
1266297bec07SBram Moolenaar  let save_mouse = &mouse
1267297bec07SBram Moolenaar  let save_term = &term
1268297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
1269297bec07SBram Moolenaar  let save_mousemodel = &mousemodel
1270297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
1271297bec07SBram Moolenaar  set mouse=a term=xterm mousemodel=popup_setpos
1272297bec07SBram Moolenaar
1273297bec07SBram Moolenaar  nmenu PopUp.foo :let g:menustr = 'foo'<CR>
1274297bec07SBram Moolenaar  nmenu PopUp.bar :let g:menustr = 'bar'<CR>
1275297bec07SBram Moolenaar  nmenu PopUp.baz :let g:menustr = 'baz'<CR>
1276297bec07SBram Moolenaar  vmenu PopUp.foo y:<C-U>let g:menustr = 'foo'<CR>
1277297bec07SBram Moolenaar  vmenu PopUp.bar y:<C-U>let g:menustr = 'bar'<CR>
1278297bec07SBram Moolenaar  vmenu PopUp.baz y:<C-U>let g:menustr = 'baz'<CR>
1279297bec07SBram Moolenaar
1280297bec07SBram Moolenaar  for ttymouse_val in g:Ttymouse_values
12812764d06aSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
1282297bec07SBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
1283297bec07SBram Moolenaar    let g:menustr = ''
1284297bec07SBram Moolenaar    call cursor(1, 1)
1285297bec07SBram Moolenaar    call feedkeys(MouseRightClickCode(1, 5)
1286297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(1, 5) .. "\<Down>\<Down>\<CR>", "x")
12872764d06aSBram Moolenaar    call assert_equal('bar', g:menustr, msg)
12882764d06aSBram Moolenaar    call assert_equal([1, 5], [line('.'), col('.')], msg)
1289297bec07SBram Moolenaar
1290297bec07SBram Moolenaar    " Test for right click in visual mode inside the selection
1291297bec07SBram Moolenaar    let @" = ''
1292297bec07SBram Moolenaar    call cursor(1, 10)
1293297bec07SBram Moolenaar    call feedkeys('vee' .. MouseRightClickCode(1, 12)
1294297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(1, 12) .. "\<Down>\<CR>", "x")
12952764d06aSBram Moolenaar    call assert_equal([1, 10], [line('.'), col('.')], msg)
12962764d06aSBram Moolenaar    call assert_equal('ran away', @", msg)
1297297bec07SBram Moolenaar
1298297bec07SBram Moolenaar    " Test for right click in visual mode before the selection
1299297bec07SBram Moolenaar    let @" = ''
1300297bec07SBram Moolenaar    call cursor(1, 10)
1301297bec07SBram Moolenaar    call feedkeys('vee' .. MouseRightClickCode(1, 2)
1302297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(1, 2) .. "\<Down>\<CR>", "x")
13032764d06aSBram Moolenaar    call assert_equal([1, 2], [line('.'), col('.')], msg)
13042764d06aSBram Moolenaar    call assert_equal('', @", msg)
1305297bec07SBram Moolenaar
1306297bec07SBram Moolenaar    " Test for right click in visual mode after the selection
1307297bec07SBram Moolenaar    let @" = ''
1308297bec07SBram Moolenaar    call cursor(1, 10)
1309297bec07SBram Moolenaar    call feedkeys('vee' .. MouseRightClickCode(1, 20)
1310297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(1, 20) .. "\<Down>\<CR>", "x")
13112764d06aSBram Moolenaar    call assert_equal([1, 20], [line('.'), col('.')], msg)
13122764d06aSBram Moolenaar    call assert_equal('', @", msg)
1313297bec07SBram Moolenaar
1314297bec07SBram Moolenaar    " Test for right click in block-wise visual mode inside the selection
1315297bec07SBram Moolenaar    let @" = ''
1316297bec07SBram Moolenaar    call cursor(1, 16)
1317297bec07SBram Moolenaar    call feedkeys("\<C-V>j3l" .. MouseRightClickCode(2, 17)
1318297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(2, 17) .. "\<Down>\<CR>", "x")
13192764d06aSBram Moolenaar    call assert_equal([1, 16], [line('.'), col('.')], msg)
13202764d06aSBram Moolenaar    call assert_equal("\<C-V>4", getregtype('"'), msg)
1321297bec07SBram Moolenaar
1322297bec07SBram Moolenaar    " Test for right click in block-wise visual mode outside the selection
1323297bec07SBram Moolenaar    let @" = ''
1324297bec07SBram Moolenaar    call cursor(1, 16)
1325297bec07SBram Moolenaar    call feedkeys("\<C-V>j3l" .. MouseRightClickCode(2, 2)
1326297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(2, 2) .. "\<Down>\<CR>", "x")
13272764d06aSBram Moolenaar    call assert_equal([2, 2], [line('.'), col('.')], msg)
13282764d06aSBram Moolenaar    call assert_equal('v', getregtype('"'), msg)
13292764d06aSBram Moolenaar    call assert_equal('', @", msg)
1330297bec07SBram Moolenaar
1331297bec07SBram Moolenaar    " Try clicking on the status line
1332297bec07SBram Moolenaar    let @" = ''
1333297bec07SBram Moolenaar    call cursor(1, 10)
1334297bec07SBram Moolenaar    call feedkeys('vee' .. MouseRightClickCode(6, 2)
1335297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(6, 2) .. "\<Down>\<CR>", "x")
13362764d06aSBram Moolenaar    call assert_equal([1, 10], [line('.'), col('.')], msg)
13372764d06aSBram Moolenaar    call assert_equal('ran away', @", msg)
1338297bec07SBram Moolenaar
1339297bec07SBram Moolenaar    " Try clicking outside the window
1340297bec07SBram Moolenaar    let @" = ''
1341297bec07SBram Moolenaar    call cursor(7, 2)
1342297bec07SBram Moolenaar    call feedkeys('vee' .. MouseRightClickCode(7, 2)
1343297bec07SBram Moolenaar		\ .. MouseRightReleaseCode(7, 2) .. "\<Down>\<CR>", "x")
13442764d06aSBram Moolenaar    call assert_equal(2, winnr(), msg)
13452764d06aSBram Moolenaar    call assert_equal('', @", msg)
1346297bec07SBram Moolenaar    wincmd w
1347297bec07SBram Moolenaar  endfor
1348297bec07SBram Moolenaar
1349297bec07SBram Moolenaar  unmenu PopUp
1350297bec07SBram Moolenaar  let &mouse = save_mouse
1351297bec07SBram Moolenaar  let &term = save_term
1352297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
1353297bec07SBram Moolenaar  let &mousemodel = save_mousemodel
1354297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
1355297bec07SBram Moolenaar  close!
1356297bec07SBram Moolenaarendfunc
1357297bec07SBram Moolenaar
1358297bec07SBram Moolenaar" Test for searching for the word under the cursor using Shift-Right or
1359297bec07SBram Moolenaar" Shift-Left click.
1360297bec07SBram Moolenaarfunc Test_term_mouse_search()
1361297bec07SBram Moolenaar  new
1362297bec07SBram Moolenaar  let save_mouse = &mouse
1363297bec07SBram Moolenaar  let save_term = &term
1364297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
1365297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
1366297bec07SBram Moolenaar  set mouse=a term=xterm ttymouse=xterm2
1367297bec07SBram Moolenaar  set mousemodel=
1368297bec07SBram Moolenaar
1369297bec07SBram Moolenaar  " In normal mode, Shift-Left or Shift-Right click should search for the word
1370297bec07SBram Moolenaar  " under the cursor.
1371297bec07SBram Moolenaar  call setline(1, ['one two three four', 'four three two one'])
1372297bec07SBram Moolenaar  call test_setmouse(1, 4)
1373297bec07SBram Moolenaar  exe "normal \<S-LeftMouse>"
1374297bec07SBram Moolenaar  call assert_equal([2, 12], [line('.'), col('.')])
1375297bec07SBram Moolenaar  call test_setmouse(2, 16)
1376297bec07SBram Moolenaar  exe "normal \<S-RightMouse>"
1377297bec07SBram Moolenaar  call assert_equal([1, 1], [line('.'), col('.')])
1378297bec07SBram Moolenaar
1379297bec07SBram Moolenaar  " In visual mode, Shift-Left or Shift-Right click should search for the word
1380297bec07SBram Moolenaar  " under the cursor and extend the selection.
1381297bec07SBram Moolenaar  call test_setmouse(1, 4)
1382297bec07SBram Moolenaar  exe "normal 4|ve\<S-LeftMouse>y"
1383297bec07SBram Moolenaar  call assert_equal([2, 12], [line("'>"), col("'>")])
1384297bec07SBram Moolenaar  call test_setmouse(2, 16)
1385297bec07SBram Moolenaar  exe "normal 2G16|ve\<S-RightMouse>y"
1386297bec07SBram Moolenaar  call assert_equal([1, 1], [line("'<"), col("'<")])
1387297bec07SBram Moolenaar
1388297bec07SBram Moolenaar  set mousemodel&
1389297bec07SBram Moolenaar  let &mouse = save_mouse
1390297bec07SBram Moolenaar  let &term = save_term
1391297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
1392297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
1393297bec07SBram Moolenaar  close!
1394297bec07SBram Moolenaarendfunc
1395297bec07SBram Moolenaar
1396297bec07SBram Moolenaar" Test for selecting an entry in the quickfix/location list window using the
1397297bec07SBram Moolenaar" mouse.
1398297bec07SBram Moolenaarfunc Test_term_mouse_quickfix_window()
1399297bec07SBram Moolenaar  let save_mouse = &mouse
1400297bec07SBram Moolenaar  let save_term = &term
1401297bec07SBram Moolenaar  let save_ttymouse = &ttymouse
1402297bec07SBram Moolenaar  call test_override('no_query_mouse', 1)
1403297bec07SBram Moolenaar  set mouse=a term=xterm ttymouse=xterm2
1404297bec07SBram Moolenaar  set mousemodel=
1405297bec07SBram Moolenaar
1406297bec07SBram Moolenaar  cgetexpr "Xfile1:1:L1"
1407297bec07SBram Moolenaar  copen 5
1408297bec07SBram Moolenaar  call test_setmouse(&lines - 7, 1)
1409297bec07SBram Moolenaar  exe "normal \<2-LeftMouse>"
1410297bec07SBram Moolenaar  call assert_equal('Xfile1', @%)
1411297bec07SBram Moolenaar  %bw!
1412297bec07SBram Moolenaar
1413297bec07SBram Moolenaar  lgetexpr "Xfile2:1:L1"
1414297bec07SBram Moolenaar  lopen 5
1415297bec07SBram Moolenaar  call test_setmouse(&lines - 7, 1)
1416297bec07SBram Moolenaar  exe "normal \<2-LeftMouse>"
1417297bec07SBram Moolenaar  call assert_equal('Xfile2', @%)
1418297bec07SBram Moolenaar  %bw!
1419297bec07SBram Moolenaar
1420297bec07SBram Moolenaar  set mousemodel&
1421297bec07SBram Moolenaar  let &mouse = save_mouse
1422297bec07SBram Moolenaar  let &term = save_term
1423297bec07SBram Moolenaar  let &ttymouse = save_ttymouse
1424297bec07SBram Moolenaar  call test_override('no_query_mouse', 0)
1425297bec07SBram Moolenaarendfunc
1426297bec07SBram Moolenaar
14272764d06aSBram Moolenaar" Test for the 'h' flag in the 'mouse' option. Using mouse in the help window.
14282764d06aSBram Moolenaarfunc Test_term_mouse_help_window()
14292764d06aSBram Moolenaar  let save_mouse = &mouse
14302764d06aSBram Moolenaar  let save_term = &term
14312764d06aSBram Moolenaar  let save_ttymouse = &ttymouse
14322764d06aSBram Moolenaar  call test_override('no_query_mouse', 1)
14332764d06aSBram Moolenaar  set mouse=h term=xterm mousetime=200
14342764d06aSBram Moolenaar
14352764d06aSBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
14362764d06aSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
14372764d06aSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
14382764d06aSBram Moolenaar    help
14392764d06aSBram Moolenaar    let @" = ''
14402764d06aSBram Moolenaar    call MouseLeftClick(2, 5)
14412764d06aSBram Moolenaar    call MouseLeftRelease(2, 5)
14422764d06aSBram Moolenaar    call MouseLeftClick(1, 1)
14432764d06aSBram Moolenaar    call MouseLeftDrag(1, 10)
14442764d06aSBram Moolenaar    call MouseLeftRelease(1, 10)
14452764d06aSBram Moolenaar    norm! y
14462764d06aSBram Moolenaar    call assert_equal('*help.txt*', @", msg)
14472764d06aSBram Moolenaar    helpclose
14482764d06aSBram Moolenaar
14492764d06aSBram Moolenaar    " Click somewhere else to make sure the left click above is not combined
14502764d06aSBram Moolenaar    " with the next left click and treated as a double click
14512764d06aSBram Moolenaar    call MouseRightClick(5, 10)
14522764d06aSBram Moolenaar    call MouseRightRelease(5, 10)
14532764d06aSBram Moolenaar  endfor
14542764d06aSBram Moolenaar
14552764d06aSBram Moolenaar  let &mouse = save_mouse
14562764d06aSBram Moolenaar  let &term = save_term
14572764d06aSBram Moolenaar  let &ttymouse = save_ttymouse
14582764d06aSBram Moolenaar  set mousetime&
14592764d06aSBram Moolenaar  call test_override('no_query_mouse', 0)
14602764d06aSBram Moolenaar  %bw!
14612764d06aSBram Moolenaarendfunc
14622764d06aSBram Moolenaar
14632764d06aSBram Moolenaar" Test for the translation of various mouse terminal codes
14642764d06aSBram Moolenaarfunc Test_mouse_termcodes()
14652764d06aSBram Moolenaar  let save_mouse = &mouse
14662764d06aSBram Moolenaar  let save_term = &term
14672764d06aSBram Moolenaar  let save_ttymouse = &ttymouse
14682764d06aSBram Moolenaar  call test_override('no_query_mouse', 1)
14692764d06aSBram Moolenaar  set mouse=a term=xterm mousetime=200
14702764d06aSBram Moolenaar
14712764d06aSBram Moolenaar  new
14722764d06aSBram Moolenaar  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
14732764d06aSBram Moolenaar    let msg = 'ttymouse=' .. ttymouse_val
14742764d06aSBram Moolenaar    exe 'set ttymouse=' .. ttymouse_val
14752764d06aSBram Moolenaar
14762764d06aSBram Moolenaar    let mouse_codes = [
14772764d06aSBram Moolenaar          \ ["\<LeftMouse>", "<LeftMouse>"],
14782764d06aSBram Moolenaar          \ ["\<MiddleMouse>", "<MiddleMouse>"],
14792764d06aSBram Moolenaar          \ ["\<RightMouse>", "<RightMouse>"],
14802764d06aSBram Moolenaar          \ ["\<S-LeftMouse>", "<S-LeftMouse>"],
14812764d06aSBram Moolenaar          \ ["\<S-MiddleMouse>", "<S-MiddleMouse>"],
14822764d06aSBram Moolenaar          \ ["\<S-RightMouse>", "<S-RightMouse>"],
14832764d06aSBram Moolenaar          \ ["\<C-LeftMouse>", "<C-LeftMouse>"],
14842764d06aSBram Moolenaar          \ ["\<C-MiddleMouse>", "<C-MiddleMouse>"],
14852764d06aSBram Moolenaar          \ ["\<C-RightMouse>", "<C-RightMouse>"],
14862764d06aSBram Moolenaar          \ ["\<M-LeftMouse>", "<M-LeftMouse>"],
14872764d06aSBram Moolenaar          \ ["\<M-MiddleMouse>", "<M-MiddleMouse>"],
14882764d06aSBram Moolenaar          \ ["\<M-RightMouse>", "<M-RightMouse>"],
14892764d06aSBram Moolenaar          \ ["\<2-LeftMouse>", "<2-LeftMouse>"],
14902764d06aSBram Moolenaar          \ ["\<2-MiddleMouse>", "<2-MiddleMouse>"],
14912764d06aSBram Moolenaar          \ ["\<2-RightMouse>", "<2-RightMouse>"],
14922764d06aSBram Moolenaar          \ ["\<3-LeftMouse>", "<3-LeftMouse>"],
14932764d06aSBram Moolenaar          \ ["\<3-MiddleMouse>", "<3-MiddleMouse>"],
14942764d06aSBram Moolenaar          \ ["\<3-RightMouse>", "<3-RightMouse>"],
14952764d06aSBram Moolenaar          \ ["\<4-LeftMouse>", "<4-LeftMouse>"],
14962764d06aSBram Moolenaar          \ ["\<4-MiddleMouse>", "<4-MiddleMouse>"],
14972764d06aSBram Moolenaar          \ ["\<4-RightMouse>", "<4-RightMouse>"],
14982764d06aSBram Moolenaar          \ ["\<LeftDrag>", "<LeftDrag>"],
14992764d06aSBram Moolenaar          \ ["\<MiddleDrag>", "<MiddleDrag>"],
15002764d06aSBram Moolenaar          \ ["\<RightDrag>", "<RightDrag>"],
15012764d06aSBram Moolenaar          \ ["\<LeftRelease>", "<LeftRelease>"],
15022764d06aSBram Moolenaar          \ ["\<MiddleRelease>", "<MiddleRelease>"],
15032764d06aSBram Moolenaar          \ ["\<RightRelease>", "<RightRelease>"],
15042764d06aSBram Moolenaar          \ ["\<ScrollWheelUp>", "<ScrollWheelUp>"],
15052764d06aSBram Moolenaar          \ ["\<S-ScrollWheelUp>", "<S-ScrollWheelUp>"],
15062764d06aSBram Moolenaar          \ ["\<C-ScrollWheelUp>", "<C-ScrollWheelUp>"],
15072764d06aSBram Moolenaar          \ ["\<ScrollWheelDown>", "<ScrollWheelDown>"],
15082764d06aSBram Moolenaar          \ ["\<S-ScrollWheelDown>", "<S-ScrollWheelDown>"],
15092764d06aSBram Moolenaar          \ ["\<C-ScrollWheelDown>", "<C-ScrollWheelDown>"],
15102764d06aSBram Moolenaar          \ ["\<ScrollWheelLeft>", "<ScrollWheelLeft>"],
15112764d06aSBram Moolenaar          \ ["\<S-ScrollWheelLeft>", "<S-ScrollWheelLeft>"],
15122764d06aSBram Moolenaar          \ ["\<C-ScrollWheelLeft>", "<C-ScrollWheelLeft>"],
15132764d06aSBram Moolenaar          \ ["\<ScrollWheelRight>", "<ScrollWheelRight>"],
15142764d06aSBram Moolenaar          \ ["\<S-ScrollWheelRight>", "<S-ScrollWheelRight>"],
15152764d06aSBram Moolenaar          \ ["\<C-ScrollWheelRight>", "<C-ScrollWheelRight>"]
15162764d06aSBram Moolenaar          \ ]
15172764d06aSBram Moolenaar
15182764d06aSBram Moolenaar    for [code, outstr] in mouse_codes
15192764d06aSBram Moolenaar      exe "normal ggC\<C-K>" . code
15202764d06aSBram Moolenaar      call assert_equal(outstr, getline(1), msg)
15212764d06aSBram Moolenaar    endfor
15222764d06aSBram Moolenaar  endfor
15232764d06aSBram Moolenaar
15242764d06aSBram Moolenaar  let &mouse = save_mouse
15252764d06aSBram Moolenaar  let &term = save_term
15262764d06aSBram Moolenaar  let &ttymouse = save_ttymouse
15272764d06aSBram Moolenaar  set mousetime&
15282764d06aSBram Moolenaar  call test_override('no_query_mouse', 0)
15292764d06aSBram Moolenaar  %bw!
15302764d06aSBram Moolenaarendfunc
15312764d06aSBram Moolenaar
153266761db1SBram Moolenaar" This only checks if the sequence is recognized.
153366761db1SBram Moolenaarfunc Test_term_rgb_response()
153466761db1SBram Moolenaar  set t_RF=x
153566761db1SBram Moolenaar  set t_RB=y
153666761db1SBram Moolenaar
153766761db1SBram Moolenaar  " response to t_RF, 4 digits
153866761db1SBram Moolenaar  let red = 0x12
153966761db1SBram Moolenaar  let green = 0x34
154066761db1SBram Moolenaar  let blue = 0x56
154166761db1SBram Moolenaar  let seq = printf("\<Esc>]10;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
154266761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
154366761db1SBram Moolenaar  call assert_equal(seq, v:termrfgresp)
154466761db1SBram Moolenaar
154566761db1SBram Moolenaar  " response to t_RF, 2 digits
154666761db1SBram Moolenaar  let red = 0x78
154766761db1SBram Moolenaar  let green = 0x9a
154866761db1SBram Moolenaar  let blue = 0xbc
154966761db1SBram Moolenaar  let seq = printf("\<Esc>]10;rgb:%02x/%02x/%02x\x07", red, green, blue)
155066761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
155166761db1SBram Moolenaar  call assert_equal(seq, v:termrfgresp)
155266761db1SBram Moolenaar
155332e19770SBram Moolenaar  " response to t_RB, 4 digits, dark
155432e19770SBram Moolenaar  set background=light
1555ce90e36fSBram Moolenaar  eval 'background'->test_option_not_set()
155632e19770SBram Moolenaar  let red = 0x29
155732e19770SBram Moolenaar  let green = 0x4a
155832e19770SBram Moolenaar  let blue = 0x6b
155932e19770SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
156032e19770SBram Moolenaar  call feedkeys(seq, 'Lx!')
156132e19770SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
156232e19770SBram Moolenaar  call assert_equal('dark', &background)
156332e19770SBram Moolenaar
156432e19770SBram Moolenaar  " response to t_RB, 4 digits, light
156532e19770SBram Moolenaar  set background=dark
156632e19770SBram Moolenaar  call test_option_not_set('background')
156732e19770SBram Moolenaar  let red = 0x81
156832e19770SBram Moolenaar  let green = 0x63
156966761db1SBram Moolenaar  let blue = 0x65
157066761db1SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
157166761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
157266761db1SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
157332e19770SBram Moolenaar  call assert_equal('light', &background)
157466761db1SBram Moolenaar
157532e19770SBram Moolenaar  " response to t_RB, 2 digits, dark
157632e19770SBram Moolenaar  set background=light
157732e19770SBram Moolenaar  call test_option_not_set('background')
157832e19770SBram Moolenaar  let red = 0x47
157932e19770SBram Moolenaar  let green = 0x59
158032e19770SBram Moolenaar  let blue = 0x5b
158166761db1SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
158266761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
158366761db1SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
158432e19770SBram Moolenaar  call assert_equal('dark', &background)
158532e19770SBram Moolenaar
158632e19770SBram Moolenaar  " response to t_RB, 2 digits, light
158732e19770SBram Moolenaar  set background=dark
158832e19770SBram Moolenaar  call test_option_not_set('background')
158932e19770SBram Moolenaar  let red = 0x83
159032e19770SBram Moolenaar  let green = 0xa4
159132e19770SBram Moolenaar  let blue = 0xc2
159232e19770SBram Moolenaar  let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
159332e19770SBram Moolenaar  call feedkeys(seq, 'Lx!')
159432e19770SBram Moolenaar  call assert_equal(seq, v:termrbgresp)
159532e19770SBram Moolenaar  call assert_equal('light', &background)
159666761db1SBram Moolenaar
159766761db1SBram Moolenaar  set t_RF= t_RB=
159866761db1SBram Moolenaarendfunc
159966761db1SBram Moolenaar
160066761db1SBram Moolenaar" This only checks if the sequence is recognized.
16011a4cbb19SBram Moolenaar" This must be after other tests, because it has side effects to xterm
16021a4cbb19SBram Moolenaar" properties.
16031a4cbb19SBram Moolenaarfunc Test_xx01_term_style_response()
160466761db1SBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
160566761db1SBram Moolenaar  set t_RV=x
16060c0eddd3SBram Moolenaar  call test_override('term_props', 1)
160766761db1SBram Moolenaar
160866761db1SBram Moolenaar  " send the termresponse to trigger requesting the XT codes
160966761db1SBram Moolenaar  let seq = "\<Esc>[>41;337;0c"
161066761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
161166761db1SBram Moolenaar  call assert_equal(seq, v:termresponse)
161266761db1SBram Moolenaar
161366761db1SBram Moolenaar  let seq = "\<Esc>P1$r2 q\<Esc>\\"
161466761db1SBram Moolenaar  call feedkeys(seq, 'Lx!')
161566761db1SBram Moolenaar  call assert_equal(seq, v:termstyleresp)
161666761db1SBram Moolenaar
16170c0eddd3SBram Moolenaar  call assert_equal(#{
16180c0eddd3SBram Moolenaar        \ cursor_style: 'u',
16190c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
16200c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
16210c0eddd3SBram Moolenaar        \ mouse: 's'
16220c0eddd3SBram Moolenaar        \ }, terminalprops())
16230c0eddd3SBram Moolenaar
162466761db1SBram Moolenaar  set t_RV=
16250c0eddd3SBram Moolenaar  call test_override('term_props', 0)
162666761db1SBram Moolenaarendfunc
1627de6dbb45SBram Moolenaar
162889577b3bSBram Moolenaar" This checks the iTerm2 version response.
162989577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
163089577b3bSBram Moolenaar" properties.
163189577b3bSBram Moolenaarfunc Test_xx02_iTerm2_response()
163289577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
163389577b3bSBram Moolenaar  set t_RV=x
16340c0eddd3SBram Moolenaar  call test_override('term_props', 1)
163589577b3bSBram Moolenaar
163689577b3bSBram Moolenaar  " Old versions of iTerm2 used a different style term response.
163789577b3bSBram Moolenaar  set ttymouse=xterm
163889577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
163989577b3bSBram Moolenaar  let seq = "\<Esc>[>0;95;c"
164089577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
164189577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
164289577b3bSBram Moolenaar  call assert_equal('xterm', &ttymouse)
164389577b3bSBram Moolenaar
164489577b3bSBram Moolenaar  set ttymouse=xterm
164589577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
164689577b3bSBram Moolenaar  let seq = "\<Esc>[>0;95;0c"
164789577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
164889577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
164989577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
165089577b3bSBram Moolenaar
16510c0eddd3SBram Moolenaar  call assert_equal(#{
16520c0eddd3SBram Moolenaar        \ cursor_style: 'n',
16530c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
16540c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
16550c0eddd3SBram Moolenaar        \ mouse: 's'
16560c0eddd3SBram Moolenaar        \ }, terminalprops())
16570c0eddd3SBram Moolenaar
165889577b3bSBram Moolenaar  set t_RV=
16590c0eddd3SBram Moolenaar  call test_override('term_props', 0)
166089577b3bSBram Moolenaarendfunc
166189577b3bSBram Moolenaar
16621a4cbb19SBram Moolenaar" This checks the libvterm version response.
16631a4cbb19SBram Moolenaar" This must be after other tests, because it has side effects to xterm
16641a4cbb19SBram Moolenaar" properties.
166589577b3bSBram Moolenaarfunc Test_xx03_libvterm_response()
16661a4cbb19SBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
16671a4cbb19SBram Moolenaar  set t_RV=x
16680c0eddd3SBram Moolenaar  call test_override('term_props', 1)
166903b00476SBram Moolenaar
16701a4cbb19SBram Moolenaar  set ttymouse=xterm
16711a4cbb19SBram Moolenaar  call test_option_not_set('ttymouse')
16721a4cbb19SBram Moolenaar  let seq = "\<Esc>[>0;100;0c"
16731a4cbb19SBram Moolenaar  call feedkeys(seq, 'Lx!')
16741a4cbb19SBram Moolenaar  call assert_equal(seq, v:termresponse)
16751a4cbb19SBram Moolenaar  call assert_equal('sgr', &ttymouse)
16761a4cbb19SBram Moolenaar
16770c0eddd3SBram Moolenaar  call assert_equal(#{
16780c0eddd3SBram Moolenaar        \ cursor_style: 'n',
16790c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
16800c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
16810c0eddd3SBram Moolenaar        \ mouse: 's'
16820c0eddd3SBram Moolenaar        \ }, terminalprops())
16830c0eddd3SBram Moolenaar
16841a4cbb19SBram Moolenaar  set t_RV=
16850c0eddd3SBram Moolenaar  call test_override('term_props', 0)
16861a4cbb19SBram Moolenaarendfunc
16871a4cbb19SBram Moolenaar
168889577b3bSBram Moolenaar" This checks the Mac Terminal.app version response.
168989577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
169089577b3bSBram Moolenaar" properties.
169189577b3bSBram Moolenaarfunc Test_xx04_Mac_Terminal_response()
169289577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
169389577b3bSBram Moolenaar  set t_RV=x
16940c0eddd3SBram Moolenaar  call test_override('term_props', 1)
169589577b3bSBram Moolenaar
169689577b3bSBram Moolenaar  set ttymouse=xterm
16978dff4cbfSBram Moolenaar  " t_8u is not reset
16988dff4cbfSBram Moolenaar  let &t_8u = "\<Esc>[58;2;%lu;%lu;%lum"
169989577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
170089577b3bSBram Moolenaar  let seq = "\<Esc>[>1;95;0c"
170189577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
170289577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
170389577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
170489577b3bSBram Moolenaar
17050c0eddd3SBram Moolenaar  call assert_equal(#{
17060c0eddd3SBram Moolenaar        \ cursor_style: 'n',
17070c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
17080c0eddd3SBram Moolenaar        \ underline_rgb: 'y',
17090c0eddd3SBram Moolenaar        \ mouse: 's'
17100c0eddd3SBram Moolenaar        \ }, terminalprops())
17118dff4cbfSBram Moolenaar  call assert_equal("\<Esc>[58;2;%lu;%lu;%lum", &t_8u)
17120c0eddd3SBram Moolenaar
171389577b3bSBram Moolenaar  " Reset is_not_xterm and is_mac_terminal.
171489577b3bSBram Moolenaar  set t_RV=
171589577b3bSBram Moolenaar  set term=xterm
171689577b3bSBram Moolenaar  set t_RV=x
17170c0eddd3SBram Moolenaar  call test_override('term_props', 0)
171889577b3bSBram Moolenaarendfunc
171989577b3bSBram Moolenaar
172089577b3bSBram Moolenaar" This checks the mintty version response.
172189577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
172289577b3bSBram Moolenaar" properties.
172389577b3bSBram Moolenaarfunc Test_xx05_mintty_response()
172489577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
172589577b3bSBram Moolenaar  set t_RV=x
17260c0eddd3SBram Moolenaar  call test_override('term_props', 1)
172789577b3bSBram Moolenaar
172889577b3bSBram Moolenaar  set ttymouse=xterm
172989577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
173089577b3bSBram Moolenaar  let seq = "\<Esc>[>77;20905;0c"
173189577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
173289577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
173389577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
173489577b3bSBram Moolenaar
17350c0eddd3SBram Moolenaar  call assert_equal(#{
17360c0eddd3SBram Moolenaar        \ cursor_style: 'n',
17370c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
17380c0eddd3SBram Moolenaar        \ underline_rgb: 'y',
17390c0eddd3SBram Moolenaar        \ mouse: 's'
17400c0eddd3SBram Moolenaar        \ }, terminalprops())
17410c0eddd3SBram Moolenaar
174289577b3bSBram Moolenaar  set t_RV=
17430c0eddd3SBram Moolenaar  call test_override('term_props', 0)
174489577b3bSBram Moolenaarendfunc
174589577b3bSBram Moolenaar
174689577b3bSBram Moolenaar" This checks the screen version response.
174789577b3bSBram Moolenaar" This must be after other tests, because it has side effects to xterm
174889577b3bSBram Moolenaar" properties.
174989577b3bSBram Moolenaarfunc Test_xx06_screen_response()
175089577b3bSBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
175189577b3bSBram Moolenaar  set t_RV=x
17520c0eddd3SBram Moolenaar  call test_override('term_props', 1)
175389577b3bSBram Moolenaar
175489577b3bSBram Moolenaar  " Old versions of screen don't support SGR mouse mode.
175589577b3bSBram Moolenaar  set ttymouse=xterm
175689577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
175789577b3bSBram Moolenaar  let seq = "\<Esc>[>83;40500;0c"
175889577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
175989577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
176089577b3bSBram Moolenaar  call assert_equal('xterm', &ttymouse)
176189577b3bSBram Moolenaar
176289577b3bSBram Moolenaar  " screen supports SGR mouse mode starting in version 4.7.
176389577b3bSBram Moolenaar  set ttymouse=xterm
176489577b3bSBram Moolenaar  call test_option_not_set('ttymouse')
176589577b3bSBram Moolenaar  let seq = "\<Esc>[>83;40700;0c"
176689577b3bSBram Moolenaar  call feedkeys(seq, 'Lx!')
176789577b3bSBram Moolenaar  call assert_equal(seq, v:termresponse)
176889577b3bSBram Moolenaar  call assert_equal('sgr', &ttymouse)
176989577b3bSBram Moolenaar
17700c0eddd3SBram Moolenaar  call assert_equal(#{
17710c0eddd3SBram Moolenaar        \ cursor_style: 'n',
17720c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'n',
17730c0eddd3SBram Moolenaar        \ underline_rgb: 'y',
17740c0eddd3SBram Moolenaar        \ mouse: 's'
17750c0eddd3SBram Moolenaar        \ }, terminalprops())
17760c0eddd3SBram Moolenaar
177789577b3bSBram Moolenaar  set t_RV=
17780c0eddd3SBram Moolenaar  call test_override('term_props', 0)
177989577b3bSBram Moolenaarendfunc
178089577b3bSBram Moolenaar
178103b00476SBram Moolenaar" This checks the xterm version response.
178203b00476SBram Moolenaar" This must be after other tests, because it has side effects to xterm
178303b00476SBram Moolenaar" properties.
178489577b3bSBram Moolenaarfunc Test_xx07_xterm_response()
178503b00476SBram Moolenaar  " Termresponse is only parsed when t_RV is not empty.
178603b00476SBram Moolenaar  set t_RV=x
17870c0eddd3SBram Moolenaar  call test_override('term_props', 1)
178803b00476SBram Moolenaar
17893cea8a9aSBram Moolenaar  " Do Terminal.app first to check that is_mac_terminal is reset.
17903cea8a9aSBram Moolenaar  set ttymouse=xterm
17913cea8a9aSBram Moolenaar  call test_option_not_set('ttymouse')
17923cea8a9aSBram Moolenaar  let seq = "\<Esc>[>1;95;0c"
17933cea8a9aSBram Moolenaar  call feedkeys(seq, 'Lx!')
17943cea8a9aSBram Moolenaar  call assert_equal(seq, v:termresponse)
17953cea8a9aSBram Moolenaar  call assert_equal('sgr', &ttymouse)
17963cea8a9aSBram Moolenaar
179703b00476SBram Moolenaar  " xterm < 95: "xterm" (actually unmodified)
17983cea8a9aSBram Moolenaar  set t_RV=
17993cea8a9aSBram Moolenaar  set term=xterm
18003cea8a9aSBram Moolenaar  set t_RV=x
180103b00476SBram Moolenaar  set ttymouse=xterm
180203b00476SBram Moolenaar  call test_option_not_set('ttymouse')
180303b00476SBram Moolenaar  let seq = "\<Esc>[>0;94;0c"
180403b00476SBram Moolenaar  call feedkeys(seq, 'Lx!')
180503b00476SBram Moolenaar  call assert_equal(seq, v:termresponse)
180603b00476SBram Moolenaar  call assert_equal('xterm', &ttymouse)
180703b00476SBram Moolenaar
18080c0eddd3SBram Moolenaar  call assert_equal(#{
18090c0eddd3SBram Moolenaar        \ cursor_style: 'n',
18100c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
18110c0eddd3SBram Moolenaar        \ underline_rgb: 'y',
18120c0eddd3SBram Moolenaar        \ mouse: 'u'
18130c0eddd3SBram Moolenaar        \ }, terminalprops())
18140c0eddd3SBram Moolenaar
181503b00476SBram Moolenaar  " xterm >= 95 < 277 "xterm2"
181603b00476SBram Moolenaar  set ttymouse=xterm
181703b00476SBram Moolenaar  call test_option_not_set('ttymouse')
181803b00476SBram Moolenaar  let seq = "\<Esc>[>0;267;0c"
181903b00476SBram Moolenaar  call feedkeys(seq, 'Lx!')
182003b00476SBram Moolenaar  call assert_equal(seq, v:termresponse)
182103b00476SBram Moolenaar  call assert_equal('xterm2', &ttymouse)
182203b00476SBram Moolenaar
18230c0eddd3SBram Moolenaar  call assert_equal(#{
18240c0eddd3SBram Moolenaar        \ cursor_style: 'n',
18250c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
18260c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
18270c0eddd3SBram Moolenaar        \ mouse: '2'
18280c0eddd3SBram Moolenaar        \ }, terminalprops())
18290c0eddd3SBram Moolenaar
183003b00476SBram Moolenaar  " xterm >= 277: "sgr"
183103b00476SBram Moolenaar  set ttymouse=xterm
183203b00476SBram Moolenaar  call test_option_not_set('ttymouse')
183303b00476SBram Moolenaar  let seq = "\<Esc>[>0;277;0c"
183403b00476SBram Moolenaar  call feedkeys(seq, 'Lx!')
183503b00476SBram Moolenaar  call assert_equal(seq, v:termresponse)
183603b00476SBram Moolenaar  call assert_equal('sgr', &ttymouse)
183703b00476SBram Moolenaar
18380c0eddd3SBram Moolenaar  call assert_equal(#{
18390c0eddd3SBram Moolenaar        \ cursor_style: 'n',
18400c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
18410c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
18420c0eddd3SBram Moolenaar        \ mouse: 's'
18430c0eddd3SBram Moolenaar        \ }, terminalprops())
18440c0eddd3SBram Moolenaar
18458dff4cbfSBram Moolenaar  " xterm >= 279: "sgr" and cursor_style not reset; also check t_8u reset
18460c0eddd3SBram Moolenaar  set ttymouse=xterm
18470c0eddd3SBram Moolenaar  call test_option_not_set('ttymouse')
18488dff4cbfSBram Moolenaar  let &t_8u = "\<Esc>[58;2;%lu;%lu;%lum"
18490c0eddd3SBram Moolenaar  let seq = "\<Esc>[>0;279;0c"
18500c0eddd3SBram Moolenaar  call feedkeys(seq, 'Lx!')
18510c0eddd3SBram Moolenaar  call assert_equal(seq, v:termresponse)
18520c0eddd3SBram Moolenaar  call assert_equal('sgr', &ttymouse)
18530c0eddd3SBram Moolenaar
18540c0eddd3SBram Moolenaar  call assert_equal(#{
18550c0eddd3SBram Moolenaar        \ cursor_style: 'u',
18560c0eddd3SBram Moolenaar        \ cursor_blink_mode: 'u',
18570c0eddd3SBram Moolenaar        \ underline_rgb: 'u',
18580c0eddd3SBram Moolenaar        \ mouse: 's'
18590c0eddd3SBram Moolenaar        \ }, terminalprops())
18608dff4cbfSBram Moolenaar  call assert_equal('', &t_8u)
18610c0eddd3SBram Moolenaar
186203b00476SBram Moolenaar  set t_RV=
18630c0eddd3SBram Moolenaar  call test_override('term_props', 0)
186403b00476SBram Moolenaarendfunc
186503b00476SBram Moolenaar
1866de6dbb45SBram Moolenaarfunc Test_get_termcode()
1867eb66328bSBram Moolenaar  try
1868de6dbb45SBram Moolenaar    let k1 = &t_k1
1869eb66328bSBram Moolenaar  catch /E113/
1870eb66328bSBram Moolenaar    throw 'Skipped: Unable to query termcodes'
1871eb66328bSBram Moolenaar  endtry
1872de6dbb45SBram Moolenaar  set t_k1=
1873de6dbb45SBram Moolenaar  set t_k1&
1874de6dbb45SBram Moolenaar  call assert_equal(k1, &t_k1)
18759aeb3363SBram Moolenaar
18769aeb3363SBram Moolenaar  " use external termcap first
18779aeb3363SBram Moolenaar  set nottybuiltin
18789aeb3363SBram Moolenaar  set t_k1=
18799aeb3363SBram Moolenaar  set t_k1&
18809aeb3363SBram Moolenaar  " when using external termcap may get something else, but it must not be
18819aeb3363SBram Moolenaar  " empty, since we would fallback to the builtin one.
18829aeb3363SBram Moolenaar  call assert_notequal('', &t_k1)
18839aeb3363SBram Moolenaar
18849aeb3363SBram Moolenaar  if &term =~ 'xterm'
18859aeb3363SBram Moolenaar    " use internal termcap first
18869aeb3363SBram Moolenaar    let term_save = &term
18879aeb3363SBram Moolenaar    let &term = 'builtin_' .. &term
18889aeb3363SBram Moolenaar    set t_k1=
18899aeb3363SBram Moolenaar    set t_k1&
18909aeb3363SBram Moolenaar    call assert_equal(k1, &t_k1)
18919aeb3363SBram Moolenaar    let &term = term_save
18929aeb3363SBram Moolenaar  endif
18939aeb3363SBram Moolenaar
18949aeb3363SBram Moolenaar  set ttybuiltin
1895de6dbb45SBram Moolenaarendfunc
189618a79a68SBram Moolenaar
1897ecd34bf5SBram Moolenaarfunc Test_list_builtin_terminals()
1898e46a2ed0SBram Moolenaar  CheckRunVimInTerminal
1899ecd34bf5SBram Moolenaar  let buf = RunVimInTerminal('', #{rows: 14})
1900ecd34bf5SBram Moolenaar  call term_sendkeys(buf, ":set cmdheight=3\<CR>")
1901*733d259aSBram Moolenaar  call TermWait(buf, 100)
1902ecd34bf5SBram Moolenaar  call term_sendkeys(buf, ":set term=xxx\<CR>")
1903*733d259aSBram Moolenaar  call TermWait(buf, 100)
1904ecd34bf5SBram Moolenaar  call assert_match('builtin_dumb', term_getline(buf, 11))
1905ecd34bf5SBram Moolenaar  call assert_match('Not found in termcap', term_getline(buf, 12))
1906ecd34bf5SBram Moolenaar  call StopVimInTerminal(buf)
1907ecd34bf5SBram Moolenaarendfunc
1908ecd34bf5SBram Moolenaar
190918a79a68SBram Moolenaarfunc GetEscCodeCSI27(key, modifier)
191018a79a68SBram Moolenaar  let key = printf("%d", char2nr(a:key))
191118a79a68SBram Moolenaar  let mod = printf("%d", a:modifier)
191218a79a68SBram Moolenaar  return "\<Esc>[27;" .. mod .. ';' .. key .. '~'
191318a79a68SBram Moolenaarendfunc
191418a79a68SBram Moolenaar
191518a79a68SBram Moolenaarfunc GetEscCodeCSIu(key, modifier)
191618a79a68SBram Moolenaar  let key = printf("%d", char2nr(a:key))
191718a79a68SBram Moolenaar  let mod = printf("%d", a:modifier)
191818a79a68SBram Moolenaar  return "\<Esc>[" .. key .. ';' .. mod .. 'u'
191918a79a68SBram Moolenaarendfunc
192018a79a68SBram Moolenaar
192118a79a68SBram Moolenaar" This checks the CSI sequences when in modifyOtherKeys mode.
192218a79a68SBram Moolenaar" The mode doesn't need to be enabled, the codes are always detected.
192318a79a68SBram Moolenaarfunc RunTest_modifyOtherKeys(func)
192418a79a68SBram Moolenaar  new
1925459fd785SBram Moolenaar  set timeoutlen=10
192618a79a68SBram Moolenaar
1927f19f8d1aSBram Moolenaar  " Shift-X is sent as 'X' with the shift modifier
192818a79a68SBram Moolenaar  call feedkeys('a' .. a:func('X', 2) .. "\<Esc>", 'Lx!')
192918a79a68SBram Moolenaar  call assert_equal('X', getline(1))
193018a79a68SBram Moolenaar
193118a79a68SBram Moolenaar  " Ctrl-i is Tab
193218a79a68SBram Moolenaar  call setline(1, '')
193318a79a68SBram Moolenaar  call feedkeys('a' .. a:func('i', 5) .. "\<Esc>", 'Lx!')
193418a79a68SBram Moolenaar  call assert_equal("\t", getline(1))
193518a79a68SBram Moolenaar
193618a79a68SBram Moolenaar  " Ctrl-I is also Tab
193718a79a68SBram Moolenaar  call setline(1, '')
193818a79a68SBram Moolenaar  call feedkeys('a' .. a:func('I', 5) .. "\<Esc>", 'Lx!')
193918a79a68SBram Moolenaar  call assert_equal("\t", getline(1))
194018a79a68SBram Moolenaar
194118a79a68SBram Moolenaar  " Alt-x is ø
194218a79a68SBram Moolenaar  call setline(1, '')
194318a79a68SBram Moolenaar  call feedkeys('a' .. a:func('x', 3) .. "\<Esc>", 'Lx!')
194418a79a68SBram Moolenaar  call assert_equal("ø", getline(1))
194518a79a68SBram Moolenaar
194618a79a68SBram Moolenaar  " Meta-x is also ø
194718a79a68SBram Moolenaar  call setline(1, '')
194818a79a68SBram Moolenaar  call feedkeys('a' .. a:func('x', 9) .. "\<Esc>", 'Lx!')
194918a79a68SBram Moolenaar  call assert_equal("ø", getline(1))
195018a79a68SBram Moolenaar
195118a79a68SBram Moolenaar  " Alt-X is Ø
195218a79a68SBram Moolenaar  call setline(1, '')
195318a79a68SBram Moolenaar  call feedkeys('a' .. a:func('X', 3) .. "\<Esc>", 'Lx!')
195418a79a68SBram Moolenaar  call assert_equal("Ø", getline(1))
195518a79a68SBram Moolenaar
195618a79a68SBram Moolenaar  " Meta-X is ø
195718a79a68SBram Moolenaar  call setline(1, '')
195818a79a68SBram Moolenaar  call feedkeys('a' .. a:func('X', 9) .. "\<Esc>", 'Lx!')
195918a79a68SBram Moolenaar  call assert_equal("Ø", getline(1))
196018a79a68SBram Moolenaar
1961828ffd59SBram Moolenaar  " Ctrl-6 is Ctrl-^
1962828ffd59SBram Moolenaar  split aaa
1963828ffd59SBram Moolenaar  edit bbb
1964828ffd59SBram Moolenaar  call feedkeys(a:func('6', 5), 'Lx!')
1965828ffd59SBram Moolenaar  call assert_equal("aaa", bufname())
1966828ffd59SBram Moolenaar  bwipe aaa
1967828ffd59SBram Moolenaar  bwipe bbb
1968828ffd59SBram Moolenaar
196918a79a68SBram Moolenaar  bwipe!
197018a79a68SBram Moolenaar  set timeoutlen&
197118a79a68SBram Moolenaarendfunc
197218a79a68SBram Moolenaar
1973459fd785SBram Moolenaarfunc Test_modifyOtherKeys_basic()
197418a79a68SBram Moolenaar  call RunTest_modifyOtherKeys(function('GetEscCodeCSI27'))
197518a79a68SBram Moolenaar  call RunTest_modifyOtherKeys(function('GetEscCodeCSIu'))
197618a79a68SBram Moolenaarendfunc
1977d1e2f398SBram Moolenaar
197838571a04SBram Moolenaarfunc Test_modifyOtherKeys_no_mapping()
197938571a04SBram Moolenaar  set timeoutlen=10
198038571a04SBram Moolenaar
198138571a04SBram Moolenaar  let @a = 'aaa'
198238571a04SBram Moolenaar  call feedkeys(":let x = '" .. GetEscCodeCSI27('R', 5) .. GetEscCodeCSI27('R', 5) .. "a'\<CR>", 'Lx!')
198338571a04SBram Moolenaar  call assert_equal("let x = 'aaa'", @:)
198438571a04SBram Moolenaar
198538571a04SBram Moolenaar  new
198638571a04SBram Moolenaar  call feedkeys("a" .. GetEscCodeCSI27('R', 5) .. GetEscCodeCSI27('R', 5) .. "a\<Esc>", 'Lx!')
198738571a04SBram Moolenaar  call assert_equal("aaa", getline(1))
198838571a04SBram Moolenaar  bwipe!
198938571a04SBram Moolenaar
199038571a04SBram Moolenaar  new
199138571a04SBram Moolenaar  call feedkeys("axx\<CR>yy" .. GetEscCodeCSI27('G', 5) .. GetEscCodeCSI27('K', 5) .. "a\<Esc>", 'Lx!')
199238571a04SBram Moolenaar  call assert_equal("axx", getline(1))
199338571a04SBram Moolenaar  call assert_equal("yy", getline(2))
199438571a04SBram Moolenaar  bwipe!
199538571a04SBram Moolenaar
199638571a04SBram Moolenaar  set timeoutlen&
199738571a04SBram Moolenaarendfunc
199838571a04SBram Moolenaar
1999d1e2f398SBram Moolenaarfunc RunTest_mapping_shift(key, func)
2000d1e2f398SBram Moolenaar  call setline(1, '')
2001d1e2f398SBram Moolenaar  if a:key == '|'
2002d1e2f398SBram Moolenaar    exe 'inoremap \| xyz'
2003d1e2f398SBram Moolenaar  else
2004d1e2f398SBram Moolenaar    exe 'inoremap ' .. a:key .. ' xyz'
2005d1e2f398SBram Moolenaar  endif
2006d1e2f398SBram Moolenaar  call feedkeys('a' .. a:func(a:key, 2) .. "\<Esc>", 'Lx!')
2007d1e2f398SBram Moolenaar  call assert_equal("xyz", getline(1))
2008d1e2f398SBram Moolenaar  if a:key == '|'
2009d1e2f398SBram Moolenaar    exe 'iunmap \|'
2010d1e2f398SBram Moolenaar  else
2011d1e2f398SBram Moolenaar    exe 'iunmap ' .. a:key
2012d1e2f398SBram Moolenaar  endif
2013d1e2f398SBram Moolenaarendfunc
2014d1e2f398SBram Moolenaar
2015975a880aSBram Moolenaarfunc Test_modifyOtherKeys_mapped()
2016975a880aSBram Moolenaar  set timeoutlen=10
2017975a880aSBram Moolenaar  imap ' <C-W>
2018975a880aSBram Moolenaar  imap <C-W><C-A> c-a
2019975a880aSBram Moolenaar  call setline(1, '')
2020975a880aSBram Moolenaar
2021975a880aSBram Moolenaar  " single quote is turned into single byte CTRL-W
2022975a880aSBram Moolenaar  " CTRL-A is added with a separate modifier, and needs to be simplified before
2023975a880aSBram Moolenaar  " the mapping can match.
2024975a880aSBram Moolenaar  call feedkeys("a'" .. GetEscCodeCSI27('A', 5) .. "\<Esc>", 'Lx!')
2025975a880aSBram Moolenaar  call assert_equal('c-a', getline(1))
2026975a880aSBram Moolenaar
2027975a880aSBram Moolenaar  iunmap '
2028975a880aSBram Moolenaar  iunmap <C-W><C-A>
2029975a880aSBram Moolenaar  set timeoutlen&
2030975a880aSBram Moolenaarendfunc
2031975a880aSBram Moolenaar
2032d1e2f398SBram Moolenaarfunc RunTest_mapping_works_with_shift(func)
2033d1e2f398SBram Moolenaar  new
2034459fd785SBram Moolenaar  set timeoutlen=10
2035d1e2f398SBram Moolenaar
2036d1e2f398SBram Moolenaar  call RunTest_mapping_shift('@', a:func)
2037d1e2f398SBram Moolenaar  call RunTest_mapping_shift('A', a:func)
2038d1e2f398SBram Moolenaar  call RunTest_mapping_shift('Z', a:func)
2039d1e2f398SBram Moolenaar  call RunTest_mapping_shift('^', 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
2046d1e2f398SBram Moolenaar  bwipe!
2047d1e2f398SBram Moolenaar  set timeoutlen&
2048d1e2f398SBram Moolenaarendfunc
2049d1e2f398SBram Moolenaar
2050459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_plain()
2051d1e2f398SBram Moolenaar  call RunTest_mapping_works_with_shift(function('GetEscCodeCSI27'))
2052d1e2f398SBram Moolenaar  call RunTest_mapping_works_with_shift(function('GetEscCodeCSIu'))
2053d1e2f398SBram Moolenaarendfunc
2054459fd785SBram Moolenaar
2055459fd785SBram Moolenaarfunc RunTest_mapping_mods(map, key, func, code)
2056459fd785SBram Moolenaar  call setline(1, '')
2057459fd785SBram Moolenaar  exe 'inoremap ' .. a:map .. ' xyz'
2058459fd785SBram Moolenaar  call feedkeys('a' .. a:func(a:key, a:code) .. "\<Esc>", 'Lx!')
2059459fd785SBram Moolenaar  call assert_equal("xyz", getline(1))
2060459fd785SBram Moolenaar  exe 'iunmap ' .. a:map
2061459fd785SBram Moolenaarendfunc
2062459fd785SBram Moolenaar
2063459fd785SBram Moolenaarfunc RunTest_mapping_works_with_mods(func, mods, code)
2064459fd785SBram Moolenaar  new
2065459fd785SBram Moolenaar  set timeoutlen=10
2066459fd785SBram Moolenaar
2067459fd785SBram Moolenaar  if a:mods !~ 'S'
2068459fd785SBram Moolenaar    " Shift by itself has no effect
2069459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-@>', '@', a:func, a:code)
2070459fd785SBram Moolenaar  endif
2071459fd785SBram Moolenaar  call RunTest_mapping_mods('<' .. a:mods .. '-A>', 'A', a:func, a:code)
2072459fd785SBram Moolenaar  call RunTest_mapping_mods('<' .. a:mods .. '-Z>', 'Z', a:func, a:code)
2073459fd785SBram Moolenaar  if a:mods !~ 'S'
2074459fd785SBram Moolenaar    " with Shift code is always upper case
2075459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-a>', 'a', a:func, a:code)
2076459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-z>', 'z', a:func, a:code)
2077459fd785SBram Moolenaar  endif
2078459fd785SBram Moolenaar  if a:mods != 'A'
2079459fd785SBram Moolenaar    " with Alt code is not in upper case
2080459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-a>', 'A', a:func, a:code)
2081459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-z>', 'Z', a:func, a:code)
2082459fd785SBram Moolenaar  endif
2083459fd785SBram Moolenaar  call RunTest_mapping_mods('<' .. a:mods .. '-á>', 'á', a:func, a:code)
2084459fd785SBram Moolenaar  if a:mods !~ 'S'
2085459fd785SBram Moolenaar    " Shift by itself has no effect
2086459fd785SBram Moolenaar    call RunTest_mapping_mods('<' .. a:mods .. '-^>', '^', a:func, a:code)
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  endif
2093459fd785SBram Moolenaar
2094459fd785SBram Moolenaar  bwipe!
2095459fd785SBram Moolenaar  set timeoutlen&
2096459fd785SBram Moolenaarendfunc
2097459fd785SBram Moolenaar
2098459fd785SBram Moolenaarfunc Test_mapping_works_with_shift()
2099459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'S', 2)
2100459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'S', 2)
2101459fd785SBram Moolenaarendfunc
2102459fd785SBram Moolenaar
2103459fd785SBram Moolenaarfunc Test_mapping_works_with_ctrl()
2104459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C', 5)
2105459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C', 5)
2106459fd785SBram Moolenaarendfunc
2107459fd785SBram Moolenaar
2108459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_ctrl()
2109459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-S', 6)
2110459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-S', 6)
2111459fd785SBram Moolenaarendfunc
2112459fd785SBram Moolenaar
2113459fd785SBram Moolenaar" Below we also test the "u" code with Alt, This works, but libvterm would not
2114459fd785SBram Moolenaar" send the Alt key like this but by prefixing an Esc.
2115459fd785SBram Moolenaar
2116459fd785SBram Moolenaarfunc Test_mapping_works_with_alt()
2117459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'A', 3)
2118459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'A', 3)
2119459fd785SBram Moolenaarendfunc
2120459fd785SBram Moolenaar
2121459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_alt()
2122459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'S-A', 4)
2123459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'S-A', 4)
2124459fd785SBram Moolenaarendfunc
2125459fd785SBram Moolenaar
2126459fd785SBram Moolenaarfunc Test_mapping_works_with_ctrl_alt()
2127459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-A', 7)
2128459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-A', 7)
2129459fd785SBram Moolenaarendfunc
2130459fd785SBram Moolenaar
2131459fd785SBram Moolenaarfunc Test_mapping_works_with_shift_ctrl_alt()
2132459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-S-A', 8)
2133459fd785SBram Moolenaar  call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-S-A', 8)
2134459fd785SBram Moolenaarendfunc
2135fc4ea2a7SBram Moolenaar
2136fc4ea2a7SBram Moolenaarfunc Test_insert_literal()
2137fc4ea2a7SBram Moolenaar  set timeoutlen=10
2138fc4ea2a7SBram Moolenaar  new
2139fc4ea2a7SBram Moolenaar  " CTRL-V CTRL-X inserts a ^X
2140fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSIu('V', '5') .. GetEscCodeCSIu('X', '5') .. "\<Esc>", 'Lx!')
2141fc4ea2a7SBram Moolenaar  call assert_equal("\<C-X>", getline(1))
2142fc4ea2a7SBram Moolenaar
2143fc4ea2a7SBram Moolenaar  call setline(1, '')
2144fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSI27('V', '5') .. GetEscCodeCSI27('X', '5') .. "\<Esc>", 'Lx!')
2145fc4ea2a7SBram Moolenaar  call assert_equal("\<C-X>", getline(1))
2146fc4ea2a7SBram Moolenaar
2147f19f8d1aSBram Moolenaar  " CTRL-SHIFT-V CTRL-X inserts escape sequence
2148fc4ea2a7SBram Moolenaar  call setline(1, '')
2149fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSIu('V', '6') .. GetEscCodeCSIu('X', '5') .. "\<Esc>", 'Lx!')
2150fc4ea2a7SBram Moolenaar  call assert_equal("\<Esc>[88;5u", getline(1))
2151fc4ea2a7SBram Moolenaar
2152fc4ea2a7SBram Moolenaar  call setline(1, '')
2153fc4ea2a7SBram Moolenaar  call feedkeys('a' .. GetEscCodeCSI27('V', '6') .. GetEscCodeCSI27('X', '5') .. "\<Esc>", 'Lx!')
2154fc4ea2a7SBram Moolenaar  call assert_equal("\<Esc>[27;5;88~", getline(1))
2155fc4ea2a7SBram Moolenaar
2156fc4ea2a7SBram Moolenaar  bwipe!
2157fc4ea2a7SBram Moolenaar  set timeoutlen&
2158fc4ea2a7SBram Moolenaarendfunc
2159fc4ea2a7SBram Moolenaar
2160fc4ea2a7SBram Moolenaarfunc Test_cmdline_literal()
2161fc4ea2a7SBram Moolenaar  set timeoutlen=10
2162fc4ea2a7SBram Moolenaar
2163fc4ea2a7SBram Moolenaar  " CTRL-V CTRL-Y inserts a ^Y
2164fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSIu('V', '5') .. GetEscCodeCSIu('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2165fc4ea2a7SBram Moolenaar  call assert_equal("\"\<C-Y>", @:)
2166fc4ea2a7SBram Moolenaar
2167fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSI27('V', '5') .. GetEscCodeCSI27('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2168fc4ea2a7SBram Moolenaar  call assert_equal("\"\<C-Y>", @:)
2169fc4ea2a7SBram Moolenaar
2170f19f8d1aSBram Moolenaar  " CTRL-SHIFT-V CTRL-Y inserts escape sequence
2171fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSIu('V', '6') .. GetEscCodeCSIu('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2172fc4ea2a7SBram Moolenaar  call assert_equal("\"\<Esc>[89;5u", @:)
2173fc4ea2a7SBram Moolenaar
2174fc4ea2a7SBram Moolenaar  call setline(1, '')
2175fc4ea2a7SBram Moolenaar  call feedkeys(':' .. GetEscCodeCSI27('V', '6') .. GetEscCodeCSI27('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2176fc4ea2a7SBram Moolenaar  call assert_equal("\"\<Esc>[27;5;89~", @:)
2177fc4ea2a7SBram Moolenaar
2178fc4ea2a7SBram Moolenaar  set timeoutlen&
2179fc4ea2a7SBram Moolenaarendfunc
21800eabd4dcSBram Moolenaar
21810ff5dedfSBram Moolenaar" Test for translation of special key codes (<xF1>, <xF2>, etc.)
21820ff5dedfSBram Moolenaarfunc Test_Keycode_Tranlsation()
21830ff5dedfSBram Moolenaar  let keycodes = [
21840ff5dedfSBram Moolenaar        \ ["<xUp>", "<Up>"],
21850ff5dedfSBram Moolenaar        \ ["<xDown>", "<Down>"],
21860ff5dedfSBram Moolenaar        \ ["<xLeft>", "<Left>"],
21870ff5dedfSBram Moolenaar        \ ["<xRight>", "<Right>"],
21880ff5dedfSBram Moolenaar        \ ["<xHome>", "<Home>"],
21890ff5dedfSBram Moolenaar        \ ["<xEnd>", "<End>"],
21900ff5dedfSBram Moolenaar        \ ["<zHome>", "<Home>"],
21910ff5dedfSBram Moolenaar        \ ["<zEnd>", "<End>"],
21920ff5dedfSBram Moolenaar        \ ["<xF1>", "<F1>"],
21930ff5dedfSBram Moolenaar        \ ["<xF2>", "<F2>"],
21940ff5dedfSBram Moolenaar        \ ["<xF3>", "<F3>"],
21950ff5dedfSBram Moolenaar        \ ["<xF4>", "<F4>"],
21960ff5dedfSBram Moolenaar        \ ["<S-xF1>", "<S-F1>"],
21970ff5dedfSBram Moolenaar        \ ["<S-xF2>", "<S-F2>"],
21980ff5dedfSBram Moolenaar        \ ["<S-xF3>", "<S-F3>"],
21990ff5dedfSBram Moolenaar        \ ["<S-xF4>", "<S-F4>"]]
22000ff5dedfSBram Moolenaar  for [k1, k2] in keycodes
22010ff5dedfSBram Moolenaar    exe "nnoremap " .. k1 .. " 2wx"
22020ff5dedfSBram Moolenaar    call assert_true(maparg(k1, 'n', 0, 1).lhs == k2)
22030ff5dedfSBram Moolenaar    exe "nunmap " .. k1
22040ff5dedfSBram Moolenaar  endfor
22050ff5dedfSBram Moolenaarendfunc
22060ff5dedfSBram Moolenaar
22070eabd4dcSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
2208