Patch 8.1.2320
Problem: Insufficient test coverage for quickfix.
Solution: Add more tests. Fix uncovered problem. (Yegappan Lakshmanan,
closes #5238)
Files: src/quickfix.c, src/testdir/test_quickfix.vim
*** ../vim-8.1.2319/src/quickfix.c 2019-11-17 18:09:33.609491591 +0100
--- src/quickfix.c 2019-11-18 22:00:26.261437036 +0100
***************
*** 3044,3055 ****
static int
qf_jump_to_usable_window(int qf_fnum, int newwin, int *opened_window)
{
! win_T *usable_win_ptr = NULL;
! int usable_win;
qf_info_T *ll_ref = NULL;
- win_T *win;
-
- usable_win = 0;
// If opening a new window, then don't use the location list referred by
// the current window. Otherwise two windows will refer to the same
--- 3044,3052 ----
static int
qf_jump_to_usable_window(int qf_fnum, int newwin, int *opened_window)
{
! win_T *usable_wp = NULL;
! int usable_win = FALSE;
qf_info_T *ll_ref = NULL;
// If opening a new window, then don't use the location list referred by
// the current window. Otherwise two windows will refer to the same
***************
*** 3060,3076 ****
if (ll_ref != NULL)
{
// Find a non-quickfix window with this location list
! usable_win_ptr = qf_find_win_with_loclist(ll_ref);
! if (usable_win_ptr != NULL)
! usable_win = 1;
}
if (!usable_win)
{
// Locate a window showing a normal buffer
! win = qf_find_win_with_normal_buf();
if (win != NULL)
! usable_win = 1;
}
// If no usable window is found and 'switchbuf' contains "usetab"
--- 3057,3073 ----
if (ll_ref != NULL)
{
// Find a non-quickfix window with this location list
! usable_wp = qf_find_win_with_loclist(ll_ref);
! if (usable_wp != NULL)
! usable_win = TRUE;
}
if (!usable_win)
{
// Locate a window showing a normal buffer
! win_T *win = qf_find_win_with_normal_buf();
if (win != NULL)
! usable_win = TRUE;
}
// If no usable window is found and 'switchbuf' contains "usetab"
***************
*** 3089,3095 ****
else
{
if (curwin->w_llist_ref != NULL) // In a location window
! qf_goto_win_with_ll_file(usable_win_ptr, qf_fnum, ll_ref);
else // In a quickfix window
qf_goto_win_with_qfl_file(qf_fnum);
}
--- 3086,3092 ----
else
{
if (curwin->w_llist_ref != NULL) // In a location window
! qf_goto_win_with_ll_file(usable_wp, qf_fnum, ll_ref);
else // In a quickfix window
qf_goto_win_with_qfl_file(qf_fnum);
}
***************
*** 3454,3470 ****
qfl->qf_ptr = qf_ptr;
qfl->qf_index = qf_index;
}
! if (p_swb != old_swb)
{
// Restore old 'switchbuf' value, but not when an autocommand or
// modeline has changed the value.
! if (p_swb == empty_option)
! {
! p_swb = old_swb;
! swb_flags = old_swb_flags;
! }
! else
! free_string_option(old_swb);
}
decr_quickfix_busy();
}
--- 3451,3462 ----
qfl->qf_ptr = qf_ptr;
qfl->qf_index = qf_index;
}
! if (p_swb != old_swb && p_swb == empty_option)
{
// Restore old 'switchbuf' value, but not when an autocommand or
// modeline has changed the value.
! p_swb = old_swb;
! swb_flags = old_swb_flags;
}
decr_quickfix_busy();
}
*** ../vim-8.1.2319/src/testdir/test_quickfix.vim 2019-11-17
18:09:33.613491551 +0100
--- src/testdir/test_quickfix.vim 2019-11-18 22:00:26.261437036 +0100
***************
*** 14,20 ****
command! -nargs=* Xaddexpr <mods>caddexpr <args>
command! -nargs=* -count Xolder <mods><count>colder <args>
command! -nargs=* Xnewer <mods>cnewer <args>
! command! -nargs=* Xopen <mods>copen <args>
command! -nargs=* Xwindow <mods>cwindow <args>
command! -nargs=* Xbottom <mods>cbottom <args>
command! -nargs=* Xclose <mods>cclose <args>
--- 14,20 ----
command! -nargs=* Xaddexpr <mods>caddexpr <args>
command! -nargs=* -count Xolder <mods><count>colder <args>
command! -nargs=* Xnewer <mods>cnewer <args>
! command! -nargs=* Xopen <mods> copen <args>
command! -nargs=* Xwindow <mods>cwindow <args>
command! -nargs=* Xbottom <mods>cbottom <args>
command! -nargs=* Xclose <mods>cclose <args>
***************
*** 32,39 ****
command! -count -nargs=* -bang Xnfile <mods><count>cnfile<bang> <args>
command! -nargs=* -bang Xpfile <mods>cpfile<bang> <args>
command! -nargs=* Xexpr <mods>cexpr <args>
! command! -range -nargs=* Xvimgrep <mods><count>vimgrep <args>
! command! -nargs=* Xvimgrepadd <mods>vimgrepadd <args>
command! -nargs=* Xgrep <mods> grep <args>
command! -nargs=* Xgrepadd <mods> grepadd <args>
command! -nargs=* Xhelpgrep helpgrep <args>
--- 32,39 ----
command! -count -nargs=* -bang Xnfile <mods><count>cnfile<bang> <args>
command! -nargs=* -bang Xpfile <mods>cpfile<bang> <args>
command! -nargs=* Xexpr <mods>cexpr <args>
! command! -count -nargs=* Xvimgrep <mods> <count>vimgrep <args>
! command! -nargs=* Xvimgrepadd <mods> vimgrepadd <args>
command! -nargs=* Xgrep <mods> grep <args>
command! -nargs=* Xgrepadd <mods> grepadd <args>
command! -nargs=* Xhelpgrep helpgrep <args>
***************
*** 51,57 ****
command! -nargs=* Xaddexpr <mods>laddexpr <args>
command! -nargs=* -count Xolder <mods><count>lolder <args>
command! -nargs=* Xnewer <mods>lnewer <args>
! command! -nargs=* Xopen <mods>lopen <args>
command! -nargs=* Xwindow <mods>lwindow <args>
command! -nargs=* Xbottom <mods>lbottom <args>
command! -nargs=* Xclose <mods>lclose <args>
--- 51,57 ----
command! -nargs=* Xaddexpr <mods>laddexpr <args>
command! -nargs=* -count Xolder <mods><count>lolder <args>
command! -nargs=* Xnewer <mods>lnewer <args>
! command! -nargs=* Xopen <mods> lopen <args>
command! -nargs=* Xwindow <mods>lwindow <args>
command! -nargs=* Xbottom <mods>lbottom <args>
command! -nargs=* Xclose <mods>lclose <args>
***************
*** 69,76 ****
command! -count -nargs=* -bang Xnfile <mods><count>lnfile<bang> <args>
command! -nargs=* -bang Xpfile <mods>lpfile<bang> <args>
command! -nargs=* Xexpr <mods>lexpr <args>
! command! -range -nargs=* Xvimgrep <mods><count>lvimgrep <args>
! command! -nargs=* Xvimgrepadd <mods>lvimgrepadd <args>
command! -nargs=* Xgrep <mods> lgrep <args>
command! -nargs=* Xgrepadd <mods> lgrepadd <args>
command! -nargs=* Xhelpgrep lhelpgrep <args>
--- 69,76 ----
command! -count -nargs=* -bang Xnfile <mods><count>lnfile<bang> <args>
command! -nargs=* -bang Xpfile <mods>lpfile<bang> <args>
command! -nargs=* Xexpr <mods>lexpr <args>
! command! -count -nargs=* Xvimgrep <mods> <count>lvimgrep <args>
! command! -nargs=* Xvimgrepadd <mods> lvimgrepadd <args>
command! -nargs=* Xgrep <mods> lgrep <args>
command! -nargs=* Xgrepadd <mods> lgrepadd <args>
command! -nargs=* Xhelpgrep lhelpgrep <args>
***************
*** 157,162 ****
--- 157,168 ----
\ ' 2 Data.Text:20 col 10 warning 22: ModuleWarning',
\ ' 3 Data/Text.hs:30 col 15 warning 33: FileWarning'], l)
+ " For help entries in the quickfix list, only the filename without directory
+ " should be displayed
+ Xhelpgrep setqflist()
+ let l = split(execute('Xlist 1', ''), "\n")
+ call assert_match('^ 1 [^\\/]\{-}:', l[0])
+
" Error cases
call assert_fails('Xlist abc', 'E488:')
endfunc
***************
*** 269,274 ****
--- 275,288 ----
Xwindow
call assert_true(winnr('$') == 1)
+ " Specifying the width should adjust the width for a vertically split
+ " quickfix window.
+ vert Xopen
+ call assert_equal(10, winwidth(0))
+ vert Xopen 12
+ call assert_equal(12, winwidth(0))
+ Xclose
+
if a:cchar == 'c'
" Opening the quickfix window in multiple tab pages should reuse the
" quickfix buffer
***************
*** 443,448 ****
--- 457,466 ----
call assert_fails('Xnfile', err)
call assert_fails('Xpfile', err)
+ Xexpr ''
+ let cmd = (a:cchar == 'c') ? '$cc' : '$ll'
+ call assert_fails(cmd, 'E42:')
+
call s:create_test_file('Xqftestfile1')
call s:create_test_file('Xqftestfile2')
***************
*** 466,471 ****
--- 484,495 ----
call assert_equal(5, g:Xgetlist({'idx':0}).idx)
2Xcc
call assert_equal(2, g:Xgetlist({'idx':0}).idx)
+ if a:cchar == 'c'
+ cc
+ else
+ ll
+ endif
+ call assert_equal(2, g:Xgetlist({'idx':0}).idx)
10Xcc
call assert_equal(6, g:Xgetlist({'idx':0}).idx)
Xlast
***************
*** 474,479 ****
--- 498,511 ----
call assert_equal(11, line('.'))
call assert_fails('Xnext', 'E553')
call assert_fails('Xnfile', 'E553')
+ " To process the range using quickfix list entries, directly use the
+ " quickfix commands (don't use the user defined commands)
+ if a:cchar == 'c'
+ $cc
+ else
+ $ll
+ endif
+ call assert_equal(6, g:Xgetlist({'idx':0}).idx)
Xrewind
call assert_equal('Xqftestfile1', bufname('%'))
call assert_equal(5, line('.'))
***************
*** 577,582 ****
--- 609,634 ----
" This wipes out the buffer, make sure that doesn't cause trouble.
Xclose
+ " When the current window is vertically split, jumping to a help match
+ " should open the help window at the top.
+ only | enew
+ let w1 = win_getid()
+ vert new
+ let w2 = win_getid()
+ Xnext
+ let w3 = win_getid()
+ call assert_true(&buftype == 'help')
+ call assert_true(winnr() == 1)
+ call assert_equal(['col', [['leaf', w3],
+ \ ['row', [['leaf', w2], ['leaf', w1]]]]], winlayout())
+
+ new | only
+ set buftype=help
+ set modified
+ call assert_fails('Xnext', 'E37:')
+ set nomodified
+ new | only
+
if a:cchar == 'l'
" When a help window is present, running :lhelpgrep should reuse the
" help window and not the current window
***************
*** 1618,1626 ****
call assert_equal(winid, win_getid())
2cnext
call assert_equal(winid, win_getid())
- enew
set switchbuf=useopen
cfirst | cnext
call assert_equal(file1_winid, win_getid())
2cnext
--- 1670,1680 ----
call assert_equal(winid, win_getid())
2cnext
call assert_equal(winid, win_getid())
+ " Test for 'switchbuf' set to search for files in windows in the current
+ " tabpage and jump to an existing window (if present)
set switchbuf=useopen
+ enew
cfirst | cnext
call assert_equal(file1_winid, win_getid())
2cnext
***************
*** 1628,1633 ****
--- 1682,1689 ----
2cnext
call assert_equal(file2_winid, win_getid())
+ " Test for 'switchbuf' set to search for files in tabpages and jump to an
+ " existing tabpage (if present)
enew | only
set switchbuf=usetab
tabedit Xqftestfile1
***************
*** 1646,1651 ****
--- 1702,1708 ----
call assert_equal(4, tabpagenr())
tabfirst | tabonly | enew
+ " Test for 'switchbuf' set to open a new window for every file
set switchbuf=split
cfirst | cnext
call assert_equal(1, winnr('$'))
***************
*** 1653,1661 ****
call assert_equal(2, winnr('$'))
cnext | cnext
call assert_equal(3, winnr('$'))
- enew | only
set switchbuf=newtab
cfirst | cnext
call assert_equal(1, tabpagenr('$'))
cnext | cnext
--- 1710,1719 ----
call assert_equal(2, winnr('$'))
cnext | cnext
call assert_equal(3, winnr('$'))
+ " Test for 'switchbuf' set to open a new tabpage for every file
set switchbuf=newtab
+ enew | only
cfirst | cnext
call assert_equal(1, tabpagenr('$'))
cnext | cnext
***************
*** 1672,1677 ****
--- 1730,1737 ----
call assert_equal(last_winid, win_getid())
enew | only
+ " With an empty 'switchbuf', jumping to a quickfix entry should open the
+ " file in an existing window (if present)
set switchbuf=
edit Xqftestfile1
let file1_winid = win_getid()
***************
*** 1701,1706 ****
--- 1761,1792 ----
call assert_equal(4, tabpagenr())
tabfirst | tabonly | enew | only
+ " Jumping to a file that is not present in any of the tabpages and the
+ " current tabpage doesn't have any usable windows, should open it in a new
+ " window in the current tabpage.
+ copen | only
+ cfirst
+ call assert_equal(1, tabpagenr())
+ call assert_equal('Xqftestfile1', bufname(''))
+
+ " If opening a file changes 'switchbuf', then the new value should be
+ " retained.
+ call writefile(["vim: switchbuf=split"], 'Xqftestfile1')
+ enew | only
+ set switchbuf&vim
+ cexpr "Xqftestfile1:1:10"
+ call assert_equal('split', &switchbuf)
+ call writefile(["vim: switchbuf=usetab"], 'Xqftestfile1')
+ enew | only
+ set switchbuf=useopen
+ cexpr "Xqftestfile1:1:10"
+ call assert_equal('usetab', &switchbuf)
+ call writefile(["vim: switchbuf&vim"], 'Xqftestfile1')
+ enew | only
+ set switchbuf=useopen
+ cexpr "Xqftestfile1:1:10"
+ call assert_equal('', &switchbuf)
+
call delete('Xqftestfile1')
call delete('Xqftestfile2')
call delete('Xqftestfile3')
***************
*** 1727,1737 ****
call append(6, ['Buffer', 'Window'])
let l = g:Xgetlist()
-
call assert_equal(5, l[0].lnum)
call assert_equal(6, l[2].lnum)
call assert_equal(13, l[3].lnum)
enew!
call delete(fname)
endfunc
--- 1813,1828 ----
call append(6, ['Buffer', 'Window'])
let l = g:Xgetlist()
call assert_equal(5, l[0].lnum)
call assert_equal(6, l[2].lnum)
call assert_equal(13, l[3].lnum)
+ " If a file doesn't have any quickfix entries, then deleting lines in the
+ " file should not update the quickfix list
+ call g:Xsetlist([], 'f')
+ 1,2delete
+ call assert_equal([], g:Xgetlist())
+
enew!
call delete(fname)
endfunc
***************
*** 1755,1768 ****
enew! | only
set makeef&vim
silent Xgrep Grep_Test_Text: test_quickfix.vim
! call assert_true(len(g:Xgetlist()) == 3)
Xopen
call assert_true(w:quickfix_title =~ '^:grep')
Xclose
enew
set makeef=Temp_File_##
silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
! call assert_true(len(g:Xgetlist()) == 6)
endfunc
func Test_grep()
--- 1846,1866 ----
enew! | only
set makeef&vim
silent Xgrep Grep_Test_Text: test_quickfix.vim
! call assert_true(len(g:Xgetlist()) == 4)
Xopen
call assert_true(w:quickfix_title =~ '^:grep')
Xclose
enew
set makeef=Temp_File_##
silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
! call assert_true(len(g:Xgetlist()) == 7)
!
! call writefile(['Vim'], 'XtestTempFile')
! set makeef=XtestTempFile
! silent Xgrep Grep_Test_Text: test_quickfix.vim
! call assert_equal(4, len(g:Xgetlist()))
! call assert_false(filereadable('XtestTempFile'))
! set makeef&vim
endfunc
func Test_grep()
***************
*** 2446,2451 ****
--- 2544,2568 ----
call assert_true(winnr('$') == 2)
call assert_true(winnr() == 1)
+ " open the quickfix buffer in two windows and jump to an entry. Should open
+ " the file in the first quickfix window.
+ enew | only
+ copen
+ let bnum = bufnr('')
+ exe 'sbuffer ' . bnum
+ wincmd b
+ cfirst
+ call assert_equal(2, winnr())
+ call assert_equal('F1', bufname(''))
+ enew | only
+ exe 'sb' bnum
+ exe 'botright sb' bnum
+ wincmd t
+ clast
+ call assert_equal(2, winnr())
+ call assert_equal('quickfix', getwinvar(1, '&buftype'))
+ call assert_equal('quickfix', getwinvar(3, '&buftype'))
+
enew | only
set efm&vim
endfunc
***************
*** 2499,2505 ****
call assert_equal(2, len(l))
call assert_equal('Editor:Notepad NOTEPAD', l[0].text)
! Xvimgrep #\cvim#g Xtestfile?
let l = g:Xgetlist()
call assert_equal(2, len(l))
call assert_equal(8, l[0].col)
--- 2616,2622 ----
call assert_equal(2, len(l))
call assert_equal('Editor:Notepad NOTEPAD', l[0].text)
! 10Xvimgrep #\cvim#g Xtestfile?
let l = g:Xgetlist()
call assert_equal(2, len(l))
call assert_equal(8, l[0].col)
***************
*** 3524,3529 ****
--- 3641,3681 ----
call setqflist([], 'f')
endfunc
+ " Test for an autocmd changing the current directory when running vimgrep
+ func Xvimgrep_autocmd_cd(cchar)
+ call s:setup_commands(a:cchar)
+
+ %bwipe
+ let save_cwd = getcwd()
+
+ augroup QF_Test
+ au!
+ autocmd BufRead * silent cd %:p:h
+ augroup END
+
+ 10Xvimgrep /vim/ Xdir/**
+ let l = g:Xgetlist()
+ call assert_equal('f1.txt', bufname(l[0].bufnr))
+ call assert_equal('f2.txt', fnamemodify(bufname(l[2].bufnr), ':t'))
+
+ augroup QF_Test
+ au!
+ augroup END
+
+ exe 'cd ' . save_cwd
+ endfunc
+
+ func Test_vimgrep_autocmd_cd()
+ call mkdir('Xdir/a', 'p')
+ call mkdir('Xdir/b', 'p')
+ call writefile(['a_L1_vim', 'a_L2_vim'], 'Xdir/a/f1.txt')
+ call writefile(['b_L1_vim', 'b_L2_vim'], 'Xdir/b/f2.txt')
+ call Xvimgrep_autocmd_cd('c')
+ call Xvimgrep_autocmd_cd('l')
+ %bwipe
+ call delete('Xdir', 'rf')
+ endfunc
+
" The following test used to crash Vim
func Test_lhelpgrep_autocmd()
lhelpgrep quickfix
*** ../vim-8.1.2319/src/version.c 2019-11-18 21:38:33.747362315 +0100
--- src/version.c 2019-11-18 22:01:34.484602446 +0100
***************
*** 743,744 ****
--- 743,746 ----
{ /* Add new patch number below this line */
+ /**/
+ 2320,
/**/
--
>From "know your smileys":
% Bike accident. A bit far-fetched, I suppose; although...
o _ _ _
_o /\_ _ \\o (_)\__/o (_)
_< \_ _>(_) (_)/<_ \_| \ _|/' \/
(_)>(_) (_) (_) (_) (_)' _\o_
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/201911182102.xAIL2jDs018544%40masaka.moolenaar.net.