diff src/testdir/test_popupwin.vim @ 17551:8cca2654d459 v8.1.1773

patch 8.1.1773: the preview popup window may be too far to the right commit https://github.com/vim/vim/commit/13d5c3f6162694a7e925e66fc4eea35436643384 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jul 28 21:42:38 2019 +0200 patch 8.1.1773: the preview popup window may be too far to the right Problem: The preview popup window may be too far to the right. Solution: Keep it inside the screen. Also keep the close button and scrollbar visible if possible.
author Bram Moolenaar <Bram@vim.org>
date Sun, 28 Jul 2019 21:45:05 +0200
parents 57b9fca8c7d2
children d5e5d0fc3fa8
line wrap: on
line diff
--- a/src/testdir/test_popupwin.vim
+++ b/src/testdir/test_popupwin.vim
@@ -1009,9 +1009,9 @@ func Test_popup_atcursor()
   call cursor(1, 1)
   redraw
   let winid = popup_create('vim', #{
-        \ line: 'cursor+2',
-        \ col: 'cursor+1',
-        \})
+	\ line: 'cursor+2',
+	\ col: 'cursor+1',
+	\})
   redraw
   let line = join(map(range(1, 17), 'screenstring(3, v:val)'), '')
   call assert_equal('xvimxxxxxxxxxxxxx', line)
@@ -1020,9 +1020,9 @@ func Test_popup_atcursor()
   call cursor(3, 3)
   redraw
   let winid = popup_create('vim', #{
-        \ line: 'cursor-2',
-        \ col: 'cursor-1',
-        \})
+	\ line: 'cursor-2',
+	\ col: 'cursor-1',
+	\})
   redraw
   let line = join(map(range(1, 17), 'screenstring(1, v:val)'), '')
   call assert_equal('xvimxxxxxxxxxxxxx', line)
@@ -1347,11 +1347,11 @@ func Test_popup_never_behind()
   call delete('XtestPopupBehind')
 endfunc
 
-func s:VerifyPosition( p, msg, line, col, width, height )
-  call assert_equal( a:line,   popup_getpos( a:p ).line,   a:msg . ' (l)' )
-  call assert_equal( a:col,    popup_getpos( a:p ).col,    a:msg . ' (c)' )
-  call assert_equal( a:width,  popup_getpos( a:p ).width,  a:msg . ' (w)' )
-  call assert_equal( a:height, popup_getpos( a:p ).height, a:msg . ' (h)' )
+func s:VerifyPosition(p, msg, line, col, width, height)
+  call assert_equal(a:line,   popup_getpos(a:p).line,   a:msg . ' (l)')
+  call assert_equal(a:col,    popup_getpos(a:p).col,    a:msg . ' (c)')
+  call assert_equal(a:width,  popup_getpos(a:p).width,  a:msg . ' (w)')
+  call assert_equal(a:height, popup_getpos(a:p).height, a:msg . ' (h)')
 endfunc
 
 func Test_popup_position_adjust()
