diff src/testdir/test_gui.vim @ 24982:4cb423b9250d v8.2.3028

patch 8.2.3028: GUI mouse events not tested Commit: https://github.com/vim/vim/commit/f1e7449d567c630601aa0cec6c663b791785a668 Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Mon Jun 21 18:44:26 2021 +0200 patch 8.2.3028: GUI mouse events not tested Problem: GUI mouse events not tested. Solution: Add test_gui_mouse_event(). Add mouse tests. Also add a few viminfo tests. (Yegappan Lakshmanan, closes #8407)
author Bram Moolenaar <Bram@vim.org>
date Mon, 21 Jun 2021 18:45:04 +0200
parents ee5b6208f725
children 3b1770226f85
line wrap: on
line diff
--- a/src/testdir/test_gui.vim
+++ b/src/testdir/test_gui.vim
@@ -389,7 +389,7 @@ func Test_set_guifont()
   endif
 
   " This only works if 'renderoptions' exists and does not work for Windows XP
-  " and older. 
+  " and older.
   if exists('+renderoptions') && windowsversion() !~ '^[345]\.'
     " doing this four times used to cause a crash
     set renderoptions=type:directx
@@ -875,4 +875,226 @@ func Test_gui_recursive_mapping()
   nunmap <C-W>a
 endfunc
 
