# HG changeset patch # User Bram Moolenaar # Date 1595070005 -7200 # Node ID e00467b9f5de84ca3a906ae66c1551c780cb10fe # Parent f9647568716290cb04725912004ca243093b2330 patch 8.2.1235: Not all mouse codes covered by tests Commit: https://github.com/vim/vim/commit/2764d06ab7140c95b6317e344d853e4a32c76e9a Author: Bram Moolenaar Date: Sat Jul 18 12:59:19 2020 +0200 patch 8.2.1235: Not all mouse codes covered by tests Problem: Not all mouse codes covered by tests. Solution: Add more tests for the mouse. (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/6472) diff --git a/src/testdir/mouse.vim b/src/testdir/mouse.vim --- a/src/testdir/mouse.vim +++ b/src/testdir/mouse.vim @@ -103,6 +103,24 @@ func MouseCtrlRightClick(row, col) call feedkeys(MouseCtrlRightClickCode(a:row, a:col), 'Lx!') endfunc +func MouseAltLeftClickCode(row, col) + let alt = 0x8 + return TerminalEscapeCode(0 + alt, a:row, a:col, 'M') +endfunc + +func MouseAltLeftClick(row, col) + call feedkeys(MouseAltLeftClickCode(a:row, a:col), 'Lx!') +endfunc + +func MouseAltRightClickCode(row, col) + let alt = 0x8 + return TerminalEscapeCode(2 + alt, a:row, a:col, 'M') +endfunc + +func MouseAltRightClick(row, col) + call feedkeys(MouseAltRightClickCode(a:row, a:col), 'Lx!') +endfunc + func MouseLeftReleaseCode(row, col) if &ttymouse ==# 'dec' return DecEscapeCode(3, 0, a:row, a:col) diff --git a/src/testdir/test_termcodes.vim b/src/testdir/test_termcodes.vim --- a/src/testdir/test_termcodes.vim +++ b/src/testdir/test_termcodes.vim @@ -147,13 +147,13 @@ func Test_xterm_mouse_tagjump() new let str = 'iHello' .. MouseCtrlRightClickCode(row, col) \ .. MouseRightReleaseCode(row, col) .. "\" - call assert_fails('call feedkeys(str, "Lx!")', 'E37:') + call assert_fails('call feedkeys(str, "Lx!")', 'E37:', msg) close! " CTRL-right click with a count let str = "4" .. MouseCtrlRightClickCode(row, col) \ .. MouseRightReleaseCode(row, col) - call assert_fails('call feedkeys(str, "Lx!")', 'E555:') + call assert_fails('call feedkeys(str, "Lx!")', 'E555:', msg) call assert_match('help.txt$', bufname('%'), msg) call assert_equal(1, line('.'), msg) @@ -230,7 +230,7 @@ func Test_term_mouse_middle_click() \ MouseMiddleClickCode(2, 7) .. MouseMiddleReleaseCode(2, 7), 'Lx!') call assert_equal(['12345abc6789abc', '12abc3abc456789'], \ getline(1, '$'), msg) - call assert_equal('1234', @") + call assert_equal('1234', @", msg) let &clipboard = save_clipboard " Clicking middle mouse in select mode, replaces the selected text with @@ -240,6 +240,18 @@ func Test_term_mouse_middle_click() exe "normal gh\\\" call assert_equal(['12xyzabc6789abc', '12abc3abc456789'], \ getline(1, '$'), msg) + + " Prefixing middle click with [ or ] fixes the indent after pasting. + %d + call setline(1, " one two") + call setreg('r', 'red blue', 'l') + call test_setmouse(1, 5) + exe "normal \"r[\" + call assert_equal(' red blue', getline(1), msg) + call test_setmouse(2, 5) + exe "normal \"r]\" + call assert_equal(' red blue', getline(3), msg) + %d endfor let &mouse = save_mouse @@ -309,7 +321,7 @@ func Test_term_mouse_middle_click_insert \ "\", 'Lx!') call assert_equal(['123abc456789', '123456789'], \ getline(1, '$'), msg) - call assert_equal([1, 6], [line('.'), col('.')]) + call assert_equal([1, 6], [line('.'), col('.')], msg) " Middle-click in replace mode call cursor(1, 1) @@ -318,7 +330,7 @@ func Test_term_mouse_middle_click_insert \ "\", 'Lx!') call assert_equal(['123abc45678abc', '123456789'], \ getline(1, '$'), msg) - call assert_equal([1, 14], [line('.'), col('.')]) + call assert_equal([1, 14], [line('.'), col('.')], msg) endfor let &mouse = save_mouse @@ -899,6 +911,53 @@ func Test_term_mouse_multiple_clicks_to_ call assert_equal("\", mode(), msg) norm! r4 call assert_equal(['34333333333333333', 'foo'], getline(1, '$'), msg) + + " Double-click on a space character should visually select all the + " consecutive space characters. + %d + call setline(1, ' one two') + call MouseLeftClick(1, 2) + call MouseLeftRelease(1, 2) + call MouseLeftClick(1, 2) + call MouseLeftRelease(1, 2) + call assert_equal('v', mode(), msg) + norm! r1 + call assert_equal(['1111one two'], getline(1, '$'), msg) + + " Double-click on a word with exclusive selection + set selection=exclusive + let @" = '' + call MouseLeftClick(1, 10) + call MouseLeftRelease(1, 10) + call MouseLeftClick(1, 10) + call MouseLeftRelease(1, 10) + norm! y + call assert_equal('two', @", msg) + + " Double click to select a block of text with exclusive selection + %d + call setline(1, 'one (two) three') + call MouseLeftClick(1, 5) + call MouseLeftRelease(1, 5) + call MouseLeftClick(1, 5) + call MouseLeftRelease(1, 5) + norm! y + call assert_equal(5, col("'<"), msg) + call assert_equal(10, col("'>"), msg) + + call MouseLeftClick(1, 9) + call MouseLeftRelease(1, 9) + call MouseLeftClick(1, 9) + call MouseLeftRelease(1, 9) + norm! y + call assert_equal(5, col("'<"), msg) + call assert_equal(10, col("'>"), msg) + set selection& + + " Click somewhere else so that the clicks above is not combined with the + " clicks in the next iteration. + call MouseRightClick(3, 10) + call MouseRightRelease(3, 10) endfor let &mouse = save_mouse @@ -909,6 +968,41 @@ func Test_term_mouse_multiple_clicks_to_ bwipe! endfunc +" Test for selecting text in visual blockwise mode using Alt-LeftClick +func Test_mouse_alt_leftclick() + let save_mouse = &mouse + let save_term = &term + let save_ttymouse = &ttymouse + call test_override('no_query_mouse', 1) + set mouse=a term=xterm mousetime=200 + set mousemodel=popup + new + call setline(1, 'one (two) three') + + for ttymouse_val in g:Ttymouse_values + let msg = 'ttymouse=' .. ttymouse_val + exe 'set ttymouse=' .. ttymouse_val + + " Left click with the Alt modifier key should extend the selection in + " blockwise visual mode. + let @" = '' + call MouseLeftClick(1, 3) + call MouseLeftRelease(1, 3) + call MouseAltLeftClick(1, 11) + call MouseLeftRelease(1, 11) + call assert_equal("\", mode(), msg) + normal! y + call assert_equal('e (two) t', @") + endfor + + let &mouse = save_mouse + let &term = save_term + let &ttymouse = save_ttymouse + set mousetime& mousemodel& + call test_override('no_query_mouse', 0) + close! +endfunc + func Test_xterm_mouse_click_in_fold_columns() new let save_mouse = &mouse @@ -1086,13 +1180,37 @@ func Test_term_mouse_visual_mode() call assert_equal('three four', @") call assert_equal(9, col('.')) - " Multi-line selection. Right click in the middle of thse selection - call setline(1, ["one", "two", "three", "four", "five", "six"]) + " Right click inside the selection closer to the start of the selection + call test_setmouse(1, 7) + exe "normal 5|vee\lly" + call assert_equal('three', @") + call assert_equal(9, col('.')) + call assert_equal(9, col("'<")) + call assert_equal(13, col("'>")) + + " Right click inside the selection closer to the end of the selection + call test_setmouse(1, 11) + exe "normal 5|vee\ly" + call assert_equal('two thre', @") + call assert_equal(5, col('.')) + call assert_equal(5, col("'<")) + call assert_equal(12, col("'>")) + + " Multi-line selection. Right click inside thse selection. + call setline(1, repeat(['aaaaaa'], 7)) call test_setmouse(3, 1) exe "normal ggVG\y" call assert_equal(3, line("'<")) - call test_setmouse(4, 1) + call test_setmouse(5, 1) exe "normal ggVG\y" + call assert_equal(5, line("'>")) + + " Click right in the middle line of the selection + call test_setmouse(4, 3) + exe "normal ggVG$\y" + call assert_equal(4, line("'<")) + call test_setmouse(4, 4) + exe "normal ggVG$\y" call assert_equal(4, line("'>")) set mousemodel& @@ -1120,11 +1238,12 @@ func Test_term_mouse_popup_menu() menu PopUp.baz :let g:menustr = 'baz' for ttymouse_val in g:Ttymouse_values + let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val let g:menustr = '' call feedkeys(MouseRightClickCode(1, 4) \ .. MouseRightReleaseCode(1, 4) .. "\\\", "x") - call assert_equal('bar', g:menustr) + call assert_equal('bar', g:menustr, msg) endfor unmenu PopUp @@ -1158,70 +1277,71 @@ func Test_term_mouse_popup_menu_setpos() vmenu PopUp.baz y:let g:menustr = 'baz' for ttymouse_val in g:Ttymouse_values + let msg = 'ttymouse=' .. ttymouse_val exe 'set ttymouse=' .. ttymouse_val let g:menustr = '' call cursor(1, 1) call feedkeys(MouseRightClickCode(1, 5) \ .. MouseRightReleaseCode(1, 5) .. "\\\", "x") - call assert_equal('bar', g:menustr) - call assert_equal([1, 5], [line('.'), col('.')]) + call assert_equal('bar', g:menustr, msg) + call assert_equal([1, 5], [line('.'), col('.')], msg) " Test for right click in visual mode inside the selection let @" = '' call cursor(1, 10) call feedkeys('vee' .. MouseRightClickCode(1, 12) \ .. MouseRightReleaseCode(1, 12) .. "\\", "x") - call assert_equal([1, 10], [line('.'), col('.')]) - call assert_equal('ran away', @") + call assert_equal([1, 10], [line('.'), col('.')], msg) + call assert_equal('ran away', @", msg) " Test for right click in visual mode before the selection let @" = '' call cursor(1, 10) call feedkeys('vee' .. MouseRightClickCode(1, 2) \ .. MouseRightReleaseCode(1, 2) .. "\\", "x") - call assert_equal([1, 2], [line('.'), col('.')]) - call assert_equal('', @") + call assert_equal([1, 2], [line('.'), col('.')], msg) + call assert_equal('', @", msg) " Test for right click in visual mode after the selection let @" = '' call cursor(1, 10) call feedkeys('vee' .. MouseRightClickCode(1, 20) \ .. MouseRightReleaseCode(1, 20) .. "\\", "x") - call assert_equal([1, 20], [line('.'), col('.')]) - call assert_equal('', @") + call assert_equal([1, 20], [line('.'), col('.')], msg) + call assert_equal('', @", msg) " Test for right click in block-wise visual mode inside the selection let @" = '' call cursor(1, 16) call feedkeys("\j3l" .. MouseRightClickCode(2, 17) \ .. MouseRightReleaseCode(2, 17) .. "\\", "x") - call assert_equal([1, 16], [line('.'), col('.')]) - call assert_equal("\4", getregtype('"')) + call assert_equal([1, 16], [line('.'), col('.')], msg) + call assert_equal("\4", getregtype('"'), msg) " Test for right click in block-wise visual mode outside the selection let @" = '' call cursor(1, 16) call feedkeys("\j3l" .. MouseRightClickCode(2, 2) \ .. MouseRightReleaseCode(2, 2) .. "\\", "x") - call assert_equal([2, 2], [line('.'), col('.')]) - call assert_equal('v', getregtype('"')) - call assert_equal('', @") + call assert_equal([2, 2], [line('.'), col('.')], msg) + call assert_equal('v', getregtype('"'), msg) + call assert_equal('', @", msg) " Try clicking on the status line let @" = '' call cursor(1, 10) call feedkeys('vee' .. MouseRightClickCode(6, 2) \ .. MouseRightReleaseCode(6, 2) .. "\\", "x") - call assert_equal([1, 10], [line('.'), col('.')]) - call assert_equal('ran away', @") + call assert_equal([1, 10], [line('.'), col('.')], msg) + call assert_equal('ran away', @", msg) " Try clicking outside the window let @" = '' call cursor(7, 2) call feedkeys('vee' .. MouseRightClickCode(7, 2) \ .. MouseRightReleaseCode(7, 2) .. "\\", "x") - call assert_equal(2, winnr()) - call assert_equal('', @") + call assert_equal(2, winnr(), msg) + call assert_equal('', @", msg) wincmd w endfor @@ -1303,6 +1423,111 @@ func Test_term_mouse_quickfix_window() call test_override('no_query_mouse', 0) endfunc +" Test for the 'h' flag in the 'mouse' option. Using mouse in the help window. +func Test_term_mouse_help_window() + let save_mouse = &mouse + let save_term = &term + let save_ttymouse = &ttymouse + call test_override('no_query_mouse', 1) + set mouse=h term=xterm mousetime=200 + + for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + let msg = 'ttymouse=' .. ttymouse_val + exe 'set ttymouse=' .. ttymouse_val + help + let @" = '' + call MouseLeftClick(2, 5) + call MouseLeftRelease(2, 5) + call MouseLeftClick(1, 1) + call MouseLeftDrag(1, 10) + call MouseLeftRelease(1, 10) + norm! y + call assert_equal('*help.txt*', @", msg) + helpclose + + " Click somewhere else to make sure the left click above is not combined + " with the next left click and treated as a double click + call MouseRightClick(5, 10) + call MouseRightRelease(5, 10) + endfor + + let &mouse = save_mouse + let &term = save_term + let &ttymouse = save_ttymouse + set mousetime& + call test_override('no_query_mouse', 0) + %bw! +endfunc + +" Test for the translation of various mouse terminal codes +func Test_mouse_termcodes() + let save_mouse = &mouse + let save_term = &term + let save_ttymouse = &ttymouse + call test_override('no_query_mouse', 1) + set mouse=a term=xterm mousetime=200 + + new + for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm + let msg = 'ttymouse=' .. ttymouse_val + exe 'set ttymouse=' .. ttymouse_val + + let mouse_codes = [ + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\<2-LeftMouse>", "<2-LeftMouse>"], + \ ["\<2-MiddleMouse>", "<2-MiddleMouse>"], + \ ["\<2-RightMouse>", "<2-RightMouse>"], + \ ["\<3-LeftMouse>", "<3-LeftMouse>"], + \ ["\<3-MiddleMouse>", "<3-MiddleMouse>"], + \ ["\<3-RightMouse>", "<3-RightMouse>"], + \ ["\<4-LeftMouse>", "<4-LeftMouse>"], + \ ["\<4-MiddleMouse>", "<4-MiddleMouse>"], + \ ["\<4-RightMouse>", "<4-RightMouse>"], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""], + \ ["\", ""] + \ ] + + for [code, outstr] in mouse_codes + exe "normal ggC\" . code + call assert_equal(outstr, getline(1), msg) + endfor + endfor + + let &mouse = save_mouse + let &term = save_term + let &ttymouse = save_ttymouse + set mousetime& + call test_override('no_query_mouse', 0) + %bw! +endfunc + " This only checks if the sequence is recognized. func Test_term_rgb_response() set t_RF=x diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -755,6 +755,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1235, +/**/ 1234, /**/ 1233,