@@ -1364,24 +1364,24 @@ func Test_popup_position_adjust()
   " Entries for cases which don't vary based on wrapping.
   " Format is per tests described below
   let both_wrap_tests = [
-        \       [ 'a', 5, &columns,        5, &columns - 2, 1, 1 ],
-        \       [ 'b', 5, &columns + 1,    5, &columns - 2, 1, 1 ],
-        \       [ 'c', 5, &columns - 1,    5, &columns - 2, 1, 1 ],
-        \       [ 'd', 5, &columns - 2,    5, &columns - 2, 1, 1 ],
-        \       [ 'e', 5, &columns - 3,    5, &columns - 3, 1, 1 ],
-        \
-        \       [ 'aa', 5, &columns,        5, &columns - 2, 2, 1 ],
-        \       [ 'bb', 5, &columns + 1,    5, &columns - 2, 2, 1 ],
-        \       [ 'cc', 5, &columns - 1,    5, &columns - 2, 2, 1 ],
-        \       [ 'dd', 5, &columns - 2,    5, &columns - 2, 2, 1 ],
-        \       [ 'ee', 5, &columns - 3,    5, &columns - 3, 2, 1 ],
-        \
-        \       [ 'aaa', 5, &columns,        5, &columns - 2, 3, 1 ],
-        \       [ 'bbb', 5, &columns + 1,    5, &columns - 2, 3, 1 ],
-        \       [ 'ccc', 5, &columns - 1,    5, &columns - 2, 3, 1 ],
-        \       [ 'ddd', 5, &columns - 2,    5, &columns - 2, 3, 1 ],
-        \       [ 'eee', 5, &columns - 3,    5, &columns - 3, 3, 1 ],
-        \ ]
+	\       ['a', 5, &columns,        5, &columns - 2, 1, 1],
+	\       ['b', 5, &columns + 1,    5, &columns - 2, 1, 1],
+	\       ['c', 5, &columns - 1,    5, &columns - 2, 1, 1],
+	\       ['d', 5, &columns - 2,    5, &columns - 2, 1, 1],
+	\       ['e', 5, &columns - 3,    5, &columns - 3, 1, 1],
+	\
+	\       ['aa', 5, &columns,        5, &columns - 2, 2, 1],
+	\       ['bb', 5, &columns + 1,    5, &columns - 2, 2, 1],
+	\       ['cc', 5, &columns - 1,    5, &columns - 2, 2, 1],
+	\       ['dd', 5, &columns - 2,    5, &columns - 2, 2, 1],
+	\       ['ee', 5, &columns - 3,    5, &columns - 3, 2, 1],
+	\
+	\       ['aaa', 5, &columns,        5, &columns - 2, 3, 1],
+	\       ['bbb', 5, &columns + 1,    5, &columns - 2, 3, 1],
+	\       ['ccc', 5, &columns - 1,    5, &columns - 2, 3, 1],
+	\       ['ddd', 5, &columns - 2,    5, &columns - 2, 3, 1],
+	\       ['eee', 5, &columns - 3,    5, &columns - 3, 3, 1],
+	\ ]
 
   " these test groups are dicts with:
   "  - comment: something to identify the group of tests by
@@ -1395,61 +1395,61 @@ func Test_popup_position_adjust()
   "     - expected width
   "     - expected height
   let tests = [
-        \ #{
-        \   comment: 'left-aligned with wrapping',
-        \   options: #{
-        \     wrap: 1,
-        \     pos: 'botleft',
-        \   },
-        \   tests: both_wrap_tests + [
-        \       [ 'aaaa', 5, &columns,        4, &columns - 2, 3, 2 ],
-        \       [ 'bbbb', 5, &columns + 1,    4, &columns - 2, 3, 2 ],
-        \       [ 'cccc', 5, &columns - 1,    4, &columns - 2, 3, 2 ],
-        \       [ 'dddd', 5, &columns - 2,    4, &columns - 2, 3, 2 ],
-        \       [ 'eeee', 5, &columns - 3,    5, &columns - 3, 4, 1 ],
-        \   ],
-        \ },
-        \ #{
-        \   comment: 'left aligned without wrapping',
-        \   options: #{
-        \     wrap: 0,
-        \     pos: 'botleft',
-        \   },
-        \   tests: both_wrap_tests + [
-        \       [ 'aaaa', 5, &columns,        5, &columns - 3, 4, 1 ],
-        \       [ 'bbbb', 5, &columns + 1,    5, &columns - 3, 4, 1 ],
-        \       [ 'cccc', 5, &columns - 1,    5, &columns - 3, 4, 1 ],
-        \       [ 'dddd', 5, &columns - 2,    5, &columns - 3, 4, 1 ],
-        \       [ 'eeee', 5, &columns - 3,    5, &columns - 3, 4, 1 ],
-        \   ],
-        \ },
-        \ #{
-        \   comment: 'left aligned with fixed position',
-        \   options: #{
-        \     wrap: 0,
-        \     fixed: 1,
-        \     pos: 'botleft',
-        \   },
-        \   tests: both_wrap_tests + [
-        \       [ 'aaaa', 5, &columns,        5, &columns - 2, 3, 1 ],
-        \       [ 'bbbb', 5, &columns + 1,    5, &columns - 2, 3, 1 ],
-        \       [ 'cccc', 5, &columns - 1,    5, &columns - 2, 3, 1 ],
-        \       [ 'dddd', 5, &columns - 2,    5, &columns - 2, 3, 1 ],
-        \       [ 'eeee', 5, &columns - 3,    5, &columns - 3, 4, 1 ],
-        \   ],
-        \ },
-      \ ]
+	\ #{
+	\   comment: 'left-aligned with wrapping',
+	\   options: #{
+	\     wrap: 1,
+	\     pos: 'botleft',
+	\   },
+	\   tests: both_wrap_tests + [
+	\       ['aaaa', 5, &columns,        4, &columns - 2, 3, 2],
+	\       ['bbbb', 5, &columns + 1,    4, &columns - 2, 3, 2],
+	\       ['cccc', 5, &columns - 1,    4, &columns - 2, 3, 2],
+	\       ['dddd', 5, &columns - 2,    4, &columns - 2, 3, 2],
+	\       ['eeee', 5, &columns - 3,    5, &columns - 3, 4, 1],
+	\   ],
+	\ },
+	\ #{
+	\   comment: 'left aligned without wrapping',
+	\   options: #{
+	\     wrap: 0,
+	\     pos: 'botleft',
+	\   },
+	\   tests: both_wrap_tests + [
+	\       ['aaaa', 5, &columns,        5, &columns - 3, 4, 1],
+	\       ['bbbb', 5, &columns + 1,    5, &columns - 3, 4, 1],
+	\       ['cccc', 5, &columns - 1,    5, &columns - 3, 4, 1],
+	\       ['dddd', 5, &columns - 2,    5, &columns - 3, 4, 1],
+	\       ['eeee', 5, &columns - 3,    5, &columns - 3, 4, 1],
+	\   ],
+	\ },
+	\ #{
+	\   comment: 'left aligned with fixed position',
+	\   options: #{
+	\     wrap: 0,
+	\     fixed: 1,
+	\     pos: 'botleft',
+	\   },
+	\   tests: both_wrap_tests + [
+	\       ['aaaa', 5, &columns,        5, &columns - 2, 3, 1],
+	\       ['bbbb', 5, &columns + 1,    5, &columns - 2, 3, 1],
+	\       ['cccc', 5, &columns - 1,    5, &columns - 2, 3, 1],
+	\       ['dddd', 5, &columns - 2,    5, &columns - 2, 3, 1],
+	\       ['eeee', 5, &columns - 3,    5, &columns - 3, 4, 1],
+	\   ],
+	\ },
+	\ ]
 
   for test_group in tests
     for test in test_group.tests
       let [ text, line, col, e_line, e_col, e_width, e_height ] = test
       let options = #{
-            \ line: line,
-            \ col: col,
-            \ }
-      call extend( options, test_group.options )
+	    \ line: line,
+	    \ col: col,
+	    \ }
+      call extend(options, test_group.options)
 
-      let p = popup_create( text, options )
+      let p = popup_create(text, options)
 
       let msg = string(extend(options, #{text: text}))
       call s:VerifyPosition(p, msg, e_line, e_col, e_width, e_height)
@@ -1465,62 +1465,62 @@ func Test_adjust_left_past_screen_width(
   " width of screen
   let X = join(map(range(&columns), {->'X'}), '')
 
-  let p = popup_create( X, #{line: 1, col: 1, wrap: 0})
-  call s:VerifyPosition( p, 'full width topleft', 1, 1, &columns, 1 )
+  let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
+  call s:VerifyPosition(p, 'full width topleft', 1, 1, &columns, 1)
 
   redraw
   let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
   call assert_equal(X, line)
 
-  call popup_close( p )
+  call popup_close(p)
   redraw
 
   " Same if placed on the right hand side
-  let p = popup_create( X, #{line: 1, col: &columns, wrap: 0})
-  call s:VerifyPosition( p, 'full width topright', 1, 1, &columns, 1 )
+  let p = popup_create(X, #{line: 1, col: &columns, wrap: 0})
+  call s:VerifyPosition(p, 'full width topright', 1, 1, &columns, 1)
 
   redraw
   let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
   call assert_equal(X, line)
 
-  call popup_close( p )
+  call popup_close(p)
   redraw
 
   " Extend so > window width
   let X .= 'x'
 
-  let p = popup_create( X, #{line: 1, col: 1, wrap: 0})
-  call s:VerifyPosition( p, 'full width +  1 topleft', 1, 1, &columns, 1 )
+  let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
+  call s:VerifyPosition(p, 'full width +  1 topleft', 1, 1, &columns, 1)
 
   redraw
   let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
   call assert_equal(X[ : -2 ], line)
 
-  call popup_close( p )
+  call popup_close(p)
   redraw
 
   " Shifted then truncated (the x is not visible)
-  let p = popup_create( X, #{line: 1, col: &columns - 3, wrap: 0})
-  call s:VerifyPosition( p, 'full width + 1 topright', 1, 1, &columns, 1 )
+  let p = popup_create(X, #{line: 1, col: &columns - 3, wrap: 0})
+  call s:VerifyPosition(p, 'full width + 1 topright', 1, 1, &columns, 1)
 
   redraw
   let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
   call assert_equal(X[ : -2 ], line)
 
-  call popup_close( p )
+  call popup_close(p)
   redraw
 
   " Not shifted, just truncated
-  let p = popup_create( X,
-        \ #{line: 1, col: 2, wrap: 0, fixed: 1})
-  call s:VerifyPosition( p, 'full width + 1 fixed', 1, 2, &columns - 1, 1)
+  let p = popup_create(X,
+	\ #{line: 1, col: 2, wrap: 0, fixed: 1})
+  call s:VerifyPosition(p, 'full width + 1 fixed', 1, 2, &columns - 1, 1)
 
   redraw
   let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
   let e_line = ' ' . X[ 1 : -2 ]
   call assert_equal(e_line, line)
 
-  call popup_close( p )
+  call popup_close(p)
   redraw
 
   call popup_clear()
@@ -1715,7 +1715,7 @@ func Test_popup_settext()
     call popup_settext(p, 'this is a text')
   END
 
-  call writefile( lines, 'XtestPopupSetText' )
+  call writefile(lines, 'XtestPopupSetText')
   let buf = RunVimInTerminal('-S XtestPopupSetText', #{rows: 10})
   call VerifyScreenDump(buf, 'Test_popup_settext_01', {})
 
@@ -2155,16 +2155,17 @@ func Test_previewpopup()
   let lines =<< trim END
         set tags=Xtags
 	call setline(1, [
-              \ 'one',
-              \ 'two',
-              \ 'three',
-              \ 'four',
-              \ 'five',
-              \ 'six',
-              \ 'seven',
-              \ 'find theword somewhere',
-              \ 'nine',
-              \ 'this is another word'])
+	      \ 'one',
+	      \ 'two',
+	      \ 'three',
+	      \ 'four',
+	      \ 'five',
+	      \ 'six',
+	      \ 'seven',
+	      \ 'find theword somewhere',
+	      \ 'nine',
+	      \ 'this is another word',
+	      \ 'very long line where the word is also another'])
         set previewpopup=height:4,width:40
   END
   call writefile(lines, 'XtestPreviewPopup')
@@ -2177,6 +2178,13 @@ func Test_previewpopup()
   call term_sendkeys(buf, "/another\<CR>\<C-W>}")
   call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_2', {})
 
+  call term_sendkeys(buf, ":call popup_move(popup_getpreview(), #{col: 15})\<CR>")
+  call term_sendkeys(buf, ":\<CR>")
+  call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_3', {})
+
+  call term_sendkeys(buf, "/another\<CR>\<C-W>}")
+  call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_4', {})
+
   call StopVimInTerminal(buf)
   call delete('Xtags')
   call delete('Xtagfile')