mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:8.2.4462: not enough testing for quickfix code
Problem: Not enough testing for quickfix code.
Solution: Add more tests. Fix uncovered problem. (Yegappan Lakshmanan,
closes vim/vim#9839)
9c9be05b17
Omit Test_helpgrep_vim9_restore_cpo().
Cherry-pick test_quickfix.vim change from patch 8.2.0644.
This commit is contained in:
parent
73bdfdd382
commit
cd1e0bb87d
@ -1790,7 +1790,7 @@ void check_quickfix_busy(void)
|
|||||||
/// @param type type character
|
/// @param type type character
|
||||||
/// @param valid valid entry
|
/// @param valid valid entry
|
||||||
///
|
///
|
||||||
/// @returns QF_OK or QF_FAIL.
|
/// @return QF_OK on success or QF_FAIL on failure.
|
||||||
static int qf_add_entry(qf_list_T *qfl, char *dir, char *fname, char *module, int bufnum,
|
static int qf_add_entry(qf_list_T *qfl, char *dir, char *fname, char *module, int bufnum,
|
||||||
char *mesg, linenr_T lnum, linenr_T end_lnum, int col, int end_col,
|
char *mesg, linenr_T lnum, linenr_T end_lnum, int col, int end_col,
|
||||||
char vis_col, char *pattern, int nr, char type, char valid)
|
char vis_col, char *pattern, int nr, char type, char valid)
|
||||||
@ -3461,12 +3461,10 @@ void qf_view_result(bool split)
|
|||||||
{
|
{
|
||||||
qf_info_T *qi = &ql_info;
|
qf_info_T *qi = &ql_info;
|
||||||
|
|
||||||
if (!bt_quickfix(curbuf)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (IS_LL_WINDOW(curwin)) {
|
if (IS_LL_WINDOW(curwin)) {
|
||||||
qi = GET_LOC_LIST(curwin);
|
qi = GET_LOC_LIST(curwin);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qf_list_empty(qf_get_curlist(qi))) {
|
if (qf_list_empty(qf_get_curlist(qi))) {
|
||||||
emsg(_(e_no_errors));
|
emsg(_(e_no_errors));
|
||||||
return;
|
return;
|
||||||
@ -3869,7 +3867,12 @@ static void qf_update_buffer(qf_info_T *qi, qfline_T *old_last)
|
|||||||
if (curwin->w_llist == qi) {
|
if (curwin->w_llist == qi) {
|
||||||
win = curwin;
|
win = curwin;
|
||||||
} else {
|
} else {
|
||||||
|
// Find the file window (non-quickfix) with this location list
|
||||||
win = qf_find_win_with_loclist(qi);
|
win = qf_find_win_with_loclist(qi);
|
||||||
|
if (win == NULL) {
|
||||||
|
// File window is not found. Find the location list window.
|
||||||
|
win = qf_find_win(qi);
|
||||||
|
}
|
||||||
if (win == NULL) {
|
if (win == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -7142,7 +7145,9 @@ void ex_helpgrep(exarg_T *eap)
|
|||||||
if (new_qi) {
|
if (new_qi) {
|
||||||
ll_free_all(&qi);
|
ll_free_all(&qi);
|
||||||
}
|
}
|
||||||
} else if (curwin->w_llist == NULL) {
|
} else if (curwin->w_llist == NULL && new_qi) {
|
||||||
|
// current window didn't have a location list associated with it
|
||||||
|
// before. Associate the new location list now.
|
||||||
curwin->w_llist = qi;
|
curwin->w_llist = qi;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -107,3 +107,19 @@ func Test_make()
|
|||||||
lclose
|
lclose
|
||||||
endfor
|
endfor
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test for an error file with a long line that needs an encoding conversion
|
||||||
|
func Test_longline_conversion()
|
||||||
|
new
|
||||||
|
call setline(1, ['Xfile:10:' .. repeat("\xe0", 2000)])
|
||||||
|
write ++enc=latin1 Xerr.out
|
||||||
|
bw!
|
||||||
|
set errorformat&
|
||||||
|
set makeencoding=latin1
|
||||||
|
cfile Xerr.out
|
||||||
|
call assert_equal(repeat("\u00e0", 2000), getqflist()[0].text)
|
||||||
|
call delete('Xerr.out')
|
||||||
|
set makeencoding&
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@ -261,6 +261,7 @@ func XwindowTests(cchar)
|
|||||||
" Opening the location list window without any errors should fail
|
" Opening the location list window without any errors should fail
|
||||||
if a:cchar == 'l'
|
if a:cchar == 'l'
|
||||||
call assert_fails('lopen', 'E776:')
|
call assert_fails('lopen', 'E776:')
|
||||||
|
call assert_fails('lwindow', 'E776:')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Create a list with no valid entries
|
" Create a list with no valid entries
|
||||||
@ -714,6 +715,8 @@ func Test_helpgrep()
|
|||||||
call s:test_xhelpgrep('l')
|
call s:test_xhelpgrep('l')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" When running the :helpgrep command, if an autocmd modifies the 'cpoptions'
|
||||||
|
" value, then Vim crashes. (issue fixed by 7.2b-004 and 8.2.4453)
|
||||||
func Test_helpgrep_restore_cpo_aucmd()
|
func Test_helpgrep_restore_cpo_aucmd()
|
||||||
let save_cpo = &cpo
|
let save_cpo = &cpo
|
||||||
augroup QF_Test
|
augroup QF_Test
|
||||||
@ -1237,8 +1240,14 @@ func Xinvalid_efm_Tests(cchar)
|
|||||||
set efm=
|
set efm=
|
||||||
call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E378:')
|
call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E378:')
|
||||||
|
|
||||||
|
" Empty directory name. When there is an error in parsing new entries, make
|
||||||
|
" sure the previous quickfix list is made the current list.
|
||||||
|
set efm&
|
||||||
|
cexpr ["one", "two"]
|
||||||
|
let qf_id = getqflist(#{id: 0}).id
|
||||||
set efm=%DEntering\ dir\ abc,%f:%l:%m
|
set efm=%DEntering\ dir\ abc,%f:%l:%m
|
||||||
call assert_fails('Xexpr ["Entering dir abc", "abc.txt:1:Hello world"]', 'E379:')
|
call assert_fails('Xexpr ["Entering dir abc", "abc.txt:1:Hello world"]', 'E379:')
|
||||||
|
call assert_equal(qf_id, getqflist(#{id: 0}).id)
|
||||||
|
|
||||||
let &efm = save_efm
|
let &efm = save_efm
|
||||||
endfunc
|
endfunc
|
||||||
@ -1492,7 +1501,7 @@ func XquickfixChangedByAutocmd(cchar)
|
|||||||
endfunc
|
endfunc
|
||||||
endif
|
endif
|
||||||
|
|
||||||
augroup testgroup
|
augroup QF_Test
|
||||||
au!
|
au!
|
||||||
autocmd BufReadCmd test_changed.txt call ReadFunc()
|
autocmd BufReadCmd test_changed.txt call ReadFunc()
|
||||||
augroup END
|
augroup END
|
||||||
@ -1506,7 +1515,24 @@ func XquickfixChangedByAutocmd(cchar)
|
|||||||
endfor
|
endfor
|
||||||
call assert_fails('Xrewind', ErrorNr . ':')
|
call assert_fails('Xrewind', ErrorNr . ':')
|
||||||
|
|
||||||
augroup! testgroup
|
augroup QF_Test
|
||||||
|
au!
|
||||||
|
augroup END
|
||||||
|
|
||||||
|
if a:cchar == 'c'
|
||||||
|
cexpr ["Xtest1:1:Line"]
|
||||||
|
cwindow
|
||||||
|
only
|
||||||
|
augroup QF_Test
|
||||||
|
au!
|
||||||
|
autocmd WinEnter * call setqflist([], 'f')
|
||||||
|
augroup END
|
||||||
|
call assert_fails('exe "normal \<CR>"', 'E925:')
|
||||||
|
augroup QF_Test
|
||||||
|
au!
|
||||||
|
augroup END
|
||||||
|
endif
|
||||||
|
%bw!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_quickfix_was_changed_by_autocmd()
|
func Test_quickfix_was_changed_by_autocmd()
|
||||||
@ -1644,6 +1670,9 @@ func SetXlistTests(cchar, bnum)
|
|||||||
\ " {'bufnr':999, 'lnum':5}])", 'E92:')
|
\ " {'bufnr':999, 'lnum':5}])", 'E92:')
|
||||||
call g:Xsetlist([[1, 2,3]])
|
call g:Xsetlist([[1, 2,3]])
|
||||||
call assert_equal(0, len(g:Xgetlist()))
|
call assert_equal(0, len(g:Xgetlist()))
|
||||||
|
call assert_fails('call g:Xsetlist([], [])', 'E928:')
|
||||||
|
call g:Xsetlist([v:_null_dict])
|
||||||
|
call assert_equal([], g:Xgetlist())
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_setqflist()
|
func Test_setqflist()
|
||||||
@ -2917,6 +2946,19 @@ func XvimgrepTests(cchar)
|
|||||||
call assert_equal(0, getbufinfo('Xtestfile1')[0].loaded)
|
call assert_equal(0, getbufinfo('Xtestfile1')[0].loaded)
|
||||||
call assert_equal([], getbufinfo('Xtestfile2'))
|
call assert_equal([], getbufinfo('Xtestfile2'))
|
||||||
|
|
||||||
|
" Test for opening the dummy buffer used by vimgrep in a window. The new
|
||||||
|
" window should be closed
|
||||||
|
%bw!
|
||||||
|
augroup QF_Test
|
||||||
|
au!
|
||||||
|
autocmd BufReadPre * exe "sb " .. expand("<abuf>")
|
||||||
|
augroup END
|
||||||
|
call assert_fails("Xvimgrep /sublime/ Xtestfile1", 'E480:')
|
||||||
|
call assert_equal(1, winnr('$'))
|
||||||
|
augroup QF_Test
|
||||||
|
au!
|
||||||
|
augroup END
|
||||||
|
|
||||||
call delete('Xtestfile1')
|
call delete('Xtestfile1')
|
||||||
call delete('Xtestfile2')
|
call delete('Xtestfile2')
|
||||||
endfunc
|
endfunc
|
||||||
@ -4088,14 +4130,19 @@ endfunc
|
|||||||
" The following test used to crash Vim
|
" The following test used to crash Vim
|
||||||
func Test_lhelpgrep_autocmd()
|
func Test_lhelpgrep_autocmd()
|
||||||
lhelpgrep quickfix
|
lhelpgrep quickfix
|
||||||
autocmd QuickFixCmdPost * call setloclist(0, [], 'f')
|
augroup QF_Test
|
||||||
|
au!
|
||||||
|
autocmd QuickFixCmdPost * call setloclist(0, [], 'f')
|
||||||
|
augroup END
|
||||||
lhelpgrep buffer
|
lhelpgrep buffer
|
||||||
call assert_equal('help', &filetype)
|
call assert_equal('help', &filetype)
|
||||||
call assert_equal(0, getloclist(0, {'nr' : '$'}).nr)
|
call assert_equal(0, getloclist(0, {'nr' : '$'}).nr)
|
||||||
lhelpgrep tabpage
|
lhelpgrep tabpage
|
||||||
call assert_equal('help', &filetype)
|
call assert_equal('help', &filetype)
|
||||||
call assert_equal(1, getloclist(0, {'nr' : '$'}).nr)
|
call assert_equal(1, getloclist(0, {'nr' : '$'}).nr)
|
||||||
au! QuickFixCmdPost
|
augroup QF_Test
|
||||||
|
au!
|
||||||
|
augroup END
|
||||||
|
|
||||||
new | only
|
new | only
|
||||||
augroup QF_Test
|
augroup QF_Test
|
||||||
@ -4108,7 +4155,7 @@ func Test_lhelpgrep_autocmd()
|
|||||||
wincmd w
|
wincmd w
|
||||||
call assert_fails('helpgrep quickfix', 'E925:')
|
call assert_fails('helpgrep quickfix', 'E925:')
|
||||||
augroup QF_Test
|
augroup QF_Test
|
||||||
au! BufEnter
|
au!
|
||||||
augroup END
|
augroup END
|
||||||
|
|
||||||
new | only
|
new | only
|
||||||
@ -4118,7 +4165,7 @@ func Test_lhelpgrep_autocmd()
|
|||||||
augroup END
|
augroup END
|
||||||
call assert_fails('helpgrep quickfix', 'E925:')
|
call assert_fails('helpgrep quickfix', 'E925:')
|
||||||
augroup QF_Test
|
augroup QF_Test
|
||||||
au! BufEnter
|
au!
|
||||||
augroup END
|
augroup END
|
||||||
|
|
||||||
new | only
|
new | only
|
||||||
@ -4128,10 +4175,43 @@ func Test_lhelpgrep_autocmd()
|
|||||||
augroup END
|
augroup END
|
||||||
call assert_fails('lhelpgrep quickfix', 'E926:')
|
call assert_fails('lhelpgrep quickfix', 'E926:')
|
||||||
augroup QF_Test
|
augroup QF_Test
|
||||||
au! BufEnter
|
au!
|
||||||
augroup END
|
augroup END
|
||||||
|
|
||||||
|
" Replace the contents of a help window location list when it is still in
|
||||||
|
" use.
|
||||||
new | only
|
new | only
|
||||||
|
lhelpgrep quickfix
|
||||||
|
wincmd w
|
||||||
|
augroup QF_Test
|
||||||
|
au!
|
||||||
|
autocmd WinEnter * call setloclist(0, [], 'r')
|
||||||
|
augroup END
|
||||||
|
call assert_fails('lhelpgrep win_getid', 'E926:')
|
||||||
|
augroup QF_Test
|
||||||
|
au!
|
||||||
|
augroup END
|
||||||
|
|
||||||
|
%bw!
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" The following test used to crash Vim
|
||||||
|
func Test_lhelpgrep_autocmd_free_loclist()
|
||||||
|
%bw!
|
||||||
|
lhelpgrep quickfix
|
||||||
|
wincmd w
|
||||||
|
augroup QF_Test
|
||||||
|
au!
|
||||||
|
autocmd WinEnter * call setloclist(0, [], 'f')
|
||||||
|
augroup END
|
||||||
|
lhelpgrep win_getid
|
||||||
|
wincmd w
|
||||||
|
wincmd w
|
||||||
|
wincmd w
|
||||||
|
augroup QF_Test
|
||||||
|
au!
|
||||||
|
augroup END
|
||||||
|
%bw!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
" Test for shortening/simplifying the file name when opening the
|
" Test for shortening/simplifying the file name when opening the
|
||||||
@ -5322,6 +5402,7 @@ func Xtest_getqflist_by_idx(cchar)
|
|||||||
call assert_equal('L20', l[0].text)
|
call assert_equal('L20', l[0].text)
|
||||||
call assert_equal([], g:Xgetlist({'idx' : -1, 'items' : 0}).items)
|
call assert_equal([], g:Xgetlist({'idx' : -1, 'items' : 0}).items)
|
||||||
call assert_equal([], g:Xgetlist({'idx' : 3, 'items' : 0}).items)
|
call assert_equal([], g:Xgetlist({'idx' : 3, 'items' : 0}).items)
|
||||||
|
call assert_equal({}, g:Xgetlist(#{idx: "abc"}))
|
||||||
%bwipe!
|
%bwipe!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
@ -5380,6 +5461,19 @@ func Xtest_qftextfunc(cchar)
|
|||||||
call assert_equal('F1|10 col 2-7| green', getline(1))
|
call assert_equal('F1|10 col 2-7| green', getline(1))
|
||||||
call assert_equal('F1|20-25 col 4-8| blue', getline(2))
|
call assert_equal('F1|20-25 col 4-8| blue', getline(2))
|
||||||
Xclose
|
Xclose
|
||||||
|
|
||||||
|
set efm=%f:%l:%c:%m
|
||||||
|
set quickfixtextfunc=Tqfexpr
|
||||||
|
" Update the list with only the cwindow
|
||||||
|
Xwindow
|
||||||
|
only
|
||||||
|
call g:Xsetlist([
|
||||||
|
\ { 'filename': 'F2', 'lnum': 20, 'col': 2,
|
||||||
|
\ 'end_col': 7, 'text': 'red'}
|
||||||
|
\ ])
|
||||||
|
call assert_equal(['F2-L20C2-red'], getline(1, '$'))
|
||||||
|
new
|
||||||
|
Xclose
|
||||||
set efm&
|
set efm&
|
||||||
set quickfixtextfunc&
|
set quickfixtextfunc&
|
||||||
|
|
||||||
@ -5687,5 +5781,62 @@ func Test_lopen_bwipe_all()
|
|||||||
call delete('Xresult')
|
call delete('Xresult')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test for calling setqflist() function recursively
|
||||||
|
func Test_recursive_setqflist()
|
||||||
|
augroup QF_Test
|
||||||
|
au!
|
||||||
|
autocmd BufWinEnter quickfix call setqflist([], 'r')
|
||||||
|
augroup END
|
||||||
|
|
||||||
|
copen
|
||||||
|
call assert_fails("call setqflist([], 'a')", 'E952:')
|
||||||
|
|
||||||
|
augroup QF_Test
|
||||||
|
au!
|
||||||
|
augroup END
|
||||||
|
%bw!
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" Test for failure to create a new window when selecting a file from the
|
||||||
|
" quickfix window
|
||||||
|
func Test_cwindow_newwin_fails()
|
||||||
|
cgetexpr ["Xfile1:10:L10", "Xfile1:20:L20"]
|
||||||
|
cwindow
|
||||||
|
only
|
||||||
|
let qf_wid = win_getid()
|
||||||
|
" create the maximum number of scratch windows
|
||||||
|
let hor_win_count = (&lines - 1)/2
|
||||||
|
let hor_split_count = hor_win_count - 1
|
||||||
|
for s in range(1, hor_split_count) | new | set buftype=nofile | endfor
|
||||||
|
call win_gotoid(qf_wid)
|
||||||
|
call assert_fails('exe "normal \<CR>"', 'E36:')
|
||||||
|
%bw!
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" Test for updating the location list when only the location list window is
|
||||||
|
" present and the corresponding file window is closed.
|
||||||
|
func Test_loclist_update_with_llwin_only()
|
||||||
|
%bw!
|
||||||
|
new
|
||||||
|
wincmd w
|
||||||
|
lexpr ["Xfile1:1:Line1"]
|
||||||
|
lopen
|
||||||
|
wincmd p
|
||||||
|
close
|
||||||
|
call setloclist(2, [], 'r', {'lines': ["Xtest2:2:Line2"]})
|
||||||
|
call assert_equal(['Xtest2|2| Line2'], getbufline(winbufnr(2), 1, '$'))
|
||||||
|
%bw!
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" Test for getting the quickfix list after a buffer with an error is wiped out
|
||||||
|
func Test_getqflist_wiped_out_buffer()
|
||||||
|
%bw!
|
||||||
|
cexpr ["Xtest1:34:Wiped out"]
|
||||||
|
let bnum = bufnr('Xtest1')
|
||||||
|
call assert_equal(bnum, getqflist()[0].bufnr)
|
||||||
|
bw Xtest1
|
||||||
|
call assert_equal(0, getqflist()[0].bufnr)
|
||||||
|
%bw!
|
||||||
|
endfunc
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@ -4913,7 +4913,7 @@ win_T *buf_jump_open_win(buf_T *buf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Jump to the first open window in any tab page that contains buffer "buf",
|
/// Jump to the first open window in any tab page that contains buffer "buf",
|
||||||
/// if one exists.
|
/// if one exists. First search in the windows present in the current tab page.
|
||||||
/// @return the found window, or NULL.
|
/// @return the found window, or NULL.
|
||||||
win_T *buf_jump_open_tab(buf_T *buf)
|
win_T *buf_jump_open_tab(buf_T *buf)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user