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 -- b...@moolenaar.net -- 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 vim_dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/201911182102.xAIL2jDs018544%40masaka.moolenaar.net.

Raspunde prin e-mail lui