+" Test GUI mouse events
+func Test_gui_mouse_event()
+  set mousemodel=extend
+  call test_override('no_query_mouse', 1)
+  new
+  call setline(1, ['one two three', 'four five six'])
+
+  " place the cursor using left click
+  call cursor(1, 1)
+  call test_gui_mouse_event(0, 2, 4, 0, 0)
+  call test_gui_mouse_event(3, 2, 4, 0, 0)
+  call feedkeys("\<Esc>", 'Lx!')
+  call assert_equal([0, 2, 4, 0], getpos('.'))
+
+  " select and yank a word
+  let @" = ''
+  call test_gui_mouse_event(0, 1, 9, 0, 0)
+  call test_gui_mouse_event(0, 1, 9, 1, 0)
+  call test_gui_mouse_event(3, 1, 9, 0, 0)
+  call feedkeys("y", 'Lx!')
+  call assert_equal('three', @")
+
+  " create visual selection using right click
+  let @" = ''
+  call test_gui_mouse_event(0, 2, 6, 0, 0)
+  call test_gui_mouse_event(3, 2, 6, 0, 0)
+  call test_gui_mouse_event(2, 2, 13, 0, 0)
+  call test_gui_mouse_event(3, 2, 13, 0, 0)
+  call feedkeys("y", 'Lx!')
+  call assert_equal('five six', @")
+
+  " paste using middle mouse button
+  let @* = 'abc '
+  call feedkeys('""', 'Lx!')
+  call test_gui_mouse_event(1, 1, 9, 0, 0)
+  call test_gui_mouse_event(3, 1, 9, 0, 0)
+  call feedkeys("\<Esc>", 'Lx!')
+  call assert_equal(['one two abc three', 'four five six'], getline(1, '$'))
+
+  " extend visual selection using right click in visual mode
+  let @" = ''
+  call cursor(1, 1)
+  call feedkeys('v', 'Lx!')
+  call test_gui_mouse_event(2, 1, 17, 0, 0)
+  call test_gui_mouse_event(3, 1, 17, 0, 0)
+  call feedkeys("y", 'Lx!')
+  call assert_equal('one two abc three', @")
+
+  " extend visual selection using mouse drag
+  let @" = ''
+  call cursor(1, 1)
+  call test_gui_mouse_event(0, 2, 1, 0, 0)
+  call test_gui_mouse_event(0x43, 2, 9, 0, 0)
+  call test_gui_mouse_event(0x3, 2, 9, 0, 0)
+  call feedkeys("y", 'Lx!')
+  call assert_equal('four five', @")
+
+  " select text by moving the mouse
+  let @" = ''
+  call cursor(1, 1)
+  redraw!
+  call test_gui_mouse_event(0, 1, 4, 0, 0)
+  call test_gui_mouse_event(0x700, 1, 9, 0, 0)
+  call test_gui_mouse_event(0x700, 1, 13, 0, 0)
+  call test_gui_mouse_event(0x3, 1, 13, 0, 0)
+  call feedkeys("y", 'Lx!')
+  call assert_equal(' two abc t', @")
+
+  " Using mouse in insert mode
+  call cursor(1, 1)
+  call feedkeys('i', 't')
+  call test_gui_mouse_event(0, 2, 11, 0, 0)
+  call test_gui_mouse_event(3, 2, 11, 0, 0)
+  call feedkeys("po\<Esc>", 'Lx!')
+  call assert_equal(['one two abc three', 'four five posix'], getline(1, '$'))
+
+  %d _
+  call setline(1, range(1, 100))
+  " scroll up
+  call test_gui_mouse_event(0x200, 2, 1, 0, 0)
+  call test_gui_mouse_event(0x200, 2, 1, 0, 0)
+  call test_gui_mouse_event(0x200, 2, 1, 0, 0)
+  call feedkeys("H", 'Lx!')
+  call assert_equal(10, line('.'))
+
+  " scroll down
+  call test_gui_mouse_event(0x100, 2, 1, 0, 0)
+  call test_gui_mouse_event(0x100, 2, 1, 0, 0)
+  call feedkeys("H", 'Lx!')
+  call assert_equal(4, line('.'))
+
+  %d _
+  set nowrap
+  call setline(1, range(10)->join('')->repeat(10))
+  " scroll left
+  call test_gui_mouse_event(0x500, 1, 5, 0, 0)
+  call test_gui_mouse_event(0x500, 1, 10, 0, 0)
+  call test_gui_mouse_event(0x500, 1, 15, 0, 0)
+  call feedkeys('g0', 'Lx!')
+  call assert_equal(19, col('.'))
+
+  " scroll right
+  call test_gui_mouse_event(0x600, 1, 15, 0, 0)
+  call test_gui_mouse_event(0x600, 1, 10, 0, 0)
+  call feedkeys('g0', 'Lx!')
+  call assert_equal(7, col('.'))
+  set wrap&
+
+  %d _
+  call setline(1, repeat([repeat('a', 60)], 10))
+
+  " record various mouse events
+  let mouseEventNames = [
+        \ 'LeftMouse', 'LeftRelease', '2-LeftMouse', '3-LeftMouse',
+        \ 'S-LeftMouse', 'A-LeftMouse', 'C-LeftMouse', 'MiddleMouse',
+        \ 'MiddleRelease', '2-MiddleMouse', '3-MiddleMouse',
+        \ 'S-MiddleMouse', 'A-MiddleMouse', 'C-MiddleMouse',
+        \ 'RightMouse', 'RightRelease', '2-RightMouse',
+        \ '3-RightMouse', 'S-RightMouse', 'A-RightMouse', 'C-RightMouse',
+        \ 'X1Mouse', 'S-X1Mouse', 'A-X1Mouse', 'C-X1Mouse', 'X2Mouse',
+        \ 'S-X2Mouse', 'A-X2Mouse', 'C-X2Mouse'
+        \ ]
+  let mouseEventCodes = map(copy(mouseEventNames), "'<' .. v:val .. '>'")
+  let g:events = []
+  for e in mouseEventCodes
+    exe 'nnoremap ' .. e .. ' <Cmd>call add(g:events, "' ..
+          \ substitute(e, '[<>]', '', 'g') .. '")<CR>'
+  endfor
+
+  " Test various mouse buttons (0 - Left, 1 - Middle, 2 - Right, 0x300 - X1,
+  " 0x300- X2)
+  for button in [0, 1, 2, 0x300, 0x400]
+    " Single click
+    call test_gui_mouse_event(button, 2, 5, 0, 0)
+    call test_gui_mouse_event(3, 2, 5, 0, 0)
+
+    " Double/Triple click is supported by only the Left/Middle/Right mouse
+    " buttons
+    if button <= 2
+      " Double Click
+      call test_gui_mouse_event(button, 2, 5, 0, 0)
+      call test_gui_mouse_event(button, 2, 5, 1, 0)
+      call test_gui_mouse_event(3, 2, 5, 0, 0)
+
+      " Triple Click
+      call test_gui_mouse_event(button, 2, 5, 0, 0)
+      call test_gui_mouse_event(button, 2, 5, 1, 0)
+      call test_gui_mouse_event(button, 2, 5, 1, 0)
+      call test_gui_mouse_event(3, 2, 5, 0, 0)
+    endif
+
+    " Shift click
+    call test_gui_mouse_event(button, 3, 7, 0, 4)
+    call test_gui_mouse_event(3, 3, 7, 0, 4)
+
+    " Alt click
+    call test_gui_mouse_event(button, 3, 7, 0, 8)
+    call test_gui_mouse_event(3, 3, 7, 0, 8)
+
+    " Ctrl click
+    call test_gui_mouse_event(button, 3, 7, 0, 16)
+    call test_gui_mouse_event(3, 3, 7, 0, 16)
+
+    call feedkeys("\<Esc>", 'Lx!')
+  endfor
+
+  call assert_equal(['LeftMouse', 'LeftRelease', 'LeftMouse', '2-LeftMouse',
+        \ 'LeftMouse', '2-LeftMouse', '3-LeftMouse', 'S-LeftMouse',
+        \ 'A-LeftMouse', 'C-LeftMouse', 'MiddleMouse', 'MiddleRelease',
+        \ 'MiddleMouse', '2-MiddleMouse', 'MiddleMouse', '2-MiddleMouse',
+        \ '3-MiddleMouse', 'S-MiddleMouse', 'A-MiddleMouse', 'C-MiddleMouse',
+        \ 'RightMouse', 'RightRelease', 'RightMouse', '2-RightMouse',
+        \ 'RightMouse', '2-RightMouse', '3-RightMouse', 'S-RightMouse',
+        \ 'A-RightMouse', 'C-RightMouse', 'X1Mouse', 'S-X1Mouse', 'A-X1Mouse',
+        \ 'C-X1Mouse', 'X2Mouse', 'S-X2Mouse', 'A-X2Mouse', 'C-X2Mouse'],
+        \ g:events)
+
+  for e in mouseEventCodes
+    exe 'nunmap ' .. e
+  endfor
+
+  " modeless selection
+  set mouse=
+  let save_guioptions = &guioptions
+  set guioptions+=A
+  %d _
+  call setline(1, ['one two three', 'four five sixteen'])
+  call cursor(1, 1)
+  redraw!
+  " Double click should select the word and copy it to clipboard
+  let @* = ''
+  call test_gui_mouse_event(0, 2, 11, 0, 0)
+  call test_gui_mouse_event(0, 2, 11, 1, 0)
+  call test_gui_mouse_event(3, 2, 11, 0, 0)
+  call feedkeys("\<Esc>", 'Lx!')
+  call assert_equal([0, 1, 1, 0], getpos('.'))
+  call assert_equal('sixteen', @*)
+  " Right click should extend the selection from cursor
+  call cursor(1, 6)
+  redraw!
+  let @* = ''
+  call test_gui_mouse_event(2, 1, 11, 0, 0)
+  call test_gui_mouse_event(3, 1, 11, 0, 0)
+  call feedkeys("\<Esc>", 'Lx!')
+  call assert_equal([0, 1, 6, 0], getpos('.'))
+  call assert_equal('wo thr', @*)
+  " Middle click should paste the clipboard contents
+  call cursor(2, 1)
+  redraw!
+  call test_gui_mouse_event(1, 1, 11, 0, 0)
+  call test_gui_mouse_event(3, 1, 11, 0, 0)
+  call feedkeys("\<Esc>", 'Lx!')
+  call assert_equal([0, 2, 7, 0], getpos('.'))
+  call assert_equal('wo thrfour five sixteen', getline(2))
+  set mouse&
+  let &guioptions = save_guioptions
+
+  bw!
+  call test_override('no_query_mouse', 0)
+  set mousemodel&
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab