1eeb1b9c7SBram Moolenaar" Test for the quickfix feature. 2da59dd5dSBram Moolenaar 3b46fecd3SBram Moolenaarsource check.vim 4b46fecd3SBram MoolenaarCheckFeature quickfix 5da59dd5dSBram Moolenaar 6e00fdf35SBram Moolenaarsource screendump.vim 7e00fdf35SBram Moolenaar 87eba3d2cSBram Moolenaarset encoding=utf-8 97eba3d2cSBram Moolenaar 102b946c9fSBram Moolenaarfunc s:setup_commands(cchar) 113ef5bf7dSBram Moolenaar if a:cchar == 'c' 123ef5bf7dSBram Moolenaar command! -nargs=* -bang Xlist <mods>clist<bang> <args> 133ef5bf7dSBram Moolenaar command! -nargs=* Xgetexpr <mods>cgetexpr <args> 14361c8f0eSBram Moolenaar command! -nargs=* Xaddexpr <mods>caddexpr <args> 1555b69264SBram Moolenaar command! -nargs=* -count Xolder <mods><count>colder <args> 163ef5bf7dSBram Moolenaar command! -nargs=* Xnewer <mods>cnewer <args> 173ef5bf7dSBram Moolenaar command! -nargs=* Xopen <mods> copen <args> 183ef5bf7dSBram Moolenaar command! -nargs=* Xwindow <mods>cwindow <args> 19537ef084SBram Moolenaar command! -nargs=* Xbottom <mods>cbottom <args> 203ef5bf7dSBram Moolenaar command! -nargs=* Xclose <mods>cclose <args> 213ef5bf7dSBram Moolenaar command! -nargs=* -bang Xfile <mods>cfile<bang> <args> 223ef5bf7dSBram Moolenaar command! -nargs=* Xgetfile <mods>cgetfile <args> 233ef5bf7dSBram Moolenaar command! -nargs=* Xaddfile <mods>caddfile <args> 243ef5bf7dSBram Moolenaar command! -nargs=* -bang Xbuffer <mods>cbuffer<bang> <args> 253ef5bf7dSBram Moolenaar command! -nargs=* Xgetbuffer <mods>cgetbuffer <args> 263ef5bf7dSBram Moolenaar command! -nargs=* Xaddbuffer <mods>caddbuffer <args> 273ef5bf7dSBram Moolenaar command! -nargs=* Xrewind <mods>crewind <args> 2899895eacSBram Moolenaar command! -count -nargs=* -bang Xnext <mods><count>cnext<bang> <args> 2999895eacSBram Moolenaar command! -count -nargs=* -bang Xprev <mods><count>cprev<bang> <args> 300fcc7c6dSBram Moolenaar command! -nargs=* -bang Xfirst <mods>cfirst<bang> <args> 310fcc7c6dSBram Moolenaar command! -nargs=* -bang Xlast <mods>clast<bang> <args> 3225190db2SBram Moolenaar command! -count -nargs=* -bang Xnfile <mods><count>cnfile<bang> <args> 330fcc7c6dSBram Moolenaar command! -nargs=* -bang Xpfile <mods>cpfile<bang> <args> 343ef5bf7dSBram Moolenaar command! -nargs=* Xexpr <mods>cexpr <args> 35f9ae154cSBram Moolenaar command! -count -nargs=* Xvimgrep <mods> <count>vimgrep <args> 36ee85df37SBram Moolenaar command! -nargs=* Xvimgrepadd <mods> vimgrepadd <args> 37049cba9eSBram Moolenaar command! -nargs=* Xgrep <mods> grep <args> 38049cba9eSBram Moolenaar command! -nargs=* Xgrepadd <mods> grepadd <args> 39049cba9eSBram Moolenaar command! -nargs=* Xhelpgrep helpgrep <args> 4074240d3fSBram Moolenaar command! -nargs=0 -count Xcc <count>cc 413ff33114SBram Moolenaar command! -count=1 -nargs=0 Xbelow <mods><count>cbelow 423ff33114SBram Moolenaar command! -count=1 -nargs=0 Xabove <mods><count>cabove 43cf6a55c4SBram Moolenaar command! -count=1 -nargs=0 Xbefore <mods><count>cbefore 44cf6a55c4SBram Moolenaar command! -count=1 -nargs=0 Xafter <mods><count>cafter 453ef5bf7dSBram Moolenaar let g:Xgetlist = function('getqflist') 463ef5bf7dSBram Moolenaar let g:Xsetlist = function('setqflist') 47b6fa30ccSBram Moolenaar call setqflist([], 'f') 483ef5bf7dSBram Moolenaar else 493ef5bf7dSBram Moolenaar command! -nargs=* -bang Xlist <mods>llist<bang> <args> 503ef5bf7dSBram Moolenaar command! -nargs=* Xgetexpr <mods>lgetexpr <args> 51361c8f0eSBram Moolenaar command! -nargs=* Xaddexpr <mods>laddexpr <args> 5255b69264SBram Moolenaar command! -nargs=* -count Xolder <mods><count>lolder <args> 533ef5bf7dSBram Moolenaar command! -nargs=* Xnewer <mods>lnewer <args> 543ef5bf7dSBram Moolenaar command! -nargs=* Xopen <mods> lopen <args> 553ef5bf7dSBram Moolenaar command! -nargs=* Xwindow <mods>lwindow <args> 56537ef084SBram Moolenaar command! -nargs=* Xbottom <mods>lbottom <args> 573ef5bf7dSBram Moolenaar command! -nargs=* Xclose <mods>lclose <args> 583ef5bf7dSBram Moolenaar command! -nargs=* -bang Xfile <mods>lfile<bang> <args> 593ef5bf7dSBram Moolenaar command! -nargs=* Xgetfile <mods>lgetfile <args> 603ef5bf7dSBram Moolenaar command! -nargs=* Xaddfile <mods>laddfile <args> 613ef5bf7dSBram Moolenaar command! -nargs=* -bang Xbuffer <mods>lbuffer<bang> <args> 623ef5bf7dSBram Moolenaar command! -nargs=* Xgetbuffer <mods>lgetbuffer <args> 633ef5bf7dSBram Moolenaar command! -nargs=* Xaddbuffer <mods>laddbuffer <args> 643ef5bf7dSBram Moolenaar command! -nargs=* Xrewind <mods>lrewind <args> 6599895eacSBram Moolenaar command! -count -nargs=* -bang Xnext <mods><count>lnext<bang> <args> 6699895eacSBram Moolenaar command! -count -nargs=* -bang Xprev <mods><count>lprev<bang> <args> 670fcc7c6dSBram Moolenaar command! -nargs=* -bang Xfirst <mods>lfirst<bang> <args> 680fcc7c6dSBram Moolenaar command! -nargs=* -bang Xlast <mods>llast<bang> <args> 6925190db2SBram Moolenaar command! -count -nargs=* -bang Xnfile <mods><count>lnfile<bang> <args> 700fcc7c6dSBram Moolenaar command! -nargs=* -bang Xpfile <mods>lpfile<bang> <args> 713ef5bf7dSBram Moolenaar command! -nargs=* Xexpr <mods>lexpr <args> 72f9ae154cSBram Moolenaar command! -count -nargs=* Xvimgrep <mods> <count>lvimgrep <args> 73ee85df37SBram Moolenaar command! -nargs=* Xvimgrepadd <mods> lvimgrepadd <args> 74049cba9eSBram Moolenaar command! -nargs=* Xgrep <mods> lgrep <args> 75049cba9eSBram Moolenaar command! -nargs=* Xgrepadd <mods> lgrepadd <args> 76049cba9eSBram Moolenaar command! -nargs=* Xhelpgrep lhelpgrep <args> 7774240d3fSBram Moolenaar command! -nargs=0 -count Xcc <count>ll 783ff33114SBram Moolenaar command! -count=1 -nargs=0 Xbelow <mods><count>lbelow 793ff33114SBram Moolenaar command! -count=1 -nargs=0 Xabove <mods><count>labove 80cf6a55c4SBram Moolenaar command! -count=1 -nargs=0 Xbefore <mods><count>lbefore 81cf6a55c4SBram Moolenaar command! -count=1 -nargs=0 Xafter <mods><count>lafter 823ef5bf7dSBram Moolenaar let g:Xgetlist = function('getloclist', [0]) 833ef5bf7dSBram Moolenaar let g:Xsetlist = function('setloclist', [0]) 84b6fa30ccSBram Moolenaar call setloclist(0, [], 'f') 853ef5bf7dSBram Moolenaar endif 862b946c9fSBram Moolenaarendfunc 873ef5bf7dSBram Moolenaar 88da59dd5dSBram Moolenaar" Tests for the :clist and :llist commands 892b946c9fSBram Moolenaarfunc XlistTests(cchar) 903ef5bf7dSBram Moolenaar call s:setup_commands(a:cchar) 91da59dd5dSBram Moolenaar 92b6fa30ccSBram Moolenaar if a:cchar == 'l' 93b6fa30ccSBram Moolenaar call assert_fails('llist', 'E776:') 94b6fa30ccSBram Moolenaar endif 95da59dd5dSBram Moolenaar " With an empty list, command should return error 963ef5bf7dSBram Moolenaar Xgetexpr [] 973ef5bf7dSBram Moolenaar silent! Xlist 98da59dd5dSBram Moolenaar call assert_true(v:errmsg ==# 'E42: No Errors') 99da59dd5dSBram Moolenaar 100da59dd5dSBram Moolenaar " Populate the list and then try 1013ef5bf7dSBram Moolenaar Xgetexpr ['non-error 1', 'Xtestfile1:1:3:Line1', 102da59dd5dSBram Moolenaar \ 'non-error 2', 'Xtestfile2:2:2:Line2', 10388a3e2b2SBram Moolenaar \ 'non-error| 3', 'Xtestfile3:3:1:Line3'] 104da59dd5dSBram Moolenaar 105da59dd5dSBram Moolenaar " List only valid entries 106ee85df37SBram Moolenaar let l = split(execute('Xlist', ''), "\n") 107da59dd5dSBram Moolenaar call assert_equal([' 2 Xtestfile1:1 col 3: Line1', 108da59dd5dSBram Moolenaar \ ' 4 Xtestfile2:2 col 2: Line2', 109da59dd5dSBram Moolenaar \ ' 6 Xtestfile3:3 col 1: Line3'], l) 110da59dd5dSBram Moolenaar 111da59dd5dSBram Moolenaar " List all the entries 112ee85df37SBram Moolenaar let l = split(execute('Xlist!', ''), "\n") 113da59dd5dSBram Moolenaar call assert_equal([' 1: non-error 1', ' 2 Xtestfile1:1 col 3: Line1', 114da59dd5dSBram Moolenaar \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2', 11588a3e2b2SBram Moolenaar \ ' 5: non-error| 3', ' 6 Xtestfile3:3 col 1: Line3'], l) 116da59dd5dSBram Moolenaar 117da59dd5dSBram Moolenaar " List a range of errors 118ee85df37SBram Moolenaar let l = split(execute('Xlist 3,6', ''), "\n") 119da59dd5dSBram Moolenaar call assert_equal([' 4 Xtestfile2:2 col 2: Line2', 120da59dd5dSBram Moolenaar \ ' 6 Xtestfile3:3 col 1: Line3'], l) 121da59dd5dSBram Moolenaar 122ee85df37SBram Moolenaar let l = split(execute('Xlist! 3,4', ''), "\n") 123da59dd5dSBram Moolenaar call assert_equal([' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l) 124da59dd5dSBram Moolenaar 125ee85df37SBram Moolenaar let l = split(execute('Xlist -6,-4', ''), "\n") 126da59dd5dSBram Moolenaar call assert_equal([' 2 Xtestfile1:1 col 3: Line1'], l) 127da59dd5dSBram Moolenaar 128ee85df37SBram Moolenaar let l = split(execute('Xlist! -5,-3', ''), "\n") 129da59dd5dSBram Moolenaar call assert_equal([' 2 Xtestfile1:1 col 3: Line1', 130da59dd5dSBram Moolenaar \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l) 131391b1dd0SBram Moolenaar 132391b1dd0SBram Moolenaar " Test for '+' 133ee85df37SBram Moolenaar let l = split(execute('Xlist! +2', ''), "\n") 134391b1dd0SBram Moolenaar call assert_equal([' 2 Xtestfile1:1 col 3: Line1', 135391b1dd0SBram Moolenaar \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l) 136ee85df37SBram Moolenaar 137ee85df37SBram Moolenaar " Different types of errors 138ee85df37SBram Moolenaar call g:Xsetlist([{'lnum':10,'col':5,'type':'W', 'text':'Warning','nr':11}, 139ee85df37SBram Moolenaar \ {'lnum':20,'col':10,'type':'e','text':'Error','nr':22}, 140ee85df37SBram Moolenaar \ {'lnum':30,'col':15,'type':'i','text':'Info','nr':33}, 141ee85df37SBram Moolenaar \ {'lnum':40,'col':20,'type':'x', 'text':'Other','nr':44}, 142ee85df37SBram Moolenaar \ {'lnum':50,'col':25,'type':"\<C-A>",'text':'one','nr':55}]) 143ee85df37SBram Moolenaar let l = split(execute('Xlist', ""), "\n") 144ee85df37SBram Moolenaar call assert_equal([' 1:10 col 5 warning 11: Warning', 145ee85df37SBram Moolenaar \ ' 2:20 col 10 error 22: Error', 146ee85df37SBram Moolenaar \ ' 3:30 col 15 info 33: Info', 147ee85df37SBram Moolenaar \ ' 4:40 col 20 x 44: Other', 148ee85df37SBram Moolenaar \ ' 5:50 col 25 55: one'], l) 149ee85df37SBram Moolenaar 150d76ce852SBram Moolenaar " Test for module names, one needs to explicitly set `'valid':v:true` so 151d76ce852SBram Moolenaar call g:Xsetlist([ 152d76ce852SBram Moolenaar \ {'lnum':10,'col':5,'type':'W','module':'Data.Text','text':'ModuleWarning','nr':11,'valid':v:true}, 153d76ce852SBram Moolenaar \ {'lnum':20,'col':10,'type':'W','module':'Data.Text','filename':'Data/Text.hs','text':'ModuleWarning','nr':22,'valid':v:true}, 154d76ce852SBram Moolenaar \ {'lnum':30,'col':15,'type':'W','filename':'Data/Text.hs','text':'FileWarning','nr':33,'valid':v:true}]) 155d76ce852SBram Moolenaar let l = split(execute('Xlist', ""), "\n") 156d76ce852SBram Moolenaar call assert_equal([' 1 Data.Text:10 col 5 warning 11: ModuleWarning', 157d76ce852SBram Moolenaar \ ' 2 Data.Text:20 col 10 warning 22: ModuleWarning', 158d76ce852SBram Moolenaar \ ' 3 Data/Text.hs:30 col 15 warning 33: FileWarning'], l) 159d76ce852SBram Moolenaar 160f9ae154cSBram Moolenaar " For help entries in the quickfix list, only the filename without directory 161f9ae154cSBram Moolenaar " should be displayed 162f9ae154cSBram Moolenaar Xhelpgrep setqflist() 163f9ae154cSBram Moolenaar let l = split(execute('Xlist 1', ''), "\n") 164f9ae154cSBram Moolenaar call assert_match('^ 1 [^\\/]\{-}:', l[0]) 165f9ae154cSBram Moolenaar 166ee85df37SBram Moolenaar " Error cases 167ee85df37SBram Moolenaar call assert_fails('Xlist abc', 'E488:') 1682b946c9fSBram Moolenaarendfunc 169da59dd5dSBram Moolenaar 1702b946c9fSBram Moolenaarfunc Test_clist() 171da59dd5dSBram Moolenaar call XlistTests('c') 172da59dd5dSBram Moolenaar call XlistTests('l') 1732b946c9fSBram Moolenaarendfunc 174da59dd5dSBram Moolenaar 175da59dd5dSBram Moolenaar" Tests for the :colder, :cnewer, :lolder and :lnewer commands 176da59dd5dSBram Moolenaar" Note that this test assumes that a quickfix/location list is 177cfc0a350SBram Moolenaar" already set by the caller. 1782b946c9fSBram Moolenaarfunc XageTests(cchar) 1793ef5bf7dSBram Moolenaar call s:setup_commands(a:cchar) 180da59dd5dSBram Moolenaar 18187f59b09SBram Moolenaar if a:cchar == 'l' 18287f59b09SBram Moolenaar " No location list for the current window 18387f59b09SBram Moolenaar call assert_fails('lolder', 'E776:') 18487f59b09SBram Moolenaar call assert_fails('lnewer', 'E776:') 18587f59b09SBram Moolenaar endif 18687f59b09SBram Moolenaar 187cf1ba35fSBram Moolenaar let list = [{'bufnr': bufnr('%'), 'lnum': 1}] 188b6fa30ccSBram Moolenaar call g:Xsetlist(list) 189b6fa30ccSBram Moolenaar 190da59dd5dSBram Moolenaar " Jumping to a non existent list should return error 1913ef5bf7dSBram Moolenaar silent! Xolder 99 192da59dd5dSBram Moolenaar call assert_true(v:errmsg ==# 'E380: At bottom of quickfix stack') 193da59dd5dSBram Moolenaar 1943ef5bf7dSBram Moolenaar silent! Xnewer 99 195da59dd5dSBram Moolenaar call assert_true(v:errmsg ==# 'E381: At top of quickfix stack') 196da59dd5dSBram Moolenaar 197da59dd5dSBram Moolenaar " Add three quickfix/location lists 1983ef5bf7dSBram Moolenaar Xgetexpr ['Xtestfile1:1:3:Line1'] 1993ef5bf7dSBram Moolenaar Xgetexpr ['Xtestfile2:2:2:Line2'] 2003ef5bf7dSBram Moolenaar Xgetexpr ['Xtestfile3:3:1:Line3'] 201da59dd5dSBram Moolenaar 202da59dd5dSBram Moolenaar " Go back two lists 2033ef5bf7dSBram Moolenaar Xolder 2043ef5bf7dSBram Moolenaar let l = g:Xgetlist() 205da59dd5dSBram Moolenaar call assert_equal('Line2', l[0].text) 206da59dd5dSBram Moolenaar 207da59dd5dSBram Moolenaar " Go forward two lists 2083ef5bf7dSBram Moolenaar Xnewer 2093ef5bf7dSBram Moolenaar let l = g:Xgetlist() 210da59dd5dSBram Moolenaar call assert_equal('Line3', l[0].text) 211da59dd5dSBram Moolenaar 212da59dd5dSBram Moolenaar " Test for the optional count argument 2133ef5bf7dSBram Moolenaar Xolder 2 2143ef5bf7dSBram Moolenaar let l = g:Xgetlist() 215da59dd5dSBram Moolenaar call assert_equal('Line1', l[0].text) 216da59dd5dSBram Moolenaar 2173ef5bf7dSBram Moolenaar Xnewer 2 2183ef5bf7dSBram Moolenaar let l = g:Xgetlist() 219da59dd5dSBram Moolenaar call assert_equal('Line3', l[0].text) 2202b946c9fSBram Moolenaarendfunc 221da59dd5dSBram Moolenaar 2222b946c9fSBram Moolenaarfunc Test_cage() 223da59dd5dSBram Moolenaar call XageTests('c') 224da59dd5dSBram Moolenaar call XageTests('l') 2252b946c9fSBram Moolenaarendfunc 226da59dd5dSBram Moolenaar 227da59dd5dSBram Moolenaar" Tests for the :cwindow, :lwindow :cclose, :lclose, :copen and :lopen 228da59dd5dSBram Moolenaar" commands 2292b946c9fSBram Moolenaarfunc XwindowTests(cchar) 2303ef5bf7dSBram Moolenaar call s:setup_commands(a:cchar) 231da59dd5dSBram Moolenaar 232b6fa30ccSBram Moolenaar " Opening the location list window without any errors should fail 233b6fa30ccSBram Moolenaar if a:cchar == 'l' 234b6fa30ccSBram Moolenaar call assert_fails('lopen', 'E776:') 235b6fa30ccSBram Moolenaar endif 236b6fa30ccSBram Moolenaar 237da59dd5dSBram Moolenaar " Create a list with no valid entries 2383ef5bf7dSBram Moolenaar Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3'] 239da59dd5dSBram Moolenaar 240da59dd5dSBram Moolenaar " Quickfix/Location window should not open with no valid errors 2413ef5bf7dSBram Moolenaar Xwindow 242da59dd5dSBram Moolenaar call assert_true(winnr('$') == 1) 243da59dd5dSBram Moolenaar 244da59dd5dSBram Moolenaar " Create a list with valid entries 2453ef5bf7dSBram Moolenaar Xgetexpr ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2', 2463ef5bf7dSBram Moolenaar \ 'Xtestfile3:3:1:Line3'] 247da59dd5dSBram Moolenaar 248da59dd5dSBram Moolenaar " Open the window 2493ef5bf7dSBram Moolenaar Xwindow 250da59dd5dSBram Moolenaar call assert_true(winnr('$') == 2 && winnr() == 2 && 251da59dd5dSBram Moolenaar \ getline('.') ==# 'Xtestfile1|1 col 3| Line1') 252537ef084SBram Moolenaar redraw! 253da59dd5dSBram Moolenaar 254da59dd5dSBram Moolenaar " Close the window 2553ef5bf7dSBram Moolenaar Xclose 256da59dd5dSBram Moolenaar call assert_true(winnr('$') == 1) 257da59dd5dSBram Moolenaar 258da59dd5dSBram Moolenaar " Create a list with no valid entries 2593ef5bf7dSBram Moolenaar Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3'] 260da59dd5dSBram Moolenaar 261da59dd5dSBram Moolenaar " Open the window 2623ef5bf7dSBram Moolenaar Xopen 5 263da59dd5dSBram Moolenaar call assert_true(winnr('$') == 2 && getline('.') ==# '|| non-error 1' 264c05d1c04SBram Moolenaar \ && winheight(0) == 5) 265da59dd5dSBram Moolenaar 266da59dd5dSBram Moolenaar " Opening the window again, should move the cursor to that window 267da59dd5dSBram Moolenaar wincmd t 2683ef5bf7dSBram Moolenaar Xopen 7 269da59dd5dSBram Moolenaar call assert_true(winnr('$') == 2 && winnr() == 2 && 270c05d1c04SBram Moolenaar \ winheight(0) == 7 && 271da59dd5dSBram Moolenaar \ getline('.') ==# '|| non-error 1') 272da59dd5dSBram Moolenaar 27315a7bdcbSBram Moolenaar " :cnext in quickfix window should move to the next entry 27415a7bdcbSBram Moolenaar Xnext 27515a7bdcbSBram Moolenaar call assert_equal(2, g:Xgetlist({'idx' : 0}).idx) 276da59dd5dSBram Moolenaar 277da59dd5dSBram Moolenaar " Calling cwindow should close the quickfix window with no valid errors 2783ef5bf7dSBram Moolenaar Xwindow 279da59dd5dSBram Moolenaar call assert_true(winnr('$') == 1) 280b6fa30ccSBram Moolenaar 281f9ae154cSBram Moolenaar " Specifying the width should adjust the width for a vertically split 282f9ae154cSBram Moolenaar " quickfix window. 283f9ae154cSBram Moolenaar vert Xopen 284f9ae154cSBram Moolenaar call assert_equal(10, winwidth(0)) 285f9ae154cSBram Moolenaar vert Xopen 12 286f9ae154cSBram Moolenaar call assert_equal(12, winwidth(0)) 287f9ae154cSBram Moolenaar Xclose 288f9ae154cSBram Moolenaar 2895d3c9f8cSBram Moolenaar " Horizontally or vertically splitting the quickfix window should create a 2905d3c9f8cSBram Moolenaar " normal window/buffer 2915d3c9f8cSBram Moolenaar Xopen 2925d3c9f8cSBram Moolenaar wincmd s 2935d3c9f8cSBram Moolenaar call assert_equal(0, getwininfo(win_getid())[0].quickfix) 2945d3c9f8cSBram Moolenaar call assert_equal(0, getwininfo(win_getid())[0].loclist) 2955d3c9f8cSBram Moolenaar call assert_notequal('quickfix', &buftype) 2965d3c9f8cSBram Moolenaar close 2975d3c9f8cSBram Moolenaar Xopen 2985d3c9f8cSBram Moolenaar wincmd v 2995d3c9f8cSBram Moolenaar call assert_equal(0, getwininfo(win_getid())[0].quickfix) 3005d3c9f8cSBram Moolenaar call assert_equal(0, getwininfo(win_getid())[0].loclist) 3015d3c9f8cSBram Moolenaar call assert_notequal('quickfix', &buftype) 3025d3c9f8cSBram Moolenaar close 3035d3c9f8cSBram Moolenaar Xopen 3045d3c9f8cSBram Moolenaar Xclose 3055d3c9f8cSBram Moolenaar 306b6fa30ccSBram Moolenaar if a:cchar == 'c' 307b6fa30ccSBram Moolenaar " Opening the quickfix window in multiple tab pages should reuse the 308b6fa30ccSBram Moolenaar " quickfix buffer 309b6fa30ccSBram Moolenaar Xgetexpr ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2', 310b6fa30ccSBram Moolenaar \ 'Xtestfile3:3:1:Line3'] 311b6fa30ccSBram Moolenaar Xopen 312b6fa30ccSBram Moolenaar let qfbufnum = bufnr('%') 313b6fa30ccSBram Moolenaar tabnew 314b6fa30ccSBram Moolenaar Xopen 315b6fa30ccSBram Moolenaar call assert_equal(qfbufnum, bufnr('%')) 316b6fa30ccSBram Moolenaar new | only | tabonly 317b6fa30ccSBram Moolenaar endif 3182b946c9fSBram Moolenaarendfunc 319da59dd5dSBram Moolenaar 3202b946c9fSBram Moolenaarfunc Test_cwindow() 321da59dd5dSBram Moolenaar call XwindowTests('c') 322da59dd5dSBram Moolenaar call XwindowTests('l') 3232b946c9fSBram Moolenaarendfunc 324da59dd5dSBram Moolenaar 32536d50222SBram Moolenaarfunc Test_copenHeight() 32636d50222SBram Moolenaar copen 32736d50222SBram Moolenaar wincmd H 32836d50222SBram Moolenaar let height = winheight(0) 32936d50222SBram Moolenaar copen 10 33036d50222SBram Moolenaar call assert_equal(height, winheight(0)) 33136d50222SBram Moolenaar quit 33236d50222SBram Moolenaarendfunc 33336d50222SBram Moolenaar 3341142a31bSBram Moolenaarfunc Test_copenHeight_tabline() 3351142a31bSBram Moolenaar set tabline=foo showtabline=2 3361142a31bSBram Moolenaar copen 3371142a31bSBram Moolenaar wincmd H 3381142a31bSBram Moolenaar let height = winheight(0) 3391142a31bSBram Moolenaar copen 10 3401142a31bSBram Moolenaar call assert_equal(height, winheight(0)) 3411142a31bSBram Moolenaar quit 3421142a31bSBram Moolenaar set tabline& showtabline& 3431142a31bSBram Moolenaarendfunc 3441142a31bSBram Moolenaar 3451142a31bSBram Moolenaar 346da59dd5dSBram Moolenaar" Tests for the :cfile, :lfile, :caddfile, :laddfile, :cgetfile and :lgetfile 347da59dd5dSBram Moolenaar" commands. 3482b946c9fSBram Moolenaarfunc XfileTests(cchar) 3493ef5bf7dSBram Moolenaar call s:setup_commands(a:cchar) 350da59dd5dSBram Moolenaar 351da59dd5dSBram Moolenaar call writefile(['Xtestfile1:700:10:Line 700', 352da59dd5dSBram Moolenaar \ 'Xtestfile2:800:15:Line 800'], 'Xqftestfile1') 353da59dd5dSBram Moolenaar 354da59dd5dSBram Moolenaar enew! 3553ef5bf7dSBram Moolenaar Xfile Xqftestfile1 3563ef5bf7dSBram Moolenaar let l = g:Xgetlist() 357da59dd5dSBram Moolenaar call assert_true(len(l) == 2 && 358da59dd5dSBram Moolenaar \ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' && 359da59dd5dSBram Moolenaar \ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800') 360da59dd5dSBram Moolenaar 361049cba9eSBram Moolenaar " Test with a non existent file 362e2e4075fSBram Moolenaar call assert_fails('Xfile non_existent_file', 'E40:') 363049cba9eSBram Moolenaar 364da59dd5dSBram Moolenaar " Run cfile/lfile from a modified buffer 365da59dd5dSBram Moolenaar enew! 366da59dd5dSBram Moolenaar silent! put ='Quickfix' 3673ef5bf7dSBram Moolenaar silent! Xfile Xqftestfile1 368da59dd5dSBram Moolenaar call assert_true(v:errmsg ==# 'E37: No write since last change (add ! to override)') 369da59dd5dSBram Moolenaar 370da59dd5dSBram Moolenaar call writefile(['Xtestfile3:900:30:Line 900'], 'Xqftestfile1') 3713ef5bf7dSBram Moolenaar Xaddfile Xqftestfile1 3723ef5bf7dSBram Moolenaar let l = g:Xgetlist() 373da59dd5dSBram Moolenaar call assert_true(len(l) == 3 && 374da59dd5dSBram Moolenaar \ l[2].lnum == 900 && l[2].col == 30 && l[2].text ==# 'Line 900') 375da59dd5dSBram Moolenaar 376da59dd5dSBram Moolenaar call writefile(['Xtestfile1:222:77:Line 222', 377da59dd5dSBram Moolenaar \ 'Xtestfile2:333:88:Line 333'], 'Xqftestfile1') 378da59dd5dSBram Moolenaar 379da59dd5dSBram Moolenaar enew! 3803ef5bf7dSBram Moolenaar Xgetfile Xqftestfile1 3813ef5bf7dSBram Moolenaar let l = g:Xgetlist() 382da59dd5dSBram Moolenaar call assert_true(len(l) == 2 && 383da59dd5dSBram Moolenaar \ l[0].lnum == 222 && l[0].col == 77 && l[0].text ==# 'Line 222' && 384da59dd5dSBram Moolenaar \ l[1].lnum == 333 && l[1].col == 88 && l[1].text ==# 'Line 333') 385da59dd5dSBram Moolenaar 38670077dd1SBram Moolenaar " Test for a file with a long line and without a newline at the end 38770077dd1SBram Moolenaar let text = repeat('x', 1024) 38870077dd1SBram Moolenaar let t = 'a.txt:18:' . text 38970077dd1SBram Moolenaar call writefile([t], 'Xqftestfile1', 'b') 39070077dd1SBram Moolenaar silent! Xfile Xqftestfile1 39170077dd1SBram Moolenaar call assert_equal(text, g:Xgetlist()[0].text) 39270077dd1SBram Moolenaar 393da59dd5dSBram Moolenaar call delete('Xqftestfile1') 3942b946c9fSBram Moolenaarendfunc 395da59dd5dSBram Moolenaar 3962b946c9fSBram Moolenaarfunc Test_cfile() 397da59dd5dSBram Moolenaar call XfileTests('c') 398da59dd5dSBram Moolenaar call XfileTests('l') 3992b946c9fSBram Moolenaarendfunc 400da59dd5dSBram Moolenaar 401da59dd5dSBram Moolenaar" Tests for the :cbuffer, :lbuffer, :caddbuffer, :laddbuffer, :cgetbuffer and 402da59dd5dSBram Moolenaar" :lgetbuffer commands. 4032b946c9fSBram Moolenaarfunc XbufferTests(cchar) 4043ef5bf7dSBram Moolenaar call s:setup_commands(a:cchar) 405da59dd5dSBram Moolenaar 406da59dd5dSBram Moolenaar enew! 407da59dd5dSBram Moolenaar silent! call setline(1, ['Xtestfile7:700:10:Line 700', 408da59dd5dSBram Moolenaar \ 'Xtestfile8:800:15:Line 800']) 4093ef5bf7dSBram Moolenaar Xbuffer! 4103ef5bf7dSBram Moolenaar let l = g:Xgetlist() 411da59dd5dSBram Moolenaar call assert_true(len(l) == 2 && 412da59dd5dSBram Moolenaar \ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' && 413da59dd5dSBram Moolenaar \ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800') 414da59dd5dSBram Moolenaar 415da59dd5dSBram Moolenaar enew! 416da59dd5dSBram Moolenaar silent! call setline(1, ['Xtestfile9:900:55:Line 900', 417da59dd5dSBram Moolenaar \ 'Xtestfile10:950:66:Line 950']) 4183ef5bf7dSBram Moolenaar Xgetbuffer 4193ef5bf7dSBram Moolenaar let l = g:Xgetlist() 420da59dd5dSBram Moolenaar call assert_true(len(l) == 2 && 421da59dd5dSBram Moolenaar \ l[0].lnum == 900 && l[0].col == 55 && l[0].text ==# 'Line 900' && 422da59dd5dSBram Moolenaar \ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950') 423da59dd5dSBram Moolenaar 424da59dd5dSBram Moolenaar enew! 425da59dd5dSBram Moolenaar silent! call setline(1, ['Xtestfile11:700:20:Line 700', 426da59dd5dSBram Moolenaar \ 'Xtestfile12:750:25:Line 750']) 4273ef5bf7dSBram Moolenaar Xaddbuffer 4283ef5bf7dSBram Moolenaar let l = g:Xgetlist() 429da59dd5dSBram Moolenaar call assert_true(len(l) == 4 && 430da59dd5dSBram Moolenaar \ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950' && 431da59dd5dSBram Moolenaar \ l[2].lnum == 700 && l[2].col == 20 && l[2].text ==# 'Line 700' && 432da59dd5dSBram Moolenaar \ l[3].lnum == 750 && l[3].col == 25 && l[3].text ==# 'Line 750') 433ab47c61fSBram Moolenaar enew! 434da59dd5dSBram Moolenaar 435ee85df37SBram Moolenaar " Check for invalid buffer 436ee85df37SBram Moolenaar call assert_fails('Xbuffer 199', 'E474:') 437ee85df37SBram Moolenaar 438ee85df37SBram Moolenaar " Check for unloaded buffer 439ee85df37SBram Moolenaar edit Xtestfile1 440ee85df37SBram Moolenaar let bnr = bufnr('%') 441ee85df37SBram Moolenaar enew! 442ee85df37SBram Moolenaar call assert_fails('Xbuffer ' . bnr, 'E681:') 443ee85df37SBram Moolenaar 444ee85df37SBram Moolenaar " Check for invalid range 445ee85df37SBram Moolenaar " Using Xbuffer will not run the range check in the cbuffer/lbuffer 446ee85df37SBram Moolenaar " commands. So directly call the commands. 447ee85df37SBram Moolenaar if (a:cchar == 'c') 448ee85df37SBram Moolenaar call assert_fails('900,999cbuffer', 'E16:') 449ee85df37SBram Moolenaar else 450ee85df37SBram Moolenaar call assert_fails('900,999lbuffer', 'E16:') 451ee85df37SBram Moolenaar endif 4522b946c9fSBram Moolenaarendfunc 453da59dd5dSBram Moolenaar 4542b946c9fSBram Moolenaarfunc Test_cbuffer() 455da59dd5dSBram Moolenaar call XbufferTests('c') 456da59dd5dSBram Moolenaar call XbufferTests('l') 4572b946c9fSBram Moolenaarendfunc 458da59dd5dSBram Moolenaar 4592b946c9fSBram Moolenaarfunc XexprTests(cchar) 4600fcc7c6dSBram Moolenaar call s:setup_commands(a:cchar) 4610fcc7c6dSBram Moolenaar 4620fcc7c6dSBram Moolenaar call assert_fails('Xexpr 10', 'E777:') 4632b946c9fSBram Moolenaarendfunc 4640fcc7c6dSBram Moolenaar 4652b946c9fSBram Moolenaarfunc Test_cexpr() 4660fcc7c6dSBram Moolenaar call XexprTests('c') 4670fcc7c6dSBram Moolenaar call XexprTests('l') 4682b946c9fSBram Moolenaarendfunc 4690fcc7c6dSBram Moolenaar 4700fcc7c6dSBram Moolenaar" Tests for :cnext, :cprev, :cfirst, :clast commands 4712b946c9fSBram Moolenaarfunc Xtest_browse(cchar) 4720fcc7c6dSBram Moolenaar call s:setup_commands(a:cchar) 4730fcc7c6dSBram Moolenaar 47474240d3fSBram Moolenaar call g:Xsetlist([], 'f') 475b6fa30ccSBram Moolenaar " Jumping to first or next location list entry without any error should 476b6fa30ccSBram Moolenaar " result in failure 47774240d3fSBram Moolenaar if a:cchar == 'c' 47874240d3fSBram Moolenaar let err = 'E42:' 47915a7bdcbSBram Moolenaar let cmd = '$cc' 48074240d3fSBram Moolenaar else 48174240d3fSBram Moolenaar let err = 'E776:' 48215a7bdcbSBram Moolenaar let cmd = '$ll' 483b6fa30ccSBram Moolenaar endif 48474240d3fSBram Moolenaar call assert_fails('Xnext', err) 48574240d3fSBram Moolenaar call assert_fails('Xprev', err) 48674240d3fSBram Moolenaar call assert_fails('Xnfile', err) 48774240d3fSBram Moolenaar call assert_fails('Xpfile', err) 48815a7bdcbSBram Moolenaar call assert_fails(cmd, err) 489b6fa30ccSBram Moolenaar 490f9ae154cSBram Moolenaar Xexpr '' 491f9ae154cSBram Moolenaar call assert_fails(cmd, 'E42:') 492f9ae154cSBram Moolenaar 4930fcc7c6dSBram Moolenaar call s:create_test_file('Xqftestfile1') 4940fcc7c6dSBram Moolenaar call s:create_test_file('Xqftestfile2') 4950fcc7c6dSBram Moolenaar 4960fcc7c6dSBram Moolenaar Xgetexpr ['Xqftestfile1:5:Line5', 4970fcc7c6dSBram Moolenaar \ 'Xqftestfile1:6:Line6', 4980fcc7c6dSBram Moolenaar \ 'Xqftestfile2:10:Line10', 49999895eacSBram Moolenaar \ 'Xqftestfile2:11:Line11', 50099895eacSBram Moolenaar \ 'RegularLine1', 50199895eacSBram Moolenaar \ 'RegularLine2'] 5020fcc7c6dSBram Moolenaar 5030fcc7c6dSBram Moolenaar Xfirst 504818fc9adSBram Moolenaar call assert_fails('-5Xcc', 'E16:') 505e2e4075fSBram Moolenaar call assert_fails('Xprev', 'E553:') 506e2e4075fSBram Moolenaar call assert_fails('Xpfile', 'E553:') 5070fcc7c6dSBram Moolenaar Xnfile 508bdd2c290SBram Moolenaar call assert_equal('Xqftestfile2', @%) 5090fcc7c6dSBram Moolenaar call assert_equal(10, line('.')) 5100fcc7c6dSBram Moolenaar Xpfile 511bdd2c290SBram Moolenaar call assert_equal('Xqftestfile1', @%) 5120fcc7c6dSBram Moolenaar call assert_equal(6, line('.')) 51374240d3fSBram Moolenaar 5Xcc 51474240d3fSBram Moolenaar call assert_equal(5, g:Xgetlist({'idx':0}).idx) 51574240d3fSBram Moolenaar 2Xcc 51674240d3fSBram Moolenaar call assert_equal(2, g:Xgetlist({'idx':0}).idx) 517f9ae154cSBram Moolenaar if a:cchar == 'c' 518f9ae154cSBram Moolenaar cc 519f9ae154cSBram Moolenaar else 520f9ae154cSBram Moolenaar ll 521f9ae154cSBram Moolenaar endif 522f9ae154cSBram Moolenaar call assert_equal(2, g:Xgetlist({'idx':0}).idx) 52374240d3fSBram Moolenaar 10Xcc 52474240d3fSBram Moolenaar call assert_equal(6, g:Xgetlist({'idx':0}).idx) 5250fcc7c6dSBram Moolenaar Xlast 52699895eacSBram Moolenaar Xprev 527bdd2c290SBram Moolenaar call assert_equal('Xqftestfile2', @%) 5280fcc7c6dSBram Moolenaar call assert_equal(11, line('.')) 529e2e4075fSBram Moolenaar call assert_fails('Xnext', 'E553:') 530e2e4075fSBram Moolenaar call assert_fails('Xnfile', 'E553:') 531f9ae154cSBram Moolenaar " To process the range using quickfix list entries, directly use the 532f9ae154cSBram Moolenaar " quickfix commands (don't use the user defined commands) 533f9ae154cSBram Moolenaar if a:cchar == 'c' 534f9ae154cSBram Moolenaar $cc 535f9ae154cSBram Moolenaar else 536f9ae154cSBram Moolenaar $ll 537f9ae154cSBram Moolenaar endif 538f9ae154cSBram Moolenaar call assert_equal(6, g:Xgetlist({'idx':0}).idx) 5390fcc7c6dSBram Moolenaar Xrewind 540bdd2c290SBram Moolenaar call assert_equal('Xqftestfile1', @%) 5410fcc7c6dSBram Moolenaar call assert_equal(5, line('.')) 5420fcc7c6dSBram Moolenaar 54399895eacSBram Moolenaar 10Xnext 544bdd2c290SBram Moolenaar call assert_equal('Xqftestfile2', @%) 54599895eacSBram Moolenaar call assert_equal(11, line('.')) 54699895eacSBram Moolenaar 10Xprev 547bdd2c290SBram Moolenaar call assert_equal('Xqftestfile1', @%) 54899895eacSBram Moolenaar call assert_equal(5, line('.')) 54999895eacSBram Moolenaar 55074240d3fSBram Moolenaar " Jumping to an error from the error window using cc command 55174240d3fSBram Moolenaar Xgetexpr ['Xqftestfile1:5:Line5', 55274240d3fSBram Moolenaar \ 'Xqftestfile1:6:Line6', 55374240d3fSBram Moolenaar \ 'Xqftestfile2:10:Line10', 55474240d3fSBram Moolenaar \ 'Xqftestfile2:11:Line11'] 55574240d3fSBram Moolenaar Xopen 55674240d3fSBram Moolenaar 10Xcc 55774240d3fSBram Moolenaar call assert_equal(11, line('.')) 558bdd2c290SBram Moolenaar call assert_equal('Xqftestfile2', @%) 559f0cee197SBram Moolenaar Xopen 560f0cee197SBram Moolenaar call cursor(2, 1) 561f0cee197SBram Moolenaar if a:cchar == 'c' 562f0cee197SBram Moolenaar .cc 563f0cee197SBram Moolenaar else 564f0cee197SBram Moolenaar .ll 565f0cee197SBram Moolenaar endif 566f0cee197SBram Moolenaar call assert_equal(6, line('.')) 567bdd2c290SBram Moolenaar call assert_equal('Xqftestfile1', @%) 56874240d3fSBram Moolenaar 56974240d3fSBram Moolenaar " Jumping to an error from the error window (when only the error window is 57074240d3fSBram Moolenaar " present) 57174240d3fSBram Moolenaar Xopen | only 57274240d3fSBram Moolenaar Xlast 1 57374240d3fSBram Moolenaar call assert_equal(5, line('.')) 574bdd2c290SBram Moolenaar call assert_equal('Xqftestfile1', @%) 57574240d3fSBram Moolenaar 576ee85df37SBram Moolenaar Xexpr "" 577ee85df37SBram Moolenaar call assert_fails('Xnext', 'E42:') 578ee85df37SBram Moolenaar 5790fcc7c6dSBram Moolenaar call delete('Xqftestfile1') 5800fcc7c6dSBram Moolenaar call delete('Xqftestfile2') 581fc2b270cSBram Moolenaar 582fc2b270cSBram Moolenaar " Should be able to use next/prev with invalid entries 583fc2b270cSBram Moolenaar Xexpr "" 584fc2b270cSBram Moolenaar call assert_equal(0, g:Xgetlist({'idx' : 0}).idx) 585fc2b270cSBram Moolenaar call assert_equal(0, g:Xgetlist({'size' : 0}).size) 58688a3e2b2SBram Moolenaar Xaddexpr ['foo', 'bar', 'baz', 'quux', 'sh|moo'] 587fc2b270cSBram Moolenaar call assert_equal(5, g:Xgetlist({'size' : 0}).size) 588fc2b270cSBram Moolenaar Xlast 589fc2b270cSBram Moolenaar call assert_equal(5, g:Xgetlist({'idx' : 0}).idx) 590fc2b270cSBram Moolenaar Xfirst 591fc2b270cSBram Moolenaar call assert_equal(1, g:Xgetlist({'idx' : 0}).idx) 592fc2b270cSBram Moolenaar 2Xnext 593fc2b270cSBram Moolenaar call assert_equal(3, g:Xgetlist({'idx' : 0}).idx) 5942b946c9fSBram Moolenaarendfunc 5950fcc7c6dSBram Moolenaar 5962b946c9fSBram Moolenaarfunc Test_browse() 5970fcc7c6dSBram Moolenaar call Xtest_browse('c') 5980fcc7c6dSBram Moolenaar call Xtest_browse('l') 5992b946c9fSBram Moolenaarendfunc 6000fcc7c6dSBram Moolenaar 6012b946c9fSBram Moolenaarfunc Test_nomem() 6028e8df251SBram Moolenaar call test_alloc_fail(GetAllocId('qf_dirname_start'), 0, 0) 603a260b87dSBram Moolenaar call assert_fails('vimgrep vim runtest.vim', 'E342:') 60475bdf6aaSBram Moolenaar 605ce90e36fSBram Moolenaar call GetAllocId('qf_dirname_now')->test_alloc_fail(0, 0) 606a260b87dSBram Moolenaar call assert_fails('vimgrep vim runtest.vim', 'E342:') 60775bdf6aaSBram Moolenaar 6088e8df251SBram Moolenaar call test_alloc_fail(GetAllocId('qf_namebuf'), 0, 0) 609a260b87dSBram Moolenaar call assert_fails('cfile runtest.vim', 'E342:') 61075bdf6aaSBram Moolenaar 6118e8df251SBram Moolenaar call test_alloc_fail(GetAllocId('qf_errmsg'), 0, 0) 612a260b87dSBram Moolenaar call assert_fails('cfile runtest.vim', 'E342:') 61375bdf6aaSBram Moolenaar 6148e8df251SBram Moolenaar call test_alloc_fail(GetAllocId('qf_pattern'), 0, 0) 615a260b87dSBram Moolenaar call assert_fails('cfile runtest.vim', 'E342:') 61675bdf6aaSBram Moolenaar 61775bdf6aaSBram Moolenaarendfunc 61875bdf6aaSBram Moolenaar 6192b946c9fSBram Moolenaarfunc s:test_xhelpgrep(cchar) 620049cba9eSBram Moolenaar call s:setup_commands(a:cchar) 621049cba9eSBram Moolenaar Xhelpgrep quickfix 622049cba9eSBram Moolenaar Xopen 623049cba9eSBram Moolenaar if a:cchar == 'c' 624049cba9eSBram Moolenaar let title_text = ':helpgrep quickfix' 625049cba9eSBram Moolenaar else 626049cba9eSBram Moolenaar let title_text = ':lhelpgrep quickfix' 627049cba9eSBram Moolenaar endif 628049cba9eSBram Moolenaar call assert_true(w:quickfix_title =~ title_text, w:quickfix_title) 62999895eacSBram Moolenaar 63099895eacSBram Moolenaar " Jumping to a help topic should open the help window 63199895eacSBram Moolenaar only 63299895eacSBram Moolenaar Xnext 63399895eacSBram Moolenaar call assert_true(&buftype == 'help') 63499895eacSBram Moolenaar call assert_true(winnr('$') == 2) 63599895eacSBram Moolenaar " Jumping to the next match should reuse the help window 63699895eacSBram Moolenaar Xnext 63799895eacSBram Moolenaar call assert_true(&buftype == 'help') 63899895eacSBram Moolenaar call assert_true(winnr() == 1) 63999895eacSBram Moolenaar call assert_true(winnr('$') == 2) 64099895eacSBram Moolenaar " Jumping to the next match from the quickfix window should reuse the help 64199895eacSBram Moolenaar " window 64299895eacSBram Moolenaar Xopen 64399895eacSBram Moolenaar Xnext 64499895eacSBram Moolenaar call assert_true(&buftype == 'help') 64599895eacSBram Moolenaar call assert_true(winnr() == 1) 64699895eacSBram Moolenaar call assert_true(winnr('$') == 2) 64799895eacSBram Moolenaar 64862ef7974SBram Moolenaar " This wipes out the buffer, make sure that doesn't cause trouble. 649049cba9eSBram Moolenaar Xclose 650ee85df37SBram Moolenaar 651f9ae154cSBram Moolenaar " When the current window is vertically split, jumping to a help match 652f9ae154cSBram Moolenaar " should open the help window at the top. 653f9ae154cSBram Moolenaar only | enew 654f9ae154cSBram Moolenaar let w1 = win_getid() 655f9ae154cSBram Moolenaar vert new 656f9ae154cSBram Moolenaar let w2 = win_getid() 657f9ae154cSBram Moolenaar Xnext 658f9ae154cSBram Moolenaar let w3 = win_getid() 659f9ae154cSBram Moolenaar call assert_true(&buftype == 'help') 660f9ae154cSBram Moolenaar call assert_true(winnr() == 1) 661a106e6cdSBram Moolenaar " See jump_to_help_window() for details 662a106e6cdSBram Moolenaar let w2_width = winwidth(w2) 663a106e6cdSBram Moolenaar if w2_width != &columns && w2_width < 80 664a106e6cdSBram Moolenaar call assert_equal(['col', [['leaf', w3], 665a106e6cdSBram Moolenaar \ ['row', [['leaf', w2], ['leaf', w1]]]]], winlayout()) 666a106e6cdSBram Moolenaar else 667a106e6cdSBram Moolenaar call assert_equal(['row', [['col', [['leaf', w3], ['leaf', w2]]], 668a106e6cdSBram Moolenaar \ ['leaf', w1]]] , winlayout()) 669a106e6cdSBram Moolenaar endif 670f9ae154cSBram Moolenaar 671f9ae154cSBram Moolenaar new | only 672f9ae154cSBram Moolenaar set buftype=help 673f9ae154cSBram Moolenaar set modified 674f9ae154cSBram Moolenaar call assert_fails('Xnext', 'E37:') 675f9ae154cSBram Moolenaar set nomodified 676f9ae154cSBram Moolenaar new | only 677f9ae154cSBram Moolenaar 678b4d5fbabSBram Moolenaar if a:cchar == 'l' 679b4d5fbabSBram Moolenaar " When a help window is present, running :lhelpgrep should reuse the 680b4d5fbabSBram Moolenaar " help window and not the current window 681b4d5fbabSBram Moolenaar new | only 682b4d5fbabSBram Moolenaar call g:Xsetlist([], 'f') 683b4d5fbabSBram Moolenaar help index.txt 684b4d5fbabSBram Moolenaar wincmd w 685b4d5fbabSBram Moolenaar lhelpgrep quickfix 686b4d5fbabSBram Moolenaar call assert_equal(1, winnr()) 687b4d5fbabSBram Moolenaar call assert_notequal([], getloclist(1)) 688b4d5fbabSBram Moolenaar call assert_equal([], getloclist(2)) 689b4d5fbabSBram Moolenaar endif 690b4d5fbabSBram Moolenaar 69199895eacSBram Moolenaar new | only 69299895eacSBram Moolenaar 693ee85df37SBram Moolenaar " Search for non existing help string 694ee85df37SBram Moolenaar call assert_fails('Xhelpgrep a1b2c3', 'E480:') 695108e7b42SBram Moolenaar " Invalid regular expression 6969b7bf9e9SBram Moolenaar call assert_fails('Xhelpgrep \@<!', 'E866:') 6972b946c9fSBram Moolenaarendfunc 698049cba9eSBram Moolenaar 6992b946c9fSBram Moolenaarfunc Test_helpgrep() 700049cba9eSBram Moolenaar call s:test_xhelpgrep('c') 701cf25fdb8SBram Moolenaar helpclose 702049cba9eSBram Moolenaar call s:test_xhelpgrep('l') 70362ef7974SBram Moolenaarendfunc 70475bdf6aaSBram Moolenaar 7056920c72dSBram Moolenaarfunc Test_errortitle() 7066920c72dSBram Moolenaar augroup QfBufWinEnter 7076920c72dSBram Moolenaar au! 7086920c72dSBram Moolenaar au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE') 7096920c72dSBram Moolenaar augroup END 7106920c72dSBram Moolenaar copen 7116920c72dSBram Moolenaar let a=[{'lnum': 308, 'bufnr': bufnr(''), 'col': 58, 'valid': 1, 'vcol': 0, 'nr': 0, 'type': '', 'pattern': '', 'text': ' au BufWinEnter * :let g:a=get(w:, ''quickfix_title'', ''NONE'')'}] 7126920c72dSBram Moolenaar call setqflist(a) 7136920c72dSBram Moolenaar call assert_equal(':setqflist()', g:a) 7146920c72dSBram Moolenaar augroup QfBufWinEnter 7156920c72dSBram Moolenaar au! 7166920c72dSBram Moolenaar augroup END 7176920c72dSBram Moolenaar augroup! QfBufWinEnter 7186920c72dSBram Moolenaarendfunc 719e27dba49SBram Moolenaar 7205584df65SBram Moolenaarfunc Test_vimgreptitle() 7215584df65SBram Moolenaar augroup QfBufWinEnter 7225584df65SBram Moolenaar au! 7235584df65SBram Moolenaar au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE') 7245584df65SBram Moolenaar augroup END 7255584df65SBram Moolenaar try 7265584df65SBram Moolenaar vimgrep /pattern/j file 7275584df65SBram Moolenaar catch /E480/ 7285584df65SBram Moolenaar endtry 7295584df65SBram Moolenaar copen 7305584df65SBram Moolenaar call assert_equal(': vimgrep /pattern/j file', g:a) 7315584df65SBram Moolenaar augroup QfBufWinEnter 7325584df65SBram Moolenaar au! 7335584df65SBram Moolenaar augroup END 7345584df65SBram Moolenaar augroup! QfBufWinEnter 7355584df65SBram Moolenaarendfunc 7365584df65SBram Moolenaar 7372b946c9fSBram Moolenaarfunc XqfTitleTests(cchar) 7383ef5bf7dSBram Moolenaar call s:setup_commands(a:cchar) 739e27dba49SBram Moolenaar 7403ef5bf7dSBram Moolenaar Xgetexpr ['file:1:1:message'] 7413ef5bf7dSBram Moolenaar let l = g:Xgetlist() 742e27dba49SBram Moolenaar if a:cchar == 'c' 743e27dba49SBram Moolenaar call setqflist(l, 'r') 744e27dba49SBram Moolenaar else 745e27dba49SBram Moolenaar call setloclist(0, l, 'r') 746e27dba49SBram Moolenaar endif 747e27dba49SBram Moolenaar 7483ef5bf7dSBram Moolenaar Xopen 749e27dba49SBram Moolenaar if a:cchar == 'c' 750e27dba49SBram Moolenaar let title = ':setqflist()' 751e27dba49SBram Moolenaar else 752e27dba49SBram Moolenaar let title = ':setloclist()' 753e27dba49SBram Moolenaar endif 754e27dba49SBram Moolenaar call assert_equal(title, w:quickfix_title) 7553ef5bf7dSBram Moolenaar Xclose 7562b946c9fSBram Moolenaarendfunc 757e27dba49SBram Moolenaar 758e27dba49SBram Moolenaar" Tests for quickfix window's title 7592b946c9fSBram Moolenaarfunc Test_qf_title() 760e27dba49SBram Moolenaar call XqfTitleTests('c') 761e27dba49SBram Moolenaar call XqfTitleTests('l') 7622b946c9fSBram Moolenaarendfunc 763e27dba49SBram Moolenaar 764e27dba49SBram Moolenaar" Tests for 'errorformat' 7652b946c9fSBram Moolenaarfunc Test_efm() 766e27dba49SBram Moolenaar let save_efm = &efm 767e27dba49SBram Moolenaar set efm=%EEEE%m,%WWWW%m,%+CCCC%.%#,%-GGGG%.%# 768e27dba49SBram Moolenaar cgetexpr ['WWWW', 'EEEE', 'CCCC'] 769e27dba49SBram Moolenaar let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]'))) 770e27dba49SBram Moolenaar call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l) 771e27dba49SBram Moolenaar cgetexpr ['WWWW', 'GGGG', 'EEEE', 'CCCC'] 772e27dba49SBram Moolenaar let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]'))) 773e27dba49SBram Moolenaar call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l) 774e27dba49SBram Moolenaar cgetexpr ['WWWW', 'GGGG', 'ZZZZ', 'EEEE', 'CCCC', 'YYYY'] 775e27dba49SBram Moolenaar let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]'))) 776e27dba49SBram Moolenaar call assert_equal("[['W', 1], ['ZZZZ', 0], ['E^@CCCC', 1], ['YYYY', 0]]", l) 777e27dba49SBram Moolenaar let &efm = save_efm 7782b946c9fSBram Moolenaarendfunc 7791ff2b64bSBram Moolenaar 7801ff2b64bSBram Moolenaar" This will test for problems in quickfix: 7811ff2b64bSBram Moolenaar" A. incorrectly copying location lists which caused the location list to show 7821ff2b64bSBram Moolenaar" a different name than the file that was actually being displayed. 7831ff2b64bSBram Moolenaar" B. not reusing the window for which the location list window is opened but 7841ff2b64bSBram Moolenaar" instead creating new windows. 7851ff2b64bSBram Moolenaar" C. make sure that the location list window is not reused instead of the 7861ff2b64bSBram Moolenaar" window it belongs to. 7871ff2b64bSBram Moolenaar" 7881ff2b64bSBram Moolenaar" Set up the test environment: 7892b946c9fSBram Moolenaarfunc ReadTestProtocol(name) 7901ff2b64bSBram Moolenaar let base = substitute(a:name, '\v^test://(.*)%(\.[^.]+)?', '\1', '') 7911ff2b64bSBram Moolenaar let word = substitute(base, '\v(.*)\..*', '\1', '') 7921ff2b64bSBram Moolenaar 7931ff2b64bSBram Moolenaar setl modifiable 7941ff2b64bSBram Moolenaar setl noreadonly 7951ff2b64bSBram Moolenaar setl noswapfile 7961ff2b64bSBram Moolenaar setl bufhidden=delete 7971ff2b64bSBram Moolenaar %del _ 7981ff2b64bSBram Moolenaar " For problem 2: 7991ff2b64bSBram Moolenaar " 'buftype' has to be set to reproduce the constant opening of new windows 8001ff2b64bSBram Moolenaar setl buftype=nofile 8011ff2b64bSBram Moolenaar 8021ff2b64bSBram Moolenaar call setline(1, word) 8031ff2b64bSBram Moolenaar 8041ff2b64bSBram Moolenaar setl nomodified 8051ff2b64bSBram Moolenaar setl nomodifiable 8061ff2b64bSBram Moolenaar setl readonly 8071ff2b64bSBram Moolenaar exe 'doautocmd BufRead ' . substitute(a:name, '\v^test://(.*)', '\1', '') 8082b946c9fSBram Moolenaarendfunc 8091ff2b64bSBram Moolenaar 8102b946c9fSBram Moolenaarfunc Test_locationlist() 8111ff2b64bSBram Moolenaar enew 8121ff2b64bSBram Moolenaar 8131ff2b64bSBram Moolenaar augroup testgroup 8141ff2b64bSBram Moolenaar au! 8151ff2b64bSBram Moolenaar autocmd BufReadCmd test://* call ReadTestProtocol(expand("<amatch>")) 8161ff2b64bSBram Moolenaar augroup END 8171ff2b64bSBram Moolenaar 8181ff2b64bSBram Moolenaar let words = [ "foo", "bar", "baz", "quux", "shmoo", "spam", "eggs" ] 8191ff2b64bSBram Moolenaar 8201ff2b64bSBram Moolenaar let qflist = [] 8211ff2b64bSBram Moolenaar for word in words 8221ff2b64bSBram Moolenaar call add(qflist, {'filename': 'test://' . word . '.txt', 'text': 'file ' . word . '.txt', }) 8231ff2b64bSBram Moolenaar " NOTE: problem 1: 8241ff2b64bSBram Moolenaar " intentionally not setting 'lnum' so that the quickfix entries are not 8251ff2b64bSBram Moolenaar " valid 826aad222c9SBram Moolenaar eval qflist->setloclist(0, ' ') 8271ff2b64bSBram Moolenaar endfor 8281ff2b64bSBram Moolenaar 8291ff2b64bSBram Moolenaar " Test A 8301ff2b64bSBram Moolenaar lrewind 8311ff2b64bSBram Moolenaar enew 8321ff2b64bSBram Moolenaar lopen 83399895eacSBram Moolenaar 4lnext 8341ff2b64bSBram Moolenaar vert split 8351ff2b64bSBram Moolenaar wincmd L 8361ff2b64bSBram Moolenaar lopen 8371ff2b64bSBram Moolenaar wincmd p 8381ff2b64bSBram Moolenaar lnext 8391ff2b64bSBram Moolenaar let fileName = expand("%") 8401ff2b64bSBram Moolenaar wincmd p 8411ff2b64bSBram Moolenaar let locationListFileName = substitute(getline(line('.')), '\([^|]*\)|.*', '\1', '') 8421ff2b64bSBram Moolenaar let fileName = substitute(fileName, '\\', '/', 'g') 8431ff2b64bSBram Moolenaar let locationListFileName = substitute(locationListFileName, '\\', '/', 'g') 8441ff2b64bSBram Moolenaar call assert_equal("test://bar.txt", fileName) 8451ff2b64bSBram Moolenaar call assert_equal("test://bar.txt", locationListFileName) 8461ff2b64bSBram Moolenaar 8471ff2b64bSBram Moolenaar wincmd n | only 8481ff2b64bSBram Moolenaar 8491ff2b64bSBram Moolenaar " Test B: 8501ff2b64bSBram Moolenaar lrewind 8511ff2b64bSBram Moolenaar lopen 8521ff2b64bSBram Moolenaar 2 8531ff2b64bSBram Moolenaar exe "normal \<CR>" 8541ff2b64bSBram Moolenaar wincmd p 8551ff2b64bSBram Moolenaar 3 8561ff2b64bSBram Moolenaar exe "normal \<CR>" 8571ff2b64bSBram Moolenaar wincmd p 8581ff2b64bSBram Moolenaar 4 8591ff2b64bSBram Moolenaar exe "normal \<CR>" 8601ff2b64bSBram Moolenaar call assert_equal(2, winnr('$')) 8611ff2b64bSBram Moolenaar wincmd n | only 8621ff2b64bSBram Moolenaar 8631ff2b64bSBram Moolenaar " Test C: 8641ff2b64bSBram Moolenaar lrewind 8651ff2b64bSBram Moolenaar lopen 8661ff2b64bSBram Moolenaar " Let's move the location list window to the top to check whether it (the 8671ff2b64bSBram Moolenaar " first window found) will be reused when we try to open new windows: 8681ff2b64bSBram Moolenaar wincmd K 8691ff2b64bSBram Moolenaar 2 8701ff2b64bSBram Moolenaar exe "normal \<CR>" 8711ff2b64bSBram Moolenaar wincmd p 8721ff2b64bSBram Moolenaar 3 8731ff2b64bSBram Moolenaar exe "normal \<CR>" 8741ff2b64bSBram Moolenaar wincmd p 8751ff2b64bSBram Moolenaar 4 8761ff2b64bSBram Moolenaar exe "normal \<CR>" 8771ff2b64bSBram Moolenaar 1wincmd w 8781ff2b64bSBram Moolenaar call assert_equal('quickfix', &buftype) 8791ff2b64bSBram Moolenaar 2wincmd w 8801ff2b64bSBram Moolenaar let bufferName = expand("%") 8811ff2b64bSBram Moolenaar let bufferName = substitute(bufferName, '\\', '/', 'g') 8821ff2b64bSBram Moolenaar call assert_equal('test://quux.txt', bufferName) 8831ff2b64bSBram Moolenaar 8841ff2b64bSBram Moolenaar wincmd n | only 8851ff2b64bSBram Moolenaar 8861ff2b64bSBram Moolenaar augroup! testgroup 8872b946c9fSBram Moolenaarendfunc 8880899d698SBram Moolenaar 8892b946c9fSBram Moolenaarfunc Test_locationlist_curwin_was_closed() 8900899d698SBram Moolenaar augroup testgroup 8910899d698SBram Moolenaar au! 892d106e5baSBram Moolenaar autocmd BufReadCmd test_curwin.txt call R(expand("<amatch>")) 8930899d698SBram Moolenaar augroup END 8940899d698SBram Moolenaar 8952b946c9fSBram Moolenaar func! R(n) 8960899d698SBram Moolenaar quit 8970899d698SBram Moolenaar endfunc 8980899d698SBram Moolenaar 8990899d698SBram Moolenaar new 9000899d698SBram Moolenaar let q = [] 901d106e5baSBram Moolenaar call add(q, {'filename': 'test_curwin.txt' }) 9020899d698SBram Moolenaar call setloclist(0, q) 9030899d698SBram Moolenaar call assert_fails('lrewind', 'E924:') 9040899d698SBram Moolenaar 9050899d698SBram Moolenaar augroup! testgroup 9062b946c9fSBram Moolenaarendfunc 9077eba3d2cSBram Moolenaar 9082b946c9fSBram Moolenaarfunc Test_locationlist_cross_tab_jump() 9090a9046fbSBram Moolenaar call writefile(['loclistfoo'], 'loclistfoo') 9100a9046fbSBram Moolenaar call writefile(['loclistbar'], 'loclistbar') 9110a9046fbSBram Moolenaar set switchbuf=usetab 9120a9046fbSBram Moolenaar 9130a9046fbSBram Moolenaar edit loclistfoo 9140a9046fbSBram Moolenaar tabedit loclistbar 9150a9046fbSBram Moolenaar silent lgrep loclistfoo loclist* 9160a9046fbSBram Moolenaar call assert_equal(1, tabpagenr()) 9170a9046fbSBram Moolenaar 9180a9046fbSBram Moolenaar enew | only | tabonly 9190a9046fbSBram Moolenaar set switchbuf&vim 9200a9046fbSBram Moolenaar call delete('loclistfoo') 9210a9046fbSBram Moolenaar call delete('loclistbar') 9222b946c9fSBram Moolenaarendfunc 9230a9046fbSBram Moolenaar 9247eba3d2cSBram Moolenaar" More tests for 'errorformat' 9252b946c9fSBram Moolenaarfunc Test_efm1() 9267eba3d2cSBram Moolenaar " The 'errorformat' setting is different on non-Unix systems. 9277eba3d2cSBram Moolenaar " This test works only on Unix-like systems. 9286d91bcb4SBram Moolenaar CheckUnix 9297eba3d2cSBram Moolenaar 930c79745a8SBram Moolenaar let l =<< trim [DATA] 931c79745a8SBram Moolenaar "Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set. 932c79745a8SBram Moolenaar "Xtestfile", line 6 col 19; this is an error 933c79745a8SBram Moolenaar gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include version.c 934c79745a8SBram Moolenaar Xtestfile:9: parse error before `asd' 935c79745a8SBram Moolenaar make: *** [vim] Error 1 936c79745a8SBram Moolenaar in file "Xtestfile" linenr 10: there is an error 937c79745a8SBram Moolenaar 938c79745a8SBram Moolenaar 2 returned 939c79745a8SBram Moolenaar "Xtestfile", line 11 col 1; this is an error 940c79745a8SBram Moolenaar "Xtestfile", line 12 col 2; this is another error 941c79745a8SBram Moolenaar "Xtestfile", line 14:10; this is an error in column 10 942c79745a8SBram Moolenaar =Xtestfile=, line 15:10; this is another error, but in vcol 10 this time 943c79745a8SBram Moolenaar "Xtestfile", linenr 16: yet another problem 944c79745a8SBram Moolenaar Error in "Xtestfile" at line 17: 945c79745a8SBram Moolenaar x should be a dot 946c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17 947c79745a8SBram Moolenaar ^ 948c79745a8SBram Moolenaar Error in "Xtestfile" at line 18: 949c79745a8SBram Moolenaar x should be a dot 950c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18 951c79745a8SBram Moolenaar .............^ 952c79745a8SBram Moolenaar Error in "Xtestfile" at line 19: 953c79745a8SBram Moolenaar x should be a dot 954c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19 955c79745a8SBram Moolenaar --------------^ 956c79745a8SBram Moolenaar Error in "Xtestfile" at line 20: 957c79745a8SBram Moolenaar x should be a dot 958c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20 959c79745a8SBram Moolenaar ^ 960c79745a8SBram Moolenaar 961c79745a8SBram Moolenaar Does anyone know what is the problem and how to correction it? 962c79745a8SBram Moolenaar "Xtestfile", line 21 col 9: What is the title of the quickfix window? 963c79745a8SBram Moolenaar "Xtestfile", line 22 col 9: What is the title of the quickfix window? 964c79745a8SBram Moolenaar [DATA] 9657eba3d2cSBram Moolenaar 9667eba3d2cSBram Moolenaar call writefile(l, 'Xerrorfile1') 9677eba3d2cSBram Moolenaar call writefile(l[:-2], 'Xerrorfile2') 9687eba3d2cSBram Moolenaar 969e7eb9270SBram Moolenaar let m =<< [DATA] 970c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 2 971c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 3 972c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 4 973c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 5 974c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 6 975c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 7 976c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 8 977c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 9 978c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 10 979c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 11 980c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 12 981c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 13 982c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 14 983c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 15 984c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 16 985c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17 986c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18 987c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19 988c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20 989c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 21 990c79745a8SBram Moolenaar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 22 991c79745a8SBram Moolenaar[DATA] 9927eba3d2cSBram Moolenaar call writefile(m, 'Xtestfile') 9937eba3d2cSBram Moolenaar 9947eba3d2cSBram Moolenaar let save_efm = &efm 9957eba3d2cSBram Moolenaar set efm+==%f=\\,\ line\ %l%*\\D%v%*[^\ ]\ %m 9967eba3d2cSBram Moolenaar set efm^=%AError\ in\ \"%f\"\ at\ line\ %l:,%Z%p^,%C%m 9977eba3d2cSBram Moolenaar 9987eba3d2cSBram Moolenaar exe 'cf Xerrorfile2' 9997eba3d2cSBram Moolenaar clast 10007eba3d2cSBram Moolenaar copen 10017eba3d2cSBram Moolenaar call assert_equal(':cf Xerrorfile2', w:quickfix_title) 10027eba3d2cSBram Moolenaar wincmd p 10037eba3d2cSBram Moolenaar 10047eba3d2cSBram Moolenaar exe 'cf Xerrorfile1' 10057eba3d2cSBram Moolenaar call assert_equal([4, 12], [line('.'), col('.')]) 10067eba3d2cSBram Moolenaar cn 10077eba3d2cSBram Moolenaar call assert_equal([6, 19], [line('.'), col('.')]) 10087eba3d2cSBram Moolenaar cn 10097eba3d2cSBram Moolenaar call assert_equal([9, 2], [line('.'), col('.')]) 10107eba3d2cSBram Moolenaar cn 10117eba3d2cSBram Moolenaar call assert_equal([10, 2], [line('.'), col('.')]) 10127eba3d2cSBram Moolenaar cn 10137eba3d2cSBram Moolenaar call assert_equal([11, 1], [line('.'), col('.')]) 10147eba3d2cSBram Moolenaar cn 10157eba3d2cSBram Moolenaar call assert_equal([12, 2], [line('.'), col('.')]) 10167eba3d2cSBram Moolenaar cn 10177eba3d2cSBram Moolenaar call assert_equal([14, 10], [line('.'), col('.')]) 10187eba3d2cSBram Moolenaar cn 10197eba3d2cSBram Moolenaar call assert_equal([15, 3, 10], [line('.'), col('.'), virtcol('.')]) 10207eba3d2cSBram Moolenaar cn 10217eba3d2cSBram Moolenaar call assert_equal([16, 2], [line('.'), col('.')]) 10227eba3d2cSBram Moolenaar cn 10237eba3d2cSBram Moolenaar call assert_equal([17, 6], [line('.'), col('.')]) 10247eba3d2cSBram Moolenaar cn 10257eba3d2cSBram Moolenaar call assert_equal([18, 7], [line('.'), col('.')]) 10267eba3d2cSBram Moolenaar cn 10277eba3d2cSBram Moolenaar call assert_equal([19, 8], [line('.'), col('.')]) 10287eba3d2cSBram Moolenaar cn 10297eba3d2cSBram Moolenaar call assert_equal([20, 9], [line('.'), col('.')]) 10307eba3d2cSBram Moolenaar clast 10317eba3d2cSBram Moolenaar cprev 10327eba3d2cSBram Moolenaar cprev 10337eba3d2cSBram Moolenaar wincmd w 10347eba3d2cSBram Moolenaar call assert_equal(':cf Xerrorfile1', w:quickfix_title) 10357eba3d2cSBram Moolenaar wincmd p 10367eba3d2cSBram Moolenaar 10377eba3d2cSBram Moolenaar let &efm = save_efm 10387eba3d2cSBram Moolenaar call delete('Xerrorfile1') 10397eba3d2cSBram Moolenaar call delete('Xerrorfile2') 10407eba3d2cSBram Moolenaar call delete('Xtestfile') 10412b946c9fSBram Moolenaarendfunc 1042ffec3c53SBram Moolenaar 1043ab47c61fSBram Moolenaar" Test for quickfix directory stack support 10442b946c9fSBram Moolenaarfunc s:dir_stack_tests(cchar) 104538df43bdSBram Moolenaar call s:setup_commands(a:cchar) 104638df43bdSBram Moolenaar 1047ab47c61fSBram Moolenaar let save_efm=&efm 1048ab47c61fSBram Moolenaar set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f' 1049ab47c61fSBram Moolenaar 1050361c8f0eSBram Moolenaar let lines = ["Entering dir 'dir1/a'", 1051361c8f0eSBram Moolenaar \ 'habits2.txt:1:Nine Healthy Habits', 1052361c8f0eSBram Moolenaar \ "Entering dir 'b'", 1053361c8f0eSBram Moolenaar \ 'habits3.txt:2:0 Hours of television', 1054361c8f0eSBram Moolenaar \ 'habits2.txt:7:5 Small meals', 1055361c8f0eSBram Moolenaar \ "Entering dir 'dir1/c'", 1056361c8f0eSBram Moolenaar \ 'habits4.txt:3:1 Hour of exercise', 1057361c8f0eSBram Moolenaar \ "Leaving dir 'dir1/c'", 1058361c8f0eSBram Moolenaar \ "Leaving dir 'dir1/a'", 1059361c8f0eSBram Moolenaar \ 'habits1.txt:4:2 Liters of water', 1060361c8f0eSBram Moolenaar \ "Entering dir 'dir2'", 1061361c8f0eSBram Moolenaar \ 'habits5.txt:5:3 Cups of hot green tea', 1062361c8f0eSBram Moolenaar \ "Leaving dir 'dir2'" 1063361c8f0eSBram Moolenaar \] 1064ab47c61fSBram Moolenaar 1065361c8f0eSBram Moolenaar Xexpr "" 1066361c8f0eSBram Moolenaar for l in lines 1067361c8f0eSBram Moolenaar Xaddexpr l 1068361c8f0eSBram Moolenaar endfor 1069ab47c61fSBram Moolenaar 10703ef5bf7dSBram Moolenaar let qf = g:Xgetlist() 1071ab47c61fSBram Moolenaar 1072ab47c61fSBram Moolenaar call assert_equal('dir1/a/habits2.txt', bufname(qf[1].bufnr)) 1073ab47c61fSBram Moolenaar call assert_equal(1, qf[1].lnum) 1074ab47c61fSBram Moolenaar call assert_equal('dir1/a/b/habits3.txt', bufname(qf[3].bufnr)) 1075ab47c61fSBram Moolenaar call assert_equal(2, qf[3].lnum) 1076ab47c61fSBram Moolenaar call assert_equal('dir1/a/habits2.txt', bufname(qf[4].bufnr)) 1077ab47c61fSBram Moolenaar call assert_equal(7, qf[4].lnum) 1078ab47c61fSBram Moolenaar call assert_equal('dir1/c/habits4.txt', bufname(qf[6].bufnr)) 1079ab47c61fSBram Moolenaar call assert_equal(3, qf[6].lnum) 1080ab47c61fSBram Moolenaar call assert_equal('habits1.txt', bufname(qf[9].bufnr)) 1081ab47c61fSBram Moolenaar call assert_equal(4, qf[9].lnum) 1082ab47c61fSBram Moolenaar call assert_equal('dir2/habits5.txt', bufname(qf[11].bufnr)) 1083ab47c61fSBram Moolenaar call assert_equal(5, qf[11].lnum) 1084ab47c61fSBram Moolenaar 1085ab47c61fSBram Moolenaar let &efm=save_efm 10862b946c9fSBram Moolenaarendfunc 1087ab47c61fSBram Moolenaar 1088ab47c61fSBram Moolenaar" Tests for %D and %X errorformat options 10892b946c9fSBram Moolenaarfunc Test_efm_dirstack() 1090ab47c61fSBram Moolenaar " Create the directory stack and files 1091ab47c61fSBram Moolenaar call mkdir('dir1') 1092ab47c61fSBram Moolenaar call mkdir('dir1/a') 1093ab47c61fSBram Moolenaar call mkdir('dir1/a/b') 1094ab47c61fSBram Moolenaar call mkdir('dir1/c') 1095ab47c61fSBram Moolenaar call mkdir('dir2') 1096ab47c61fSBram Moolenaar 1097ab47c61fSBram Moolenaar let lines = ["Nine Healthy Habits", 1098ab47c61fSBram Moolenaar \ "0 Hours of television", 1099ab47c61fSBram Moolenaar \ "1 Hour of exercise", 1100ab47c61fSBram Moolenaar \ "2 Liters of water", 1101ab47c61fSBram Moolenaar \ "3 Cups of hot green tea", 1102ab47c61fSBram Moolenaar \ "4 Short mental breaks", 1103ab47c61fSBram Moolenaar \ "5 Small meals", 1104ab47c61fSBram Moolenaar \ "6 AM wake up time", 1105ab47c61fSBram Moolenaar \ "7 Minutes of laughter", 1106ab47c61fSBram Moolenaar \ "8 Hours of sleep (at least)", 1107ab47c61fSBram Moolenaar \ "9 PM end of the day and off to bed" 1108ab47c61fSBram Moolenaar \ ] 1109ab47c61fSBram Moolenaar call writefile(lines, 'habits1.txt') 1110ab47c61fSBram Moolenaar call writefile(lines, 'dir1/a/habits2.txt') 1111ab47c61fSBram Moolenaar call writefile(lines, 'dir1/a/b/habits3.txt') 1112ab47c61fSBram Moolenaar call writefile(lines, 'dir1/c/habits4.txt') 1113ab47c61fSBram Moolenaar call writefile(lines, 'dir2/habits5.txt') 1114ab47c61fSBram Moolenaar 1115ab47c61fSBram Moolenaar call s:dir_stack_tests('c') 1116ab47c61fSBram Moolenaar call s:dir_stack_tests('l') 1117ab47c61fSBram Moolenaar 1118ab47c61fSBram Moolenaar call delete('dir1', 'rf') 1119ab47c61fSBram Moolenaar call delete('dir2', 'rf') 1120ab47c61fSBram Moolenaar call delete('habits1.txt') 11212b946c9fSBram Moolenaarendfunc 1122ab47c61fSBram Moolenaar 11239b457948SBram Moolenaar" Test for resync after continuing an ignored message 11242b946c9fSBram Moolenaarfunc Xefm_ignore_continuations(cchar) 11259b457948SBram Moolenaar call s:setup_commands(a:cchar) 11269b457948SBram Moolenaar 11279b457948SBram Moolenaar let save_efm = &efm 11289b457948SBram Moolenaar 11299b457948SBram Moolenaar let &efm = 11309b457948SBram Moolenaar \ '%Eerror %m %l,' . 11319b457948SBram Moolenaar \ '%-Wignored %m %l,' . 11329b457948SBram Moolenaar \ '%+Cmore ignored %m %l,' . 11339b457948SBram Moolenaar \ '%Zignored end' 11349b457948SBram Moolenaar Xgetexpr ['ignored warning 1', 'more ignored continuation 2', 'ignored end', 'error resync 4'] 11359b457948SBram Moolenaar let l = map(g:Xgetlist(), '[v:val.text, v:val.valid, v:val.lnum, v:val.type]') 11369b457948SBram Moolenaar call assert_equal([['resync', 1, 4, 'E']], l) 11379b457948SBram Moolenaar 11389b457948SBram Moolenaar let &efm = save_efm 11392b946c9fSBram Moolenaarendfunc 11409b457948SBram Moolenaar 11412b946c9fSBram Moolenaarfunc Test_efm_ignore_continuations() 11429b457948SBram Moolenaar call Xefm_ignore_continuations('c') 11439b457948SBram Moolenaar call Xefm_ignore_continuations('l') 11442b946c9fSBram Moolenaarendfunc 11459b457948SBram Moolenaar 11460fcc7c6dSBram Moolenaar" Tests for invalid error format specifies 11472b946c9fSBram Moolenaarfunc Xinvalid_efm_Tests(cchar) 11480fcc7c6dSBram Moolenaar call s:setup_commands(a:cchar) 11490fcc7c6dSBram Moolenaar 1150049cba9eSBram Moolenaar let save_efm = &efm 1151049cba9eSBram Moolenaar 11520fcc7c6dSBram Moolenaar set efm=%f:%l:%m,%f:%f:%l:%m 11530fcc7c6dSBram Moolenaar call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E372:') 11540fcc7c6dSBram Moolenaar 11550fcc7c6dSBram Moolenaar set efm=%f:%l:%m,%f:%l:%r:%m 11560fcc7c6dSBram Moolenaar call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:') 11570fcc7c6dSBram Moolenaar 11580fcc7c6dSBram Moolenaar set efm=%f:%l:%m,%O:%f:%l:%m 11590fcc7c6dSBram Moolenaar call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:') 11600fcc7c6dSBram Moolenaar 11610fcc7c6dSBram Moolenaar set efm=%f:%l:%m,%f:%l:%*[^a-z 11620fcc7c6dSBram Moolenaar call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E374:') 11630fcc7c6dSBram Moolenaar 11640fcc7c6dSBram Moolenaar set efm=%f:%l:%m,%f:%l:%*c 11650fcc7c6dSBram Moolenaar call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E375:') 11660fcc7c6dSBram Moolenaar 11670fcc7c6dSBram Moolenaar set efm=%f:%l:%m,%L%M%N 11680fcc7c6dSBram Moolenaar call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E376:') 11690fcc7c6dSBram Moolenaar 11700fcc7c6dSBram Moolenaar set efm=%f:%l:%m,%f:%l:%m:%R 11710fcc7c6dSBram Moolenaar call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E377:') 11720fcc7c6dSBram Moolenaar 117370077dd1SBram Moolenaar " Invalid regular expression 117470077dd1SBram Moolenaar set efm=%\\%%k 117570077dd1SBram Moolenaar call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E867:') 117670077dd1SBram Moolenaar 11770fcc7c6dSBram Moolenaar set efm= 11780fcc7c6dSBram Moolenaar call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E378:') 11790fcc7c6dSBram Moolenaar 11800fcc7c6dSBram Moolenaar set efm=%DEntering\ dir\ abc,%f:%l:%m 11810fcc7c6dSBram Moolenaar call assert_fails('Xexpr ["Entering dir abc", "abc.txt:1:Hello world"]', 'E379:') 11820fcc7c6dSBram Moolenaar 11830fcc7c6dSBram Moolenaar let &efm = save_efm 11842b946c9fSBram Moolenaarendfunc 11850fcc7c6dSBram Moolenaar 11862b946c9fSBram Moolenaarfunc Test_invalid_efm() 11870fcc7c6dSBram Moolenaar call Xinvalid_efm_Tests('c') 11880fcc7c6dSBram Moolenaar call Xinvalid_efm_Tests('l') 11892b946c9fSBram Moolenaarendfunc 11900fcc7c6dSBram Moolenaar 11910fcc7c6dSBram Moolenaar" TODO: 11920fcc7c6dSBram Moolenaar" Add tests for the following formats in 'errorformat' 11930fcc7c6dSBram Moolenaar" %r %O 11942b946c9fSBram Moolenaarfunc Test_efm2() 11950fcc7c6dSBram Moolenaar let save_efm = &efm 1196049cba9eSBram Moolenaar 1197049cba9eSBram Moolenaar " Test for %s format in efm 1198049cba9eSBram Moolenaar set efm=%f:%s 1199049cba9eSBram Moolenaar cexpr 'Xtestfile:Line search text' 1200049cba9eSBram Moolenaar let l = getqflist() 120170077dd1SBram Moolenaar call assert_equal('^\VLine search text\$', l[0].pattern) 120270077dd1SBram Moolenaar call assert_equal(0, l[0].lnum) 1203049cba9eSBram Moolenaar 1204ee85df37SBram Moolenaar let l = split(execute('clist', ''), "\n") 1205ee85df37SBram Moolenaar call assert_equal([' 1 Xtestfile:^\VLine search text\$: '], l) 1206ee85df37SBram Moolenaar 120770077dd1SBram Moolenaar " Test for a long line 120870077dd1SBram Moolenaar cexpr 'Xtestfile:' . repeat('a', 1026) 120970077dd1SBram Moolenaar let l = getqflist() 121070077dd1SBram Moolenaar call assert_equal('^\V' . repeat('a', 1019) . '\$', l[0].pattern) 121170077dd1SBram Moolenaar 12120fcc7c6dSBram Moolenaar " Test for %P, %Q and %t format specifiers 1213c79745a8SBram Moolenaar let lines =<< trim [DATA] 1214c79745a8SBram Moolenaar [Xtestfile1] 1215c79745a8SBram Moolenaar (1,17) error: ';' missing 1216c79745a8SBram Moolenaar (21,2) warning: variable 'z' not defined 1217c79745a8SBram Moolenaar (67,3) error: end of file found before string ended 1218c79745a8SBram Moolenaar -- 1219c79745a8SBram Moolenaar 1220c79745a8SBram Moolenaar [Xtestfile2] 1221c79745a8SBram Moolenaar -- 1222c79745a8SBram Moolenaar 1223c79745a8SBram Moolenaar [Xtestfile3] 1224c79745a8SBram Moolenaar NEW compiler v1.1 1225c79745a8SBram Moolenaar (2,2) warning: variable 'x' not defined 1226c79745a8SBram Moolenaar (67,3) warning: 's' already defined 1227c79745a8SBram Moolenaar -- 1228c79745a8SBram Moolenaar [DATA] 1229c79745a8SBram Moolenaar 1230ee85df37SBram Moolenaar set efm=%+P[%f]%r,(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%+Q--%r 1231391b1dd0SBram Moolenaar " To exercise the push/pop file functionality in quickfix, the test files 1232391b1dd0SBram Moolenaar " need to be created. 1233391b1dd0SBram Moolenaar call writefile(['Line1'], 'Xtestfile1') 1234391b1dd0SBram Moolenaar call writefile(['Line2'], 'Xtestfile2') 1235391b1dd0SBram Moolenaar call writefile(['Line3'], 'Xtestfile3') 1236361c8f0eSBram Moolenaar cexpr "" 1237361c8f0eSBram Moolenaar for l in lines 1238361c8f0eSBram Moolenaar caddexpr l 1239361c8f0eSBram Moolenaar endfor 1240049cba9eSBram Moolenaar let l = getqflist() 1241ee85df37SBram Moolenaar call assert_equal(12, len(l)) 1242049cba9eSBram Moolenaar call assert_equal(21, l[2].lnum) 1243049cba9eSBram Moolenaar call assert_equal(2, l[2].col) 12440fcc7c6dSBram Moolenaar call assert_equal('w', l[2].type) 12450fcc7c6dSBram Moolenaar call assert_equal('e', l[3].type) 1246391b1dd0SBram Moolenaar call delete('Xtestfile1') 1247391b1dd0SBram Moolenaar call delete('Xtestfile2') 1248391b1dd0SBram Moolenaar call delete('Xtestfile3') 12490fcc7c6dSBram Moolenaar 125070077dd1SBram Moolenaar " Test for %P, %Q with non-existing files 125170077dd1SBram Moolenaar cexpr lines 125270077dd1SBram Moolenaar let l = getqflist() 125370077dd1SBram Moolenaar call assert_equal(14, len(l)) 125470077dd1SBram Moolenaar call assert_equal('[Xtestfile1]', l[0].text) 125570077dd1SBram Moolenaar call assert_equal('[Xtestfile2]', l[6].text) 125670077dd1SBram Moolenaar call assert_equal('[Xtestfile3]', l[9].text) 125770077dd1SBram Moolenaar 12580fcc7c6dSBram Moolenaar " Tests for %E, %C and %Z format specifiers 1259c79745a8SBram Moolenaar let lines =<< trim [DATA] 1260c79745a8SBram Moolenaar Error 275 1261c79745a8SBram Moolenaar line 42 1262c79745a8SBram Moolenaar column 3 1263c79745a8SBram Moolenaar ' ' expected after '--' 1264c79745a8SBram Moolenaar [DATA] 1265c79745a8SBram Moolenaar 12660fcc7c6dSBram Moolenaar set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m 12670fcc7c6dSBram Moolenaar cgetexpr lines 12680fcc7c6dSBram Moolenaar let l = getqflist() 12690fcc7c6dSBram Moolenaar call assert_equal(275, l[0].nr) 12700fcc7c6dSBram Moolenaar call assert_equal(42, l[0].lnum) 12710fcc7c6dSBram Moolenaar call assert_equal(3, l[0].col) 12720fcc7c6dSBram Moolenaar call assert_equal('E', l[0].type) 12730fcc7c6dSBram Moolenaar call assert_equal("\n' ' expected after '--'", l[0].text) 12740fcc7c6dSBram Moolenaar 12750fcc7c6dSBram Moolenaar " Test for %> 1276c79745a8SBram Moolenaar let lines =<< trim [DATA] 1277c79745a8SBram Moolenaar Error in line 147 of foo.c: 1278c79745a8SBram Moolenaar unknown variable 'i' 1279c79745a8SBram Moolenaar [DATA] 1280c79745a8SBram Moolenaar 12810fcc7c6dSBram Moolenaar set efm=unknown\ variable\ %m,%E%>Error\ in\ line\ %l\ of\ %f:,%Z%m 12820fcc7c6dSBram Moolenaar cgetexpr lines 12830fcc7c6dSBram Moolenaar let l = getqflist() 12840fcc7c6dSBram Moolenaar call assert_equal(147, l[0].lnum) 12850fcc7c6dSBram Moolenaar call assert_equal('E', l[0].type) 12860fcc7c6dSBram Moolenaar call assert_equal("\nunknown variable 'i'", l[0].text) 1287049cba9eSBram Moolenaar 1288e87e6dddSBram Moolenaar " Test for %A, %C and other formats 1289c79745a8SBram Moolenaar let lines =<< trim [DATA] 1290c79745a8SBram Moolenaar ============================================================== 1291c79745a8SBram Moolenaar FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest) 1292c79745a8SBram Moolenaar -------------------------------------------------------------- 1293c79745a8SBram Moolenaar Traceback (most recent call last): 1294c79745a8SBram Moolenaar File "unittests/dbfacadeTest.py", line 89, in testFoo 1295c79745a8SBram Moolenaar self.assertEquals(34, dtid) 1296c79745a8SBram Moolenaar File "/usr/lib/python2.2/unittest.py", line 286, in 1297c79745a8SBram Moolenaar failUnlessEqual 1298c79745a8SBram Moolenaar raise self.failureException, \\ 129970077dd1SBram Moolenaar W:AssertionError: 34 != 33 1300c79745a8SBram Moolenaar 1301c79745a8SBram Moolenaar -------------------------------------------------------------- 1302c79745a8SBram Moolenaar Ran 27 tests in 0.063s 1303c79745a8SBram Moolenaar [DATA] 1304c79745a8SBram Moolenaar 130570077dd1SBram Moolenaar set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%t:%m 1306e87e6dddSBram Moolenaar cgetexpr lines 1307e87e6dddSBram Moolenaar let l = getqflist() 1308e87e6dddSBram Moolenaar call assert_equal(8, len(l)) 1309e87e6dddSBram Moolenaar call assert_equal(89, l[4].lnum) 1310e87e6dddSBram Moolenaar call assert_equal(1, l[4].valid) 1311e87e6dddSBram Moolenaar call assert_equal('unittests/dbfacadeTest.py', bufname(l[4].bufnr)) 131270077dd1SBram Moolenaar call assert_equal('W', l[4].type) 1313e87e6dddSBram Moolenaar 1314d76ce852SBram Moolenaar " Test for %o 1315d76ce852SBram Moolenaar set efm=%f(%o):%l\ %m 1316bc7845daSBram Moolenaar cgetexpr ['Xotestfile(Language.PureScript.Types):20 Error'] 1317bc7845daSBram Moolenaar call writefile(['Line1'], 'Xotestfile') 1318d76ce852SBram Moolenaar let l = getqflist() 1319d76ce852SBram Moolenaar call assert_equal(1, len(l), string(l)) 1320d76ce852SBram Moolenaar call assert_equal('Language.PureScript.Types', l[0].module) 1321d76ce852SBram Moolenaar copen 1322d76ce852SBram Moolenaar call assert_equal('Language.PureScript.Types|20| Error', getline(1)) 1323d76ce852SBram Moolenaar call feedkeys("\<CR>", 'xn') 1324bc7845daSBram Moolenaar call assert_equal('Xotestfile', expand('%:t')) 1325d76ce852SBram Moolenaar cclose 1326d76ce852SBram Moolenaar bd 1327bc7845daSBram Moolenaar call delete("Xotestfile") 1328d76ce852SBram Moolenaar 132970077dd1SBram Moolenaar " Test for a long module name 133070077dd1SBram Moolenaar cexpr 'Xtest(' . repeat('m', 1026) . '):15 message' 133170077dd1SBram Moolenaar let l = getqflist() 133270077dd1SBram Moolenaar call assert_equal(repeat('m', 1024), l[0].module) 133370077dd1SBram Moolenaar call assert_equal(15, l[0].lnum) 133470077dd1SBram Moolenaar call assert_equal('message', l[0].text) 133570077dd1SBram Moolenaar 133699895eacSBram Moolenaar " The following sequence of commands used to crash Vim 133799895eacSBram Moolenaar set efm=%W%m 133899895eacSBram Moolenaar cgetexpr ['msg1'] 133999895eacSBram Moolenaar let l = getqflist() 134099895eacSBram Moolenaar call assert_equal(1, len(l), string(l)) 134199895eacSBram Moolenaar call assert_equal('msg1', l[0].text) 134299895eacSBram Moolenaar set efm=%C%m 134399895eacSBram Moolenaar lexpr 'msg2' 134499895eacSBram Moolenaar let l = getloclist(0) 134599895eacSBram Moolenaar call assert_equal(1, len(l), string(l)) 134699895eacSBram Moolenaar call assert_equal('msg2', l[0].text) 134799895eacSBram Moolenaar lopen 134899895eacSBram Moolenaar call setqflist([], 'r') 134999895eacSBram Moolenaar caddbuf 135099895eacSBram Moolenaar let l = getqflist() 135199895eacSBram Moolenaar call assert_equal(1, len(l), string(l)) 135299895eacSBram Moolenaar call assert_equal('|| msg2', l[0].text) 135399895eacSBram Moolenaar 135478ddc06bSBram Moolenaar " When matching error lines, case should be ignored. Test for this. 135578ddc06bSBram Moolenaar set noignorecase 135678ddc06bSBram Moolenaar let l=getqflist({'lines' : ['Xtest:FOO10:Line 20'], 'efm':'%f:foo%l:%m'}) 135778ddc06bSBram Moolenaar call assert_equal(10, l.items[0].lnum) 135878ddc06bSBram Moolenaar call assert_equal('Line 20', l.items[0].text) 135978ddc06bSBram Moolenaar set ignorecase& 136078ddc06bSBram Moolenaar 136199895eacSBram Moolenaar new | only 1362049cba9eSBram Moolenaar let &efm = save_efm 13632b946c9fSBram Moolenaarendfunc 1364049cba9eSBram Moolenaar 1365e928366dSBram Moolenaar" Test for '%t' (error type) field in 'efm' 1366e928366dSBram Moolenaarfunc Test_efm_error_type() 1367e928366dSBram Moolenaar let save_efm = &efm 1368e928366dSBram Moolenaar 1369e928366dSBram Moolenaar " error type 1370e928366dSBram Moolenaar set efm=%f:%l:%t:%m 1371e928366dSBram Moolenaar cexpr ["Xfile1:10:E:msg1", "Xfile1:20:W:msg2", "Xfile1:30:I:msg3", 1372e928366dSBram Moolenaar \ "Xfile1:40:N:msg4", "Xfile1:50:R:msg5"] 1373e928366dSBram Moolenaar let output = split(execute('clist'), "\n") 1374e928366dSBram Moolenaar call assert_equal([ 1375e928366dSBram Moolenaar \ ' 1 Xfile1:10 error: msg1', 1376e928366dSBram Moolenaar \ ' 2 Xfile1:20 warning: msg2', 1377e928366dSBram Moolenaar \ ' 3 Xfile1:30 info: msg3', 1378e928366dSBram Moolenaar \ ' 4 Xfile1:40 note: msg4', 1379e928366dSBram Moolenaar \ ' 5 Xfile1:50 R: msg5'], output) 1380e928366dSBram Moolenaar 1381e928366dSBram Moolenaar " error type and a error number 1382e928366dSBram Moolenaar set efm=%f:%l:%t:%n:%m 1383e928366dSBram Moolenaar cexpr ["Xfile1:10:E:2:msg1", "Xfile1:20:W:4:msg2", "Xfile1:30:I:6:msg3", 1384e928366dSBram Moolenaar \ "Xfile1:40:N:8:msg4", "Xfile1:50:R:3:msg5"] 1385e928366dSBram Moolenaar let output = split(execute('clist'), "\n") 1386e928366dSBram Moolenaar call assert_equal([ 1387e928366dSBram Moolenaar \ ' 1 Xfile1:10 error 2: msg1', 1388e928366dSBram Moolenaar \ ' 2 Xfile1:20 warning 4: msg2', 1389e928366dSBram Moolenaar \ ' 3 Xfile1:30 info 6: msg3', 1390e928366dSBram Moolenaar \ ' 4 Xfile1:40 note 8: msg4', 1391e928366dSBram Moolenaar \ ' 5 Xfile1:50 R 3: msg5'], output) 1392e928366dSBram Moolenaar let &efm = save_efm 1393e928366dSBram Moolenaarendfunc 1394e928366dSBram Moolenaar 13952b946c9fSBram Moolenaarfunc XquickfixChangedByAutocmd(cchar) 13963ef5bf7dSBram Moolenaar call s:setup_commands(a:cchar) 1397ffec3c53SBram Moolenaar if a:cchar == 'c' 1398ffec3c53SBram Moolenaar let ErrorNr = 'E925' 13992b946c9fSBram Moolenaar func! ReadFunc() 1400ffec3c53SBram Moolenaar colder 1401ffec3c53SBram Moolenaar cgetexpr [] 1402ffec3c53SBram Moolenaar endfunc 1403ffec3c53SBram Moolenaar else 1404ffec3c53SBram Moolenaar let ErrorNr = 'E926' 14052b946c9fSBram Moolenaar func! ReadFunc() 1406ffec3c53SBram Moolenaar lolder 1407ffec3c53SBram Moolenaar lgetexpr [] 1408ffec3c53SBram Moolenaar endfunc 1409ffec3c53SBram Moolenaar endif 1410ffec3c53SBram Moolenaar 1411ffec3c53SBram Moolenaar augroup testgroup 1412ffec3c53SBram Moolenaar au! 1413d106e5baSBram Moolenaar autocmd BufReadCmd test_changed.txt call ReadFunc() 1414ffec3c53SBram Moolenaar augroup END 1415ffec3c53SBram Moolenaar 1416d106e5baSBram Moolenaar new | only 1417ffec3c53SBram Moolenaar let words = [ "a", "b" ] 1418ffec3c53SBram Moolenaar let qflist = [] 1419ffec3c53SBram Moolenaar for word in words 1420d106e5baSBram Moolenaar call add(qflist, {'filename': 'test_changed.txt'}) 14213ef5bf7dSBram Moolenaar call g:Xsetlist(qflist, ' ') 1422ffec3c53SBram Moolenaar endfor 14233ef5bf7dSBram Moolenaar call assert_fails('Xrewind', ErrorNr . ':') 1424ffec3c53SBram Moolenaar 1425ffec3c53SBram Moolenaar augroup! testgroup 1426ffec3c53SBram Moolenaarendfunc 1427ffec3c53SBram Moolenaar 14282b946c9fSBram Moolenaarfunc Test_quickfix_was_changed_by_autocmd() 1429ffec3c53SBram Moolenaar call XquickfixChangedByAutocmd('c') 1430ffec3c53SBram Moolenaar call XquickfixChangedByAutocmd('l') 14312b946c9fSBram Moolenaarendfunc 14328b20179cSBram Moolenaar 14334d170af0SBram Moolenaarfunc Test_setloclist_in_autocommand() 14344d170af0SBram Moolenaar call writefile(['test1', 'test2'], 'Xfile') 14354d170af0SBram Moolenaar edit Xfile 14364d170af0SBram Moolenaar let s:bufnr = bufnr() 14374d170af0SBram Moolenaar call setloclist(1, 14384d170af0SBram Moolenaar \ [{'bufnr' : s:bufnr, 'lnum' : 1, 'text' : 'test1'}, 14394d170af0SBram Moolenaar \ {'bufnr' : s:bufnr, 'lnum' : 2, 'text' : 'test2'}]) 14404d170af0SBram Moolenaar 14414d170af0SBram Moolenaar augroup Test_LocList 14424d170af0SBram Moolenaar au! 14434d170af0SBram Moolenaar autocmd BufEnter * call setloclist(1, 14444d170af0SBram Moolenaar \ [{'bufnr' : s:bufnr, 'lnum' : 1, 'text' : 'test1'}, 14454d170af0SBram Moolenaar \ {'bufnr' : s:bufnr, 'lnum' : 2, 'text' : 'test2'}], 'r') 14464d170af0SBram Moolenaar augroup END 14474d170af0SBram Moolenaar 14484d170af0SBram Moolenaar lopen 14494d170af0SBram Moolenaar call assert_fails('exe "normal j\<CR>"', 'E926:') 14504d170af0SBram Moolenaar 14514d170af0SBram Moolenaar augroup Test_LocList 14524d170af0SBram Moolenaar au! 14534d170af0SBram Moolenaar augroup END 14544d170af0SBram Moolenaar call delete('Xfile') 14554d170af0SBram Moolenaarendfunc 14564d170af0SBram Moolenaar 14578b20179cSBram Moolenaarfunc Test_caddbuffer_to_empty() 14588b20179cSBram Moolenaar helpgr quickfix 14598b20179cSBram Moolenaar call setqflist([], 'r') 14608b20179cSBram Moolenaar cad 1461f68f1d70SBram Moolenaar try 1462f68f1d70SBram Moolenaar cn 1463f68f1d70SBram Moolenaar catch 1464f68f1d70SBram Moolenaar " number of matches is unknown 1465f68f1d70SBram Moolenaar call assert_true(v:exception =~ 'E553:') 1466f68f1d70SBram Moolenaar endtry 14678b20179cSBram Moolenaar quit! 14688b20179cSBram Moolenaarendfunc 146989c64d55SBram Moolenaar 147089c64d55SBram Moolenaarfunc Test_cgetexpr_works() 147189c64d55SBram Moolenaar " this must not crash Vim 147289c64d55SBram Moolenaar cgetexpr [$x] 14733ef5bf7dSBram Moolenaar lgetexpr [$x] 147489c64d55SBram Moolenaarendfunc 1475c1808d58SBram Moolenaar 1476c1808d58SBram Moolenaar" Tests for the setqflist() and setloclist() functions 14772b946c9fSBram Moolenaarfunc SetXlistTests(cchar, bnum) 14783ef5bf7dSBram Moolenaar call s:setup_commands(a:cchar) 1479c1808d58SBram Moolenaar 14803ef5bf7dSBram Moolenaar call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 1}, 1481c1808d58SBram Moolenaar \ {'bufnr': a:bnum, 'lnum': 2}]) 14823ef5bf7dSBram Moolenaar let l = g:Xgetlist() 1483c1808d58SBram Moolenaar call assert_equal(2, len(l)) 1484c1808d58SBram Moolenaar call assert_equal(2, l[1].lnum) 1485c1808d58SBram Moolenaar 14863ef5bf7dSBram Moolenaar Xnext 14873ef5bf7dSBram Moolenaar call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3}], 'a') 14883ef5bf7dSBram Moolenaar let l = g:Xgetlist() 1489c1808d58SBram Moolenaar call assert_equal(3, len(l)) 14903ef5bf7dSBram Moolenaar Xnext 1491c1808d58SBram Moolenaar call assert_equal(3, line('.')) 1492c1808d58SBram Moolenaar 14932b2b8ae5SBram Moolenaar " Appending entries to the list should not change the cursor position 14942b2b8ae5SBram Moolenaar " in the quickfix window 14953ef5bf7dSBram Moolenaar Xwindow 14962b2b8ae5SBram Moolenaar 1 14973ef5bf7dSBram Moolenaar call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 4}, 14982b2b8ae5SBram Moolenaar \ {'bufnr': a:bnum, 'lnum': 5}], 'a') 14992b2b8ae5SBram Moolenaar call assert_equal(1, line('.')) 15002b2b8ae5SBram Moolenaar close 15012b2b8ae5SBram Moolenaar 15023ef5bf7dSBram Moolenaar call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3}, 1503c1808d58SBram Moolenaar \ {'bufnr': a:bnum, 'lnum': 4}, 1504c1808d58SBram Moolenaar \ {'bufnr': a:bnum, 'lnum': 5}], 'r') 15053ef5bf7dSBram Moolenaar let l = g:Xgetlist() 1506c1808d58SBram Moolenaar call assert_equal(3, len(l)) 1507c1808d58SBram Moolenaar call assert_equal(5, l[2].lnum) 1508c1808d58SBram Moolenaar 15093ef5bf7dSBram Moolenaar call g:Xsetlist([]) 15103ef5bf7dSBram Moolenaar let l = g:Xgetlist() 1511c1808d58SBram Moolenaar call assert_equal(0, len(l)) 1512ee85df37SBram Moolenaar 1513f1d21c8cSBram Moolenaar " Tests for setting the 'valid' flag 1514f1d21c8cSBram Moolenaar call g:Xsetlist([{'bufnr':a:bnum, 'lnum':4, 'valid':0}]) 1515f1d21c8cSBram Moolenaar Xwindow 1516f1d21c8cSBram Moolenaar call assert_equal(1, winnr('$')) 1517f1d21c8cSBram Moolenaar let l = g:Xgetlist() 1518f1d21c8cSBram Moolenaar call g:Xsetlist(l) 1519f1d21c8cSBram Moolenaar call assert_equal(0, g:Xgetlist()[0].valid) 15209752c72fSBram Moolenaar " Adding a non-valid entry should not mark the list as having valid entries 15219752c72fSBram Moolenaar call g:Xsetlist([{'bufnr':a:bnum, 'lnum':5, 'valid':0}], 'a') 15229752c72fSBram Moolenaar Xwindow 15239752c72fSBram Moolenaar call assert_equal(1, winnr('$')) 15249752c72fSBram Moolenaar 15259752c72fSBram Moolenaar " :cnext/:cprev should still work even with invalid entries in the list 15269752c72fSBram Moolenaar let l = [{'bufnr' : a:bnum, 'lnum' : 1, 'text' : '1', 'valid' : 0}, 15279752c72fSBram Moolenaar \ {'bufnr' : a:bnum, 'lnum' : 2, 'text' : '2', 'valid' : 0}] 15289752c72fSBram Moolenaar call g:Xsetlist(l) 15299752c72fSBram Moolenaar Xnext 15309752c72fSBram Moolenaar call assert_equal(2, g:Xgetlist({'idx' : 0}).idx) 15319752c72fSBram Moolenaar Xprev 15329752c72fSBram Moolenaar call assert_equal(1, g:Xgetlist({'idx' : 0}).idx) 15339752c72fSBram Moolenaar " :cnext/:cprev should still work after appending invalid entries to an 15349752c72fSBram Moolenaar " empty list 15359752c72fSBram Moolenaar call g:Xsetlist([]) 15369752c72fSBram Moolenaar call g:Xsetlist(l, 'a') 15379752c72fSBram Moolenaar Xnext 15389752c72fSBram Moolenaar call assert_equal(2, g:Xgetlist({'idx' : 0}).idx) 15399752c72fSBram Moolenaar Xprev 15409752c72fSBram Moolenaar call assert_equal(1, g:Xgetlist({'idx' : 0}).idx) 15419752c72fSBram Moolenaar 1542f1d21c8cSBram Moolenaar call g:Xsetlist([{'text':'Text1', 'valid':1}]) 1543f1d21c8cSBram Moolenaar Xwindow 1544f1d21c8cSBram Moolenaar call assert_equal(2, winnr('$')) 1545f1d21c8cSBram Moolenaar Xclose 1546f1d21c8cSBram Moolenaar let save_efm = &efm 1547f1d21c8cSBram Moolenaar set efm=%m 1548f1d21c8cSBram Moolenaar Xgetexpr 'TestMessage' 1549f1d21c8cSBram Moolenaar let l = g:Xgetlist() 1550f1d21c8cSBram Moolenaar call g:Xsetlist(l) 1551f1d21c8cSBram Moolenaar call assert_equal(1, g:Xgetlist()[0].valid) 1552f1d21c8cSBram Moolenaar let &efm = save_efm 1553f1d21c8cSBram Moolenaar 1554ee85df37SBram Moolenaar " Error cases: 1555ee85df37SBram Moolenaar " Refer to a non-existing buffer and pass a non-dictionary type 1556ee85df37SBram Moolenaar call assert_fails("call g:Xsetlist([{'bufnr':998, 'lnum':4}," . 1557ee85df37SBram Moolenaar \ " {'bufnr':999, 'lnum':5}])", 'E92:') 1558ee85df37SBram Moolenaar call g:Xsetlist([[1, 2,3]]) 1559ee85df37SBram Moolenaar call assert_equal(0, len(g:Xgetlist())) 156099fa7219SBram Moolenaar call assert_fails('call g:Xsetlist([], [])', 'E928:') 15612b946c9fSBram Moolenaarendfunc 1562c1808d58SBram Moolenaar 15632b946c9fSBram Moolenaarfunc Test_setqflist() 1564c1808d58SBram Moolenaar new Xtestfile | only 1565c1808d58SBram Moolenaar let bnum = bufnr('%') 1566c1808d58SBram Moolenaar call setline(1, range(1,5)) 1567c1808d58SBram Moolenaar 1568c1808d58SBram Moolenaar call SetXlistTests('c', bnum) 1569c1808d58SBram Moolenaar call SetXlistTests('l', bnum) 1570c1808d58SBram Moolenaar 15711cee693bSBram Moolenaar enew! 1572c1808d58SBram Moolenaar call delete('Xtestfile') 15732b946c9fSBram Moolenaarendfunc 1574d106e5baSBram Moolenaar 15752b946c9fSBram Moolenaarfunc Xlist_empty_middle(cchar) 15763ef5bf7dSBram Moolenaar call s:setup_commands(a:cchar) 15773ef5bf7dSBram Moolenaar 15781cee693bSBram Moolenaar " create three quickfix lists 1579ee85df37SBram Moolenaar let @/ = 'Test_' 1580ee85df37SBram Moolenaar Xvimgrep // test_quickfix.vim 15813ef5bf7dSBram Moolenaar let testlen = len(g:Xgetlist()) 15821cee693bSBram Moolenaar call assert_true(testlen > 0) 15833ef5bf7dSBram Moolenaar Xvimgrep empty test_quickfix.vim 15843ef5bf7dSBram Moolenaar call assert_true(len(g:Xgetlist()) > 0) 15853ef5bf7dSBram Moolenaar Xvimgrep matches test_quickfix.vim 15863ef5bf7dSBram Moolenaar let matchlen = len(g:Xgetlist()) 15871cee693bSBram Moolenaar call assert_true(matchlen > 0) 15883ef5bf7dSBram Moolenaar Xolder 15891cee693bSBram Moolenaar " make the middle list empty 15903ef5bf7dSBram Moolenaar call g:Xsetlist([], 'r') 15913ef5bf7dSBram Moolenaar call assert_true(len(g:Xgetlist()) == 0) 15923ef5bf7dSBram Moolenaar Xolder 15933ef5bf7dSBram Moolenaar call assert_equal(testlen, len(g:Xgetlist())) 15943ef5bf7dSBram Moolenaar Xnewer 15953ef5bf7dSBram Moolenaar Xnewer 15963ef5bf7dSBram Moolenaar call assert_equal(matchlen, len(g:Xgetlist())) 15971cee693bSBram Moolenaarendfunc 15981cee693bSBram Moolenaar 15992b946c9fSBram Moolenaarfunc Test_setqflist_empty_middle() 16003ef5bf7dSBram Moolenaar call Xlist_empty_middle('c') 16013ef5bf7dSBram Moolenaar call Xlist_empty_middle('l') 16022b946c9fSBram Moolenaarendfunc 16033ef5bf7dSBram Moolenaar 16042b946c9fSBram Moolenaarfunc Xlist_empty_older(cchar) 16053ef5bf7dSBram Moolenaar call s:setup_commands(a:cchar) 16063ef5bf7dSBram Moolenaar 16071cee693bSBram Moolenaar " create three quickfix lists 16083ef5bf7dSBram Moolenaar Xvimgrep one test_quickfix.vim 16093ef5bf7dSBram Moolenaar let onelen = len(g:Xgetlist()) 16101cee693bSBram Moolenaar call assert_true(onelen > 0) 16113ef5bf7dSBram Moolenaar Xvimgrep two test_quickfix.vim 16123ef5bf7dSBram Moolenaar let twolen = len(g:Xgetlist()) 16131cee693bSBram Moolenaar call assert_true(twolen > 0) 16143ef5bf7dSBram Moolenaar Xvimgrep three test_quickfix.vim 16153ef5bf7dSBram Moolenaar let threelen = len(g:Xgetlist()) 16161cee693bSBram Moolenaar call assert_true(threelen > 0) 16173ef5bf7dSBram Moolenaar Xolder 2 16181cee693bSBram Moolenaar " make the first list empty, check the others didn't change 16193ef5bf7dSBram Moolenaar call g:Xsetlist([], 'r') 16203ef5bf7dSBram Moolenaar call assert_true(len(g:Xgetlist()) == 0) 16213ef5bf7dSBram Moolenaar Xnewer 16223ef5bf7dSBram Moolenaar call assert_equal(twolen, len(g:Xgetlist())) 16233ef5bf7dSBram Moolenaar Xnewer 16243ef5bf7dSBram Moolenaar call assert_equal(threelen, len(g:Xgetlist())) 16252b946c9fSBram Moolenaarendfunc 16263ef5bf7dSBram Moolenaar 16272b946c9fSBram Moolenaarfunc Test_setqflist_empty_older() 16283ef5bf7dSBram Moolenaar call Xlist_empty_older('c') 16293ef5bf7dSBram Moolenaar call Xlist_empty_older('l') 16302b946c9fSBram Moolenaarendfunc 16311cee693bSBram Moolenaar 16322b946c9fSBram Moolenaarfunc XquickfixSetListWithAct(cchar) 16333ef5bf7dSBram Moolenaar call s:setup_commands(a:cchar) 16343ef5bf7dSBram Moolenaar 1635d106e5baSBram Moolenaar let list1 = [{'filename': 'fnameA', 'text': 'A'}, 1636d106e5baSBram Moolenaar \ {'filename': 'fnameB', 'text': 'B'}] 1637d106e5baSBram Moolenaar let list2 = [{'filename': 'fnameC', 'text': 'C'}, 1638d106e5baSBram Moolenaar \ {'filename': 'fnameD', 'text': 'D'}, 1639d106e5baSBram Moolenaar \ {'filename': 'fnameE', 'text': 'E'}] 1640d106e5baSBram Moolenaar 1641eeb1b9c7SBram Moolenaar " {action} is unspecified. Same as specifying ' '. 1642d106e5baSBram Moolenaar new | only 16433ef5bf7dSBram Moolenaar silent! Xnewer 99 16443ef5bf7dSBram Moolenaar call g:Xsetlist(list1) 16453ef5bf7dSBram Moolenaar call g:Xsetlist(list2) 16463ef5bf7dSBram Moolenaar let li = g:Xgetlist() 1647d106e5baSBram Moolenaar call assert_equal(3, len(li)) 1648d106e5baSBram Moolenaar call assert_equal('C', li[0]['text']) 1649d106e5baSBram Moolenaar call assert_equal('D', li[1]['text']) 1650d106e5baSBram Moolenaar call assert_equal('E', li[2]['text']) 16513ef5bf7dSBram Moolenaar silent! Xolder 16523ef5bf7dSBram Moolenaar let li = g:Xgetlist() 1653d106e5baSBram Moolenaar call assert_equal(2, len(li)) 1654d106e5baSBram Moolenaar call assert_equal('A', li[0]['text']) 1655d106e5baSBram Moolenaar call assert_equal('B', li[1]['text']) 1656d106e5baSBram Moolenaar 1657d106e5baSBram Moolenaar " {action} is specified ' '. 1658d106e5baSBram Moolenaar new | only 16593ef5bf7dSBram Moolenaar silent! Xnewer 99 16603ef5bf7dSBram Moolenaar call g:Xsetlist(list1) 16613ef5bf7dSBram Moolenaar call g:Xsetlist(list2, ' ') 16623ef5bf7dSBram Moolenaar let li = g:Xgetlist() 1663d106e5baSBram Moolenaar call assert_equal(3, len(li)) 1664d106e5baSBram Moolenaar call assert_equal('C', li[0]['text']) 1665d106e5baSBram Moolenaar call assert_equal('D', li[1]['text']) 1666d106e5baSBram Moolenaar call assert_equal('E', li[2]['text']) 16673ef5bf7dSBram Moolenaar silent! Xolder 16683ef5bf7dSBram Moolenaar let li = g:Xgetlist() 1669d106e5baSBram Moolenaar call assert_equal(2, len(li)) 1670d106e5baSBram Moolenaar call assert_equal('A', li[0]['text']) 1671d106e5baSBram Moolenaar call assert_equal('B', li[1]['text']) 1672d106e5baSBram Moolenaar 1673d106e5baSBram Moolenaar " {action} is specified 'a'. 1674d106e5baSBram Moolenaar new | only 16753ef5bf7dSBram Moolenaar silent! Xnewer 99 16763ef5bf7dSBram Moolenaar call g:Xsetlist(list1) 16773ef5bf7dSBram Moolenaar call g:Xsetlist(list2, 'a') 16783ef5bf7dSBram Moolenaar let li = g:Xgetlist() 1679d106e5baSBram Moolenaar call assert_equal(5, len(li)) 1680d106e5baSBram Moolenaar call assert_equal('A', li[0]['text']) 1681d106e5baSBram Moolenaar call assert_equal('B', li[1]['text']) 1682d106e5baSBram Moolenaar call assert_equal('C', li[2]['text']) 1683d106e5baSBram Moolenaar call assert_equal('D', li[3]['text']) 1684d106e5baSBram Moolenaar call assert_equal('E', li[4]['text']) 1685d106e5baSBram Moolenaar 1686d106e5baSBram Moolenaar " {action} is specified 'r'. 1687d106e5baSBram Moolenaar new | only 16883ef5bf7dSBram Moolenaar silent! Xnewer 99 16893ef5bf7dSBram Moolenaar call g:Xsetlist(list1) 16903ef5bf7dSBram Moolenaar call g:Xsetlist(list2, 'r') 16913ef5bf7dSBram Moolenaar let li = g:Xgetlist() 1692d106e5baSBram Moolenaar call assert_equal(3, len(li)) 1693d106e5baSBram Moolenaar call assert_equal('C', li[0]['text']) 1694d106e5baSBram Moolenaar call assert_equal('D', li[1]['text']) 1695d106e5baSBram Moolenaar call assert_equal('E', li[2]['text']) 1696d106e5baSBram Moolenaar 1697d106e5baSBram Moolenaar " Test for wrong value. 1698d106e5baSBram Moolenaar new | only 16993ef5bf7dSBram Moolenaar call assert_fails("call g:Xsetlist(0)", 'E714:') 17003ef5bf7dSBram Moolenaar call assert_fails("call g:Xsetlist(list1, '')", 'E927:') 17013ef5bf7dSBram Moolenaar call assert_fails("call g:Xsetlist(list1, 'aa')", 'E927:') 17023ef5bf7dSBram Moolenaar call assert_fails("call g:Xsetlist(list1, ' a')", 'E927:') 17033ef5bf7dSBram Moolenaar call assert_fails("call g:Xsetlist(list1, 0)", 'E928:') 1704d106e5baSBram Moolenaarendfunc 1705d106e5baSBram Moolenaar 1706a0ca7d00SBram Moolenaarfunc Test_setqflist_invalid_nr() 1707a0ca7d00SBram Moolenaar " The following command used to crash Vim 1708aad222c9SBram Moolenaar eval []->setqflist(' ', {'nr' : $XXX_DOES_NOT_EXIST}) 1709a0ca7d00SBram Moolenaarendfunc 1710a0ca7d00SBram Moolenaar 171199234f29SBram Moolenaarfunc Test_setqflist_user_sets_buftype() 171299234f29SBram Moolenaar call setqflist([{'text': 'foo'}, {'text': 'bar'}]) 171399234f29SBram Moolenaar set buftype=quickfix 171499234f29SBram Moolenaar call setqflist([], 'a') 171599234f29SBram Moolenaar enew 171699234f29SBram Moolenaarendfunc 171799234f29SBram Moolenaar 17182b946c9fSBram Moolenaarfunc Test_quickfix_set_list_with_act() 1719d106e5baSBram Moolenaar call XquickfixSetListWithAct('c') 1720d106e5baSBram Moolenaar call XquickfixSetListWithAct('l') 17212b946c9fSBram Moolenaarendfunc 17226be8c8e1SBram Moolenaar 17232b946c9fSBram Moolenaarfunc XLongLinesTests(cchar) 17243ef5bf7dSBram Moolenaar let l = g:Xgetlist() 17256be8c8e1SBram Moolenaar 1726049cba9eSBram Moolenaar call assert_equal(4, len(l)) 17276be8c8e1SBram Moolenaar call assert_equal(1, l[0].lnum) 17286be8c8e1SBram Moolenaar call assert_equal(1, l[0].col) 1729049cba9eSBram Moolenaar call assert_equal(1975, len(l[0].text)) 17306be8c8e1SBram Moolenaar call assert_equal(2, l[1].lnum) 17316be8c8e1SBram Moolenaar call assert_equal(1, l[1].col) 17326be8c8e1SBram Moolenaar call assert_equal(4070, len(l[1].text)) 17336be8c8e1SBram Moolenaar call assert_equal(3, l[2].lnum) 17346be8c8e1SBram Moolenaar call assert_equal(1, l[2].col) 1735049cba9eSBram Moolenaar call assert_equal(4070, len(l[2].text)) 1736049cba9eSBram Moolenaar call assert_equal(4, l[3].lnum) 1737049cba9eSBram Moolenaar call assert_equal(1, l[3].col) 1738049cba9eSBram Moolenaar call assert_equal(10, len(l[3].text)) 17396be8c8e1SBram Moolenaar 17403ef5bf7dSBram Moolenaar call g:Xsetlist([], 'r') 17412b946c9fSBram Moolenaarendfunc 17426be8c8e1SBram Moolenaar 17432b946c9fSBram Moolenaarfunc s:long_lines_tests(cchar) 17443ef5bf7dSBram Moolenaar call s:setup_commands(a:cchar) 17453ef5bf7dSBram Moolenaar 17466be8c8e1SBram Moolenaar let testfile = 'samples/quickfix.txt' 17476be8c8e1SBram Moolenaar 17486be8c8e1SBram Moolenaar " file 17493ef5bf7dSBram Moolenaar exe 'Xgetfile' testfile 17503ef5bf7dSBram Moolenaar call XLongLinesTests(a:cchar) 17516be8c8e1SBram Moolenaar 17526be8c8e1SBram Moolenaar " list 17533ef5bf7dSBram Moolenaar Xexpr readfile(testfile) 17543ef5bf7dSBram Moolenaar call XLongLinesTests(a:cchar) 17556be8c8e1SBram Moolenaar 17566be8c8e1SBram Moolenaar " string 17573ef5bf7dSBram Moolenaar Xexpr join(readfile(testfile), "\n") 17583ef5bf7dSBram Moolenaar call XLongLinesTests(a:cchar) 17596be8c8e1SBram Moolenaar 17606be8c8e1SBram Moolenaar " buffer 17613ef5bf7dSBram Moolenaar exe 'edit' testfile 17623ef5bf7dSBram Moolenaar exe 'Xbuffer' bufnr('%') 1763f50df392SBram Moolenaar call XLongLinesTests(a:cchar) 17642b946c9fSBram Moolenaarendfunc 17653ef5bf7dSBram Moolenaar 17662b946c9fSBram Moolenaarfunc Test_long_lines() 17673ef5bf7dSBram Moolenaar call s:long_lines_tests('c') 17683ef5bf7dSBram Moolenaar call s:long_lines_tests('l') 17692b946c9fSBram Moolenaarendfunc 1770049cba9eSBram Moolenaar 177159941cbdSBram Moolenaarfunc Test_cgetfile_on_long_lines() 177259941cbdSBram Moolenaar " Problematic values if the line is longer than 4096 bytes. Then 1024 bytes 177359941cbdSBram Moolenaar " are read at a time. 177459941cbdSBram Moolenaar for len in [4078, 4079, 4080, 5102, 5103, 5104, 6126, 6127, 6128, 7150, 7151, 7152] 177559941cbdSBram Moolenaar let lines = [ 177659941cbdSBram Moolenaar \ '/tmp/file1:1:1:aaa', 177759941cbdSBram Moolenaar \ '/tmp/file2:1:1:%s', 177859941cbdSBram Moolenaar \ '/tmp/file3:1:1:bbb', 177959941cbdSBram Moolenaar \ '/tmp/file4:1:1:ccc', 178059941cbdSBram Moolenaar \ ] 178159941cbdSBram Moolenaar let lines[1] = substitute(lines[1], '%s', repeat('x', len), '') 178259941cbdSBram Moolenaar call writefile(lines, 'Xcqetfile.txt') 178359941cbdSBram Moolenaar cgetfile Xcqetfile.txt 178459941cbdSBram Moolenaar call assert_equal(4, getqflist(#{size: v:true}).size, 'with length ' .. len) 178559941cbdSBram Moolenaar endfor 178659941cbdSBram Moolenaar call delete('Xcqetfile.txt') 178759941cbdSBram Moolenaarendfunc 178859941cbdSBram Moolenaar 17892b946c9fSBram Moolenaarfunc s:create_test_file(filename) 1790049cba9eSBram Moolenaar let l = [] 1791049cba9eSBram Moolenaar for i in range(1, 20) 1792049cba9eSBram Moolenaar call add(l, 'Line' . i) 1793049cba9eSBram Moolenaar endfor 1794049cba9eSBram Moolenaar call writefile(l, a:filename) 17952b946c9fSBram Moolenaarendfunc 1796049cba9eSBram Moolenaar 17972b946c9fSBram Moolenaarfunc Test_switchbuf() 1798049cba9eSBram Moolenaar call s:create_test_file('Xqftestfile1') 1799049cba9eSBram Moolenaar call s:create_test_file('Xqftestfile2') 1800049cba9eSBram Moolenaar call s:create_test_file('Xqftestfile3') 1801049cba9eSBram Moolenaar 1802049cba9eSBram Moolenaar new | only 1803049cba9eSBram Moolenaar edit Xqftestfile1 1804049cba9eSBram Moolenaar let file1_winid = win_getid() 1805049cba9eSBram Moolenaar new Xqftestfile2 1806049cba9eSBram Moolenaar let file2_winid = win_getid() 1807049cba9eSBram Moolenaar cgetexpr ['Xqftestfile1:5:Line5', 1808049cba9eSBram Moolenaar \ 'Xqftestfile1:6:Line6', 1809049cba9eSBram Moolenaar \ 'Xqftestfile2:10:Line10', 1810049cba9eSBram Moolenaar \ 'Xqftestfile2:11:Line11', 1811049cba9eSBram Moolenaar \ 'Xqftestfile3:15:Line15', 1812049cba9eSBram Moolenaar \ 'Xqftestfile3:16:Line16'] 1813049cba9eSBram Moolenaar 1814049cba9eSBram Moolenaar new 1815049cba9eSBram Moolenaar let winid = win_getid() 1816049cba9eSBram Moolenaar cfirst | cnext 1817049cba9eSBram Moolenaar call assert_equal(winid, win_getid()) 181899895eacSBram Moolenaar 2cnext 1819049cba9eSBram Moolenaar call assert_equal(winid, win_getid()) 182099895eacSBram Moolenaar 2cnext 1821049cba9eSBram Moolenaar call assert_equal(winid, win_getid()) 1822049cba9eSBram Moolenaar 1823f9ae154cSBram Moolenaar " Test for 'switchbuf' set to search for files in windows in the current 1824f9ae154cSBram Moolenaar " tabpage and jump to an existing window (if present) 1825049cba9eSBram Moolenaar set switchbuf=useopen 1826f9ae154cSBram Moolenaar enew 1827049cba9eSBram Moolenaar cfirst | cnext 1828049cba9eSBram Moolenaar call assert_equal(file1_winid, win_getid()) 182999895eacSBram Moolenaar 2cnext 1830049cba9eSBram Moolenaar call assert_equal(file2_winid, win_getid()) 183199895eacSBram Moolenaar 2cnext 1832049cba9eSBram Moolenaar call assert_equal(file2_winid, win_getid()) 1833049cba9eSBram Moolenaar 1834f9ae154cSBram Moolenaar " Test for 'switchbuf' set to search for files in tabpages and jump to an 1835f9ae154cSBram Moolenaar " existing tabpage (if present) 1836049cba9eSBram Moolenaar enew | only 1837049cba9eSBram Moolenaar set switchbuf=usetab 1838049cba9eSBram Moolenaar tabedit Xqftestfile1 1839049cba9eSBram Moolenaar tabedit Xqftestfile2 184074240d3fSBram Moolenaar tabedit Xqftestfile3 1841049cba9eSBram Moolenaar tabfirst 1842049cba9eSBram Moolenaar cfirst | cnext 1843049cba9eSBram Moolenaar call assert_equal(2, tabpagenr()) 184499895eacSBram Moolenaar 2cnext 1845049cba9eSBram Moolenaar call assert_equal(3, tabpagenr()) 184674240d3fSBram Moolenaar 6cnext 184774240d3fSBram Moolenaar call assert_equal(4, tabpagenr()) 184874240d3fSBram Moolenaar 2cpfile 184974240d3fSBram Moolenaar call assert_equal(2, tabpagenr()) 185074240d3fSBram Moolenaar 2cnfile 185174240d3fSBram Moolenaar call assert_equal(4, tabpagenr()) 1852049cba9eSBram Moolenaar tabfirst | tabonly | enew 1853049cba9eSBram Moolenaar 1854f9ae154cSBram Moolenaar " Test for 'switchbuf' set to open a new window for every file 1855049cba9eSBram Moolenaar set switchbuf=split 1856049cba9eSBram Moolenaar cfirst | cnext 1857049cba9eSBram Moolenaar call assert_equal(1, winnr('$')) 1858049cba9eSBram Moolenaar cnext | cnext 1859049cba9eSBram Moolenaar call assert_equal(2, winnr('$')) 1860049cba9eSBram Moolenaar cnext | cnext 1861049cba9eSBram Moolenaar call assert_equal(3, winnr('$')) 1862049cba9eSBram Moolenaar 1863f9ae154cSBram Moolenaar " Test for 'switchbuf' set to open a new tabpage for every file 1864049cba9eSBram Moolenaar set switchbuf=newtab 1865f9ae154cSBram Moolenaar enew | only 1866049cba9eSBram Moolenaar cfirst | cnext 1867049cba9eSBram Moolenaar call assert_equal(1, tabpagenr('$')) 1868049cba9eSBram Moolenaar cnext | cnext 1869049cba9eSBram Moolenaar call assert_equal(2, tabpagenr('$')) 1870049cba9eSBram Moolenaar cnext | cnext 1871049cba9eSBram Moolenaar call assert_equal(3, tabpagenr('$')) 1872049cba9eSBram Moolenaar tabfirst | enew | tabonly | only 1873049cba9eSBram Moolenaar 1874539aa6b2SBram Moolenaar set switchbuf=uselast 1875539aa6b2SBram Moolenaar split 1876539aa6b2SBram Moolenaar let last_winid = win_getid() 1877539aa6b2SBram Moolenaar copen 1878539aa6b2SBram Moolenaar exe "normal 1G\<CR>" 1879539aa6b2SBram Moolenaar call assert_equal(last_winid, win_getid()) 1880539aa6b2SBram Moolenaar enew | only 1881539aa6b2SBram Moolenaar 1882f9ae154cSBram Moolenaar " With an empty 'switchbuf', jumping to a quickfix entry should open the 1883f9ae154cSBram Moolenaar " file in an existing window (if present) 1884049cba9eSBram Moolenaar set switchbuf= 1885049cba9eSBram Moolenaar edit Xqftestfile1 1886049cba9eSBram Moolenaar let file1_winid = win_getid() 1887049cba9eSBram Moolenaar new Xqftestfile2 1888049cba9eSBram Moolenaar let file2_winid = win_getid() 1889049cba9eSBram Moolenaar copen 1890049cba9eSBram Moolenaar exe "normal 1G\<CR>" 1891049cba9eSBram Moolenaar call assert_equal(file1_winid, win_getid()) 1892049cba9eSBram Moolenaar copen 1893049cba9eSBram Moolenaar exe "normal 3G\<CR>" 1894049cba9eSBram Moolenaar call assert_equal(file2_winid, win_getid()) 1895049cba9eSBram Moolenaar copen | only 1896049cba9eSBram Moolenaar exe "normal 5G\<CR>" 1897049cba9eSBram Moolenaar call assert_equal(2, winnr('$')) 1898049cba9eSBram Moolenaar call assert_equal(1, bufwinnr('Xqftestfile3')) 1899049cba9eSBram Moolenaar 1900391b1dd0SBram Moolenaar " If only quickfix window is open in the current tabpage, jumping to an 19011bc353b6SBram Moolenaar " entry with 'switchbuf' set to 'usetab' should search in other tabpages. 1902049cba9eSBram Moolenaar enew | only 1903391b1dd0SBram Moolenaar set switchbuf=usetab 1904391b1dd0SBram Moolenaar tabedit Xqftestfile1 1905391b1dd0SBram Moolenaar tabedit Xqftestfile2 1906391b1dd0SBram Moolenaar tabedit Xqftestfile3 1907391b1dd0SBram Moolenaar tabfirst 1908391b1dd0SBram Moolenaar copen | only 1909391b1dd0SBram Moolenaar clast 1910391b1dd0SBram Moolenaar call assert_equal(4, tabpagenr()) 1911391b1dd0SBram Moolenaar tabfirst | tabonly | enew | only 1912049cba9eSBram Moolenaar 1913f9ae154cSBram Moolenaar " Jumping to a file that is not present in any of the tabpages and the 1914f9ae154cSBram Moolenaar " current tabpage doesn't have any usable windows, should open it in a new 1915f9ae154cSBram Moolenaar " window in the current tabpage. 1916f9ae154cSBram Moolenaar copen | only 1917f9ae154cSBram Moolenaar cfirst 1918f9ae154cSBram Moolenaar call assert_equal(1, tabpagenr()) 1919bdd2c290SBram Moolenaar call assert_equal('Xqftestfile1', @%) 1920f9ae154cSBram Moolenaar 1921f9ae154cSBram Moolenaar " If opening a file changes 'switchbuf', then the new value should be 1922f9ae154cSBram Moolenaar " retained. 192341d4299fSBram Moolenaar set modeline&vim 1924f9ae154cSBram Moolenaar call writefile(["vim: switchbuf=split"], 'Xqftestfile1') 1925f9ae154cSBram Moolenaar enew | only 1926f9ae154cSBram Moolenaar set switchbuf&vim 1927f9ae154cSBram Moolenaar cexpr "Xqftestfile1:1:10" 1928f9ae154cSBram Moolenaar call assert_equal('split', &switchbuf) 1929f9ae154cSBram Moolenaar call writefile(["vim: switchbuf=usetab"], 'Xqftestfile1') 1930f9ae154cSBram Moolenaar enew | only 1931f9ae154cSBram Moolenaar set switchbuf=useopen 1932f9ae154cSBram Moolenaar cexpr "Xqftestfile1:1:10" 1933f9ae154cSBram Moolenaar call assert_equal('usetab', &switchbuf) 1934f9ae154cSBram Moolenaar call writefile(["vim: switchbuf&vim"], 'Xqftestfile1') 1935f9ae154cSBram Moolenaar enew | only 1936f9ae154cSBram Moolenaar set switchbuf=useopen 1937f9ae154cSBram Moolenaar cexpr "Xqftestfile1:1:10" 1938f9ae154cSBram Moolenaar call assert_equal('', &switchbuf) 1939f9ae154cSBram Moolenaar 1940049cba9eSBram Moolenaar call delete('Xqftestfile1') 1941049cba9eSBram Moolenaar call delete('Xqftestfile2') 1942049cba9eSBram Moolenaar call delete('Xqftestfile3') 1943391b1dd0SBram Moolenaar set switchbuf&vim 1944391b1dd0SBram Moolenaar 1945391b1dd0SBram Moolenaar enew | only 19462b946c9fSBram Moolenaarendfunc 1947049cba9eSBram Moolenaar 19482b946c9fSBram Moolenaarfunc Xadjust_qflnum(cchar) 1949049cba9eSBram Moolenaar call s:setup_commands(a:cchar) 1950049cba9eSBram Moolenaar 1951049cba9eSBram Moolenaar enew | only 1952049cba9eSBram Moolenaar 1953c1542744SBram Moolenaar let fname = 'Xqftestfile' . a:cchar 1954c1542744SBram Moolenaar call s:create_test_file(fname) 1955c1542744SBram Moolenaar exe 'edit ' . fname 1956049cba9eSBram Moolenaar 1957c1542744SBram Moolenaar Xgetexpr [fname . ':5:Line5', 1958c1542744SBram Moolenaar \ fname . ':10:Line10', 1959c1542744SBram Moolenaar \ fname . ':15:Line15', 1960c1542744SBram Moolenaar \ fname . ':20:Line20'] 1961049cba9eSBram Moolenaar 1962049cba9eSBram Moolenaar 6,14delete 1963049cba9eSBram Moolenaar call append(6, ['Buffer', 'Window']) 1964049cba9eSBram Moolenaar 1965049cba9eSBram Moolenaar let l = g:Xgetlist() 1966049cba9eSBram Moolenaar call assert_equal(5, l[0].lnum) 1967049cba9eSBram Moolenaar call assert_equal(6, l[2].lnum) 1968049cba9eSBram Moolenaar call assert_equal(13, l[3].lnum) 1969049cba9eSBram Moolenaar 1970f9ae154cSBram Moolenaar " If a file doesn't have any quickfix entries, then deleting lines in the 1971f9ae154cSBram Moolenaar " file should not update the quickfix list 1972f9ae154cSBram Moolenaar call g:Xsetlist([], 'f') 1973f9ae154cSBram Moolenaar 1,2delete 1974f9ae154cSBram Moolenaar call assert_equal([], g:Xgetlist()) 1975f9ae154cSBram Moolenaar 1976049cba9eSBram Moolenaar enew! 1977c1542744SBram Moolenaar call delete(fname) 19782b946c9fSBram Moolenaarendfunc 1979049cba9eSBram Moolenaar 19802b946c9fSBram Moolenaarfunc Test_adjust_lnum() 1981c1542744SBram Moolenaar call setloclist(0, []) 1982049cba9eSBram Moolenaar call Xadjust_qflnum('c') 1983c1542744SBram Moolenaar call setqflist([]) 1984049cba9eSBram Moolenaar call Xadjust_qflnum('l') 19852b946c9fSBram Moolenaarendfunc 1986049cba9eSBram Moolenaar 1987049cba9eSBram Moolenaar" Tests for the :grep/:lgrep and :grepadd/:lgrepadd commands 19882b946c9fSBram Moolenaarfunc s:test_xgrep(cchar) 1989049cba9eSBram Moolenaar call s:setup_commands(a:cchar) 1990049cba9eSBram Moolenaar 1991049cba9eSBram Moolenaar " The following lines are used for the grep test. Don't remove. 1992049cba9eSBram Moolenaar " Grep_Test_Text: Match 1 1993049cba9eSBram Moolenaar " Grep_Test_Text: Match 2 1994049cba9eSBram Moolenaar " GrepAdd_Test_Text: Match 1 1995049cba9eSBram Moolenaar " GrepAdd_Test_Text: Match 2 1996049cba9eSBram Moolenaar enew! | only 1997049cba9eSBram Moolenaar set makeef&vim 1998049cba9eSBram Moolenaar silent Xgrep Grep_Test_Text: test_quickfix.vim 199915a7bdcbSBram Moolenaar call assert_true(len(g:Xgetlist()) == 5) 2000049cba9eSBram Moolenaar Xopen 2001049cba9eSBram Moolenaar call assert_true(w:quickfix_title =~ '^:grep') 2002049cba9eSBram Moolenaar Xclose 2003049cba9eSBram Moolenaar enew 2004049cba9eSBram Moolenaar set makeef=Temp_File_## 2005049cba9eSBram Moolenaar silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim 200615a7bdcbSBram Moolenaar call assert_true(len(g:Xgetlist()) == 9) 200715a7bdcbSBram Moolenaar 200815a7bdcbSBram Moolenaar " Try with 'grepprg' set to 'internal' 200915a7bdcbSBram Moolenaar set grepprg=internal 201015a7bdcbSBram Moolenaar silent Xgrep Grep_Test_Text: test_quickfix.vim 201115a7bdcbSBram Moolenaar silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim 201215a7bdcbSBram Moolenaar call assert_true(len(g:Xgetlist()) == 9) 201315a7bdcbSBram Moolenaar set grepprg&vim 2014f9ae154cSBram Moolenaar 2015f9ae154cSBram Moolenaar call writefile(['Vim'], 'XtestTempFile') 2016f9ae154cSBram Moolenaar set makeef=XtestTempFile 2017f9ae154cSBram Moolenaar silent Xgrep Grep_Test_Text: test_quickfix.vim 201815a7bdcbSBram Moolenaar call assert_equal(5, len(g:Xgetlist())) 2019f9ae154cSBram Moolenaar call assert_false(filereadable('XtestTempFile')) 2020f9ae154cSBram Moolenaar set makeef&vim 20212b946c9fSBram Moolenaarendfunc 2022049cba9eSBram Moolenaar 20232b946c9fSBram Moolenaarfunc Test_grep() 2024049cba9eSBram Moolenaar " The grepprg may not be set on non-Unix systems 20256d91bcb4SBram Moolenaar CheckUnix 2026049cba9eSBram Moolenaar 2027049cba9eSBram Moolenaar call s:test_xgrep('c') 2028049cba9eSBram Moolenaar call s:test_xgrep('l') 20292b946c9fSBram Moolenaarendfunc 2030361c8f0eSBram Moolenaar 20312b946c9fSBram Moolenaarfunc Test_two_windows() 2032361c8f0eSBram Moolenaar " Use one 'errorformat' for two windows. Add an expression to each of them, 2033361c8f0eSBram Moolenaar " make sure they each keep their own state. 2034361c8f0eSBram Moolenaar set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f' 2035361c8f0eSBram Moolenaar call mkdir('Xone/a', 'p') 2036361c8f0eSBram Moolenaar call mkdir('Xtwo/a', 'p') 2037361c8f0eSBram Moolenaar let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7'] 2038361c8f0eSBram Moolenaar call writefile(lines, 'Xone/a/one.txt') 2039361c8f0eSBram Moolenaar call writefile(lines, 'Xtwo/a/two.txt') 2040361c8f0eSBram Moolenaar 2041361c8f0eSBram Moolenaar new one 2042361c8f0eSBram Moolenaar let one_id = win_getid() 2043361c8f0eSBram Moolenaar lexpr "" 2044361c8f0eSBram Moolenaar new two 2045361c8f0eSBram Moolenaar let two_id = win_getid() 2046361c8f0eSBram Moolenaar lexpr "" 2047361c8f0eSBram Moolenaar 2048361c8f0eSBram Moolenaar laddexpr "Entering dir 'Xtwo/a'" 2049361c8f0eSBram Moolenaar call win_gotoid(one_id) 2050361c8f0eSBram Moolenaar laddexpr "Entering dir 'Xone/a'" 2051361c8f0eSBram Moolenaar call win_gotoid(two_id) 2052361c8f0eSBram Moolenaar laddexpr 'two.txt:5:two two two' 2053361c8f0eSBram Moolenaar call win_gotoid(one_id) 2054361c8f0eSBram Moolenaar laddexpr 'one.txt:3:one one one' 2055361c8f0eSBram Moolenaar 2056361c8f0eSBram Moolenaar let loc_one = getloclist(one_id) 2057361c8f0eSBram Moolenaar call assert_equal('Xone/a/one.txt', bufname(loc_one[1].bufnr)) 2058361c8f0eSBram Moolenaar call assert_equal(3, loc_one[1].lnum) 2059361c8f0eSBram Moolenaar 2060361c8f0eSBram Moolenaar let loc_two = getloclist(two_id) 2061361c8f0eSBram Moolenaar call assert_equal('Xtwo/a/two.txt', bufname(loc_two[1].bufnr)) 2062361c8f0eSBram Moolenaar call assert_equal(5, loc_two[1].lnum) 2063361c8f0eSBram Moolenaar 2064361c8f0eSBram Moolenaar call win_gotoid(one_id) 2065361c8f0eSBram Moolenaar bwipe! 2066361c8f0eSBram Moolenaar call win_gotoid(two_id) 2067361c8f0eSBram Moolenaar bwipe! 2068361c8f0eSBram Moolenaar call delete('Xone', 'rf') 2069361c8f0eSBram Moolenaar call delete('Xtwo', 'rf') 2070361c8f0eSBram Moolenaarendfunc 2071dcb17001SBram Moolenaar 20722b946c9fSBram Moolenaarfunc XbottomTests(cchar) 2073537ef084SBram Moolenaar call s:setup_commands(a:cchar) 2074537ef084SBram Moolenaar 2075b6fa30ccSBram Moolenaar " Calling lbottom without any errors should fail 2076b6fa30ccSBram Moolenaar if a:cchar == 'l' 2077b6fa30ccSBram Moolenaar call assert_fails('lbottom', 'E776:') 2078b6fa30ccSBram Moolenaar endif 2079b6fa30ccSBram Moolenaar 2080537ef084SBram Moolenaar call g:Xsetlist([{'filename': 'foo', 'lnum': 42}]) 2081537ef084SBram Moolenaar Xopen 2082dcb17001SBram Moolenaar let wid = win_getid() 2083dcb17001SBram Moolenaar call assert_equal(1, line('.')) 2084dcb17001SBram Moolenaar wincmd w 2085537ef084SBram Moolenaar call g:Xsetlist([{'filename': 'var', 'lnum': 24}], 'a') 2086537ef084SBram Moolenaar Xbottom 2087dcb17001SBram Moolenaar call win_gotoid(wid) 2088dcb17001SBram Moolenaar call assert_equal(2, line('.')) 2089537ef084SBram Moolenaar Xclose 2090dcb17001SBram Moolenaarendfunc 2091537ef084SBram Moolenaar 2092537ef084SBram Moolenaar" Tests for the :cbottom and :lbottom commands 20932b946c9fSBram Moolenaarfunc Test_cbottom() 2094537ef084SBram Moolenaar call XbottomTests('c') 2095537ef084SBram Moolenaar call XbottomTests('l') 20962b946c9fSBram Moolenaarendfunc 2097f6acffbeSBram Moolenaar 20982b946c9fSBram Moolenaarfunc HistoryTest(cchar) 2099f6acffbeSBram Moolenaar call s:setup_commands(a:cchar) 2100f6acffbeSBram Moolenaar 2101f6acffbeSBram Moolenaar " clear all lists after the first one, then replace the first one. 2102f6acffbeSBram Moolenaar call g:Xsetlist([]) 2103b6fa30ccSBram Moolenaar call assert_fails('Xolder 99', 'E380:') 2104f6acffbeSBram Moolenaar let entry = {'filename': 'foo', 'lnum': 42} 2105f6acffbeSBram Moolenaar call g:Xsetlist([entry], 'r') 2106f6acffbeSBram Moolenaar call g:Xsetlist([entry, entry]) 2107f6acffbeSBram Moolenaar call g:Xsetlist([entry, entry, entry]) 2108f6acffbeSBram Moolenaar let res = split(execute(a:cchar . 'hist'), "\n") 2109f6acffbeSBram Moolenaar call assert_equal(3, len(res)) 2110f6acffbeSBram Moolenaar let common = 'errors :set' . (a:cchar == 'c' ? 'qf' : 'loc') . 'list()' 2111f6acffbeSBram Moolenaar call assert_equal(' error list 1 of 3; 1 ' . common, res[0]) 2112f6acffbeSBram Moolenaar call assert_equal(' error list 2 of 3; 2 ' . common, res[1]) 2113f6acffbeSBram Moolenaar call assert_equal('> error list 3 of 3; 3 ' . common, res[2]) 2114b4d5fbabSBram Moolenaar 21158ffc7c8bSBram Moolenaar " Test for changing the quickfix lists 21168ffc7c8bSBram Moolenaar call assert_equal(3, g:Xgetlist({'nr' : 0}).nr) 21178ffc7c8bSBram Moolenaar exe '1' . a:cchar . 'hist' 21188ffc7c8bSBram Moolenaar call assert_equal(1, g:Xgetlist({'nr' : 0}).nr) 21198ffc7c8bSBram Moolenaar exe '3' . a:cchar . 'hist' 21208ffc7c8bSBram Moolenaar call assert_equal(3, g:Xgetlist({'nr' : 0}).nr) 21218ffc7c8bSBram Moolenaar call assert_fails('-2' . a:cchar . 'hist', 'E16:') 21228ffc7c8bSBram Moolenaar call assert_fails('4' . a:cchar . 'hist', 'E16:') 21238ffc7c8bSBram Moolenaar 2124b4d5fbabSBram Moolenaar call g:Xsetlist([], 'f') 2125b4d5fbabSBram Moolenaar let l = split(execute(a:cchar . 'hist'), "\n") 2126b4d5fbabSBram Moolenaar call assert_equal('No entries', l[0]) 21278ffc7c8bSBram Moolenaar if a:cchar == 'c' 21288ffc7c8bSBram Moolenaar call assert_fails('4chist', 'E16:') 21298ffc7c8bSBram Moolenaar else 21308ffc7c8bSBram Moolenaar call assert_fails('4lhist', 'E776:') 21318ffc7c8bSBram Moolenaar endif 21325b69c22fSBram Moolenaar 21335b69c22fSBram Moolenaar " An empty list should still show the stack history 21345b69c22fSBram Moolenaar call g:Xsetlist([]) 21355b69c22fSBram Moolenaar let res = split(execute(a:cchar . 'hist'), "\n") 21365b69c22fSBram Moolenaar call assert_equal('> error list 1 of 1; 0 ' . common, res[0]) 21375b69c22fSBram Moolenaar 21385b69c22fSBram Moolenaar call g:Xsetlist([], 'f') 2139f6acffbeSBram Moolenaarendfunc 2140f6acffbeSBram Moolenaar 2141f6acffbeSBram Moolenaarfunc Test_history() 2142f6acffbeSBram Moolenaar call HistoryTest('c') 2143f6acffbeSBram Moolenaar call HistoryTest('l') 2144f6acffbeSBram Moolenaarendfunc 2145015102e9SBram Moolenaar 2146015102e9SBram Moolenaarfunc Test_duplicate_buf() 2147015102e9SBram Moolenaar " make sure we can get the highest buffer number 2148015102e9SBram Moolenaar edit DoesNotExist 2149015102e9SBram Moolenaar edit DoesNotExist2 2150015102e9SBram Moolenaar let last_buffer = bufnr("$") 2151015102e9SBram Moolenaar 2152015102e9SBram Moolenaar " make sure only one buffer is created 2153015102e9SBram Moolenaar call writefile(['this one', 'that one'], 'Xgrepthis') 2154015102e9SBram Moolenaar vimgrep one Xgrepthis 2155015102e9SBram Moolenaar vimgrep one Xgrepthis 2156015102e9SBram Moolenaar call assert_equal(last_buffer + 1, bufnr("$")) 2157015102e9SBram Moolenaar 2158015102e9SBram Moolenaar call delete('Xgrepthis') 2159015102e9SBram Moolenaarendfunc 2160d823fa91SBram Moolenaar 2161d823fa91SBram Moolenaar" Quickfix/Location list set/get properties tests 21622b946c9fSBram Moolenaarfunc Xproperty_tests(cchar) 2163d823fa91SBram Moolenaar call s:setup_commands(a:cchar) 2164d823fa91SBram Moolenaar 2165d823fa91SBram Moolenaar " Error cases 2166d823fa91SBram Moolenaar call assert_fails('call g:Xgetlist(99)', 'E715:') 2167d823fa91SBram Moolenaar call assert_fails('call g:Xsetlist(99)', 'E714:') 2168d823fa91SBram Moolenaar call assert_fails('call g:Xsetlist([], "a", [])', 'E715:') 2169d823fa91SBram Moolenaar 2170d823fa91SBram Moolenaar " Set and get the title 2171b6fa30ccSBram Moolenaar call g:Xsetlist([]) 2172d823fa91SBram Moolenaar Xopen 2173d823fa91SBram Moolenaar wincmd p 2174d823fa91SBram Moolenaar call g:Xsetlist([{'filename':'foo', 'lnum':27}]) 217586f100dcSBram Moolenaar let s = g:Xsetlist([], 'a', {'title' : 'Sample'}) 217686f100dcSBram Moolenaar call assert_equal(0, s) 2177d823fa91SBram Moolenaar let d = g:Xgetlist({"title":1}) 2178d823fa91SBram Moolenaar call assert_equal('Sample', d.title) 2179a2aa8a2bSBram Moolenaar " Try setting title to a non-string value 2180a2aa8a2bSBram Moolenaar call assert_equal(-1, g:Xsetlist([], 'a', {'title' : ['Test']})) 2181a2aa8a2bSBram Moolenaar call assert_equal('Sample', g:Xgetlist({"title":1}).title) 2182d823fa91SBram Moolenaar 2183d823fa91SBram Moolenaar Xopen 2184d823fa91SBram Moolenaar call assert_equal('Sample', w:quickfix_title) 2185d823fa91SBram Moolenaar Xclose 2186d823fa91SBram Moolenaar 21872b529bb6SBram Moolenaar " Tests for action argument 21882b529bb6SBram Moolenaar silent! Xolder 999 21892b529bb6SBram Moolenaar let qfnr = g:Xgetlist({'all':1}).nr 21902b529bb6SBram Moolenaar call g:Xsetlist([], 'r', {'title' : 'N1'}) 21912b529bb6SBram Moolenaar call assert_equal('N1', g:Xgetlist({'all':1}).title) 21922b529bb6SBram Moolenaar call g:Xsetlist([], ' ', {'title' : 'N2'}) 21932b529bb6SBram Moolenaar call assert_equal(qfnr + 1, g:Xgetlist({'all':1}).nr) 2194890680caSBram Moolenaar 2195890680caSBram Moolenaar let res = g:Xgetlist({'nr': 0}) 2196890680caSBram Moolenaar call assert_equal(qfnr + 1, res.nr) 2197890680caSBram Moolenaar call assert_equal(['nr'], keys(res)) 2198890680caSBram Moolenaar 21992b529bb6SBram Moolenaar call g:Xsetlist([], ' ', {'title' : 'N3'}) 22002b529bb6SBram Moolenaar call assert_equal('N2', g:Xgetlist({'nr':2, 'title':1}).title) 22012b529bb6SBram Moolenaar 2202ee85df37SBram Moolenaar " Changing the title of an earlier quickfix list 220355b69264SBram Moolenaar call g:Xsetlist([], 'r', {'title' : 'NewTitle', 'nr' : 2}) 2204ee85df37SBram Moolenaar call assert_equal('NewTitle', g:Xgetlist({'nr':2, 'title':1}).title) 2205ee85df37SBram Moolenaar 2206ee85df37SBram Moolenaar " Changing the title of an invalid quickfix list 2207ee85df37SBram Moolenaar call assert_equal(-1, g:Xsetlist([], ' ', 2208ee85df37SBram Moolenaar \ {'title' : 'SomeTitle', 'nr' : 99})) 2209ee85df37SBram Moolenaar call assert_equal(-1, g:Xsetlist([], ' ', 2210ee85df37SBram Moolenaar \ {'title' : 'SomeTitle', 'nr' : 'abc'})) 2211ee85df37SBram Moolenaar 2212ee85df37SBram Moolenaar if a:cchar == 'c' 2213ee85df37SBram Moolenaar copen 2214ee85df37SBram Moolenaar call assert_equal({'winid':win_getid()}, getqflist({'winid':1})) 2215ee85df37SBram Moolenaar cclose 2216ee85df37SBram Moolenaar endif 2217ee85df37SBram Moolenaar 2218d823fa91SBram Moolenaar " Invalid arguments 2219e2e4075fSBram Moolenaar call assert_fails('call g:Xgetlist([])', 'E715:') 2220e2e4075fSBram Moolenaar call assert_fails('call g:Xsetlist([], "a", [])', 'E715:') 2221d823fa91SBram Moolenaar let s = g:Xsetlist([], 'a', {'abc':1}) 2222d823fa91SBram Moolenaar call assert_equal(-1, s) 2223d823fa91SBram Moolenaar 2224d823fa91SBram Moolenaar call assert_equal({}, g:Xgetlist({'abc':1})) 2225a6d4849cSBram Moolenaar call assert_equal('', g:Xgetlist({'nr':99, 'title':1}).title) 2226a6d4849cSBram Moolenaar call assert_equal('', g:Xgetlist({'nr':[], 'title':1}).title) 2227d823fa91SBram Moolenaar 2228d823fa91SBram Moolenaar if a:cchar == 'l' 2229890680caSBram Moolenaar call assert_equal({}, getloclist(99, {'title': 1})) 2230d823fa91SBram Moolenaar endif 22318f77c5a4SBram Moolenaar 22328f77c5a4SBram Moolenaar " Context related tests 223386f100dcSBram Moolenaar let s = g:Xsetlist([], 'a', {'context':[1,2,3]}) 223486f100dcSBram Moolenaar call assert_equal(0, s) 22358f77c5a4SBram Moolenaar call test_garbagecollect_now() 22368f77c5a4SBram Moolenaar let d = g:Xgetlist({'context':1}) 22378f77c5a4SBram Moolenaar call assert_equal([1,2,3], d.context) 22388f77c5a4SBram Moolenaar call g:Xsetlist([], 'a', {'context':{'color':'green'}}) 22398f77c5a4SBram Moolenaar let d = g:Xgetlist({'context':1}) 22408f77c5a4SBram Moolenaar call assert_equal({'color':'green'}, d.context) 22418f77c5a4SBram Moolenaar call g:Xsetlist([], 'a', {'context':"Context info"}) 22428f77c5a4SBram Moolenaar let d = g:Xgetlist({'context':1}) 22438f77c5a4SBram Moolenaar call assert_equal("Context info", d.context) 22448f77c5a4SBram Moolenaar call g:Xsetlist([], 'a', {'context':246}) 22458f77c5a4SBram Moolenaar let d = g:Xgetlist({'context':1}) 22468f77c5a4SBram Moolenaar call assert_equal(246, d.context) 224792b83ccfSBram Moolenaar " set other Vim data types as context 224892b83ccfSBram Moolenaar call g:Xsetlist([], 'a', {'context' : test_null_blob()}) 224992b83ccfSBram Moolenaar if has('channel') 225092b83ccfSBram Moolenaar call g:Xsetlist([], 'a', {'context' : test_null_channel()}) 225192b83ccfSBram Moolenaar endif 225292b83ccfSBram Moolenaar if has('job') 225392b83ccfSBram Moolenaar call g:Xsetlist([], 'a', {'context' : test_null_job()}) 225492b83ccfSBram Moolenaar endif 225592b83ccfSBram Moolenaar call g:Xsetlist([], 'a', {'context' : test_null_function()}) 225692b83ccfSBram Moolenaar call g:Xsetlist([], 'a', {'context' : test_null_partial()}) 225792b83ccfSBram Moolenaar call g:Xsetlist([], 'a', {'context' : ''}) 225892b83ccfSBram Moolenaar call test_garbagecollect_now() 22598f77c5a4SBram Moolenaar if a:cchar == 'l' 22608f77c5a4SBram Moolenaar " Test for copying context across two different location lists 22618f77c5a4SBram Moolenaar new | only 22628f77c5a4SBram Moolenaar let w1_id = win_getid() 22638f77c5a4SBram Moolenaar let l = [1] 22648f77c5a4SBram Moolenaar call setloclist(0, [], 'a', {'context':l}) 22658f77c5a4SBram Moolenaar new 22668f77c5a4SBram Moolenaar let w2_id = win_getid() 22678f77c5a4SBram Moolenaar call add(l, 2) 22688f77c5a4SBram Moolenaar call assert_equal([1, 2], getloclist(w1_id, {'context':1}).context) 22698f77c5a4SBram Moolenaar call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context) 22708f77c5a4SBram Moolenaar unlet! l 22718f77c5a4SBram Moolenaar call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context) 22728f77c5a4SBram Moolenaar only 22738f77c5a4SBram Moolenaar call setloclist(0, [], 'f') 2274a6d4849cSBram Moolenaar call assert_equal('', getloclist(0, {'context':1}).context) 22758f77c5a4SBram Moolenaar endif 22766e62da3eSBram Moolenaar 22776e62da3eSBram Moolenaar " Test for changing the context of previous quickfix lists 22786e62da3eSBram Moolenaar call g:Xsetlist([], 'f') 22796e62da3eSBram Moolenaar Xexpr "One" 22806e62da3eSBram Moolenaar Xexpr "Two" 22816e62da3eSBram Moolenaar Xexpr "Three" 228255b69264SBram Moolenaar call g:Xsetlist([], 'r', {'context' : [1], 'nr' : 1}) 228355b69264SBram Moolenaar call g:Xsetlist([], 'a', {'context' : [2], 'nr' : 2}) 22846e62da3eSBram Moolenaar " Also, check for setting the context using quickfix list number zero. 228555b69264SBram Moolenaar call g:Xsetlist([], 'r', {'context' : [3], 'nr' : 0}) 22866e62da3eSBram Moolenaar call test_garbagecollect_now() 22876e62da3eSBram Moolenaar let l = g:Xgetlist({'nr' : 1, 'context' : 1}) 22886e62da3eSBram Moolenaar call assert_equal([1], l.context) 22896e62da3eSBram Moolenaar let l = g:Xgetlist({'nr' : 2, 'context' : 1}) 22906e62da3eSBram Moolenaar call assert_equal([2], l.context) 22916e62da3eSBram Moolenaar let l = g:Xgetlist({'nr' : 3, 'context' : 1}) 22926e62da3eSBram Moolenaar call assert_equal([3], l.context) 22936e62da3eSBram Moolenaar 22946e62da3eSBram Moolenaar " Test for changing the context through reference and for garbage 22956e62da3eSBram Moolenaar " collection of quickfix context 22966e62da3eSBram Moolenaar let l = ["red"] 22976e62da3eSBram Moolenaar call g:Xsetlist([], ' ', {'context' : l}) 22986e62da3eSBram Moolenaar call add(l, "blue") 22996e62da3eSBram Moolenaar let x = g:Xgetlist({'context' : 1}) 23006e62da3eSBram Moolenaar call add(x.context, "green") 23016e62da3eSBram Moolenaar call assert_equal(["red", "blue", "green"], l) 23026e62da3eSBram Moolenaar call assert_equal(["red", "blue", "green"], x.context) 23036e62da3eSBram Moolenaar unlet l 23046e62da3eSBram Moolenaar call test_garbagecollect_now() 23056e62da3eSBram Moolenaar let m = g:Xgetlist({'context' : 1}) 23066e62da3eSBram Moolenaar call assert_equal(["red", "blue", "green"], m.context) 23076a8958dbSBram Moolenaar 23086a8958dbSBram Moolenaar " Test for setting/getting items 23096a8958dbSBram Moolenaar Xexpr "" 23106a8958dbSBram Moolenaar let qfprev = g:Xgetlist({'nr':0}) 231186f100dcSBram Moolenaar let s = g:Xsetlist([], ' ', {'title':'Green', 23126a8958dbSBram Moolenaar \ 'items' : [{'filename':'F1', 'lnum':10}]}) 231386f100dcSBram Moolenaar call assert_equal(0, s) 23146a8958dbSBram Moolenaar let qfcur = g:Xgetlist({'nr':0}) 23156a8958dbSBram Moolenaar call assert_true(qfcur.nr == qfprev.nr + 1) 23166a8958dbSBram Moolenaar let l = g:Xgetlist({'items':1}) 23176a8958dbSBram Moolenaar call assert_equal('F1', bufname(l.items[0].bufnr)) 23186a8958dbSBram Moolenaar call assert_equal(10, l.items[0].lnum) 23196a8958dbSBram Moolenaar call g:Xsetlist([], 'a', {'items' : [{'filename':'F2', 'lnum':20}, 23206a8958dbSBram Moolenaar \ {'filename':'F2', 'lnum':30}]}) 23216a8958dbSBram Moolenaar let l = g:Xgetlist({'items':1}) 23226a8958dbSBram Moolenaar call assert_equal('F2', bufname(l.items[2].bufnr)) 23236a8958dbSBram Moolenaar call assert_equal(30, l.items[2].lnum) 23246a8958dbSBram Moolenaar call g:Xsetlist([], 'r', {'items' : [{'filename':'F3', 'lnum':40}]}) 23256a8958dbSBram Moolenaar let l = g:Xgetlist({'items':1}) 23266a8958dbSBram Moolenaar call assert_equal('F3', bufname(l.items[0].bufnr)) 23276a8958dbSBram Moolenaar call assert_equal(40, l.items[0].lnum) 23286a8958dbSBram Moolenaar call g:Xsetlist([], 'r', {'items' : []}) 23296a8958dbSBram Moolenaar let l = g:Xgetlist({'items':1}) 23306a8958dbSBram Moolenaar call assert_equal(0, len(l.items)) 23316a8958dbSBram Moolenaar 2332b4d5fbabSBram Moolenaar call g:Xsetlist([], 'r', {'title' : 'TestTitle'}) 2333b4d5fbabSBram Moolenaar call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]}) 2334b4d5fbabSBram Moolenaar call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]}) 2335b4d5fbabSBram Moolenaar call assert_equal('TestTitle', g:Xgetlist({'title' : 1}).title) 2336b4d5fbabSBram Moolenaar 2337c9cc9c78SBram Moolenaar " Test for getting id of window associated with a location list window 2338c9cc9c78SBram Moolenaar if a:cchar == 'l' 2339c9cc9c78SBram Moolenaar only 2340c9cc9c78SBram Moolenaar call assert_equal(0, g:Xgetlist({'all' : 1}).filewinid) 2341c9cc9c78SBram Moolenaar let wid = win_getid() 2342c9cc9c78SBram Moolenaar Xopen 2343c9cc9c78SBram Moolenaar call assert_equal(wid, g:Xgetlist({'filewinid' : 1}).filewinid) 2344c9cc9c78SBram Moolenaar wincmd w 2345c9cc9c78SBram Moolenaar call assert_equal(0, g:Xgetlist({'filewinid' : 1}).filewinid) 2346c9cc9c78SBram Moolenaar only 2347c9cc9c78SBram Moolenaar endif 2348c9cc9c78SBram Moolenaar 2349ae338338SBram Moolenaar " The following used to crash Vim with address sanitizer 2350ae338338SBram Moolenaar call g:Xsetlist([], 'f') 2351ae338338SBram Moolenaar call g:Xsetlist([], 'a', {'items' : [{'filename':'F1', 'lnum':10}]}) 2352ae338338SBram Moolenaar call assert_equal(10, g:Xgetlist({'items':1}).items[0].lnum) 2353ae338338SBram Moolenaar 2354a2aa8a2bSBram Moolenaar " Try setting the items using a string 2355a2aa8a2bSBram Moolenaar call assert_equal(-1, g:Xsetlist([], ' ', {'items' : 'Test'})) 2356a2aa8a2bSBram Moolenaar 23576a8958dbSBram Moolenaar " Save and restore the quickfix stack 23586a8958dbSBram Moolenaar call g:Xsetlist([], 'f') 23596a8958dbSBram Moolenaar call assert_equal(0, g:Xgetlist({'nr':'$'}).nr) 23606a8958dbSBram Moolenaar Xexpr "File1:10:Line1" 23616a8958dbSBram Moolenaar Xexpr "File2:20:Line2" 23626a8958dbSBram Moolenaar Xexpr "File3:30:Line3" 23636a8958dbSBram Moolenaar let last_qf = g:Xgetlist({'nr':'$'}).nr 23646a8958dbSBram Moolenaar call assert_equal(3, last_qf) 23656a8958dbSBram Moolenaar let qstack = [] 23666a8958dbSBram Moolenaar for i in range(1, last_qf) 23676a8958dbSBram Moolenaar let qstack = add(qstack, g:Xgetlist({'nr':i, 'all':1})) 23686a8958dbSBram Moolenaar endfor 23696a8958dbSBram Moolenaar call g:Xsetlist([], 'f') 23706a8958dbSBram Moolenaar for i in range(len(qstack)) 23716a8958dbSBram Moolenaar call g:Xsetlist([], ' ', qstack[i]) 23726a8958dbSBram Moolenaar endfor 23736a8958dbSBram Moolenaar call assert_equal(3, g:Xgetlist({'nr':'$'}).nr) 23746a8958dbSBram Moolenaar call assert_equal(10, g:Xgetlist({'nr':1, 'items':1}).items[0].lnum) 23756a8958dbSBram Moolenaar call assert_equal(20, g:Xgetlist({'nr':2, 'items':1}).items[0].lnum) 23766a8958dbSBram Moolenaar call assert_equal(30, g:Xgetlist({'nr':3, 'items':1}).items[0].lnum) 23776a8958dbSBram Moolenaar call g:Xsetlist([], 'f') 23786a8958dbSBram Moolenaar 23796a8958dbSBram Moolenaar " Swap two quickfix lists 23806a8958dbSBram Moolenaar Xexpr "File1:10:Line10" 23816a8958dbSBram Moolenaar Xexpr "File2:20:Line20" 23826a8958dbSBram Moolenaar Xexpr "File3:30:Line30" 23836a8958dbSBram Moolenaar call g:Xsetlist([], 'r', {'nr':1,'title':'Colors','context':['Colors']}) 23846a8958dbSBram Moolenaar call g:Xsetlist([], 'r', {'nr':2,'title':'Fruits','context':['Fruits']}) 23856a8958dbSBram Moolenaar let l1=g:Xgetlist({'nr':1,'all':1}) 23866a8958dbSBram Moolenaar let l2=g:Xgetlist({'nr':2,'all':1}) 2387a539f4f1SBram Moolenaar let save_id = l1.id 2388a539f4f1SBram Moolenaar let l1.id=l2.id 2389a539f4f1SBram Moolenaar let l2.id=save_id 23906a8958dbSBram Moolenaar call g:Xsetlist([], 'r', l1) 23916a8958dbSBram Moolenaar call g:Xsetlist([], 'r', l2) 23926a8958dbSBram Moolenaar let newl1=g:Xgetlist({'nr':1,'all':1}) 23936a8958dbSBram Moolenaar let newl2=g:Xgetlist({'nr':2,'all':1}) 2394b4d5fbabSBram Moolenaar call assert_equal('Fruits', newl1.title) 23956a8958dbSBram Moolenaar call assert_equal(['Fruits'], newl1.context) 23966a8958dbSBram Moolenaar call assert_equal('Line20', newl1.items[0].text) 2397b4d5fbabSBram Moolenaar call assert_equal('Colors', newl2.title) 23986a8958dbSBram Moolenaar call assert_equal(['Colors'], newl2.context) 23996a8958dbSBram Moolenaar call assert_equal('Line10', newl2.items[0].text) 24006a8958dbSBram Moolenaar call g:Xsetlist([], 'f') 2401be7a50c2SBram Moolenaar 2402be7a50c2SBram Moolenaar " Cannot specify both a non-empty list argument and a dict argument 2403be7a50c2SBram Moolenaar call assert_fails("call g:Xsetlist([{}], ' ', {})", 'E475:') 24042b946c9fSBram Moolenaarendfunc 2405d823fa91SBram Moolenaar 24062b946c9fSBram Moolenaarfunc Test_qf_property() 2407d823fa91SBram Moolenaar call Xproperty_tests('c') 2408d823fa91SBram Moolenaar call Xproperty_tests('l') 24092b946c9fSBram Moolenaarendfunc 241004c4ce65SBram Moolenaar 24115b69c22fSBram Moolenaar" Test for setting the current index in the location/quickfix list 24125b69c22fSBram Moolenaarfunc Xtest_setqfidx(cchar) 24135b69c22fSBram Moolenaar call s:setup_commands(a:cchar) 24145b69c22fSBram Moolenaar 24155b69c22fSBram Moolenaar Xgetexpr "F1:10:1:Line1\nF2:20:2:Line2\nF3:30:3:Line3" 24165b69c22fSBram Moolenaar Xgetexpr "F4:10:1:Line1\nF5:20:2:Line2\nF6:30:3:Line3" 24175b69c22fSBram Moolenaar Xgetexpr "F7:10:1:Line1\nF8:20:2:Line2\nF9:30:3:Line3" 24185b69c22fSBram Moolenaar 24195b69c22fSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 3, 'idx' : 2}) 24205b69c22fSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 2, 'idx' : 2}) 24215b69c22fSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 3}) 24225b69c22fSBram Moolenaar Xolder 2 24235b69c22fSBram Moolenaar Xopen 24245b69c22fSBram Moolenaar call assert_equal(3, line('.')) 24255b69c22fSBram Moolenaar Xnewer 24265b69c22fSBram Moolenaar call assert_equal(2, line('.')) 24275b69c22fSBram Moolenaar Xnewer 24285b69c22fSBram Moolenaar call assert_equal(2, line('.')) 24295b69c22fSBram Moolenaar " Update the current index with the quickfix window open 24305b69c22fSBram Moolenaar wincmd w 24315b69c22fSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 3, 'idx' : 3}) 24325b69c22fSBram Moolenaar Xopen 24335b69c22fSBram Moolenaar call assert_equal(3, line('.')) 24345b69c22fSBram Moolenaar Xclose 24355b69c22fSBram Moolenaar 24365b69c22fSBram Moolenaar " Set the current index to the last entry 24375b69c22fSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : '$'}) 24385b69c22fSBram Moolenaar call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx) 24395b69c22fSBram Moolenaar " A large value should set the index to the last index 24405b69c22fSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 1}) 24415b69c22fSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 999}) 24425b69c22fSBram Moolenaar call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx) 24435b69c22fSBram Moolenaar " Invalid index values 24445b69c22fSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : -1}) 24455b69c22fSBram Moolenaar call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx) 24465b69c22fSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 0}) 24475b69c22fSBram Moolenaar call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx) 24485b69c22fSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 'xx'}) 24495b69c22fSBram Moolenaar call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx) 24505b69c22fSBram Moolenaar call assert_fails("call g:Xsetlist([], 'a', {'nr':1, 'idx':[]})", 'E745:') 24515b69c22fSBram Moolenaar 24525b69c22fSBram Moolenaar call g:Xsetlist([], 'f') 24535b69c22fSBram Moolenaar new | only 24545b69c22fSBram Moolenaarendfunc 24555b69c22fSBram Moolenaar 24565b69c22fSBram Moolenaarfunc Test_setqfidx() 24575b69c22fSBram Moolenaar call Xtest_setqfidx('c') 24585b69c22fSBram Moolenaar call Xtest_setqfidx('l') 24595b69c22fSBram Moolenaarendfunc 24605b69c22fSBram Moolenaar 246104c4ce65SBram Moolenaar" Tests for the QuickFixCmdPre/QuickFixCmdPost autocommands 24622b946c9fSBram Moolenaarfunc QfAutoCmdHandler(loc, cmd) 246304c4ce65SBram Moolenaar call add(g:acmds, a:loc . a:cmd) 24642b946c9fSBram Moolenaarendfunc 246504c4ce65SBram Moolenaar 24662b946c9fSBram Moolenaarfunc Test_Autocmd() 246704c4ce65SBram Moolenaar autocmd QuickFixCmdPre * call QfAutoCmdHandler('pre', expand('<amatch>')) 246804c4ce65SBram Moolenaar autocmd QuickFixCmdPost * call QfAutoCmdHandler('post', expand('<amatch>')) 246904c4ce65SBram Moolenaar 247004c4ce65SBram Moolenaar let g:acmds = [] 247104c4ce65SBram Moolenaar cexpr "F1:10:Line 10" 247204c4ce65SBram Moolenaar caddexpr "F1:20:Line 20" 247304c4ce65SBram Moolenaar cgetexpr "F1:30:Line 30" 24741ed2276fSBram Moolenaar cexpr "" 24751ed2276fSBram Moolenaar caddexpr "" 24761ed2276fSBram Moolenaar cgetexpr "" 24771ed2276fSBram Moolenaar silent! cexpr non_existing_func() 24781ed2276fSBram Moolenaar silent! caddexpr non_existing_func() 24791ed2276fSBram Moolenaar silent! cgetexpr non_existing_func() 248004c4ce65SBram Moolenaar let l = ['precexpr', 248104c4ce65SBram Moolenaar \ 'postcexpr', 248204c4ce65SBram Moolenaar \ 'precaddexpr', 248304c4ce65SBram Moolenaar \ 'postcaddexpr', 248404c4ce65SBram Moolenaar \ 'precgetexpr', 248504c4ce65SBram Moolenaar \ 'postcgetexpr', 24861ed2276fSBram Moolenaar \ 'precexpr', 24871ed2276fSBram Moolenaar \ 'postcexpr', 24881ed2276fSBram Moolenaar \ 'precaddexpr', 24891ed2276fSBram Moolenaar \ 'postcaddexpr', 24901ed2276fSBram Moolenaar \ 'precgetexpr', 24911ed2276fSBram Moolenaar \ 'postcgetexpr', 24921ed2276fSBram Moolenaar \ 'precexpr', 24931ed2276fSBram Moolenaar \ 'precaddexpr', 24941ed2276fSBram Moolenaar \ 'precgetexpr'] 24951ed2276fSBram Moolenaar call assert_equal(l, g:acmds) 24961ed2276fSBram Moolenaar 24971ed2276fSBram Moolenaar let g:acmds = [] 24981ed2276fSBram Moolenaar enew! | call append(0, "F2:10:Line 10") 24991ed2276fSBram Moolenaar cbuffer! 25001ed2276fSBram Moolenaar enew! | call append(0, "F2:20:Line 20") 25011ed2276fSBram Moolenaar cgetbuffer 25021ed2276fSBram Moolenaar enew! | call append(0, "F2:30:Line 30") 25031ed2276fSBram Moolenaar caddbuffer 25041ed2276fSBram Moolenaar new 25051ed2276fSBram Moolenaar let bnum = bufnr('%') 25061ed2276fSBram Moolenaar bunload 25071ed2276fSBram Moolenaar exe 'silent! cbuffer! ' . bnum 25081ed2276fSBram Moolenaar exe 'silent! cgetbuffer ' . bnum 25091ed2276fSBram Moolenaar exe 'silent! caddbuffer ' . bnum 25101ed2276fSBram Moolenaar enew! 25111ed2276fSBram Moolenaar let l = ['precbuffer', 251204c4ce65SBram Moolenaar \ 'postcbuffer', 251304c4ce65SBram Moolenaar \ 'precgetbuffer', 251404c4ce65SBram Moolenaar \ 'postcgetbuffer', 251504c4ce65SBram Moolenaar \ 'precaddbuffer', 25161ed2276fSBram Moolenaar \ 'postcaddbuffer', 25171ed2276fSBram Moolenaar \ 'precbuffer', 25181ed2276fSBram Moolenaar \ 'precgetbuffer', 25191ed2276fSBram Moolenaar \ 'precaddbuffer'] 252004c4ce65SBram Moolenaar call assert_equal(l, g:acmds) 25211ed2276fSBram Moolenaar 25221ed2276fSBram Moolenaar call writefile(['Xtest:1:Line1'], 'Xtest') 25231ed2276fSBram Moolenaar call writefile([], 'Xempty') 25241ed2276fSBram Moolenaar let g:acmds = [] 25251ed2276fSBram Moolenaar cfile Xtest 25261ed2276fSBram Moolenaar caddfile Xtest 25271ed2276fSBram Moolenaar cgetfile Xtest 25281ed2276fSBram Moolenaar cfile Xempty 25291ed2276fSBram Moolenaar caddfile Xempty 25301ed2276fSBram Moolenaar cgetfile Xempty 25311ed2276fSBram Moolenaar silent! cfile do_not_exist 25321ed2276fSBram Moolenaar silent! caddfile do_not_exist 25331ed2276fSBram Moolenaar silent! cgetfile do_not_exist 25341ed2276fSBram Moolenaar let l = ['precfile', 25351ed2276fSBram Moolenaar \ 'postcfile', 25361ed2276fSBram Moolenaar \ 'precaddfile', 25371ed2276fSBram Moolenaar \ 'postcaddfile', 25381ed2276fSBram Moolenaar \ 'precgetfile', 25391ed2276fSBram Moolenaar \ 'postcgetfile', 25401ed2276fSBram Moolenaar \ 'precfile', 25411ed2276fSBram Moolenaar \ 'postcfile', 25421ed2276fSBram Moolenaar \ 'precaddfile', 25431ed2276fSBram Moolenaar \ 'postcaddfile', 25441ed2276fSBram Moolenaar \ 'precgetfile', 25451ed2276fSBram Moolenaar \ 'postcgetfile', 25461ed2276fSBram Moolenaar \ 'precfile', 25471ed2276fSBram Moolenaar \ 'postcfile', 25481ed2276fSBram Moolenaar \ 'precaddfile', 25491ed2276fSBram Moolenaar \ 'postcaddfile', 25501ed2276fSBram Moolenaar \ 'precgetfile', 25511ed2276fSBram Moolenaar \ 'postcgetfile'] 25521ed2276fSBram Moolenaar call assert_equal(l, g:acmds) 25531ed2276fSBram Moolenaar 25541ed2276fSBram Moolenaar let g:acmds = [] 25551ed2276fSBram Moolenaar helpgrep quickfix 25561ed2276fSBram Moolenaar silent! helpgrep non_existing_help_topic 25571ed2276fSBram Moolenaar vimgrep test Xtest 25581ed2276fSBram Moolenaar vimgrepadd test Xtest 25591ed2276fSBram Moolenaar silent! vimgrep non_existing_test Xtest 25601ed2276fSBram Moolenaar silent! vimgrepadd non_existing_test Xtest 25611ed2276fSBram Moolenaar set makeprg= 25621ed2276fSBram Moolenaar silent! make 25631ed2276fSBram Moolenaar set makeprg& 25641ed2276fSBram Moolenaar let l = ['prehelpgrep', 25651ed2276fSBram Moolenaar \ 'posthelpgrep', 25661ed2276fSBram Moolenaar \ 'prehelpgrep', 25671ed2276fSBram Moolenaar \ 'posthelpgrep', 25681ed2276fSBram Moolenaar \ 'previmgrep', 25691ed2276fSBram Moolenaar \ 'postvimgrep', 25701ed2276fSBram Moolenaar \ 'previmgrepadd', 25711ed2276fSBram Moolenaar \ 'postvimgrepadd', 25721ed2276fSBram Moolenaar \ 'previmgrep', 25731ed2276fSBram Moolenaar \ 'postvimgrep', 25741ed2276fSBram Moolenaar \ 'previmgrepadd', 25751ed2276fSBram Moolenaar \ 'postvimgrepadd', 25761ed2276fSBram Moolenaar \ 'premake', 25771ed2276fSBram Moolenaar \ 'postmake'] 25781ed2276fSBram Moolenaar call assert_equal(l, g:acmds) 25791ed2276fSBram Moolenaar 25801ed2276fSBram Moolenaar if has('unix') 25811ed2276fSBram Moolenaar " Run this test only on Unix-like systems. The grepprg may not be set on 25821ed2276fSBram Moolenaar " non-Unix systems. 25831ed2276fSBram Moolenaar " The following lines are used for the grep test. Don't remove. 25841ed2276fSBram Moolenaar " Grep_Autocmd_Text: Match 1 25851ed2276fSBram Moolenaar " GrepAdd_Autocmd_Text: Match 2 25861ed2276fSBram Moolenaar let g:acmds = [] 25871ed2276fSBram Moolenaar silent grep Grep_Autocmd_Text test_quickfix.vim 25881ed2276fSBram Moolenaar silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim 25891ed2276fSBram Moolenaar silent grep abc123def Xtest 25901ed2276fSBram Moolenaar silent grepadd abc123def Xtest 259115a7bdcbSBram Moolenaar set grepprg=internal 259215a7bdcbSBram Moolenaar silent grep Grep_Autocmd_Text test_quickfix.vim 259315a7bdcbSBram Moolenaar silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim 259415a7bdcbSBram Moolenaar silent lgrep Grep_Autocmd_Text test_quickfix.vim 259515a7bdcbSBram Moolenaar silent lgrepadd GrepAdd_Autocmd_Text test_quickfix.vim 259615a7bdcbSBram Moolenaar set grepprg&vim 25971ed2276fSBram Moolenaar let l = ['pregrep', 25981ed2276fSBram Moolenaar \ 'postgrep', 25991ed2276fSBram Moolenaar \ 'pregrepadd', 26001ed2276fSBram Moolenaar \ 'postgrepadd', 26011ed2276fSBram Moolenaar \ 'pregrep', 26021ed2276fSBram Moolenaar \ 'postgrep', 26031ed2276fSBram Moolenaar \ 'pregrepadd', 260415a7bdcbSBram Moolenaar \ 'postgrepadd', 260515a7bdcbSBram Moolenaar \ 'pregrep', 260615a7bdcbSBram Moolenaar \ 'postgrep', 260715a7bdcbSBram Moolenaar \ 'pregrepadd', 260815a7bdcbSBram Moolenaar \ 'postgrepadd', 260915a7bdcbSBram Moolenaar \ 'prelgrep', 261015a7bdcbSBram Moolenaar \ 'postlgrep', 261115a7bdcbSBram Moolenaar \ 'prelgrepadd', 261215a7bdcbSBram Moolenaar \ 'postlgrepadd'] 26131ed2276fSBram Moolenaar call assert_equal(l, g:acmds) 26141ed2276fSBram Moolenaar endif 26151ed2276fSBram Moolenaar 26161ed2276fSBram Moolenaar call delete('Xtest') 26171ed2276fSBram Moolenaar call delete('Xempty') 2618b254af31SBram Moolenaar au! QuickFixCmdPre 2619b254af31SBram Moolenaar au! QuickFixCmdPost 26202b946c9fSBram Moolenaarendfunc 262121662be2SBram Moolenaar 26222b946c9fSBram Moolenaarfunc Test_Autocmd_Exception() 262321662be2SBram Moolenaar set efm=%m 262421662be2SBram Moolenaar lgetexpr '?' 262521662be2SBram Moolenaar 262621662be2SBram Moolenaar try 262721662be2SBram Moolenaar call DoesNotExit() 262821662be2SBram Moolenaar catch 262921662be2SBram Moolenaar lgetexpr '1' 263021662be2SBram Moolenaar finally 263121662be2SBram Moolenaar lgetexpr '1' 263221662be2SBram Moolenaar endtry 263321662be2SBram Moolenaar 263421662be2SBram Moolenaar call assert_equal('1', getloclist(0)[0].text) 263521662be2SBram Moolenaar 263621662be2SBram Moolenaar set efm&vim 26372b946c9fSBram Moolenaarendfunc 263863bed3d3SBram Moolenaar 26392b946c9fSBram Moolenaarfunc Test_caddbuffer_wrong() 26402b946c9fSBram Moolenaar " This used to cause a memory access in freed memory. 264163bed3d3SBram Moolenaar let save_efm = &efm 264263bed3d3SBram Moolenaar set efm=%EEEE%m,%WWWW,%+CCCC%>%#,%GGGG%.# 264363bed3d3SBram Moolenaar cgetexpr ['WWWW', 'EEEE', 'CCCC'] 264463bed3d3SBram Moolenaar let &efm = save_efm 26452b946c9fSBram Moolenaar caddbuffer 264663bed3d3SBram Moolenaar bwipe! 264763bed3d3SBram Moolenaarendfunc 26482b946c9fSBram Moolenaar 26492b946c9fSBram Moolenaarfunc Test_caddexpr_wrong() 26502b946c9fSBram Moolenaar " This used to cause a memory access in freed memory. 26512b946c9fSBram Moolenaar cbuffer 26522b946c9fSBram Moolenaar cbuffer 26532b946c9fSBram Moolenaar copen 26542b946c9fSBram Moolenaar let save_efm = &efm 26552b946c9fSBram Moolenaar set efm=% 26562b946c9fSBram Moolenaar call assert_fails('caddexpr ""', 'E376:') 26572b946c9fSBram Moolenaar let &efm = save_efm 26582b946c9fSBram Moolenaarendfunc 26597618e00dSBram Moolenaar 26607618e00dSBram Moolenaarfunc Test_dirstack_cleanup() 26617618e00dSBram Moolenaar " This used to cause a memory access in freed memory. 26627618e00dSBram Moolenaar let save_efm = &efm 26637618e00dSBram Moolenaar lexpr '0' 26647618e00dSBram Moolenaar lopen 26657618e00dSBram Moolenaar fun X(c) 26667618e00dSBram Moolenaar let save_efm=&efm 26677618e00dSBram Moolenaar set efm=%D%f 26687618e00dSBram Moolenaar if a:c == 'c' 26697618e00dSBram Moolenaar caddexpr '::' 26707618e00dSBram Moolenaar else 26717618e00dSBram Moolenaar laddexpr ':0:0' 26727618e00dSBram Moolenaar endif 26737618e00dSBram Moolenaar let &efm=save_efm 26747618e00dSBram Moolenaar endfun 26757618e00dSBram Moolenaar call X('c') 26767618e00dSBram Moolenaar call X('l') 26777618e00dSBram Moolenaar call setqflist([], 'r') 26787618e00dSBram Moolenaar caddbuffer 26797618e00dSBram Moolenaar let &efm = save_efm 26807618e00dSBram Moolenaarendfunc 2681391b1dd0SBram Moolenaar 2682391b1dd0SBram Moolenaar" Tests for jumping to entries from the location list window and quickfix 2683391b1dd0SBram Moolenaar" window 2684391b1dd0SBram Moolenaarfunc Test_cwindow_jump() 2685391b1dd0SBram Moolenaar set efm=%f%%%l%%%m 2686391b1dd0SBram Moolenaar lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"] 2687391b1dd0SBram Moolenaar lopen | only 2688391b1dd0SBram Moolenaar lfirst 2689391b1dd0SBram Moolenaar call assert_true(winnr('$') == 2) 2690391b1dd0SBram Moolenaar call assert_true(winnr() == 1) 2691391b1dd0SBram Moolenaar " Location list for the new window should be set 2692391b1dd0SBram Moolenaar call assert_true(getloclist(0)[2].text == 'Line 30') 2693391b1dd0SBram Moolenaar 2694391b1dd0SBram Moolenaar " Open a scratch buffer 2695391b1dd0SBram Moolenaar " Open a new window and create a location list 2696391b1dd0SBram Moolenaar " Open the location list window and close the other window 2697391b1dd0SBram Moolenaar " Jump to an entry. 2698eeb1b9c7SBram Moolenaar " Should create a new window and jump to the entry. The scratch buffer 2699391b1dd0SBram Moolenaar " should not be used. 2700391b1dd0SBram Moolenaar enew | only 2701391b1dd0SBram Moolenaar set buftype=nofile 2702391b1dd0SBram Moolenaar below new 2703391b1dd0SBram Moolenaar lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"] 2704391b1dd0SBram Moolenaar lopen 2705391b1dd0SBram Moolenaar 2wincmd c 2706391b1dd0SBram Moolenaar lnext 2707391b1dd0SBram Moolenaar call assert_true(winnr('$') == 3) 2708391b1dd0SBram Moolenaar call assert_true(winnr() == 2) 2709391b1dd0SBram Moolenaar 2710391b1dd0SBram Moolenaar " Open two windows with two different location lists 2711391b1dd0SBram Moolenaar " Open the location list window and close the previous window 2712391b1dd0SBram Moolenaar " Jump to an entry in the location list window 2713391b1dd0SBram Moolenaar " Should open the file in the first window and not set the location list. 2714391b1dd0SBram Moolenaar enew | only 2715391b1dd0SBram Moolenaar lgetexpr ["F1%5%Line 5"] 2716391b1dd0SBram Moolenaar below new 2717391b1dd0SBram Moolenaar lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"] 2718391b1dd0SBram Moolenaar lopen 2719391b1dd0SBram Moolenaar 2wincmd c 2720391b1dd0SBram Moolenaar lnext 2721391b1dd0SBram Moolenaar call assert_true(winnr() == 1) 2722391b1dd0SBram Moolenaar call assert_true(getloclist(0)[0].text == 'Line 5') 2723391b1dd0SBram Moolenaar 2724391b1dd0SBram Moolenaar enew | only 2725391b1dd0SBram Moolenaar cgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"] 2726391b1dd0SBram Moolenaar copen 2727391b1dd0SBram Moolenaar cnext 2728391b1dd0SBram Moolenaar call assert_true(winnr('$') == 2) 2729391b1dd0SBram Moolenaar call assert_true(winnr() == 1) 2730391b1dd0SBram Moolenaar 2731f9ae154cSBram Moolenaar " open the quickfix buffer in two windows and jump to an entry. Should open 2732f9ae154cSBram Moolenaar " the file in the first quickfix window. 2733f9ae154cSBram Moolenaar enew | only 2734f9ae154cSBram Moolenaar copen 2735f9ae154cSBram Moolenaar let bnum = bufnr('') 2736f9ae154cSBram Moolenaar exe 'sbuffer ' . bnum 2737f9ae154cSBram Moolenaar wincmd b 2738f9ae154cSBram Moolenaar cfirst 2739f9ae154cSBram Moolenaar call assert_equal(2, winnr()) 2740bdd2c290SBram Moolenaar call assert_equal('F1', @%) 2741f9ae154cSBram Moolenaar enew | only 2742f9ae154cSBram Moolenaar exe 'sb' bnum 2743f9ae154cSBram Moolenaar exe 'botright sb' bnum 2744f9ae154cSBram Moolenaar wincmd t 2745f9ae154cSBram Moolenaar clast 2746f9ae154cSBram Moolenaar call assert_equal(2, winnr()) 2747f9ae154cSBram Moolenaar call assert_equal('quickfix', getwinvar(1, '&buftype')) 2748f9ae154cSBram Moolenaar call assert_equal('quickfix', getwinvar(3, '&buftype')) 2749f9ae154cSBram Moolenaar 27504b96df5aSBram Moolenaar " Jumping to a file from the location list window should find a usable 275115a7bdcbSBram Moolenaar " window by wrapping around the window list. 275215a7bdcbSBram Moolenaar enew | only 275315a7bdcbSBram Moolenaar call setloclist(0, [], 'f') 275415a7bdcbSBram Moolenaar new | new 275515a7bdcbSBram Moolenaar lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"] 275615a7bdcbSBram Moolenaar lopen 275715a7bdcbSBram Moolenaar 1close 275815a7bdcbSBram Moolenaar call assert_equal(0, getloclist(3, {'id' : 0}).id) 275915a7bdcbSBram Moolenaar lnext 276015a7bdcbSBram Moolenaar call assert_equal(3, winnr()) 276115a7bdcbSBram Moolenaar call assert_equal(getloclist(1, {'id' : 0}).id, getloclist(3, {'id' : 0}).id) 276215a7bdcbSBram Moolenaar 2763391b1dd0SBram Moolenaar enew | only 2764391b1dd0SBram Moolenaar set efm&vim 2765391b1dd0SBram Moolenaarendfunc 2766ee85df37SBram Moolenaar 2767e00fdf35SBram Moolenaarfunc Test_cwindow_highlight() 2768e00fdf35SBram Moolenaar CheckScreendump 2769e00fdf35SBram Moolenaar 2770e00fdf35SBram Moolenaar let lines =<< trim END 2771e00fdf35SBram Moolenaar call setline(1, ['some', 'text', 'with', 'matches']) 2772e00fdf35SBram Moolenaar write XCwindow 2773e00fdf35SBram Moolenaar vimgrep e XCwindow 2774e00fdf35SBram Moolenaar redraw 2775e00fdf35SBram Moolenaar cwindow 4 2776e00fdf35SBram Moolenaar END 2777e00fdf35SBram Moolenaar call writefile(lines, 'XtestCwindow') 2778e00fdf35SBram Moolenaar let buf = RunVimInTerminal('-S XtestCwindow', #{rows: 12}) 2779e00fdf35SBram Moolenaar call VerifyScreenDump(buf, 'Test_quickfix_cwindow_1', {}) 2780e00fdf35SBram Moolenaar 2781e00fdf35SBram Moolenaar call term_sendkeys(buf, ":cnext\<CR>") 2782e00fdf35SBram Moolenaar call VerifyScreenDump(buf, 'Test_quickfix_cwindow_2', {}) 2783e00fdf35SBram Moolenaar 2784e00fdf35SBram Moolenaar " clean up 2785e00fdf35SBram Moolenaar call StopVimInTerminal(buf) 2786e00fdf35SBram Moolenaar call delete('XtestCwindow') 2787e00fdf35SBram Moolenaar call delete('XCwindow') 2788e00fdf35SBram Moolenaarendfunc 2789e00fdf35SBram Moolenaar 2790ee85df37SBram Moolenaarfunc XvimgrepTests(cchar) 2791ee85df37SBram Moolenaar call s:setup_commands(a:cchar) 2792ee85df37SBram Moolenaar 2793ee85df37SBram Moolenaar call writefile(['Editor:VIM vim', 2794ee85df37SBram Moolenaar \ 'Editor:Emacs EmAcS', 2795ee85df37SBram Moolenaar \ 'Editor:Notepad NOTEPAD'], 'Xtestfile1') 2796ee85df37SBram Moolenaar call writefile(['Linux', 'MacOS', 'MS-Windows'], 'Xtestfile2') 2797ee85df37SBram Moolenaar 2798ee85df37SBram Moolenaar " Error cases 2799ee85df37SBram Moolenaar call assert_fails('Xvimgrep /abc *', 'E682:') 2800ee85df37SBram Moolenaar 2801ee85df37SBram Moolenaar let @/='' 2802ee85df37SBram Moolenaar call assert_fails('Xvimgrep // *', 'E35:') 2803ee85df37SBram Moolenaar 2804ee85df37SBram Moolenaar call assert_fails('Xvimgrep abc', 'E683:') 2805ee85df37SBram Moolenaar call assert_fails('Xvimgrep a1b2c3 Xtestfile1', 'E480:') 2806ee85df37SBram Moolenaar call assert_fails('Xvimgrep pat Xa1b2c3', 'E480:') 2807ee85df37SBram Moolenaar 2808ee85df37SBram Moolenaar Xexpr "" 2809ee85df37SBram Moolenaar Xvimgrepadd Notepad Xtestfile1 2810ee85df37SBram Moolenaar Xvimgrepadd MacOS Xtestfile2 2811ee85df37SBram Moolenaar let l = g:Xgetlist() 2812ee85df37SBram Moolenaar call assert_equal(2, len(l)) 2813ee85df37SBram Moolenaar call assert_equal('Editor:Notepad NOTEPAD', l[0].text) 2814ee85df37SBram Moolenaar 2815f9ae154cSBram Moolenaar 10Xvimgrep #\cvim#g Xtestfile? 2816ee85df37SBram Moolenaar let l = g:Xgetlist() 2817ee85df37SBram Moolenaar call assert_equal(2, len(l)) 2818ee85df37SBram Moolenaar call assert_equal(8, l[0].col) 2819ee85df37SBram Moolenaar call assert_equal(12, l[1].col) 2820ee85df37SBram Moolenaar 2821ee85df37SBram Moolenaar 1Xvimgrep ?Editor? Xtestfile* 2822ee85df37SBram Moolenaar let l = g:Xgetlist() 2823ee85df37SBram Moolenaar call assert_equal(1, len(l)) 2824ee85df37SBram Moolenaar call assert_equal('Editor:VIM vim', l[0].text) 2825ee85df37SBram Moolenaar 2826ee85df37SBram Moolenaar edit +3 Xtestfile2 2827ee85df37SBram Moolenaar Xvimgrep +\cemacs+j Xtestfile1 2828ee85df37SBram Moolenaar let l = g:Xgetlist() 2829bdd2c290SBram Moolenaar call assert_equal('Xtestfile2', @%) 2830ee85df37SBram Moolenaar call assert_equal('Editor:Emacs EmAcS', l[0].text) 2831ee85df37SBram Moolenaar 28322225ebb4SBram Moolenaar " Test for unloading a buffer after vimgrep searched the buffer 28332225ebb4SBram Moolenaar %bwipe 28342225ebb4SBram Moolenaar Xvimgrep /Editor/j Xtestfile* 28352225ebb4SBram Moolenaar call assert_equal(0, getbufinfo('Xtestfile1')[0].loaded) 28362225ebb4SBram Moolenaar call assert_equal([], getbufinfo('Xtestfile2')) 28372225ebb4SBram Moolenaar 2838ee85df37SBram Moolenaar call delete('Xtestfile1') 2839ee85df37SBram Moolenaar call delete('Xtestfile2') 2840ee85df37SBram Moolenaarendfunc 2841ee85df37SBram Moolenaar 2842ee85df37SBram Moolenaar" Tests for the :vimgrep command 2843ee85df37SBram Moolenaarfunc Test_vimgrep() 2844ee85df37SBram Moolenaar call XvimgrepTests('c') 2845ee85df37SBram Moolenaar call XvimgrepTests('l') 2846ee85df37SBram Moolenaarendfunc 284769f40be6SBram Moolenaar 28481c299434SBram Moolenaar" Test for incsearch highlighting of the :vimgrep pattern 28491c299434SBram Moolenaar" This test used to cause "E315: ml_get: invalid lnum" errors. 28501c299434SBram Moolenaarfunc Test_vimgrep_incsearch() 28511c299434SBram Moolenaar enew 28521c299434SBram Moolenaar set incsearch 28531c299434SBram Moolenaar call test_override("char_avail", 1) 28541c299434SBram Moolenaar 28551c299434SBram Moolenaar call feedkeys(":2vimgrep assert test_quickfix.vim test_cdo.vim\<CR>", "ntx") 28561c299434SBram Moolenaar let l = getqflist() 28571c299434SBram Moolenaar call assert_equal(2, len(l)) 28581c299434SBram Moolenaar 28591c299434SBram Moolenaar call test_override("ALL", 0) 28601c299434SBram Moolenaar set noincsearch 28611c299434SBram Moolenaarendfunc 28621c299434SBram Moolenaar 28639f6277bdSBram Moolenaar" Test vimgrep with the last search pattern not set 28649f6277bdSBram Moolenaarfunc Test_vimgrep_with_no_last_search_pat() 28659f6277bdSBram Moolenaar let lines =<< trim [SCRIPT] 28669f6277bdSBram Moolenaar call assert_fails('vimgrep // *', 'E35:') 28679f6277bdSBram Moolenaar call writefile(v:errors, 'Xresult') 28689f6277bdSBram Moolenaar qall! 28699f6277bdSBram Moolenaar [SCRIPT] 28709f6277bdSBram Moolenaar call writefile(lines, 'Xscript') 28719f6277bdSBram Moolenaar if RunVim([], [], '--clean -S Xscript') 28729f6277bdSBram Moolenaar call assert_equal([], readfile('Xresult')) 28739f6277bdSBram Moolenaar endif 28749f6277bdSBram Moolenaar call delete('Xscript') 28759f6277bdSBram Moolenaar call delete('Xresult') 28769f6277bdSBram Moolenaarendfunc 28779f6277bdSBram Moolenaar 2878997cd1a1SBram Moolenaar" Test vimgrep without swap file 2879997cd1a1SBram Moolenaarfunc Test_vimgrep_without_swap_file() 2880997cd1a1SBram Moolenaar let lines =<< trim [SCRIPT] 2881997cd1a1SBram Moolenaar vimgrep grep test_c* 2882997cd1a1SBram Moolenaar call writefile(['done'], 'Xresult') 2883997cd1a1SBram Moolenaar qall! 2884997cd1a1SBram Moolenaar [SCRIPT] 2885997cd1a1SBram Moolenaar call writefile(lines, 'Xscript') 2886997cd1a1SBram Moolenaar if RunVim([], [], '--clean -n -S Xscript Xscript') 2887997cd1a1SBram Moolenaar call assert_equal(['done'], readfile('Xresult')) 2888997cd1a1SBram Moolenaar endif 2889997cd1a1SBram Moolenaar call delete('Xscript') 2890997cd1a1SBram Moolenaar call delete('Xresult') 2891997cd1a1SBram Moolenaarendfunc 2892997cd1a1SBram Moolenaar 28938ce4b7edSBram Moolenaarfunc Test_vimgrep_existing_swapfile() 28948ce4b7edSBram Moolenaar call writefile(['match apple with apple'], 'Xapple') 28958ce4b7edSBram Moolenaar call writefile(['swapfile'], '.Xapple.swp') 28968ce4b7edSBram Moolenaar let g:foundSwap = 0 28978ce4b7edSBram Moolenaar let g:ignoreSwapExists = 1 28988ce4b7edSBram Moolenaar augroup grep 28998ce4b7edSBram Moolenaar au SwapExists * let foundSwap = 1 | let v:swapchoice = 'e' 29008ce4b7edSBram Moolenaar augroup END 29018ce4b7edSBram Moolenaar vimgrep apple Xapple 29028ce4b7edSBram Moolenaar call assert_equal(1, g:foundSwap) 29038ce4b7edSBram Moolenaar call assert_match('.Xapple.swo', swapname('')) 29048ce4b7edSBram Moolenaar 29058ce4b7edSBram Moolenaar call delete('Xapple') 29066d91bcb4SBram Moolenaar call delete('.Xapple.swp') 29078ce4b7edSBram Moolenaar augroup grep 29088ce4b7edSBram Moolenaar au! SwapExists 29098ce4b7edSBram Moolenaar augroup END 29108ce4b7edSBram Moolenaar unlet g:ignoreSwapExists 29118ce4b7edSBram Moolenaarendfunc 29128ce4b7edSBram Moolenaar 291369f40be6SBram Moolenaarfunc XfreeTests(cchar) 291469f40be6SBram Moolenaar call s:setup_commands(a:cchar) 291569f40be6SBram Moolenaar 291669f40be6SBram Moolenaar enew | only 291769f40be6SBram Moolenaar 291869f40be6SBram Moolenaar " Deleting the quickfix stack should work even When the current list is 291969f40be6SBram Moolenaar " somewhere in the middle of the stack 292069f40be6SBram Moolenaar Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15'] 292169f40be6SBram Moolenaar Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25'] 292269f40be6SBram Moolenaar Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35'] 292369f40be6SBram Moolenaar Xolder 292469f40be6SBram Moolenaar call g:Xsetlist([], 'f') 292569f40be6SBram Moolenaar call assert_equal(0, len(g:Xgetlist())) 292669f40be6SBram Moolenaar 292769f40be6SBram Moolenaar " After deleting the stack, adding a new list should create a stack with a 292869f40be6SBram Moolenaar " single list. 292969f40be6SBram Moolenaar Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15'] 293069f40be6SBram Moolenaar call assert_equal(1, g:Xgetlist({'all':1}).nr) 293169f40be6SBram Moolenaar 293269f40be6SBram Moolenaar " Deleting the stack from a quickfix window should update/clear the 293369f40be6SBram Moolenaar " quickfix/location list window. 293469f40be6SBram Moolenaar Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15'] 293569f40be6SBram Moolenaar Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25'] 293669f40be6SBram Moolenaar Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35'] 293769f40be6SBram Moolenaar Xolder 293869f40be6SBram Moolenaar Xwindow 293969f40be6SBram Moolenaar call g:Xsetlist([], 'f') 294069f40be6SBram Moolenaar call assert_equal(2, winnr('$')) 294169f40be6SBram Moolenaar call assert_equal(1, line('$')) 294269f40be6SBram Moolenaar Xclose 294369f40be6SBram Moolenaar 294469f40be6SBram Moolenaar " Deleting the stack from a non-quickfix window should update/clear the 294569f40be6SBram Moolenaar " quickfix/location list window. 294669f40be6SBram Moolenaar Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15'] 294769f40be6SBram Moolenaar Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25'] 294869f40be6SBram Moolenaar Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35'] 294969f40be6SBram Moolenaar Xolder 295069f40be6SBram Moolenaar Xwindow 295169f40be6SBram Moolenaar wincmd p 295269f40be6SBram Moolenaar call g:Xsetlist([], 'f') 295369f40be6SBram Moolenaar call assert_equal(0, len(g:Xgetlist())) 295469f40be6SBram Moolenaar wincmd p 295569f40be6SBram Moolenaar call assert_equal(2, winnr('$')) 295669f40be6SBram Moolenaar call assert_equal(1, line('$')) 295769f40be6SBram Moolenaar 295869f40be6SBram Moolenaar " After deleting the location list stack, if the location list window is 295969f40be6SBram Moolenaar " opened, then a new location list should be created. So opening the 296069f40be6SBram Moolenaar " location list window again should not create a new window. 296169f40be6SBram Moolenaar if a:cchar == 'l' 296269f40be6SBram Moolenaar lexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15'] 296369f40be6SBram Moolenaar wincmd p 296469f40be6SBram Moolenaar lopen 296569f40be6SBram Moolenaar call assert_equal(2, winnr('$')) 296669f40be6SBram Moolenaar endif 296769f40be6SBram Moolenaar Xclose 296869f40be6SBram Moolenaarendfunc 296969f40be6SBram Moolenaar 297074240d3fSBram Moolenaar" Tests for the quickfix free functionality 297169f40be6SBram Moolenaarfunc Test_qf_free() 297269f40be6SBram Moolenaar call XfreeTests('c') 297369f40be6SBram Moolenaar call XfreeTests('l') 297469f40be6SBram Moolenaarendfunc 29756e62da3eSBram Moolenaar 29766e62da3eSBram Moolenaar" Test for buffer overflow when parsing lines and adding new entries to 29776e62da3eSBram Moolenaar" the quickfix list. 29786e62da3eSBram Moolenaarfunc Test_bufoverflow() 29796e62da3eSBram Moolenaar set efm=%f:%l:%m 29806e62da3eSBram Moolenaar cgetexpr ['File1:100:' . repeat('x', 1025)] 29816e62da3eSBram Moolenaar 29826e62da3eSBram Moolenaar set efm=%+GCompiler:\ %.%#,%f:%l:%m 29836e62da3eSBram Moolenaar cgetexpr ['Compiler: ' . repeat('a', 1015), 'File1:10:Hello World'] 29846e62da3eSBram Moolenaar 29856e62da3eSBram Moolenaar set efm=%DEntering\ directory\ %f,%f:%l:%m 29866e62da3eSBram Moolenaar cgetexpr ['Entering directory ' . repeat('a', 1006), 29876e62da3eSBram Moolenaar \ 'File1:10:Hello World'] 29886e62da3eSBram Moolenaar set efm&vim 29896e62da3eSBram Moolenaarendfunc 29906e62da3eSBram Moolenaar 2991875feea6SBram Moolenaar" Tests for getting the quickfix stack size 2992875feea6SBram Moolenaarfunc XsizeTests(cchar) 2993875feea6SBram Moolenaar call s:setup_commands(a:cchar) 2994875feea6SBram Moolenaar 2995875feea6SBram Moolenaar call g:Xsetlist([], 'f') 2996875feea6SBram Moolenaar call assert_equal(0, g:Xgetlist({'nr':'$'}).nr) 2997a6d4849cSBram Moolenaar call assert_equal('', g:Xgetlist({'nr':'$', 'all':1}).title) 2998a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'nr':0}).nr) 2999875feea6SBram Moolenaar 3000875feea6SBram Moolenaar Xexpr "File1:10:Line1" 3001875feea6SBram Moolenaar Xexpr "File2:20:Line2" 3002875feea6SBram Moolenaar Xexpr "File3:30:Line3" 3003875feea6SBram Moolenaar Xolder | Xolder 3004875feea6SBram Moolenaar call assert_equal(3, g:Xgetlist({'nr':'$'}).nr) 3005875feea6SBram Moolenaar call g:Xsetlist([], 'f') 3006875feea6SBram Moolenaar 3007875feea6SBram Moolenaar Xexpr "File1:10:Line1" 3008875feea6SBram Moolenaar Xexpr "File2:20:Line2" 3009875feea6SBram Moolenaar Xexpr "File3:30:Line3" 3010875feea6SBram Moolenaar Xolder | Xolder 3011875feea6SBram Moolenaar call g:Xsetlist([], 'a', {'nr':'$', 'title':'Compiler'}) 3012875feea6SBram Moolenaar call assert_equal('Compiler', g:Xgetlist({'nr':3, 'all':1}).title) 3013875feea6SBram Moolenaarendfunc 3014875feea6SBram Moolenaar 3015875feea6SBram Moolenaarfunc Test_Qf_Size() 3016875feea6SBram Moolenaar call XsizeTests('c') 3017875feea6SBram Moolenaar call XsizeTests('l') 3018875feea6SBram Moolenaarendfunc 30191814183bSBram Moolenaar 30209c4fefffSBram Moolenaarfunc Test_cclose_from_copen() 30219c4fefffSBram Moolenaar augroup QF_Test 30229c4fefffSBram Moolenaar au! 3023e2e4075fSBram Moolenaar au FileType qf :call assert_fails(':cclose', 'E788:') 30249c4fefffSBram Moolenaar augroup END 30259c4fefffSBram Moolenaar copen 30269c4fefffSBram Moolenaar augroup QF_Test 30279c4fefffSBram Moolenaar au! 30289c4fefffSBram Moolenaar augroup END 30299c4fefffSBram Moolenaar augroup! QF_Test 30309c4fefffSBram Moolenaarendfunc 30319c4fefffSBram Moolenaar 30321814183bSBram Moolenaarfunc Test_cclose_in_autocmd() 30331814183bSBram Moolenaar " Problem is only triggered if "starting" is zero, so that the OptionsSet 30341814183bSBram Moolenaar " event will be triggered. 30351814183bSBram Moolenaar call test_override('starting', 1) 30361814183bSBram Moolenaar augroup QF_Test 30371814183bSBram Moolenaar au! 3038e2e4075fSBram Moolenaar au FileType qf :call assert_fails(':cclose', 'E788:') 30391814183bSBram Moolenaar augroup END 30401814183bSBram Moolenaar copen 30411814183bSBram Moolenaar augroup QF_Test 30421814183bSBram Moolenaar au! 30431814183bSBram Moolenaar augroup END 30441814183bSBram Moolenaar augroup! QF_Test 30451814183bSBram Moolenaar call test_override('starting', 0) 30461814183bSBram Moolenaarendfunc 30479c4fefffSBram Moolenaar 3048379fb76bSBram Moolenaar" Check that ":file" without an argument is possible even when "curbuf_lock" 3049379fb76bSBram Moolenaar" is set. 3050379fb76bSBram Moolenaarfunc Test_file_from_copen() 3051379fb76bSBram Moolenaar " Works without argument. 3052379fb76bSBram Moolenaar augroup QF_Test 3053379fb76bSBram Moolenaar au! 3054379fb76bSBram Moolenaar au FileType qf file 3055379fb76bSBram Moolenaar augroup END 3056379fb76bSBram Moolenaar copen 3057379fb76bSBram Moolenaar 3058379fb76bSBram Moolenaar augroup QF_Test 3059379fb76bSBram Moolenaar au! 3060379fb76bSBram Moolenaar augroup END 3061379fb76bSBram Moolenaar cclose 3062379fb76bSBram Moolenaar 3063379fb76bSBram Moolenaar " Fails with argument. 3064379fb76bSBram Moolenaar augroup QF_Test 3065379fb76bSBram Moolenaar au! 3066e2e4075fSBram Moolenaar au FileType qf call assert_fails(':file foo', 'E788:') 3067379fb76bSBram Moolenaar augroup END 3068379fb76bSBram Moolenaar copen 3069379fb76bSBram Moolenaar augroup QF_Test 3070379fb76bSBram Moolenaar au! 3071379fb76bSBram Moolenaar augroup END 3072379fb76bSBram Moolenaar cclose 3073379fb76bSBram Moolenaar 3074379fb76bSBram Moolenaar augroup! QF_Test 30756a0cc916SBram Moolenaarendfunc 3076379fb76bSBram Moolenaar 30779c4fefffSBram Moolenaarfunc Test_resize_from_copen() 30789c4fefffSBram Moolenaar augroup QF_Test 30799c4fefffSBram Moolenaar au! 30809c4fefffSBram Moolenaar au FileType qf resize 5 30819c4fefffSBram Moolenaar augroup END 30829c4fefffSBram Moolenaar try 30839c4fefffSBram Moolenaar " This should succeed without any exception. No other buffers are 30849c4fefffSBram Moolenaar " involved in the autocmd. 30859c4fefffSBram Moolenaar copen 30869c4fefffSBram Moolenaar finally 30879c4fefffSBram Moolenaar augroup QF_Test 30889c4fefffSBram Moolenaar au! 30899c4fefffSBram Moolenaar augroup END 30909c4fefffSBram Moolenaar augroup! QF_Test 30919c4fefffSBram Moolenaar endtry 30929c4fefffSBram Moolenaarendfunc 3093a8788f4dSBram Moolenaar 3094a8788f4dSBram Moolenaar" Tests for the quickfix buffer b:changedtick variable 3095a8788f4dSBram Moolenaarfunc Xchangedtick_tests(cchar) 3096a8788f4dSBram Moolenaar call s:setup_commands(a:cchar) 3097a8788f4dSBram Moolenaar 3098a8788f4dSBram Moolenaar new | only 3099a8788f4dSBram Moolenaar 3100a8788f4dSBram Moolenaar Xexpr "" | Xexpr "" | Xexpr "" 3101a8788f4dSBram Moolenaar 3102a8788f4dSBram Moolenaar Xopen 3103a8788f4dSBram Moolenaar Xolder 3104a8788f4dSBram Moolenaar Xolder 3105a8788f4dSBram Moolenaar Xaddexpr "F1:10:Line10" 3106a8788f4dSBram Moolenaar Xaddexpr "F2:20:Line20" 3107a8788f4dSBram Moolenaar call g:Xsetlist([{"filename":"F3", "lnum":30, "text":"Line30"}], 'a') 3108a8788f4dSBram Moolenaar call g:Xsetlist([], 'f') 3109a8788f4dSBram Moolenaar call assert_equal(8, getbufvar('%', 'changedtick')) 3110a8788f4dSBram Moolenaar Xclose 3111a8788f4dSBram Moolenaarendfunc 3112a8788f4dSBram Moolenaar 3113a8788f4dSBram Moolenaarfunc Test_changedtick() 3114a8788f4dSBram Moolenaar call Xchangedtick_tests('c') 3115a8788f4dSBram Moolenaar call Xchangedtick_tests('l') 3116a8788f4dSBram Moolenaarendfunc 3117d28cc3f5SBram Moolenaar 3118ae338338SBram Moolenaar" Tests for parsing an expression using setqflist() 3119ae338338SBram Moolenaarfunc Xsetexpr_tests(cchar) 3120ae338338SBram Moolenaar call s:setup_commands(a:cchar) 3121ae338338SBram Moolenaar 3122ae338338SBram Moolenaar let t = ["File1:10:Line10", "File1:20:Line20"] 31232c809b7cSBram Moolenaar call g:Xsetlist([], ' ', {'lines' : t}) 31242c809b7cSBram Moolenaar call g:Xsetlist([], 'a', {'lines' : ["File1:30:Line30"]}) 3125ae338338SBram Moolenaar 3126ae338338SBram Moolenaar let l = g:Xgetlist() 3127ae338338SBram Moolenaar call assert_equal(3, len(l)) 3128ae338338SBram Moolenaar call assert_equal(20, l[1].lnum) 3129ae338338SBram Moolenaar call assert_equal('Line30', l[2].text) 31302c809b7cSBram Moolenaar call g:Xsetlist([], 'r', {'lines' : ["File2:5:Line5"]}) 3131ae338338SBram Moolenaar let l = g:Xgetlist() 3132ae338338SBram Moolenaar call assert_equal(1, len(l)) 3133ae338338SBram Moolenaar call assert_equal('Line5', l[0].text) 31342c809b7cSBram Moolenaar call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : 10})) 31352c809b7cSBram Moolenaar call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : "F1:10:L10"})) 3136ae338338SBram Moolenaar 3137ae338338SBram Moolenaar call g:Xsetlist([], 'f') 3138ae338338SBram Moolenaar " Add entries to multiple lists 31392c809b7cSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:10:Line10"]}) 31402c809b7cSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:20:Line20"]}) 31412c809b7cSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:15:Line15"]}) 31422c809b7cSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:25:Line25"]}) 3143ae338338SBram Moolenaar call assert_equal('Line15', g:Xgetlist({'nr':1, 'items':1}).items[1].text) 3144ae338338SBram Moolenaar call assert_equal('Line25', g:Xgetlist({'nr':2, 'items':1}).items[1].text) 314536538225SBram Moolenaar 314636538225SBram Moolenaar " Adding entries using a custom efm 314736538225SBram Moolenaar set efm& 314836538225SBram Moolenaar call g:Xsetlist([], ' ', {'efm' : '%f#%l#%m', 314936538225SBram Moolenaar \ 'lines' : ["F1#10#L10", "F2#20#L20"]}) 315036538225SBram Moolenaar call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum) 315136538225SBram Moolenaar call g:Xsetlist([], 'a', {'efm' : '%f#%l#%m', 'lines' : ["F3:30:L30"]}) 315236538225SBram Moolenaar call assert_equal('F3:30:L30', g:Xgetlist({'items':1}).items[2].text) 315336538225SBram Moolenaar call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum) 315436538225SBram Moolenaar call assert_equal(-1, g:Xsetlist([], 'a', {'efm' : [], 315536538225SBram Moolenaar \ 'lines' : ['F1:10:L10']})) 3156ae338338SBram Moolenaarendfunc 3157ae338338SBram Moolenaar 3158ae338338SBram Moolenaarfunc Test_setexpr() 3159ae338338SBram Moolenaar call Xsetexpr_tests('c') 3160ae338338SBram Moolenaar call Xsetexpr_tests('l') 3161ae338338SBram Moolenaarendfunc 3162ae338338SBram Moolenaar 3163ae338338SBram Moolenaar" Tests for per quickfix/location list directory stack 3164ae338338SBram Moolenaarfunc Xmultidirstack_tests(cchar) 3165ae338338SBram Moolenaar call s:setup_commands(a:cchar) 3166ae338338SBram Moolenaar 3167ae338338SBram Moolenaar call g:Xsetlist([], 'f') 3168ae338338SBram Moolenaar Xexpr "" | Xexpr "" 3169ae338338SBram Moolenaar 31702c809b7cSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["Entering dir 'Xone/a'"]}) 31712c809b7cSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["Entering dir 'Xtwo/a'"]}) 31722c809b7cSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["one.txt:3:one one one"]}) 31732c809b7cSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["two.txt:5:two two two"]}) 3174ae338338SBram Moolenaar 3175ae338338SBram Moolenaar let l1 = g:Xgetlist({'nr':1, 'items':1}) 3176ae338338SBram Moolenaar let l2 = g:Xgetlist({'nr':2, 'items':1}) 3177ae338338SBram Moolenaar call assert_equal('Xone/a/one.txt', bufname(l1.items[1].bufnr)) 3178ae338338SBram Moolenaar call assert_equal(3, l1.items[1].lnum) 3179ae338338SBram Moolenaar call assert_equal('Xtwo/a/two.txt', bufname(l2.items[1].bufnr)) 3180ae338338SBram Moolenaar call assert_equal(5, l2.items[1].lnum) 3181ae338338SBram Moolenaarendfunc 3182ae338338SBram Moolenaar 3183ae338338SBram Moolenaarfunc Test_multidirstack() 3184ae338338SBram Moolenaar call mkdir('Xone/a', 'p') 3185ae338338SBram Moolenaar call mkdir('Xtwo/a', 'p') 3186ae338338SBram Moolenaar let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7'] 3187ae338338SBram Moolenaar call writefile(lines, 'Xone/a/one.txt') 3188ae338338SBram Moolenaar call writefile(lines, 'Xtwo/a/two.txt') 3189ae338338SBram Moolenaar let save_efm = &efm 3190ae338338SBram Moolenaar set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f' 3191ae338338SBram Moolenaar 3192ae338338SBram Moolenaar call Xmultidirstack_tests('c') 3193ae338338SBram Moolenaar call Xmultidirstack_tests('l') 3194ae338338SBram Moolenaar 3195ae338338SBram Moolenaar let &efm = save_efm 3196ae338338SBram Moolenaar call delete('Xone', 'rf') 3197ae338338SBram Moolenaar call delete('Xtwo', 'rf') 3198ae338338SBram Moolenaarendfunc 3199ae338338SBram Moolenaar 3200ae338338SBram Moolenaar" Tests for per quickfix/location list file stack 3201ae338338SBram Moolenaarfunc Xmultifilestack_tests(cchar) 3202ae338338SBram Moolenaar call s:setup_commands(a:cchar) 3203ae338338SBram Moolenaar 3204ae338338SBram Moolenaar call g:Xsetlist([], 'f') 3205ae338338SBram Moolenaar Xexpr "" | Xexpr "" 3206ae338338SBram Moolenaar 32072c809b7cSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["[one.txt]"]}) 32082c809b7cSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["[two.txt]"]}) 32092c809b7cSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["(3,5) one one one"]}) 32102c809b7cSBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["(5,9) two two two"]}) 3211ae338338SBram Moolenaar 3212ae338338SBram Moolenaar let l1 = g:Xgetlist({'nr':1, 'items':1}) 3213ae338338SBram Moolenaar let l2 = g:Xgetlist({'nr':2, 'items':1}) 3214ae338338SBram Moolenaar call assert_equal('one.txt', bufname(l1.items[1].bufnr)) 3215ae338338SBram Moolenaar call assert_equal(3, l1.items[1].lnum) 3216ae338338SBram Moolenaar call assert_equal('two.txt', bufname(l2.items[1].bufnr)) 3217ae338338SBram Moolenaar call assert_equal(5, l2.items[1].lnum) 3218e333e79fSBram Moolenaar 3219e333e79fSBram Moolenaar " Test for start of a new error line in the same line where a previous 3220e333e79fSBram Moolenaar " error line ends with a file stack. 3221e333e79fSBram Moolenaar let efm_val = 'Error\ l%l\ in\ %f,' 3222e333e79fSBram Moolenaar let efm_val .= '%-P%>(%f%r,Error\ l%l\ in\ %m,%-Q)%r' 3223e333e79fSBram Moolenaar let l = g:Xgetlist({'lines' : [ 3224e333e79fSBram Moolenaar \ '(one.txt', 3225e333e79fSBram Moolenaar \ 'Error l4 in one.txt', 3226e333e79fSBram Moolenaar \ ') (two.txt', 3227e333e79fSBram Moolenaar \ 'Error l6 in two.txt', 3228e333e79fSBram Moolenaar \ ')', 3229e333e79fSBram Moolenaar \ 'Error l8 in one.txt' 3230e333e79fSBram Moolenaar \ ], 'efm' : efm_val}) 3231e333e79fSBram Moolenaar call assert_equal(3, len(l.items)) 3232e333e79fSBram Moolenaar call assert_equal('one.txt', bufname(l.items[0].bufnr)) 3233e333e79fSBram Moolenaar call assert_equal(4, l.items[0].lnum) 3234e333e79fSBram Moolenaar call assert_equal('one.txt', l.items[0].text) 3235e333e79fSBram Moolenaar call assert_equal('two.txt', bufname(l.items[1].bufnr)) 3236e333e79fSBram Moolenaar call assert_equal(6, l.items[1].lnum) 3237e333e79fSBram Moolenaar call assert_equal('two.txt', l.items[1].text) 3238e333e79fSBram Moolenaar call assert_equal('one.txt', bufname(l.items[2].bufnr)) 3239e333e79fSBram Moolenaar call assert_equal(8, l.items[2].lnum) 3240e333e79fSBram Moolenaar call assert_equal('', l.items[2].text) 3241ae338338SBram Moolenaarendfunc 3242ae338338SBram Moolenaar 3243ae338338SBram Moolenaarfunc Test_multifilestack() 3244ae338338SBram Moolenaar let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7'] 3245ae338338SBram Moolenaar call writefile(lines, 'one.txt') 3246ae338338SBram Moolenaar call writefile(lines, 'two.txt') 3247ae338338SBram Moolenaar let save_efm = &efm 3248ae338338SBram Moolenaar set efm=%+P[%f],(%l\\,%c)\ %m,%-Q 3249ae338338SBram Moolenaar 3250ae338338SBram Moolenaar call Xmultifilestack_tests('c') 3251ae338338SBram Moolenaar call Xmultifilestack_tests('l') 3252ae338338SBram Moolenaar 3253ae338338SBram Moolenaar let &efm = save_efm 3254ae338338SBram Moolenaar call delete('one.txt') 3255ae338338SBram Moolenaar call delete('two.txt') 3256ae338338SBram Moolenaarendfunc 3257ae338338SBram Moolenaar 3258ae338338SBram Moolenaar" Tests for per buffer 'efm' setting 3259ae338338SBram Moolenaarfunc Test_perbuf_efm() 3260ae338338SBram Moolenaar call writefile(["File1-10-Line10"], 'one.txt') 3261ae338338SBram Moolenaar call writefile(["File2#20#Line20"], 'two.txt') 3262ae338338SBram Moolenaar set efm=%f#%l#%m 3263ae338338SBram Moolenaar new | only 3264ae338338SBram Moolenaar new 3265ae338338SBram Moolenaar setlocal efm=%f-%l-%m 3266ae338338SBram Moolenaar cfile one.txt 3267ae338338SBram Moolenaar wincmd w 3268ae338338SBram Moolenaar caddfile two.txt 3269ae338338SBram Moolenaar 3270ae338338SBram Moolenaar let l = getqflist() 3271ae338338SBram Moolenaar call assert_equal(10, l[0].lnum) 3272ae338338SBram Moolenaar call assert_equal('Line20', l[1].text) 3273ae338338SBram Moolenaar 3274ae338338SBram Moolenaar set efm& 3275ae338338SBram Moolenaar new | only 3276ae338338SBram Moolenaar call delete('one.txt') 3277ae338338SBram Moolenaar call delete('two.txt') 3278ae338338SBram Moolenaarendfunc 3279ae338338SBram Moolenaar 3280d28cc3f5SBram Moolenaar" Open multiple help windows using ":lhelpgrep 3281d28cc3f5SBram Moolenaar" This test used to crash Vim 3282d28cc3f5SBram Moolenaarfunc Test_Multi_LL_Help() 3283d28cc3f5SBram Moolenaar new | only 3284d28cc3f5SBram Moolenaar lhelpgrep window 3285d28cc3f5SBram Moolenaar lopen 3286d28cc3f5SBram Moolenaar e# 3287d28cc3f5SBram Moolenaar lhelpgrep buffer 3288d28cc3f5SBram Moolenaar call assert_equal(3, winnr('$')) 3289d28cc3f5SBram Moolenaar call assert_true(len(getloclist(1)) != 0) 3290d28cc3f5SBram Moolenaar call assert_true(len(getloclist(2)) != 0) 3291d28cc3f5SBram Moolenaar new | only 3292d28cc3f5SBram Moolenaarendfunc 329355b69264SBram Moolenaar 329455b69264SBram Moolenaar" Tests for adding new quickfix lists using setqflist() 329555b69264SBram Moolenaarfunc XaddQf_tests(cchar) 329655b69264SBram Moolenaar call s:setup_commands(a:cchar) 329755b69264SBram Moolenaar 329855b69264SBram Moolenaar " Create a new list using ' ' for action 329955b69264SBram Moolenaar call g:Xsetlist([], 'f') 330055b69264SBram Moolenaar call g:Xsetlist([], ' ', {'title' : 'Test1'}) 330155b69264SBram Moolenaar let l = g:Xgetlist({'nr' : '$', 'all' : 1}) 330255b69264SBram Moolenaar call assert_equal(1, l.nr) 330355b69264SBram Moolenaar call assert_equal('Test1', l.title) 330455b69264SBram Moolenaar 330555b69264SBram Moolenaar " Create a new list using ' ' for action and '$' for 'nr' 330655b69264SBram Moolenaar call g:Xsetlist([], 'f') 330755b69264SBram Moolenaar call g:Xsetlist([], ' ', {'title' : 'Test2', 'nr' : '$'}) 330855b69264SBram Moolenaar let l = g:Xgetlist({'nr' : '$', 'all' : 1}) 330955b69264SBram Moolenaar call assert_equal(1, l.nr) 331055b69264SBram Moolenaar call assert_equal('Test2', l.title) 331155b69264SBram Moolenaar 331255b69264SBram Moolenaar " Create a new list using 'a' for action 331355b69264SBram Moolenaar call g:Xsetlist([], 'f') 331455b69264SBram Moolenaar call g:Xsetlist([], 'a', {'title' : 'Test3'}) 331555b69264SBram Moolenaar let l = g:Xgetlist({'nr' : '$', 'all' : 1}) 331655b69264SBram Moolenaar call assert_equal(1, l.nr) 331755b69264SBram Moolenaar call assert_equal('Test3', l.title) 331855b69264SBram Moolenaar 331955b69264SBram Moolenaar " Create a new list using 'a' for action and '$' for 'nr' 332055b69264SBram Moolenaar call g:Xsetlist([], 'f') 332155b69264SBram Moolenaar call g:Xsetlist([], 'a', {'title' : 'Test3', 'nr' : '$'}) 332255b69264SBram Moolenaar call g:Xsetlist([], 'a', {'title' : 'Test4'}) 332355b69264SBram Moolenaar let l = g:Xgetlist({'nr' : '$', 'all' : 1}) 332455b69264SBram Moolenaar call assert_equal(1, l.nr) 332555b69264SBram Moolenaar call assert_equal('Test4', l.title) 332655b69264SBram Moolenaar 332755b69264SBram Moolenaar " Adding a quickfix list should remove all the lists following the current 332855b69264SBram Moolenaar " list. 332955b69264SBram Moolenaar Xexpr "" | Xexpr "" | Xexpr "" 333055b69264SBram Moolenaar silent! 10Xolder 333155b69264SBram Moolenaar call g:Xsetlist([], ' ', {'title' : 'Test5'}) 333255b69264SBram Moolenaar let l = g:Xgetlist({'nr' : '$', 'all' : 1}) 333355b69264SBram Moolenaar call assert_equal(2, l.nr) 333455b69264SBram Moolenaar call assert_equal('Test5', l.title) 333555b69264SBram Moolenaar 333655b69264SBram Moolenaar " Add a quickfix list using '$' as the list number. 333755b69264SBram Moolenaar let lastqf = g:Xgetlist({'nr':'$'}).nr 333855b69264SBram Moolenaar silent! 99Xolder 333955b69264SBram Moolenaar call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test6'}) 334055b69264SBram Moolenaar let l = g:Xgetlist({'nr' : '$', 'all' : 1}) 334155b69264SBram Moolenaar call assert_equal(lastqf + 1, l.nr) 334255b69264SBram Moolenaar call assert_equal('Test6', l.title) 334355b69264SBram Moolenaar 334455b69264SBram Moolenaar " Add a quickfix list using 'nr' set to one more than the quickfix 334555b69264SBram Moolenaar " list size. 334655b69264SBram Moolenaar let lastqf = g:Xgetlist({'nr':'$'}).nr 334755b69264SBram Moolenaar silent! 99Xolder 334855b69264SBram Moolenaar call g:Xsetlist([], ' ', {'nr' : lastqf + 1, 'title' : 'Test7'}) 334955b69264SBram Moolenaar let l = g:Xgetlist({'nr' : '$', 'all' : 1}) 335055b69264SBram Moolenaar call assert_equal(lastqf + 1, l.nr) 335155b69264SBram Moolenaar call assert_equal('Test7', l.title) 335255b69264SBram Moolenaar 335355b69264SBram Moolenaar " Add a quickfix list to a stack with 10 lists using 'nr' set to '$' 335455b69264SBram Moolenaar exe repeat('Xexpr "" |', 9) . 'Xexpr ""' 335555b69264SBram Moolenaar silent! 99Xolder 335655b69264SBram Moolenaar call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test8'}) 335755b69264SBram Moolenaar let l = g:Xgetlist({'nr' : '$', 'all' : 1}) 335855b69264SBram Moolenaar call assert_equal(10, l.nr) 335955b69264SBram Moolenaar call assert_equal('Test8', l.title) 336055b69264SBram Moolenaar 336155b69264SBram Moolenaar " Add a quickfix list using 'nr' set to a value greater than 10 336255b69264SBram Moolenaar call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 12, 'title' : 'Test9'})) 336355b69264SBram Moolenaar 336455b69264SBram Moolenaar " Try adding a quickfix list with 'nr' set to a value greater than the 336555b69264SBram Moolenaar " quickfix list size but less than 10. 336655b69264SBram Moolenaar call g:Xsetlist([], 'f') 336755b69264SBram Moolenaar Xexpr "" | Xexpr "" | Xexpr "" 336855b69264SBram Moolenaar silent! 99Xolder 336955b69264SBram Moolenaar call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 8, 'title' : 'Test10'})) 337055b69264SBram Moolenaar 337155b69264SBram Moolenaar " Add a quickfix list using 'nr' set to a some string or list 337255b69264SBram Moolenaar call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : [1,2], 'title' : 'Test11'})) 337355b69264SBram Moolenaarendfunc 337455b69264SBram Moolenaar 337555b69264SBram Moolenaarfunc Test_add_qf() 337655b69264SBram Moolenaar call XaddQf_tests('c') 337755b69264SBram Moolenaar call XaddQf_tests('l') 337855b69264SBram Moolenaarendfunc 33797adf06f4SBram Moolenaar 33807adf06f4SBram Moolenaar" Test for getting the quickfix list items from some text without modifying 33817adf06f4SBram Moolenaar" the quickfix stack 33822c809b7cSBram Moolenaarfunc XgetListFromLines(cchar) 33837adf06f4SBram Moolenaar call s:setup_commands(a:cchar) 33847adf06f4SBram Moolenaar call g:Xsetlist([], 'f') 33857adf06f4SBram Moolenaar 33862c809b7cSBram Moolenaar let l = g:Xgetlist({'lines' : ["File2:20:Line20", "File2:30:Line30"]}).items 33877adf06f4SBram Moolenaar call assert_equal(2, len(l)) 33887adf06f4SBram Moolenaar call assert_equal(30, l[1].lnum) 33897adf06f4SBram Moolenaar 33902c809b7cSBram Moolenaar call assert_equal({}, g:Xgetlist({'lines' : 10})) 33912c809b7cSBram Moolenaar call assert_equal({}, g:Xgetlist({'lines' : 'File1:10:Line10'})) 33922c809b7cSBram Moolenaar call assert_equal([], g:Xgetlist({'lines' : []}).items) 33932c809b7cSBram Moolenaar call assert_equal([], g:Xgetlist({'lines' : [10, 20]}).items) 33947adf06f4SBram Moolenaar 339536538225SBram Moolenaar " Parse text using a custom efm 339636538225SBram Moolenaar set efm& 339736538225SBram Moolenaar let l = g:Xgetlist({'lines':['File3#30#Line30'], 'efm' : '%f#%l#%m'}).items 339836538225SBram Moolenaar call assert_equal('Line30', l[0].text) 339936538225SBram Moolenaar let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : '%f-%l-%m'}).items 340036538225SBram Moolenaar call assert_equal('File3:30:Line30', l[0].text) 340136538225SBram Moolenaar let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : [1,2]}) 340236538225SBram Moolenaar call assert_equal({}, l) 340336538225SBram Moolenaar call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':'%2'})", 'E376:') 340436538225SBram Moolenaar call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':''})", 'E378:') 340536538225SBram Moolenaar 34067adf06f4SBram Moolenaar " Make sure that the quickfix stack is not modified 34077adf06f4SBram Moolenaar call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr) 34087adf06f4SBram Moolenaarendfunc 34097adf06f4SBram Moolenaar 34102c809b7cSBram Moolenaarfunc Test_get_list_from_lines() 34112c809b7cSBram Moolenaar call XgetListFromLines('c') 34122c809b7cSBram Moolenaar call XgetListFromLines('l') 34137adf06f4SBram Moolenaarendfunc 3414a539f4f1SBram Moolenaar 3415a539f4f1SBram Moolenaar" Tests for the quickfix list id 3416a539f4f1SBram Moolenaarfunc Xqfid_tests(cchar) 3417a539f4f1SBram Moolenaar call s:setup_commands(a:cchar) 3418a539f4f1SBram Moolenaar 3419a539f4f1SBram Moolenaar call g:Xsetlist([], 'f') 3420a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'id':0}).id) 3421a539f4f1SBram Moolenaar Xexpr '' 3422a539f4f1SBram Moolenaar let start_id = g:Xgetlist({'id' : 0}).id 3423a539f4f1SBram Moolenaar Xexpr '' | Xexpr '' 3424a539f4f1SBram Moolenaar Xolder 3425a539f4f1SBram Moolenaar call assert_equal(start_id, g:Xgetlist({'id':0, 'nr':1}).id) 3426a539f4f1SBram Moolenaar call assert_equal(start_id + 1, g:Xgetlist({'id':0, 'nr':0}).id) 3427a539f4f1SBram Moolenaar call assert_equal(start_id + 2, g:Xgetlist({'id':0, 'nr':'$'}).id) 3428a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'id':0, 'nr':99}).id) 3429a539f4f1SBram Moolenaar call assert_equal(2, g:Xgetlist({'id':start_id + 1, 'nr':0}).nr) 3430a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'id':99, 'nr':0}).id) 3431a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'id':"abc", 'nr':0}).id) 3432a539f4f1SBram Moolenaar 3433a539f4f1SBram Moolenaar call g:Xsetlist([], 'a', {'id':start_id, 'context':[1,2]}) 3434a539f4f1SBram Moolenaar call assert_equal([1,2], g:Xgetlist({'nr':1, 'context':1}).context) 34352c809b7cSBram Moolenaar call g:Xsetlist([], 'a', {'id':start_id+1, 'lines':['F1:10:L10']}) 3436a539f4f1SBram Moolenaar call assert_equal('L10', g:Xgetlist({'nr':2, 'items':1}).items[0].text) 3437a539f4f1SBram Moolenaar call assert_equal(-1, g:Xsetlist([], 'a', {'id':999, 'title':'Vim'})) 3438a539f4f1SBram Moolenaar call assert_equal(-1, g:Xsetlist([], 'a', {'id':'abc', 'title':'Vim'})) 3439a539f4f1SBram Moolenaar 3440a539f4f1SBram Moolenaar let qfid = g:Xgetlist({'id':0, 'nr':0}) 3441a539f4f1SBram Moolenaar call g:Xsetlist([], 'f') 3442a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'id':qfid, 'nr':0}).id) 3443a539f4f1SBram Moolenaarendfunc 3444a539f4f1SBram Moolenaar 3445a539f4f1SBram Moolenaarfunc Test_qf_id() 3446a539f4f1SBram Moolenaar call Xqfid_tests('c') 3447a539f4f1SBram Moolenaar call Xqfid_tests('l') 3448a539f4f1SBram Moolenaarendfunc 344974240d3fSBram Moolenaar 345074240d3fSBram Moolenaarfunc Xqfjump_tests(cchar) 345174240d3fSBram Moolenaar call s:setup_commands(a:cchar) 345274240d3fSBram Moolenaar 345374240d3fSBram Moolenaar call writefile(["Line1\tFoo", "Line2"], 'F1') 345474240d3fSBram Moolenaar call writefile(["Line1\tBar", "Line2"], 'F2') 345574240d3fSBram Moolenaar call writefile(["Line1\tBaz", "Line2"], 'F3') 345674240d3fSBram Moolenaar 345774240d3fSBram Moolenaar call g:Xsetlist([], 'f') 345874240d3fSBram Moolenaar 345974240d3fSBram Moolenaar " Tests for 346074240d3fSBram Moolenaar " Jumping to a line using a pattern 346174240d3fSBram Moolenaar " Jumping to a column greater than the last column in a line 346274240d3fSBram Moolenaar " Jumping to a line greater than the last line in the file 346374240d3fSBram Moolenaar let l = [] 346474240d3fSBram Moolenaar for i in range(1, 7) 346574240d3fSBram Moolenaar call add(l, {}) 346674240d3fSBram Moolenaar endfor 346774240d3fSBram Moolenaar let l[0].filename='F1' 346874240d3fSBram Moolenaar let l[0].pattern='Line1' 346974240d3fSBram Moolenaar let l[1].filename='F2' 347074240d3fSBram Moolenaar let l[1].pattern='Line1' 347174240d3fSBram Moolenaar let l[2].filename='F3' 347274240d3fSBram Moolenaar let l[2].pattern='Line1' 347374240d3fSBram Moolenaar let l[3].filename='F3' 347474240d3fSBram Moolenaar let l[3].lnum=1 347574240d3fSBram Moolenaar let l[3].col=9 347674240d3fSBram Moolenaar let l[3].vcol=1 347774240d3fSBram Moolenaar let l[4].filename='F3' 347874240d3fSBram Moolenaar let l[4].lnum=99 347974240d3fSBram Moolenaar let l[5].filename='F3' 348074240d3fSBram Moolenaar let l[5].lnum=1 348174240d3fSBram Moolenaar let l[5].col=99 348274240d3fSBram Moolenaar let l[5].vcol=1 348374240d3fSBram Moolenaar let l[6].filename='F3' 348474240d3fSBram Moolenaar let l[6].pattern='abcxyz' 348574240d3fSBram Moolenaar 348674240d3fSBram Moolenaar call g:Xsetlist([], ' ', {'items' : l}) 348774240d3fSBram Moolenaar Xopen | only 348874240d3fSBram Moolenaar 2Xnext 348974240d3fSBram Moolenaar call assert_equal(3, g:Xgetlist({'idx' : 0}).idx) 3490bdd2c290SBram Moolenaar call assert_equal('F3', @%) 349174240d3fSBram Moolenaar Xnext 349274240d3fSBram Moolenaar call assert_equal(7, col('.')) 349374240d3fSBram Moolenaar Xnext 349474240d3fSBram Moolenaar call assert_equal(2, line('.')) 349574240d3fSBram Moolenaar Xnext 349674240d3fSBram Moolenaar call assert_equal(9, col('.')) 349774240d3fSBram Moolenaar 2 349874240d3fSBram Moolenaar Xnext 349974240d3fSBram Moolenaar call assert_equal(2, line('.')) 350074240d3fSBram Moolenaar 350174240d3fSBram Moolenaar if a:cchar == 'l' 350274240d3fSBram Moolenaar " When jumping to a location list entry in the location list window and 350374240d3fSBram Moolenaar " no usable windows are available, then a new window should be opened. 350474240d3fSBram Moolenaar enew! | new | only 350574240d3fSBram Moolenaar call g:Xsetlist([], 'f') 350674240d3fSBram Moolenaar setlocal buftype=nofile 350774240d3fSBram Moolenaar new 350874240d3fSBram Moolenaar call g:Xsetlist([], ' ', {'lines' : ['F1:1:1:Line1', 'F1:2:2:Line2', 'F2:1:1:Line1', 'F2:2:2:Line2', 'F3:1:1:Line1', 'F3:2:2:Line2']}) 350974240d3fSBram Moolenaar Xopen 351074240d3fSBram Moolenaar let winid = win_getid() 351174240d3fSBram Moolenaar wincmd p 351274240d3fSBram Moolenaar close 351374240d3fSBram Moolenaar call win_gotoid(winid) 351474240d3fSBram Moolenaar Xnext 351574240d3fSBram Moolenaar call assert_equal(3, winnr('$')) 351674240d3fSBram Moolenaar call assert_equal(1, winnr()) 351774240d3fSBram Moolenaar call assert_equal(2, line('.')) 351874240d3fSBram Moolenaar 351974240d3fSBram Moolenaar " When jumping to an entry in the location list window and the window 352074240d3fSBram Moolenaar " associated with the location list is not present and a window containing 352174240d3fSBram Moolenaar " the file is already present, then that window should be used. 352274240d3fSBram Moolenaar close 352374240d3fSBram Moolenaar belowright new 352474240d3fSBram Moolenaar call g:Xsetlist([], 'f') 352574240d3fSBram Moolenaar edit F3 352674240d3fSBram Moolenaar call win_gotoid(winid) 352774240d3fSBram Moolenaar Xlast 352874240d3fSBram Moolenaar call assert_equal(3, winnr()) 352974240d3fSBram Moolenaar call assert_equal(6, g:Xgetlist({'size' : 1}).size) 353074240d3fSBram Moolenaar call assert_equal(winid, g:Xgetlist({'winid' : 1}).winid) 353174240d3fSBram Moolenaar endif 353274240d3fSBram Moolenaar 353374240d3fSBram Moolenaar " Cleanup 353474240d3fSBram Moolenaar enew! 353574240d3fSBram Moolenaar new | only 353674240d3fSBram Moolenaar 353774240d3fSBram Moolenaar call delete('F1') 353874240d3fSBram Moolenaar call delete('F2') 353974240d3fSBram Moolenaar call delete('F3') 354074240d3fSBram Moolenaarendfunc 354174240d3fSBram Moolenaar 354274240d3fSBram Moolenaarfunc Test_qfjump() 354374240d3fSBram Moolenaar call Xqfjump_tests('c') 354474240d3fSBram Moolenaar call Xqfjump_tests('l') 354574240d3fSBram Moolenaarendfunc 3546a6d4849cSBram Moolenaar 3547a6d4849cSBram Moolenaar" Tests for the getqflist() and getloclist() functions when the list is not 3548a6d4849cSBram Moolenaar" present or is empty 3549a6d4849cSBram Moolenaarfunc Xgetlist_empty_tests(cchar) 3550a6d4849cSBram Moolenaar call s:setup_commands(a:cchar) 3551a6d4849cSBram Moolenaar 3552a6d4849cSBram Moolenaar " Empty quickfix stack 3553a6d4849cSBram Moolenaar call g:Xsetlist([], 'f') 3554a6d4849cSBram Moolenaar call assert_equal('', g:Xgetlist({'context' : 0}).context) 3555a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'id' : 0}).id) 3556a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'idx' : 0}).idx) 3557a6d4849cSBram Moolenaar call assert_equal([], g:Xgetlist({'items' : 0}).items) 3558a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'nr' : 0}).nr) 3559a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'size' : 0}).size) 3560a6d4849cSBram Moolenaar call assert_equal('', g:Xgetlist({'title' : 0}).title) 3561a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'winid' : 0}).winid) 3562b254af31SBram Moolenaar call assert_equal(0, g:Xgetlist({'changedtick' : 0}).changedtick) 3563c9cc9c78SBram Moolenaar if a:cchar == 'c' 3564c9cc9c78SBram Moolenaar call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 3565647e24baSBram Moolenaar \ 'items' : [], 'nr' : 0, 'size' : 0, 'qfbufnr' : 0, 3566d43906d2SBram Moolenaar \ 'title' : '', 'winid' : 0, 'changedtick': 0, 3567d43906d2SBram Moolenaar \ 'quickfixtextfunc' : ''}, g:Xgetlist({'all' : 0})) 3568c9cc9c78SBram Moolenaar else 3569c9cc9c78SBram Moolenaar call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 3570c9cc9c78SBram Moolenaar \ 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '', 3571647e24baSBram Moolenaar \ 'winid' : 0, 'changedtick': 0, 'filewinid' : 0, 3572d43906d2SBram Moolenaar \ 'qfbufnr' : 0, 'quickfixtextfunc' : ''}, 3573c9cc9c78SBram Moolenaar \ g:Xgetlist({'all' : 0})) 3574c9cc9c78SBram Moolenaar endif 3575a6d4849cSBram Moolenaar 35762ec364e9SBram Moolenaar " Quickfix window with empty stack 35772ec364e9SBram Moolenaar silent! Xopen 35782ec364e9SBram Moolenaar let qfwinid = (a:cchar == 'c') ? win_getid() : 0 3579647e24baSBram Moolenaar let qfbufnr = (a:cchar == 'c') ? bufnr('') : 0 35802ec364e9SBram Moolenaar call assert_equal(qfwinid, g:Xgetlist({'winid' : 0}).winid) 35812ec364e9SBram Moolenaar Xclose 35822ec364e9SBram Moolenaar 3583a6d4849cSBram Moolenaar " Empty quickfix list 3584a6d4849cSBram Moolenaar Xexpr "" 3585a6d4849cSBram Moolenaar call assert_equal('', g:Xgetlist({'context' : 0}).context) 3586a6d4849cSBram Moolenaar call assert_notequal(0, g:Xgetlist({'id' : 0}).id) 3587a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'idx' : 0}).idx) 3588a6d4849cSBram Moolenaar call assert_equal([], g:Xgetlist({'items' : 0}).items) 3589a6d4849cSBram Moolenaar call assert_notequal(0, g:Xgetlist({'nr' : 0}).nr) 3590a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'size' : 0}).size) 3591a6d4849cSBram Moolenaar call assert_notequal('', g:Xgetlist({'title' : 0}).title) 3592a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'winid' : 0}).winid) 3593b254af31SBram Moolenaar call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick) 3594a6d4849cSBram Moolenaar 3595a6d4849cSBram Moolenaar let qfid = g:Xgetlist({'id' : 0}).id 3596a6d4849cSBram Moolenaar call g:Xsetlist([], 'f') 3597a6d4849cSBram Moolenaar 3598a6d4849cSBram Moolenaar " Non-existing quickfix identifier 3599a6d4849cSBram Moolenaar call assert_equal('', g:Xgetlist({'id' : qfid, 'context' : 0}).context) 3600a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'id' : qfid}).id) 3601a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'id' : qfid, 'idx' : 0}).idx) 3602a6d4849cSBram Moolenaar call assert_equal([], g:Xgetlist({'id' : qfid, 'items' : 0}).items) 3603a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'id' : qfid, 'nr' : 0}).nr) 3604a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'id' : qfid, 'size' : 0}).size) 3605a6d4849cSBram Moolenaar call assert_equal('', g:Xgetlist({'id' : qfid, 'title' : 0}).title) 3606a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'id' : qfid, 'winid' : 0}).winid) 3607b254af31SBram Moolenaar call assert_equal(0, g:Xgetlist({'id' : qfid, 'changedtick' : 0}).changedtick) 3608c9cc9c78SBram Moolenaar if a:cchar == 'c' 3609c9cc9c78SBram Moolenaar call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [], 3610c9cc9c78SBram Moolenaar \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0, 3611d43906d2SBram Moolenaar \ 'qfbufnr' : qfbufnr, 'quickfixtextfunc' : '', 3612c9cc9c78SBram Moolenaar \ 'changedtick' : 0}, g:Xgetlist({'id' : qfid, 'all' : 0})) 3613c9cc9c78SBram Moolenaar else 3614c9cc9c78SBram Moolenaar call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [], 3615c9cc9c78SBram Moolenaar \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0, 3616d43906d2SBram Moolenaar \ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0, 3617d43906d2SBram Moolenaar \ 'quickfixtextfunc' : ''}, 3618c9cc9c78SBram Moolenaar \ g:Xgetlist({'id' : qfid, 'all' : 0})) 3619c9cc9c78SBram Moolenaar endif 3620a6d4849cSBram Moolenaar 3621a6d4849cSBram Moolenaar " Non-existing quickfix list number 3622a6d4849cSBram Moolenaar call assert_equal('', g:Xgetlist({'nr' : 5, 'context' : 0}).context) 3623a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'nr' : 5}).nr) 3624a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'nr' : 5, 'idx' : 0}).idx) 3625a6d4849cSBram Moolenaar call assert_equal([], g:Xgetlist({'nr' : 5, 'items' : 0}).items) 3626a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'nr' : 5, 'id' : 0}).id) 3627a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'nr' : 5, 'size' : 0}).size) 3628a6d4849cSBram Moolenaar call assert_equal('', g:Xgetlist({'nr' : 5, 'title' : 0}).title) 3629a6d4849cSBram Moolenaar call assert_equal(0, g:Xgetlist({'nr' : 5, 'winid' : 0}).winid) 3630b254af31SBram Moolenaar call assert_equal(0, g:Xgetlist({'nr' : 5, 'changedtick' : 0}).changedtick) 3631c9cc9c78SBram Moolenaar if a:cchar == 'c' 3632c9cc9c78SBram Moolenaar call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [], 3633c9cc9c78SBram Moolenaar \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0, 3634d43906d2SBram Moolenaar \ 'changedtick' : 0, 'qfbufnr' : qfbufnr, 3635d43906d2SBram Moolenaar \ 'quickfixtextfunc' : ''}, g:Xgetlist({'nr' : 5, 'all' : 0})) 3636c9cc9c78SBram Moolenaar else 3637c9cc9c78SBram Moolenaar call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [], 3638c9cc9c78SBram Moolenaar \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0, 3639d43906d2SBram Moolenaar \ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0, 3640d43906d2SBram Moolenaar \ 'quickfixtextfunc' : ''}, g:Xgetlist({'nr' : 5, 'all' : 0})) 3641c9cc9c78SBram Moolenaar endif 3642a6d4849cSBram Moolenaarendfunc 3643a6d4849cSBram Moolenaar 3644a6d4849cSBram Moolenaarfunc Test_getqflist() 3645a6d4849cSBram Moolenaar call Xgetlist_empty_tests('c') 3646a6d4849cSBram Moolenaar call Xgetlist_empty_tests('l') 3647a6d4849cSBram Moolenaarendfunc 3648b254af31SBram Moolenaar 3649a0ca7d00SBram Moolenaarfunc Test_getqflist_invalid_nr() 3650a0ca7d00SBram Moolenaar " The following commands used to crash Vim 3651a0ca7d00SBram Moolenaar cexpr "" 3652a0ca7d00SBram Moolenaar call getqflist({'nr' : $XXX_DOES_NOT_EXIST_XXX}) 3653a0ca7d00SBram Moolenaar 3654a0ca7d00SBram Moolenaar " Cleanup 3655a0ca7d00SBram Moolenaar call setqflist([], 'r') 3656a0ca7d00SBram Moolenaarendfunc 3657a0ca7d00SBram Moolenaar 3658b254af31SBram Moolenaar" Tests for the quickfix/location list changedtick 3659b254af31SBram Moolenaarfunc Xqftick_tests(cchar) 3660b254af31SBram Moolenaar call s:setup_commands(a:cchar) 3661b254af31SBram Moolenaar 3662b254af31SBram Moolenaar call g:Xsetlist([], 'f') 3663b254af31SBram Moolenaar 3664b254af31SBram Moolenaar Xexpr "F1:10:Line10" 3665b254af31SBram Moolenaar let qfid = g:Xgetlist({'id' : 0}).id 3666b254af31SBram Moolenaar call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick) 3667b254af31SBram Moolenaar Xaddexpr "F2:20:Line20\nF2:21:Line21" 3668b254af31SBram Moolenaar call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick) 3669b254af31SBram Moolenaar call g:Xsetlist([], 'a', {'lines' : ["F3:30:Line30", "F3:31:Line31"]}) 3670b254af31SBram Moolenaar call assert_equal(3, g:Xgetlist({'changedtick' : 0}).changedtick) 3671b254af31SBram Moolenaar call g:Xsetlist([], 'r', {'lines' : ["F4:40:Line40"]}) 3672b254af31SBram Moolenaar call assert_equal(4, g:Xgetlist({'changedtick' : 0}).changedtick) 3673b254af31SBram Moolenaar call g:Xsetlist([], 'a', {'title' : 'New Title'}) 3674b254af31SBram Moolenaar call assert_equal(5, g:Xgetlist({'changedtick' : 0}).changedtick) 3675b254af31SBram Moolenaar 3676b254af31SBram Moolenaar enew! 3677b254af31SBram Moolenaar call append(0, ["F5:50:L50", "F6:60:L60"]) 3678b254af31SBram Moolenaar Xaddbuffer 3679b254af31SBram Moolenaar call assert_equal(6, g:Xgetlist({'changedtick' : 0}).changedtick) 3680b254af31SBram Moolenaar enew! 3681b254af31SBram Moolenaar 3682b254af31SBram Moolenaar call g:Xsetlist([], 'a', {'context' : {'bus' : 'pci'}}) 3683b254af31SBram Moolenaar call assert_equal(7, g:Xgetlist({'changedtick' : 0}).changedtick) 3684b254af31SBram Moolenaar call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'}, 3685b254af31SBram Moolenaar \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'a') 3686b254af31SBram Moolenaar call assert_equal(8, g:Xgetlist({'changedtick' : 0}).changedtick) 3687b254af31SBram Moolenaar call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'}, 3688b254af31SBram Moolenaar \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], ' ') 3689b254af31SBram Moolenaar call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick) 3690b254af31SBram Moolenaar call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'}, 3691b254af31SBram Moolenaar \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'r') 3692b254af31SBram Moolenaar call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick) 3693b254af31SBram Moolenaar 3694b254af31SBram Moolenaar call writefile(["F8:80:L80", "F8:81:L81"], "Xone") 3695b254af31SBram Moolenaar Xfile Xone 3696b254af31SBram Moolenaar call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick) 3697b254af31SBram Moolenaar Xaddfile Xone 3698b254af31SBram Moolenaar call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick) 3699b254af31SBram Moolenaar 3700b254af31SBram Moolenaar " Test case for updating a non-current quickfix list 3701b254af31SBram Moolenaar call g:Xsetlist([], 'f') 3702b254af31SBram Moolenaar Xexpr "F1:1:L1" 3703b254af31SBram Moolenaar Xexpr "F2:2:L2" 3704b254af31SBram Moolenaar call g:Xsetlist([], 'a', {'nr' : 1, "lines" : ["F10:10:L10"]}) 3705b254af31SBram Moolenaar call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick) 3706b254af31SBram Moolenaar call assert_equal(2, g:Xgetlist({'nr' : 1, 'changedtick' : 0}).changedtick) 3707b254af31SBram Moolenaar 3708b254af31SBram Moolenaar call delete("Xone") 3709b254af31SBram Moolenaarendfunc 3710b254af31SBram Moolenaar 3711b254af31SBram Moolenaarfunc Test_qf_tick() 3712b254af31SBram Moolenaar call Xqftick_tests('c') 3713b254af31SBram Moolenaar call Xqftick_tests('l') 3714b254af31SBram Moolenaarendfunc 371512237448SBram Moolenaar 3716c631f2dfSBram Moolenaar" Test helpgrep with lang specifier 3717c631f2dfSBram Moolenaarfunc Xtest_helpgrep_with_lang_specifier(cchar) 3718c631f2dfSBram Moolenaar call s:setup_commands(a:cchar) 3719c631f2dfSBram Moolenaar Xhelpgrep Vim@en 3720c631f2dfSBram Moolenaar call assert_equal('help', &filetype) 3721c631f2dfSBram Moolenaar call assert_notequal(0, g:Xgetlist({'nr' : '$'}).nr) 3722c631f2dfSBram Moolenaar new | only 3723c631f2dfSBram Moolenaarendfunc 3724c631f2dfSBram Moolenaar 3725c631f2dfSBram Moolenaarfunc Test_helpgrep_with_lang_specifier() 3726c631f2dfSBram Moolenaar call Xtest_helpgrep_with_lang_specifier('c') 3727c631f2dfSBram Moolenaar call Xtest_helpgrep_with_lang_specifier('l') 3728c631f2dfSBram Moolenaarendfunc 3729c631f2dfSBram Moolenaar 373012237448SBram Moolenaar" The following test used to crash Vim. 373112237448SBram Moolenaar" Open the location list window and close the regular window associated with 373212237448SBram Moolenaar" the location list. When the garbage collection runs now, it incorrectly 373312237448SBram Moolenaar" marks the location list context as not in use and frees the context. 373412237448SBram Moolenaarfunc Test_ll_window_ctx() 373512237448SBram Moolenaar call setloclist(0, [], 'f') 373612237448SBram Moolenaar call setloclist(0, [], 'a', {'context' : []}) 373712237448SBram Moolenaar lopen | only 373812237448SBram Moolenaar call test_garbagecollect_now() 373912237448SBram Moolenaar echo getloclist(0, {'context' : 1}).context 374012237448SBram Moolenaar enew | only 374112237448SBram Moolenaarendfunc 374212237448SBram Moolenaar 374314a4deb0SBram Moolenaar" The following test used to crash vim 374414a4deb0SBram Moolenaarfunc Test_lfile_crash() 374514a4deb0SBram Moolenaar sp Xtest 374614a4deb0SBram Moolenaar au QuickFixCmdPre * bw 3747e2e4075fSBram Moolenaar call assert_fails('lfile', 'E40:') 374814a4deb0SBram Moolenaar au! QuickFixCmdPre 374914a4deb0SBram Moolenaarendfunc 37503c097226SBram Moolenaar 37513c097226SBram Moolenaar" The following test used to crash vim 37523c097226SBram Moolenaarfunc Test_lbuffer_crash() 37533c097226SBram Moolenaar sv Xtest 37543c097226SBram Moolenaar augroup QF_Test 37553c097226SBram Moolenaar au! 37563c097226SBram Moolenaar au * * bw 37573c097226SBram Moolenaar augroup END 37583c097226SBram Moolenaar lbuffer 37593c097226SBram Moolenaar augroup QF_Test 37603c097226SBram Moolenaar au! 37613c097226SBram Moolenaar augroup END 37623c097226SBram Moolenaarendfunc 37633c097226SBram Moolenaar 37643c097226SBram Moolenaar" The following test used to crash vim 37653c097226SBram Moolenaarfunc Test_lexpr_crash() 37663c097226SBram Moolenaar augroup QF_Test 37673c097226SBram Moolenaar au! 37683c097226SBram Moolenaar au * * call setloclist(0, [], 'f') 37693c097226SBram Moolenaar augroup END 37703c097226SBram Moolenaar lexpr "" 37713c097226SBram Moolenaar augroup QF_Test 37723c097226SBram Moolenaar au! 37733c097226SBram Moolenaar augroup END 37749f84ded3SBram Moolenaar 37753c097226SBram Moolenaar enew | only 37769f84ded3SBram Moolenaar augroup QF_Test 37779f84ded3SBram Moolenaar au! 37789f84ded3SBram Moolenaar au BufNew * call setloclist(0, [], 'f') 37799f84ded3SBram Moolenaar augroup END 37809f84ded3SBram Moolenaar lexpr 'x:1:x' 37819f84ded3SBram Moolenaar augroup QF_Test 37829f84ded3SBram Moolenaar au! 37839f84ded3SBram Moolenaar augroup END 37849f84ded3SBram Moolenaar 37859f84ded3SBram Moolenaar enew | only 37869f84ded3SBram Moolenaar lexpr '' 37879f84ded3SBram Moolenaar lopen 37889f84ded3SBram Moolenaar augroup QF_Test 37899f84ded3SBram Moolenaar au! 37909f84ded3SBram Moolenaar au FileType * call setloclist(0, [], 'f') 37919f84ded3SBram Moolenaar augroup END 37929f84ded3SBram Moolenaar lexpr '' 37939f84ded3SBram Moolenaar augroup QF_Test 37949f84ded3SBram Moolenaar au! 37959f84ded3SBram Moolenaar augroup END 37963c097226SBram Moolenaarendfunc 37973c097226SBram Moolenaar 37983c097226SBram Moolenaar" The following test used to crash Vim 37993c097226SBram Moolenaarfunc Test_lvimgrep_crash() 38003c097226SBram Moolenaar sv Xtest 38013c097226SBram Moolenaar augroup QF_Test 38023c097226SBram Moolenaar au! 38033c097226SBram Moolenaar au * * call setloclist(0, [], 'f') 38043c097226SBram Moolenaar augroup END 38053c097226SBram Moolenaar lvimgrep quickfix test_quickfix.vim 38063c097226SBram Moolenaar augroup QF_Test 38073c097226SBram Moolenaar au! 38083c097226SBram Moolenaar augroup END 3809b6f1480aSBram Moolenaar 3810b6f1480aSBram Moolenaar new | only 3811b6f1480aSBram Moolenaar augroup QF_Test 3812b6f1480aSBram Moolenaar au! 3813b6f1480aSBram Moolenaar au BufEnter * call setloclist(0, [], 'r') 3814b6f1480aSBram Moolenaar augroup END 3815b6f1480aSBram Moolenaar call assert_fails('lvimgrep Test_lvimgrep_crash *', 'E926:') 3816b6f1480aSBram Moolenaar augroup QF_Test 3817b6f1480aSBram Moolenaar au! 3818b6f1480aSBram Moolenaar augroup END 3819b6f1480aSBram Moolenaar 38203c097226SBram Moolenaar enew | only 38213c097226SBram Moolenaarendfunc 3822de04654dSBram Moolenaar 38232573af35SBram Moolenaarfunc Test_lvimgrep_crash2() 38242573af35SBram Moolenaar au BufNewFile x sfind 38259b7bf9e9SBram Moolenaar call assert_fails('lvimgrep x x', 'E471:') 38269b7bf9e9SBram Moolenaar call assert_fails('lvimgrep x x x', 'E471:') 38272573af35SBram Moolenaar 38282573af35SBram Moolenaar au! BufNewFile 38292573af35SBram Moolenaarendfunc 38302573af35SBram Moolenaar 3831de04654dSBram Moolenaar" Test for the position of the quickfix and location list window 3832de04654dSBram Moolenaarfunc Test_qfwin_pos() 3833de04654dSBram Moolenaar " Open two windows 3834de04654dSBram Moolenaar new | only 3835de04654dSBram Moolenaar new 3836de04654dSBram Moolenaar cexpr ['F1:10:L10'] 3837de04654dSBram Moolenaar copen 3838de04654dSBram Moolenaar " Quickfix window should be the bottom most window 3839de04654dSBram Moolenaar call assert_equal(3, winnr()) 3840de04654dSBram Moolenaar close 3841de04654dSBram Moolenaar " Open at the very top 3842de04654dSBram Moolenaar wincmd t 3843de04654dSBram Moolenaar topleft copen 3844de04654dSBram Moolenaar call assert_equal(1, winnr()) 3845de04654dSBram Moolenaar close 3846de04654dSBram Moolenaar " open left of the current window 3847de04654dSBram Moolenaar wincmd t 3848de04654dSBram Moolenaar below new 3849de04654dSBram Moolenaar leftabove copen 3850de04654dSBram Moolenaar call assert_equal(2, winnr()) 3851de04654dSBram Moolenaar close 3852de04654dSBram Moolenaar " open right of the current window 3853de04654dSBram Moolenaar rightbelow copen 3854de04654dSBram Moolenaar call assert_equal(3, winnr()) 3855de04654dSBram Moolenaar close 3856de04654dSBram Moolenaarendfunc 3857e1bb879fSBram Moolenaar 3858e1bb879fSBram Moolenaar" Tests for quickfix/location lists changed by autocommands when 3859e1bb879fSBram Moolenaar" :vimgrep/:lvimgrep commands are running. 3860e1bb879fSBram Moolenaarfunc Test_vimgrep_autocmd() 3861e1bb879fSBram Moolenaar call setqflist([], 'f') 3862e1bb879fSBram Moolenaar call writefile(['stars'], 'Xtest1.txt') 3863e1bb879fSBram Moolenaar call writefile(['stars'], 'Xtest2.txt') 3864e1bb879fSBram Moolenaar 3865e1bb879fSBram Moolenaar " Test 1: 3866e1bb879fSBram Moolenaar " When searching for a pattern using :vimgrep, if the quickfix list is 3867e1bb879fSBram Moolenaar " changed by an autocmd, the results should be added to the correct quickfix 3868e1bb879fSBram Moolenaar " list. 3869e1bb879fSBram Moolenaar autocmd BufRead Xtest2.txt cexpr '' | cexpr '' 3870e1bb879fSBram Moolenaar silent vimgrep stars Xtest*.txt 3871e1bb879fSBram Moolenaar call assert_equal(1, getqflist({'nr' : 0}).nr) 3872e1bb879fSBram Moolenaar call assert_equal(3, getqflist({'nr' : '$'}).nr) 3873e1bb879fSBram Moolenaar call assert_equal('Xtest2.txt', bufname(getqflist()[1].bufnr)) 3874e1bb879fSBram Moolenaar au! BufRead Xtest2.txt 3875e1bb879fSBram Moolenaar 3876e1bb879fSBram Moolenaar " Test 2: 3877e1bb879fSBram Moolenaar " When searching for a pattern using :vimgrep, if the quickfix list is 3878e1bb879fSBram Moolenaar " freed, then a error should be given. 3879e1bb879fSBram Moolenaar silent! %bwipe! 3880e1bb879fSBram Moolenaar call setqflist([], 'f') 3881e1bb879fSBram Moolenaar autocmd BufRead Xtest2.txt for i in range(10) | cexpr '' | endfor 3882e1bb879fSBram Moolenaar call assert_fails('vimgrep stars Xtest*.txt', 'E925:') 3883e1bb879fSBram Moolenaar au! BufRead Xtest2.txt 3884e1bb879fSBram Moolenaar 3885e1bb879fSBram Moolenaar " Test 3: 3886e1bb879fSBram Moolenaar " When searching for a pattern using :lvimgrep, if the location list is 3887e1bb879fSBram Moolenaar " freed, then the command should error out. 3888e1bb879fSBram Moolenaar silent! %bwipe! 3889e1bb879fSBram Moolenaar let g:save_winid = win_getid() 3890e1bb879fSBram Moolenaar autocmd BufRead Xtest2.txt call setloclist(g:save_winid, [], 'f') 3891e1bb879fSBram Moolenaar call assert_fails('lvimgrep stars Xtest*.txt', 'E926:') 3892e1bb879fSBram Moolenaar au! BufRead Xtest2.txt 3893e1bb879fSBram Moolenaar 3894e1bb879fSBram Moolenaar call delete('Xtest1.txt') 3895e1bb879fSBram Moolenaar call delete('Xtest2.txt') 3896e1bb879fSBram Moolenaar call setqflist([], 'f') 3897e1bb879fSBram Moolenaarendfunc 38983b9474b4SBram Moolenaar 3899f9ae154cSBram Moolenaar" Test for an autocmd changing the current directory when running vimgrep 3900f9ae154cSBram Moolenaarfunc Xvimgrep_autocmd_cd(cchar) 3901f9ae154cSBram Moolenaar call s:setup_commands(a:cchar) 3902f9ae154cSBram Moolenaar 3903f9ae154cSBram Moolenaar %bwipe 3904f9ae154cSBram Moolenaar let save_cwd = getcwd() 3905f9ae154cSBram Moolenaar 3906f9ae154cSBram Moolenaar augroup QF_Test 3907f9ae154cSBram Moolenaar au! 3908f9ae154cSBram Moolenaar autocmd BufRead * silent cd %:p:h 3909f9ae154cSBram Moolenaar augroup END 3910f9ae154cSBram Moolenaar 3911f9ae154cSBram Moolenaar 10Xvimgrep /vim/ Xdir/** 3912f9ae154cSBram Moolenaar let l = g:Xgetlist() 3913f9ae154cSBram Moolenaar call assert_equal('f1.txt', bufname(l[0].bufnr)) 3914f9ae154cSBram Moolenaar call assert_equal('f2.txt', fnamemodify(bufname(l[2].bufnr), ':t')) 3915f9ae154cSBram Moolenaar 3916f9ae154cSBram Moolenaar augroup QF_Test 3917f9ae154cSBram Moolenaar au! 3918f9ae154cSBram Moolenaar augroup END 3919f9ae154cSBram Moolenaar 3920f9ae154cSBram Moolenaar exe 'cd ' . save_cwd 3921f9ae154cSBram Moolenaarendfunc 3922f9ae154cSBram Moolenaar 3923f9ae154cSBram Moolenaarfunc Test_vimgrep_autocmd_cd() 3924f9ae154cSBram Moolenaar call mkdir('Xdir/a', 'p') 3925f9ae154cSBram Moolenaar call mkdir('Xdir/b', 'p') 3926f9ae154cSBram Moolenaar call writefile(['a_L1_vim', 'a_L2_vim'], 'Xdir/a/f1.txt') 3927f9ae154cSBram Moolenaar call writefile(['b_L1_vim', 'b_L2_vim'], 'Xdir/b/f2.txt') 3928f9ae154cSBram Moolenaar call Xvimgrep_autocmd_cd('c') 3929f9ae154cSBram Moolenaar call Xvimgrep_autocmd_cd('l') 3930f9ae154cSBram Moolenaar %bwipe 3931f9ae154cSBram Moolenaar call delete('Xdir', 'rf') 3932f9ae154cSBram Moolenaarendfunc 3933f9ae154cSBram Moolenaar 39343b9474b4SBram Moolenaar" The following test used to crash Vim 39353b9474b4SBram Moolenaarfunc Test_lhelpgrep_autocmd() 39363b9474b4SBram Moolenaar lhelpgrep quickfix 39373b9474b4SBram Moolenaar autocmd QuickFixCmdPost * call setloclist(0, [], 'f') 39383b9474b4SBram Moolenaar lhelpgrep buffer 39393b9474b4SBram Moolenaar call assert_equal('help', &filetype) 39403b9474b4SBram Moolenaar call assert_equal(0, getloclist(0, {'nr' : '$'}).nr) 39413b9474b4SBram Moolenaar lhelpgrep tabpage 39423b9474b4SBram Moolenaar call assert_equal('help', &filetype) 39433b9474b4SBram Moolenaar call assert_equal(1, getloclist(0, {'nr' : '$'}).nr) 39443b9474b4SBram Moolenaar au! QuickFixCmdPost 3945b6f1480aSBram Moolenaar 3946b6f1480aSBram Moolenaar new | only 3947b6f1480aSBram Moolenaar augroup QF_Test 3948b6f1480aSBram Moolenaar au! 3949b6f1480aSBram Moolenaar au BufEnter * call setqflist([], 'f') 3950b6f1480aSBram Moolenaar augroup END 3951b6f1480aSBram Moolenaar call assert_fails('helpgrep quickfix', 'E925:') 3952*dbfa795dSBram Moolenaar " run the test with a help window already open 3953*dbfa795dSBram Moolenaar help 3954*dbfa795dSBram Moolenaar wincmd w 3955*dbfa795dSBram Moolenaar call assert_fails('helpgrep quickfix', 'E925:') 3956b6f1480aSBram Moolenaar augroup QF_Test 3957b6f1480aSBram Moolenaar au! BufEnter 3958b6f1480aSBram Moolenaar augroup END 3959b6f1480aSBram Moolenaar 3960b6f1480aSBram Moolenaar new | only 3961b6f1480aSBram Moolenaar augroup QF_Test 3962b6f1480aSBram Moolenaar au! 3963b6f1480aSBram Moolenaar au BufEnter * call setqflist([], 'r') 3964b6f1480aSBram Moolenaar augroup END 3965b6f1480aSBram Moolenaar call assert_fails('helpgrep quickfix', 'E925:') 3966b6f1480aSBram Moolenaar augroup QF_Test 3967b6f1480aSBram Moolenaar au! BufEnter 3968b6f1480aSBram Moolenaar augroup END 3969b6f1480aSBram Moolenaar 3970b6f1480aSBram Moolenaar new | only 3971b6f1480aSBram Moolenaar augroup QF_Test 3972b6f1480aSBram Moolenaar au! 3973b6f1480aSBram Moolenaar au BufEnter * call setloclist(0, [], 'r') 3974b6f1480aSBram Moolenaar augroup END 3975b6f1480aSBram Moolenaar call assert_fails('lhelpgrep quickfix', 'E926:') 3976b6f1480aSBram Moolenaar augroup QF_Test 3977b6f1480aSBram Moolenaar au! BufEnter 3978b6f1480aSBram Moolenaar augroup END 3979b6f1480aSBram Moolenaar 39803b9474b4SBram Moolenaar new | only 39813b9474b4SBram Moolenaarendfunc 3982a796d46fSBram Moolenaar 3983a796d46fSBram Moolenaar" Test for shortening/simplifying the file name when opening the 3984a796d46fSBram Moolenaar" quickfix window or when displaying the quickfix list 3985a796d46fSBram Moolenaarfunc Test_shorten_fname() 39866d91bcb4SBram Moolenaar CheckUnix 3987a796d46fSBram Moolenaar %bwipe 3988a796d46fSBram Moolenaar " Create a quickfix list with a absolute path filename 3989a796d46fSBram Moolenaar let fname = getcwd() . '/test_quickfix.vim' 3990a796d46fSBram Moolenaar call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'}) 3991a796d46fSBram Moolenaar call assert_equal(fname, bufname('test_quickfix.vim')) 3992a796d46fSBram Moolenaar " Opening the quickfix window should simplify the file path 3993a796d46fSBram Moolenaar cwindow 3994a796d46fSBram Moolenaar call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim')) 3995a796d46fSBram Moolenaar cclose 3996a796d46fSBram Moolenaar %bwipe 3997a796d46fSBram Moolenaar " Create a quickfix list with a absolute path filename 3998a796d46fSBram Moolenaar call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'}) 3999a796d46fSBram Moolenaar call assert_equal(fname, bufname('test_quickfix.vim')) 4000a796d46fSBram Moolenaar " Displaying the quickfix list should simplify the file path 4001a796d46fSBram Moolenaar silent! clist 4002a796d46fSBram Moolenaar call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim')) 40038ec92c97SBram Moolenaar " Add a few entries for the same file with different paths and check whether 40048ec92c97SBram Moolenaar " the buffer name is shortened 40058ec92c97SBram Moolenaar %bwipe 40068ec92c97SBram Moolenaar call setqflist([], 'f') 40078ec92c97SBram Moolenaar call setqflist([{'filename' : 'test_quickfix.vim', 'lnum' : 10}, 40088ec92c97SBram Moolenaar \ {'filename' : '../testdir/test_quickfix.vim', 'lnum' : 20}, 40098ec92c97SBram Moolenaar \ {'filename' : fname, 'lnum' : 30}], ' ') 40108ec92c97SBram Moolenaar copen 40118ec92c97SBram Moolenaar call assert_equal(['test_quickfix.vim|10| ', 40128ec92c97SBram Moolenaar \ 'test_quickfix.vim|20| ', 40138ec92c97SBram Moolenaar \ 'test_quickfix.vim|30| '], getline(1, '$')) 40148ec92c97SBram Moolenaar cclose 4015a796d46fSBram Moolenaarendfunc 40168b62e310SBram Moolenaar 40178b62e310SBram Moolenaar" Quickfix title tests 40188b62e310SBram Moolenaar" In the below tests, 'exe "cmd"' is used to invoke the quickfix commands. 40198b62e310SBram Moolenaar" Otherwise due to indentation, the title is set with spaces at the beginning 40208b62e310SBram Moolenaar" of the command. 40218b62e310SBram Moolenaarfunc Test_qftitle() 40228b62e310SBram Moolenaar call writefile(["F1:1:Line1"], 'Xerr') 40238b62e310SBram Moolenaar 40248b62e310SBram Moolenaar " :cexpr 40258b62e310SBram Moolenaar exe "cexpr readfile('Xerr')" 40268b62e310SBram Moolenaar call assert_equal(":cexpr readfile('Xerr')", getqflist({'title' : 1}).title) 40278b62e310SBram Moolenaar 40288b62e310SBram Moolenaar " :cgetexpr 40298b62e310SBram Moolenaar exe "cgetexpr readfile('Xerr')" 40308b62e310SBram Moolenaar call assert_equal(":cgetexpr readfile('Xerr')", 40318b62e310SBram Moolenaar \ getqflist({'title' : 1}).title) 40328b62e310SBram Moolenaar 40338b62e310SBram Moolenaar " :caddexpr 40348b62e310SBram Moolenaar call setqflist([], 'f') 40358b62e310SBram Moolenaar exe "caddexpr readfile('Xerr')" 40368b62e310SBram Moolenaar call assert_equal(":caddexpr readfile('Xerr')", 40378b62e310SBram Moolenaar \ getqflist({'title' : 1}).title) 40388b62e310SBram Moolenaar 40398b62e310SBram Moolenaar " :cbuffer 40408b62e310SBram Moolenaar new Xerr 40418b62e310SBram Moolenaar exe "cbuffer" 40428b62e310SBram Moolenaar call assert_equal(':cbuffer (Xerr)', getqflist({'title' : 1}).title) 40438b62e310SBram Moolenaar 40448b62e310SBram Moolenaar " :cgetbuffer 40458b62e310SBram Moolenaar edit Xerr 40468b62e310SBram Moolenaar exe "cgetbuffer" 40478b62e310SBram Moolenaar call assert_equal(':cgetbuffer (Xerr)', getqflist({'title' : 1}).title) 40488b62e310SBram Moolenaar 40498b62e310SBram Moolenaar " :caddbuffer 40508b62e310SBram Moolenaar call setqflist([], 'f') 40518b62e310SBram Moolenaar edit Xerr 40528b62e310SBram Moolenaar exe "caddbuffer" 40538b62e310SBram Moolenaar call assert_equal(':caddbuffer (Xerr)', getqflist({'title' : 1}).title) 40548b62e310SBram Moolenaar 40558b62e310SBram Moolenaar " :cfile 40568b62e310SBram Moolenaar exe "cfile Xerr" 40578b62e310SBram Moolenaar call assert_equal(':cfile Xerr', getqflist({'title' : 1}).title) 40588b62e310SBram Moolenaar 40598b62e310SBram Moolenaar " :cgetfile 40608b62e310SBram Moolenaar exe "cgetfile Xerr" 40618b62e310SBram Moolenaar call assert_equal(':cgetfile Xerr', getqflist({'title' : 1}).title) 40628b62e310SBram Moolenaar 40638b62e310SBram Moolenaar " :caddfile 40648b62e310SBram Moolenaar call setqflist([], 'f') 40658b62e310SBram Moolenaar exe "caddfile Xerr" 40668b62e310SBram Moolenaar call assert_equal(':caddfile Xerr', getqflist({'title' : 1}).title) 40678b62e310SBram Moolenaar 40688b62e310SBram Moolenaar " :grep 40698b62e310SBram Moolenaar set grepprg=internal 40708b62e310SBram Moolenaar exe "grep F1 Xerr" 40718b62e310SBram Moolenaar call assert_equal(':grep F1 Xerr', getqflist({'title' : 1}).title) 40728b62e310SBram Moolenaar 40738b62e310SBram Moolenaar " :grepadd 40748b62e310SBram Moolenaar call setqflist([], 'f') 40758b62e310SBram Moolenaar exe "grepadd F1 Xerr" 40768b62e310SBram Moolenaar call assert_equal(':grepadd F1 Xerr', getqflist({'title' : 1}).title) 40778b62e310SBram Moolenaar set grepprg&vim 40788b62e310SBram Moolenaar 40798b62e310SBram Moolenaar " :vimgrep 40808b62e310SBram Moolenaar exe "vimgrep F1 Xerr" 40818b62e310SBram Moolenaar call assert_equal(':vimgrep F1 Xerr', getqflist({'title' : 1}).title) 40828b62e310SBram Moolenaar 40838b62e310SBram Moolenaar " :vimgrepadd 40848b62e310SBram Moolenaar call setqflist([], 'f') 40858b62e310SBram Moolenaar exe "vimgrepadd F1 Xerr" 40868b62e310SBram Moolenaar call assert_equal(':vimgrepadd F1 Xerr', getqflist({'title' : 1}).title) 40878b62e310SBram Moolenaar 40888b62e310SBram Moolenaar call setqflist(['F1:10:L10'], ' ') 40898b62e310SBram Moolenaar call assert_equal(':setqflist()', getqflist({'title' : 1}).title) 40908b62e310SBram Moolenaar 40918b62e310SBram Moolenaar call setqflist([], 'f') 40928b62e310SBram Moolenaar call setqflist(['F1:10:L10'], 'a') 40938b62e310SBram Moolenaar call assert_equal(':setqflist()', getqflist({'title' : 1}).title) 40948b62e310SBram Moolenaar 40958b62e310SBram Moolenaar call setqflist([], 'f') 40968b62e310SBram Moolenaar call setqflist(['F1:10:L10'], 'r') 40978b62e310SBram Moolenaar call assert_equal(':setqflist()', getqflist({'title' : 1}).title) 40988b62e310SBram Moolenaar 40998b62e310SBram Moolenaar close 41008b62e310SBram Moolenaar call delete('Xerr') 41018b62e310SBram Moolenaar 41028b62e310SBram Moolenaar call setqflist([], ' ', {'title' : 'Errors'}) 41038b62e310SBram Moolenaar copen 41048b62e310SBram Moolenaar call assert_equal('Errors', w:quickfix_title) 41058b62e310SBram Moolenaar call setqflist([], 'r', {'items' : [{'filename' : 'a.c', 'lnum' : 10}]}) 41068b62e310SBram Moolenaar call assert_equal('Errors', w:quickfix_title) 41078b62e310SBram Moolenaar cclose 41088b62e310SBram Moolenaarendfunc 4109600323b4SBram Moolenaar 4110600323b4SBram Moolenaarfunc Test_lbuffer_with_bwipe() 4111600323b4SBram Moolenaar new 4112600323b4SBram Moolenaar new 4113600323b4SBram Moolenaar augroup nasty 4114600323b4SBram Moolenaar au * * bwipe 4115600323b4SBram Moolenaar augroup END 4116600323b4SBram Moolenaar lbuffer 4117600323b4SBram Moolenaar augroup nasty 4118600323b4SBram Moolenaar au! 4119600323b4SBram Moolenaar augroup END 4120600323b4SBram Moolenaarendfunc 41210366c016SBram Moolenaar 4122531b9a3aSBram Moolenaar" Test for an autocmd freeing the quickfix/location list when cexpr/lexpr is 4123531b9a3aSBram Moolenaar" running 4124531b9a3aSBram Moolenaarfunc Xexpr_acmd_freelist(cchar) 4125531b9a3aSBram Moolenaar call s:setup_commands(a:cchar) 4126531b9a3aSBram Moolenaar 41270366c016SBram Moolenaar " This was using freed memory. 41280366c016SBram Moolenaar augroup nasty 4129531b9a3aSBram Moolenaar au * * call g:Xsetlist([], 'f') 41300366c016SBram Moolenaar augroup END 4131531b9a3aSBram Moolenaar Xexpr "x" 41320366c016SBram Moolenaar augroup nasty 41330366c016SBram Moolenaar au! 41340366c016SBram Moolenaar augroup END 41350366c016SBram Moolenaarendfunc 4136531b9a3aSBram Moolenaar 4137531b9a3aSBram Moolenaarfunc Test_cexpr_acmd_freelist() 4138531b9a3aSBram Moolenaar call Xexpr_acmd_freelist('c') 4139531b9a3aSBram Moolenaar call Xexpr_acmd_freelist('l') 4140531b9a3aSBram Moolenaarendfunc 4141531b9a3aSBram Moolenaar 4142531b9a3aSBram Moolenaar" Test for commands that create a new quickfix/location list and jump to the 4143531b9a3aSBram Moolenaar" first error automatically. 4144531b9a3aSBram Moolenaarfunc Xjumpto_first_error_test(cchar) 4145531b9a3aSBram Moolenaar call s:setup_commands(a:cchar) 4146531b9a3aSBram Moolenaar 4147531b9a3aSBram Moolenaar call s:create_test_file('Xtestfile1') 4148531b9a3aSBram Moolenaar call s:create_test_file('Xtestfile2') 4149531b9a3aSBram Moolenaar let l = ['Xtestfile1:2:Line2', 'Xtestfile2:4:Line4'] 4150531b9a3aSBram Moolenaar 4151531b9a3aSBram Moolenaar " Test for cexpr/lexpr 4152531b9a3aSBram Moolenaar enew 4153531b9a3aSBram Moolenaar Xexpr l 4154bdd2c290SBram Moolenaar call assert_equal('Xtestfile1', @%) 4155531b9a3aSBram Moolenaar call assert_equal(2, line('.')) 4156531b9a3aSBram Moolenaar 4157531b9a3aSBram Moolenaar " Test for cfile/lfile 4158531b9a3aSBram Moolenaar enew 4159531b9a3aSBram Moolenaar call writefile(l, 'Xerr') 4160531b9a3aSBram Moolenaar Xfile Xerr 4161bdd2c290SBram Moolenaar call assert_equal('Xtestfile1', @%) 4162531b9a3aSBram Moolenaar call assert_equal(2, line('.')) 4163531b9a3aSBram Moolenaar 4164531b9a3aSBram Moolenaar " Test for cbuffer/lbuffer 4165531b9a3aSBram Moolenaar edit Xerr 4166531b9a3aSBram Moolenaar Xbuffer 4167bdd2c290SBram Moolenaar call assert_equal('Xtestfile1', @%) 4168531b9a3aSBram Moolenaar call assert_equal(2, line('.')) 4169531b9a3aSBram Moolenaar 4170531b9a3aSBram Moolenaar call delete('Xerr') 4171531b9a3aSBram Moolenaar call delete('Xtestfile1') 4172531b9a3aSBram Moolenaar call delete('Xtestfile2') 4173531b9a3aSBram Moolenaarendfunc 4174531b9a3aSBram Moolenaar 4175531b9a3aSBram Moolenaarfunc Test_jumpto_first_error() 4176531b9a3aSBram Moolenaar call Xjumpto_first_error_test('c') 4177531b9a3aSBram Moolenaar call Xjumpto_first_error_test('l') 4178531b9a3aSBram Moolenaarendfunc 4179531b9a3aSBram Moolenaar 4180531b9a3aSBram Moolenaar" Test for a quickfix autocmd changing the quickfix/location list before 4181531b9a3aSBram Moolenaar" jumping to the first error in the new list. 4182531b9a3aSBram Moolenaarfunc Xautocmd_changelist(cchar) 4183531b9a3aSBram Moolenaar call s:setup_commands(a:cchar) 4184531b9a3aSBram Moolenaar 4185531b9a3aSBram Moolenaar " Test for cfile/lfile 4186531b9a3aSBram Moolenaar call s:create_test_file('Xtestfile1') 4187531b9a3aSBram Moolenaar call s:create_test_file('Xtestfile2') 4188531b9a3aSBram Moolenaar Xexpr 'Xtestfile1:2:Line2' 4189531b9a3aSBram Moolenaar autocmd QuickFixCmdPost * Xolder 4190531b9a3aSBram Moolenaar call writefile(['Xtestfile2:4:Line4'], 'Xerr') 4191531b9a3aSBram Moolenaar Xfile Xerr 4192bdd2c290SBram Moolenaar call assert_equal('Xtestfile2', @%) 4193531b9a3aSBram Moolenaar call assert_equal(4, line('.')) 4194531b9a3aSBram Moolenaar autocmd! QuickFixCmdPost 4195531b9a3aSBram Moolenaar 4196531b9a3aSBram Moolenaar " Test for cbuffer/lbuffer 4197531b9a3aSBram Moolenaar call g:Xsetlist([], 'f') 4198531b9a3aSBram Moolenaar Xexpr 'Xtestfile1:2:Line2' 4199531b9a3aSBram Moolenaar autocmd QuickFixCmdPost * Xolder 4200531b9a3aSBram Moolenaar call writefile(['Xtestfile2:4:Line4'], 'Xerr') 4201531b9a3aSBram Moolenaar edit Xerr 4202531b9a3aSBram Moolenaar Xbuffer 4203bdd2c290SBram Moolenaar call assert_equal('Xtestfile2', @%) 4204531b9a3aSBram Moolenaar call assert_equal(4, line('.')) 4205531b9a3aSBram Moolenaar autocmd! QuickFixCmdPost 4206531b9a3aSBram Moolenaar 4207531b9a3aSBram Moolenaar " Test for cexpr/lexpr 4208531b9a3aSBram Moolenaar call g:Xsetlist([], 'f') 4209531b9a3aSBram Moolenaar Xexpr 'Xtestfile1:2:Line2' 4210531b9a3aSBram Moolenaar autocmd QuickFixCmdPost * Xolder 4211531b9a3aSBram Moolenaar Xexpr 'Xtestfile2:4:Line4' 4212bdd2c290SBram Moolenaar call assert_equal('Xtestfile2', @%) 4213531b9a3aSBram Moolenaar call assert_equal(4, line('.')) 4214531b9a3aSBram Moolenaar autocmd! QuickFixCmdPost 4215531b9a3aSBram Moolenaar 4216851332eaSBram Moolenaar " The grepprg may not be set on non-Unix systems 4217851332eaSBram Moolenaar if has('unix') 4218531b9a3aSBram Moolenaar " Test for grep/lgrep 4219531b9a3aSBram Moolenaar call g:Xsetlist([], 'f') 4220531b9a3aSBram Moolenaar Xexpr 'Xtestfile1:2:Line2' 4221531b9a3aSBram Moolenaar autocmd QuickFixCmdPost * Xolder 4222531b9a3aSBram Moolenaar silent Xgrep Line5 Xtestfile2 4223bdd2c290SBram Moolenaar call assert_equal('Xtestfile2', @%) 4224531b9a3aSBram Moolenaar call assert_equal(5, line('.')) 4225531b9a3aSBram Moolenaar autocmd! QuickFixCmdPost 4226851332eaSBram Moolenaar endif 4227531b9a3aSBram Moolenaar 4228531b9a3aSBram Moolenaar " Test for vimgrep/lvimgrep 4229531b9a3aSBram Moolenaar call g:Xsetlist([], 'f') 4230531b9a3aSBram Moolenaar Xexpr 'Xtestfile1:2:Line2' 4231531b9a3aSBram Moolenaar autocmd QuickFixCmdPost * Xolder 4232531b9a3aSBram Moolenaar silent Xvimgrep Line5 Xtestfile2 4233bdd2c290SBram Moolenaar call assert_equal('Xtestfile2', @%) 4234531b9a3aSBram Moolenaar call assert_equal(5, line('.')) 4235531b9a3aSBram Moolenaar autocmd! QuickFixCmdPost 4236531b9a3aSBram Moolenaar 42373f347e47SBram Moolenaar " Test for autocommands clearing the quickfix list before jumping to the 42383f347e47SBram Moolenaar " first error. This should not result in an error 42393f347e47SBram Moolenaar autocmd QuickFixCmdPost * call g:Xsetlist([], 'r') 42403f347e47SBram Moolenaar let v:errmsg = '' 42413f347e47SBram Moolenaar " Test for cfile/lfile 42423f347e47SBram Moolenaar Xfile Xerr 42433f347e47SBram Moolenaar call assert_true(v:errmsg !~# 'E42:') 42443f347e47SBram Moolenaar " Test for cbuffer/lbuffer 42453f347e47SBram Moolenaar edit Xerr 42463f347e47SBram Moolenaar Xbuffer 42473f347e47SBram Moolenaar call assert_true(v:errmsg !~# 'E42:') 42483f347e47SBram Moolenaar " Test for cexpr/lexpr 42493f347e47SBram Moolenaar Xexpr 'Xtestfile2:4:Line4' 42503f347e47SBram Moolenaar call assert_true(v:errmsg !~# 'E42:') 42513f347e47SBram Moolenaar " Test for grep/lgrep 42523f347e47SBram Moolenaar " The grepprg may not be set on non-Unix systems 42533f347e47SBram Moolenaar if has('unix') 42543f347e47SBram Moolenaar silent Xgrep Line5 Xtestfile2 42553f347e47SBram Moolenaar call assert_true(v:errmsg !~# 'E42:') 42563f347e47SBram Moolenaar endif 42573f347e47SBram Moolenaar " Test for vimgrep/lvimgrep 42583f347e47SBram Moolenaar call assert_fails('silent Xvimgrep Line5 Xtestfile2', 'E480:') 42593f347e47SBram Moolenaar autocmd! QuickFixCmdPost 42603f347e47SBram Moolenaar 4261531b9a3aSBram Moolenaar call delete('Xerr') 4262531b9a3aSBram Moolenaar call delete('Xtestfile1') 4263531b9a3aSBram Moolenaar call delete('Xtestfile2') 4264531b9a3aSBram Moolenaarendfunc 4265531b9a3aSBram Moolenaar 4266531b9a3aSBram Moolenaarfunc Test_autocmd_changelist() 4267531b9a3aSBram Moolenaar call Xautocmd_changelist('c') 4268531b9a3aSBram Moolenaar call Xautocmd_changelist('l') 4269531b9a3aSBram Moolenaarendfunc 42704cde86c2SBram Moolenaar 42714cde86c2SBram Moolenaar" Tests for the ':filter /pat/ clist' command 42724cde86c2SBram Moolenaarfunc Test_filter_clist() 42734cde86c2SBram Moolenaar cexpr ['Xfile1:10:10:Line 10', 'Xfile2:15:15:Line 15'] 42744cde86c2SBram Moolenaar call assert_equal([' 2 Xfile2:15 col 15: Line 15'], 42754cde86c2SBram Moolenaar \ split(execute('filter /Line 15/ clist'), "\n")) 42764cde86c2SBram Moolenaar call assert_equal([' 1 Xfile1:10 col 10: Line 10'], 42774cde86c2SBram Moolenaar \ split(execute('filter /Xfile1/ clist'), "\n")) 42784cde86c2SBram Moolenaar call assert_equal([], split(execute('filter /abc/ clist'), "\n")) 42794cde86c2SBram Moolenaar 42804cde86c2SBram Moolenaar call setqflist([{'module' : 'abc', 'pattern' : 'pat1'}, 42814cde86c2SBram Moolenaar \ {'module' : 'pqr', 'pattern' : 'pat2'}], ' ') 42824cde86c2SBram Moolenaar call assert_equal([' 2 pqr:pat2: '], 42834cde86c2SBram Moolenaar \ split(execute('filter /pqr/ clist'), "\n")) 42844cde86c2SBram Moolenaar call assert_equal([' 1 abc:pat1: '], 42854cde86c2SBram Moolenaar \ split(execute('filter /pat1/ clist'), "\n")) 42864cde86c2SBram Moolenaarendfunc 42870a08c63dSBram Moolenaar 42880a08c63dSBram Moolenaar" Tests for the "CTRL-W <CR>" command. 42890a08c63dSBram Moolenaarfunc Xview_result_split_tests(cchar) 42900a08c63dSBram Moolenaar call s:setup_commands(a:cchar) 42910a08c63dSBram Moolenaar 42920a08c63dSBram Moolenaar " Test that "CTRL-W <CR>" in a qf/ll window fails with empty list. 42930a08c63dSBram Moolenaar call g:Xsetlist([]) 42940a08c63dSBram Moolenaar Xopen 42950a08c63dSBram Moolenaar let l:win_count = winnr('$') 4296e2e4075fSBram Moolenaar call assert_fails('execute "normal! \<C-W>\<CR>"', 'E42:') 42970a08c63dSBram Moolenaar call assert_equal(l:win_count, winnr('$')) 42980a08c63dSBram Moolenaar Xclose 42990a08c63dSBram Moolenaarendfunc 43000a08c63dSBram Moolenaar 43010a08c63dSBram Moolenaarfunc Test_view_result_split() 43020a08c63dSBram Moolenaar call Xview_result_split_tests('c') 43030a08c63dSBram Moolenaar call Xview_result_split_tests('l') 43040a08c63dSBram Moolenaarendfunc 43052dfcef4cSBram Moolenaar 43062dfcef4cSBram Moolenaar" Test that :cc sets curswant 43072dfcef4cSBram Moolenaarfunc Test_curswant() 43082dfcef4cSBram Moolenaar helpgrep quickfix 43092dfcef4cSBram Moolenaar normal! llll 43102dfcef4cSBram Moolenaar 1cc 43112dfcef4cSBram Moolenaar call assert_equal(getcurpos()[4], virtcol('.')) 43122dfcef4cSBram Moolenaar cclose | helpclose 43132dfcef4cSBram Moolenaarendfunc 4314b244373bSBram Moolenaar 4315b244373bSBram Moolenaar" Test for opening a file from the quickfix window using CTRL-W <Enter> 4316b244373bSBram Moolenaar" doesn't leave an empty buffer around. 4317b244373bSBram Moolenaarfunc Test_splitview() 4318b244373bSBram Moolenaar call s:create_test_file('Xtestfile1') 4319b244373bSBram Moolenaar call s:create_test_file('Xtestfile2') 4320b244373bSBram Moolenaar new | only 4321b244373bSBram Moolenaar let last_bufnr = bufnr('Test_sv_1', 1) 4322b244373bSBram Moolenaar let l = ['Xtestfile1:2:Line2', 'Xtestfile2:4:Line4'] 4323b244373bSBram Moolenaar cgetexpr l 4324b244373bSBram Moolenaar copen 4325b244373bSBram Moolenaar let numbufs = len(getbufinfo()) 4326b244373bSBram Moolenaar exe "normal \<C-W>\<CR>" 4327b244373bSBram Moolenaar copen 4328b244373bSBram Moolenaar exe "normal j\<C-W>\<CR>" 4329b244373bSBram Moolenaar " Make sure new empty buffers are not created 4330b244373bSBram Moolenaar call assert_equal(numbufs, len(getbufinfo())) 4331b244373bSBram Moolenaar " Creating a new buffer should use the next available buffer number 4332b244373bSBram Moolenaar call assert_equal(last_bufnr + 4, bufnr("Test_sv_2", 1)) 4333b244373bSBram Moolenaar bwipe Test_sv_1 4334b244373bSBram Moolenaar bwipe Test_sv_2 4335b244373bSBram Moolenaar new | only 4336b244373bSBram Moolenaar 4337b244373bSBram Moolenaar " When split opening files from location list window, make sure that two 4338b244373bSBram Moolenaar " windows doesn't refer to the same location list 4339b244373bSBram Moolenaar lgetexpr l 4340b244373bSBram Moolenaar let locid = getloclist(0, {'id' : 0}).id 4341b244373bSBram Moolenaar lopen 4342b244373bSBram Moolenaar exe "normal \<C-W>\<CR>" 4343b244373bSBram Moolenaar call assert_notequal(locid, getloclist(0, {'id' : 0}).id) 4344b244373bSBram Moolenaar call assert_equal(0, getloclist(0, {'winid' : 0}).winid) 4345b244373bSBram Moolenaar new | only 4346b244373bSBram Moolenaar 4347b244373bSBram Moolenaar " When split opening files from a helpgrep location list window, a new help 4348eeb1b9c7SBram Moolenaar " window should be opened with a copy of the location list. 4349b244373bSBram Moolenaar lhelpgrep window 4350b244373bSBram Moolenaar let locid = getloclist(0, {'id' : 0}).id 4351b244373bSBram Moolenaar lwindow 4352b244373bSBram Moolenaar exe "normal j\<C-W>\<CR>" 4353b244373bSBram Moolenaar call assert_notequal(locid, getloclist(0, {'id' : 0}).id) 4354b244373bSBram Moolenaar call assert_equal(0, getloclist(0, {'winid' : 0}).winid) 4355b244373bSBram Moolenaar new | only 4356b244373bSBram Moolenaar 4357406cd90fSBram Moolenaar " Using :split or :vsplit from a quickfix window should behave like a :new 4358406cd90fSBram Moolenaar " or a :vnew command 4359406cd90fSBram Moolenaar copen 4360406cd90fSBram Moolenaar split 4361406cd90fSBram Moolenaar call assert_equal(3, winnr('$')) 4362406cd90fSBram Moolenaar let l = getwininfo() 4363406cd90fSBram Moolenaar call assert_equal([0, 0, 1], [l[0].quickfix, l[1].quickfix, l[2].quickfix]) 4364406cd90fSBram Moolenaar close 4365406cd90fSBram Moolenaar copen 4366406cd90fSBram Moolenaar vsplit 4367406cd90fSBram Moolenaar let l = getwininfo() 4368406cd90fSBram Moolenaar call assert_equal([0, 0, 1], [l[0].quickfix, l[1].quickfix, l[2].quickfix]) 4369406cd90fSBram Moolenaar new | only 4370406cd90fSBram Moolenaar 4371b244373bSBram Moolenaar call delete('Xtestfile1') 4372b244373bSBram Moolenaar call delete('Xtestfile2') 4373b244373bSBram Moolenaarendfunc 4374c45eb770SBram Moolenaar 4375c45eb770SBram Moolenaar" Test for parsing entries using visual screen column 4376c45eb770SBram Moolenaarfunc Test_viscol() 4377c45eb770SBram Moolenaar enew 4378c45eb770SBram Moolenaar call writefile(["Col1\tCol2\tCol3"], 'Xfile1') 4379c45eb770SBram Moolenaar edit Xfile1 4380c45eb770SBram Moolenaar 4381c45eb770SBram Moolenaar " Use byte offset for column number 4382c45eb770SBram Moolenaar set efm& 4383c45eb770SBram Moolenaar cexpr "Xfile1:1:5:XX\nXfile1:1:9:YY\nXfile1:1:20:ZZ" 4384c45eb770SBram Moolenaar call assert_equal([5, 8], [col('.'), virtcol('.')]) 4385c45eb770SBram Moolenaar cnext 4386c45eb770SBram Moolenaar call assert_equal([9, 12], [col('.'), virtcol('.')]) 4387c45eb770SBram Moolenaar cnext 4388c45eb770SBram Moolenaar call assert_equal([14, 20], [col('.'), virtcol('.')]) 4389c45eb770SBram Moolenaar 4390c45eb770SBram Moolenaar " Use screen column offset for column number 4391c45eb770SBram Moolenaar set efm=%f:%l:%v:%m 4392c45eb770SBram Moolenaar cexpr "Xfile1:1:8:XX\nXfile1:1:12:YY\nXfile1:1:20:ZZ" 4393c45eb770SBram Moolenaar call assert_equal([5, 8], [col('.'), virtcol('.')]) 4394c45eb770SBram Moolenaar cnext 4395c45eb770SBram Moolenaar call assert_equal([9, 12], [col('.'), virtcol('.')]) 4396c45eb770SBram Moolenaar cnext 4397c45eb770SBram Moolenaar call assert_equal([14, 20], [col('.'), virtcol('.')]) 4398c45eb770SBram Moolenaar cexpr "Xfile1:1:6:XX\nXfile1:1:15:YY\nXfile1:1:24:ZZ" 4399c45eb770SBram Moolenaar call assert_equal([5, 8], [col('.'), virtcol('.')]) 4400c45eb770SBram Moolenaar cnext 4401c45eb770SBram Moolenaar call assert_equal([10, 16], [col('.'), virtcol('.')]) 4402c45eb770SBram Moolenaar cnext 4403c45eb770SBram Moolenaar call assert_equal([14, 20], [col('.'), virtcol('.')]) 4404c45eb770SBram Moolenaar 4405c45eb770SBram Moolenaar enew 4406c45eb770SBram Moolenaar call writefile(["Col1\täü\töß\tCol4"], 'Xfile1') 4407c45eb770SBram Moolenaar 4408c45eb770SBram Moolenaar " Use byte offset for column number 4409c45eb770SBram Moolenaar set efm& 4410c45eb770SBram Moolenaar cexpr "Xfile1:1:8:XX\nXfile1:1:11:YY\nXfile1:1:16:ZZ" 4411c45eb770SBram Moolenaar call assert_equal([8, 10], [col('.'), virtcol('.')]) 4412c45eb770SBram Moolenaar cnext 4413c45eb770SBram Moolenaar call assert_equal([11, 17], [col('.'), virtcol('.')]) 4414c45eb770SBram Moolenaar cnext 4415c45eb770SBram Moolenaar call assert_equal([16, 25], [col('.'), virtcol('.')]) 4416c45eb770SBram Moolenaar 4417c45eb770SBram Moolenaar " Use screen column offset for column number 4418c45eb770SBram Moolenaar set efm=%f:%l:%v:%m 4419c45eb770SBram Moolenaar cexpr "Xfile1:1:10:XX\nXfile1:1:17:YY\nXfile1:1:25:ZZ" 4420c45eb770SBram Moolenaar call assert_equal([8, 10], [col('.'), virtcol('.')]) 4421c45eb770SBram Moolenaar cnext 4422c45eb770SBram Moolenaar call assert_equal([11, 17], [col('.'), virtcol('.')]) 4423c45eb770SBram Moolenaar cnext 4424c45eb770SBram Moolenaar call assert_equal([16, 25], [col('.'), virtcol('.')]) 4425c45eb770SBram Moolenaar 4426c95940c0SBram Moolenaar " Use screen column number with a multi-line error message 4427c95940c0SBram Moolenaar enew 4428c95940c0SBram Moolenaar call writefile(["à test"], 'Xfile1') 4429c95940c0SBram Moolenaar set efm=%E===\ %f\ ===,%C%l:%v,%Z%m 4430c95940c0SBram Moolenaar cexpr ["=== Xfile1 ===", "1:3", "errormsg"] 4431c95940c0SBram Moolenaar call assert_equal('Xfile1', @%) 4432c95940c0SBram Moolenaar call assert_equal([0, 1, 4, 0], getpos('.')) 4433c95940c0SBram Moolenaar 4434c95940c0SBram Moolenaar " Repeat previous test with byte offset %c: ensure that fix to issue #7145 4435c95940c0SBram Moolenaar " does not break this 4436c95940c0SBram Moolenaar set efm=%E===\ %f\ ===,%C%l:%c,%Z%m 4437c95940c0SBram Moolenaar cexpr ["=== Xfile1 ===", "1:3", "errormsg"] 4438c95940c0SBram Moolenaar call assert_equal('Xfile1', @%) 4439c95940c0SBram Moolenaar call assert_equal([0, 1, 3, 0], getpos('.')) 4440c95940c0SBram Moolenaar 4441c45eb770SBram Moolenaar enew | only 4442c45eb770SBram Moolenaar set efm& 4443c45eb770SBram Moolenaar call delete('Xfile1') 4444c45eb770SBram Moolenaarendfunc 4445ee8188fcSBram Moolenaar 4446ee8188fcSBram Moolenaar" Test for the quickfix window buffer 4447ee8188fcSBram Moolenaarfunc Xqfbuf_test(cchar) 4448ee8188fcSBram Moolenaar call s:setup_commands(a:cchar) 4449ee8188fcSBram Moolenaar 4450ee8188fcSBram Moolenaar " Quickfix buffer should be reused across closing and opening a quickfix 4451ee8188fcSBram Moolenaar " window 4452ee8188fcSBram Moolenaar Xexpr "F1:10:Line10" 4453ee8188fcSBram Moolenaar Xopen 4454ee8188fcSBram Moolenaar let qfbnum = bufnr('') 4455ee8188fcSBram Moolenaar Xclose 4456ee8188fcSBram Moolenaar " Even after the quickfix window is closed, the buffer should be loaded 4457ee8188fcSBram Moolenaar call assert_true(bufloaded(qfbnum)) 4458647e24baSBram Moolenaar call assert_true(qfbnum, g:Xgetlist({'qfbufnr' : 0}).qfbufnr) 4459ee8188fcSBram Moolenaar Xopen 4460ee8188fcSBram Moolenaar " Buffer should be reused when opening the window again 4461ee8188fcSBram Moolenaar call assert_equal(qfbnum, bufnr('')) 4462ee8188fcSBram Moolenaar Xclose 4463ee8188fcSBram Moolenaar 4464ee8188fcSBram Moolenaar if a:cchar == 'l' 4465ee8188fcSBram Moolenaar %bwipe 4466ee8188fcSBram Moolenaar " For a location list, when both the file window and the location list 4467ee8188fcSBram Moolenaar " window for the list are closed, then the buffer should be freed. 4468ee8188fcSBram Moolenaar new | only 4469ee8188fcSBram Moolenaar lexpr "F1:10:Line10" 4470ee8188fcSBram Moolenaar let wid = win_getid() 4471ee8188fcSBram Moolenaar lopen 4472ee8188fcSBram Moolenaar let qfbnum = bufnr('') 4473ee8188fcSBram Moolenaar call assert_match(qfbnum . ' %a- "\[Location List]"', execute('ls')) 4474ee8188fcSBram Moolenaar close 4475ee8188fcSBram Moolenaar " When the location list window is closed, the buffer name should not 4476ee8188fcSBram Moolenaar " change to 'Quickfix List' 4477647e24baSBram Moolenaar call assert_match(qfbnum . 'u h- "\[Location List]"', execute('ls!')) 4478ee8188fcSBram Moolenaar call assert_true(bufloaded(qfbnum)) 4479ee8188fcSBram Moolenaar 4480d82a81caSBram Moolenaar " After deleting a location list buffer using ":bdelete", opening the 4481d82a81caSBram Moolenaar " location list window should mark the buffer as a location list buffer. 4482d82a81caSBram Moolenaar exe "bdelete " . qfbnum 4483d82a81caSBram Moolenaar lopen 4484d82a81caSBram Moolenaar call assert_equal("quickfix", &buftype) 4485d82a81caSBram Moolenaar call assert_equal(1, getwininfo(win_getid(winnr()))[0].loclist) 4486d82a81caSBram Moolenaar call assert_equal(wid, getloclist(0, {'filewinid' : 0}).filewinid) 4487d82a81caSBram Moolenaar call assert_false(&swapfile) 4488d82a81caSBram Moolenaar lclose 4489d82a81caSBram Moolenaar 4490eeb1b9c7SBram Moolenaar " When the location list is cleared for the window, the buffer should be 4491eeb1b9c7SBram Moolenaar " removed 4492eeb1b9c7SBram Moolenaar call setloclist(0, [], 'f') 4493eeb1b9c7SBram Moolenaar call assert_false(bufexists(qfbnum)) 4494647e24baSBram Moolenaar call assert_equal(0, getloclist(0, {'qfbufnr' : 0}).qfbufnr) 4495eeb1b9c7SBram Moolenaar 4496eeb1b9c7SBram Moolenaar " When the location list is freed with the location list window open, the 4497eeb1b9c7SBram Moolenaar " location list buffer should not be lost. It should be reused when the 4498eeb1b9c7SBram Moolenaar " location list is again populated. 4499eeb1b9c7SBram Moolenaar lexpr "F1:10:Line10" 4500eeb1b9c7SBram Moolenaar lopen 4501eeb1b9c7SBram Moolenaar let wid = win_getid() 4502eeb1b9c7SBram Moolenaar let qfbnum = bufnr('') 4503eeb1b9c7SBram Moolenaar wincmd p 4504eeb1b9c7SBram Moolenaar call setloclist(0, [], 'f') 4505eeb1b9c7SBram Moolenaar lexpr "F1:10:Line10" 4506eeb1b9c7SBram Moolenaar lopen 4507eeb1b9c7SBram Moolenaar call assert_equal(wid, win_getid()) 4508eeb1b9c7SBram Moolenaar call assert_equal(qfbnum, bufnr('')) 4509eeb1b9c7SBram Moolenaar lclose 4510eeb1b9c7SBram Moolenaar 4511eeb1b9c7SBram Moolenaar " When the window with the location list is closed, the buffer should be 4512eeb1b9c7SBram Moolenaar " removed 4513ee8188fcSBram Moolenaar new | only 4514eeb1b9c7SBram Moolenaar call assert_false(bufexists(qfbnum)) 4515ee8188fcSBram Moolenaar endif 4516ee8188fcSBram Moolenaarendfunc 4517ee8188fcSBram Moolenaar 4518ee8188fcSBram Moolenaarfunc Test_qfbuf() 4519ee8188fcSBram Moolenaar call Xqfbuf_test('c') 4520ee8188fcSBram Moolenaar call Xqfbuf_test('l') 4521ee8188fcSBram Moolenaarendfunc 4522eeb1b9c7SBram Moolenaar 4523eeb1b9c7SBram Moolenaar" If there is an autocmd to use only one window, then opening the location 4524eeb1b9c7SBram Moolenaar" list window used to crash Vim. 4525eeb1b9c7SBram Moolenaarfunc Test_winonly_autocmd() 4526eeb1b9c7SBram Moolenaar call s:create_test_file('Xtest1') 4527eeb1b9c7SBram Moolenaar " Autocmd to show only one Vim window at a time 4528eeb1b9c7SBram Moolenaar autocmd WinEnter * only 4529eeb1b9c7SBram Moolenaar new 4530eeb1b9c7SBram Moolenaar " Load the location list 4531eeb1b9c7SBram Moolenaar lexpr "Xtest1:5:Line5\nXtest1:10:Line10\nXtest1:15:Line15" 4532eeb1b9c7SBram Moolenaar let loclistid = getloclist(0, {'id' : 0}).id 4533eeb1b9c7SBram Moolenaar " Open the location list window. Only this window will be shown and the file 4534eeb1b9c7SBram Moolenaar " window is closed. 4535eeb1b9c7SBram Moolenaar lopen 4536eeb1b9c7SBram Moolenaar call assert_equal(loclistid, getloclist(0, {'id' : 0}).id) 4537eeb1b9c7SBram Moolenaar " Jump to an entry in the location list and make sure that the cursor is 4538eeb1b9c7SBram Moolenaar " positioned correctly. 4539eeb1b9c7SBram Moolenaar ll 3 4540eeb1b9c7SBram Moolenaar call assert_equal(loclistid, getloclist(0, {'id' : 0}).id) 4541bdd2c290SBram Moolenaar call assert_equal('Xtest1', @%) 4542eeb1b9c7SBram Moolenaar call assert_equal(15, line('.')) 4543eeb1b9c7SBram Moolenaar " Cleanup 4544eeb1b9c7SBram Moolenaar autocmd! WinEnter 4545eeb1b9c7SBram Moolenaar new | only 4546eeb1b9c7SBram Moolenaar call delete('Xtest1') 4547eeb1b9c7SBram Moolenaarendfunc 454839803d82SBram Moolenaar 454939803d82SBram Moolenaar" Test to make sure that an empty quickfix buffer is not reused for loading 455039803d82SBram Moolenaar" a normal buffer. 455139803d82SBram Moolenaarfunc Test_empty_qfbuf() 455239803d82SBram Moolenaar enew | only 455339803d82SBram Moolenaar call writefile(["Test"], 'Xfile1') 455439803d82SBram Moolenaar call setqflist([], 'f') 455539803d82SBram Moolenaar copen | only 455639803d82SBram Moolenaar let qfbuf = bufnr('') 455739803d82SBram Moolenaar edit Xfile1 455839803d82SBram Moolenaar call assert_notequal(qfbuf, bufnr('')) 455939803d82SBram Moolenaar enew 456039803d82SBram Moolenaar call delete('Xfile1') 456139803d82SBram Moolenaarendfunc 45623ff33114SBram Moolenaar 45633ff33114SBram Moolenaar" Test for the :cbelow, :cabove, :lbelow and :labove commands. 4564cf6a55c4SBram Moolenaar" And for the :cafter, :cbefore, :lafter and :lbefore commands. 45653ff33114SBram Moolenaarfunc Xtest_below(cchar) 45663ff33114SBram Moolenaar call s:setup_commands(a:cchar) 45673ff33114SBram Moolenaar 45683ff33114SBram Moolenaar " No quickfix/location list 45693ff33114SBram Moolenaar call assert_fails('Xbelow', 'E42:') 45703ff33114SBram Moolenaar call assert_fails('Xabove', 'E42:') 4571cf6a55c4SBram Moolenaar call assert_fails('Xbefore', 'E42:') 4572cf6a55c4SBram Moolenaar call assert_fails('Xafter', 'E42:') 45733ff33114SBram Moolenaar 45743ff33114SBram Moolenaar " Empty quickfix/location list 45753ff33114SBram Moolenaar call g:Xsetlist([]) 45763ff33114SBram Moolenaar call assert_fails('Xbelow', 'E42:') 45773ff33114SBram Moolenaar call assert_fails('Xabove', 'E42:') 4578cf6a55c4SBram Moolenaar call assert_fails('Xbefore', 'E42:') 4579cf6a55c4SBram Moolenaar call assert_fails('Xafter', 'E42:') 45803ff33114SBram Moolenaar 45813ff33114SBram Moolenaar call s:create_test_file('X1') 45823ff33114SBram Moolenaar call s:create_test_file('X2') 45833ff33114SBram Moolenaar call s:create_test_file('X3') 45843ff33114SBram Moolenaar call s:create_test_file('X4') 45853ff33114SBram Moolenaar 45863ff33114SBram Moolenaar " Invalid entries 45873ff33114SBram Moolenaar edit X1 45883ff33114SBram Moolenaar call g:Xsetlist(["E1", "E2"]) 45893ff33114SBram Moolenaar call assert_fails('Xbelow', 'E42:') 45903ff33114SBram Moolenaar call assert_fails('Xabove', 'E42:') 45913ff33114SBram Moolenaar call assert_fails('3Xbelow', 'E42:') 45923ff33114SBram Moolenaar call assert_fails('4Xabove', 'E42:') 4593cf6a55c4SBram Moolenaar call assert_fails('Xbefore', 'E42:') 4594cf6a55c4SBram Moolenaar call assert_fails('Xafter', 'E42:') 4595cf6a55c4SBram Moolenaar call assert_fails('3Xbefore', 'E42:') 4596cf6a55c4SBram Moolenaar call assert_fails('4Xafter', 'E42:') 45973ff33114SBram Moolenaar 45983ff33114SBram Moolenaar " Test the commands with various arguments 4599cf6a55c4SBram Moolenaar Xexpr ["X1:5:3:L5", "X2:5:2:L5", "X2:10:3:L10", "X2:15:4:L15", "X3:3:5:L3"] 46003ff33114SBram Moolenaar edit +7 X2 46013ff33114SBram Moolenaar Xabove 4602bdd2c290SBram Moolenaar call assert_equal(['X2', 5], [@%, line('.')]) 46033ff33114SBram Moolenaar call assert_fails('Xabove', 'E553:') 4604cf6a55c4SBram Moolenaar normal 7G 4605cf6a55c4SBram Moolenaar Xbefore 4606bdd2c290SBram Moolenaar call assert_equal(['X2', 5, 2], [@%, line('.'), col('.')]) 4607cf6a55c4SBram Moolenaar call assert_fails('Xbefore', 'E553:') 4608cf6a55c4SBram Moolenaar 46093ff33114SBram Moolenaar normal 2j 46103ff33114SBram Moolenaar Xbelow 4611bdd2c290SBram Moolenaar call assert_equal(['X2', 10], [@%, line('.')]) 4612cf6a55c4SBram Moolenaar normal 7G 4613cf6a55c4SBram Moolenaar Xafter 4614bdd2c290SBram Moolenaar call assert_equal(['X2', 10, 3], [@%, line('.'), col('.')]) 4615cf6a55c4SBram Moolenaar 46163ff33114SBram Moolenaar " Last error in this file 46173ff33114SBram Moolenaar Xbelow 99 4618bdd2c290SBram Moolenaar call assert_equal(['X2', 15], [@%, line('.')]) 46193ff33114SBram Moolenaar call assert_fails('Xbelow', 'E553:') 4620cf6a55c4SBram Moolenaar normal gg 4621cf6a55c4SBram Moolenaar Xafter 99 4622bdd2c290SBram Moolenaar call assert_equal(['X2', 15, 4], [@%, line('.'), col('.')]) 4623cf6a55c4SBram Moolenaar call assert_fails('Xafter', 'E553:') 4624cf6a55c4SBram Moolenaar 46253ff33114SBram Moolenaar " First error in this file 46263ff33114SBram Moolenaar Xabove 99 4627bdd2c290SBram Moolenaar call assert_equal(['X2', 5], [@%, line('.')]) 46283ff33114SBram Moolenaar call assert_fails('Xabove', 'E553:') 4629cf6a55c4SBram Moolenaar normal G 4630cf6a55c4SBram Moolenaar Xbefore 99 4631bdd2c290SBram Moolenaar call assert_equal(['X2', 5, 2], [@%, line('.'), col('.')]) 4632cf6a55c4SBram Moolenaar call assert_fails('Xbefore', 'E553:') 4633cf6a55c4SBram Moolenaar 46343ff33114SBram Moolenaar normal gg 46353ff33114SBram Moolenaar Xbelow 2 4636bdd2c290SBram Moolenaar call assert_equal(['X2', 10], [@%, line('.')]) 4637cf6a55c4SBram Moolenaar normal gg 4638cf6a55c4SBram Moolenaar Xafter 2 4639bdd2c290SBram Moolenaar call assert_equal(['X2', 10, 3], [@%, line('.'), col('.')]) 4640cf6a55c4SBram Moolenaar 46413ff33114SBram Moolenaar normal G 46423ff33114SBram Moolenaar Xabove 2 4643bdd2c290SBram Moolenaar call assert_equal(['X2', 10], [@%, line('.')]) 4644cf6a55c4SBram Moolenaar normal G 4645cf6a55c4SBram Moolenaar Xbefore 2 4646bdd2c290SBram Moolenaar call assert_equal(['X2', 10, 3], [@%, line('.'), col('.')]) 4647cf6a55c4SBram Moolenaar 46483ff33114SBram Moolenaar edit X4 46493ff33114SBram Moolenaar call assert_fails('Xabove', 'E42:') 46503ff33114SBram Moolenaar call assert_fails('Xbelow', 'E42:') 4651cf6a55c4SBram Moolenaar call assert_fails('Xbefore', 'E42:') 4652cf6a55c4SBram Moolenaar call assert_fails('Xafter', 'E42:') 46533ff33114SBram Moolenaar if a:cchar == 'l' 46543ff33114SBram Moolenaar " If a buffer has location list entries from some other window but not 46553ff33114SBram Moolenaar " from the current window, then the commands should fail. 46563ff33114SBram Moolenaar edit X1 | split | call setloclist(0, [], 'f') 46573ff33114SBram Moolenaar call assert_fails('Xabove', 'E776:') 46583ff33114SBram Moolenaar call assert_fails('Xbelow', 'E776:') 4659cf6a55c4SBram Moolenaar call assert_fails('Xbefore', 'E776:') 4660cf6a55c4SBram Moolenaar call assert_fails('Xafter', 'E776:') 46613ff33114SBram Moolenaar close 46623ff33114SBram Moolenaar endif 46633ff33114SBram Moolenaar 46643ff33114SBram Moolenaar " Test for lines with multiple quickfix entries 46653ff33114SBram Moolenaar Xexpr ["X1:5:L5", "X2:5:1:L5_1", "X2:5:2:L5_2", "X2:5:3:L5_3", 46663ff33114SBram Moolenaar \ "X2:10:1:L10_1", "X2:10:2:L10_2", "X2:10:3:L10_3", 46673ff33114SBram Moolenaar \ "X2:15:1:L15_1", "X2:15:2:L15_2", "X2:15:3:L15_3", "X3:3:L3"] 46683ff33114SBram Moolenaar edit +1 X2 46693ff33114SBram Moolenaar Xbelow 2 4670bdd2c290SBram Moolenaar call assert_equal(['X2', 10, 1], [@%, line('.'), col('.')]) 4671cf6a55c4SBram Moolenaar normal 1G 4672cf6a55c4SBram Moolenaar Xafter 2 4673bdd2c290SBram Moolenaar call assert_equal(['X2', 5, 2], [@%, line('.'), col('.')]) 4674cf6a55c4SBram Moolenaar 46753ff33114SBram Moolenaar normal gg 46763ff33114SBram Moolenaar Xbelow 99 4677bdd2c290SBram Moolenaar call assert_equal(['X2', 15, 1], [@%, line('.'), col('.')]) 4678cf6a55c4SBram Moolenaar normal gg 4679cf6a55c4SBram Moolenaar Xafter 99 4680bdd2c290SBram Moolenaar call assert_equal(['X2', 15, 3], [@%, line('.'), col('.')]) 4681cf6a55c4SBram Moolenaar 46823ff33114SBram Moolenaar normal G 46833ff33114SBram Moolenaar Xabove 2 4684bdd2c290SBram Moolenaar call assert_equal(['X2', 10, 1], [@%, line('.'), col('.')]) 46853ff33114SBram Moolenaar normal G 4686cf6a55c4SBram Moolenaar Xbefore 2 4687bdd2c290SBram Moolenaar call assert_equal(['X2', 15, 2], [@%, line('.'), col('.')]) 4688cf6a55c4SBram Moolenaar 4689cf6a55c4SBram Moolenaar normal G 46903ff33114SBram Moolenaar Xabove 99 4691bdd2c290SBram Moolenaar call assert_equal(['X2', 5, 1], [@%, line('.'), col('.')]) 4692cf6a55c4SBram Moolenaar normal G 4693cf6a55c4SBram Moolenaar Xbefore 99 4694bdd2c290SBram Moolenaar call assert_equal(['X2', 5, 1], [@%, line('.'), col('.')]) 4695cf6a55c4SBram Moolenaar 46963ff33114SBram Moolenaar normal 10G 46973ff33114SBram Moolenaar Xabove 4698bdd2c290SBram Moolenaar call assert_equal(['X2', 5, 1], [@%, line('.'), col('.')]) 4699cf6a55c4SBram Moolenaar normal 10G$ 4700cf6a55c4SBram Moolenaar 2Xbefore 4701bdd2c290SBram Moolenaar call assert_equal(['X2', 10, 2], [@%, line('.'), col('.')]) 4702cf6a55c4SBram Moolenaar 47033ff33114SBram Moolenaar normal 10G 47043ff33114SBram Moolenaar Xbelow 4705bdd2c290SBram Moolenaar call assert_equal(['X2', 15, 1], [@%, line('.'), col('.')]) 4706cf6a55c4SBram Moolenaar normal 9G 4707cf6a55c4SBram Moolenaar 5Xafter 4708bdd2c290SBram Moolenaar call assert_equal(['X2', 15, 2], [@%, line('.'), col('.')]) 47093ff33114SBram Moolenaar 47103ff33114SBram Moolenaar " Invalid range 47113ff33114SBram Moolenaar if a:cchar == 'c' 471225190db2SBram Moolenaar call assert_fails('-2cbelow', 'E16:') 4713cf6a55c4SBram Moolenaar call assert_fails('-2cafter', 'E16:') 47143ff33114SBram Moolenaar else 471525190db2SBram Moolenaar call assert_fails('-2lbelow', 'E16:') 4716cf6a55c4SBram Moolenaar call assert_fails('-2lafter', 'E16:') 47173ff33114SBram Moolenaar endif 47183ff33114SBram Moolenaar 47193ff33114SBram Moolenaar call delete('X1') 47203ff33114SBram Moolenaar call delete('X2') 47213ff33114SBram Moolenaar call delete('X3') 47223ff33114SBram Moolenaar call delete('X4') 47233ff33114SBram Moolenaarendfunc 47243ff33114SBram Moolenaar 47253ff33114SBram Moolenaarfunc Test_cbelow() 47263ff33114SBram Moolenaar call Xtest_below('c') 47273ff33114SBram Moolenaar call Xtest_below('l') 47283ff33114SBram Moolenaarendfunc 472925190db2SBram Moolenaar 473025190db2SBram Moolenaarfunc Test_quickfix_count() 473125190db2SBram Moolenaar let commands = [ 473225190db2SBram Moolenaar \ 'cNext', 473325190db2SBram Moolenaar \ 'cNfile', 473425190db2SBram Moolenaar \ 'cabove', 473525190db2SBram Moolenaar \ 'cbelow', 473625190db2SBram Moolenaar \ 'cfirst', 473725190db2SBram Moolenaar \ 'clast', 473825190db2SBram Moolenaar \ 'cnewer', 473925190db2SBram Moolenaar \ 'cnext', 474025190db2SBram Moolenaar \ 'cnfile', 474125190db2SBram Moolenaar \ 'colder', 474225190db2SBram Moolenaar \ 'cprevious', 474325190db2SBram Moolenaar \ 'crewind', 474425190db2SBram Moolenaar \ 474525190db2SBram Moolenaar \ 'lNext', 474625190db2SBram Moolenaar \ 'lNfile', 474725190db2SBram Moolenaar \ 'labove', 474825190db2SBram Moolenaar \ 'lbelow', 474925190db2SBram Moolenaar \ 'lfirst', 475025190db2SBram Moolenaar \ 'llast', 475125190db2SBram Moolenaar \ 'lnewer', 475225190db2SBram Moolenaar \ 'lnext', 475325190db2SBram Moolenaar \ 'lnfile', 475425190db2SBram Moolenaar \ 'lolder', 475525190db2SBram Moolenaar \ 'lprevious', 475625190db2SBram Moolenaar \ 'lrewind', 475725190db2SBram Moolenaar \ ] 475825190db2SBram Moolenaar for cmd in commands 475925190db2SBram Moolenaar call assert_fails('-1' .. cmd, 'E16:') 476025190db2SBram Moolenaar call assert_fails('.' .. cmd, 'E16:') 476125190db2SBram Moolenaar call assert_fails('%' .. cmd, 'E16:') 476225190db2SBram Moolenaar call assert_fails('$' .. cmd, 'E16:') 476325190db2SBram Moolenaar endfor 476425190db2SBram Moolenaarendfunc 47656a0cc916SBram Moolenaar 47666a0cc916SBram Moolenaar" Test for aborting quickfix commands using QuickFixCmdPre 47676a0cc916SBram Moolenaarfunc Xtest_qfcmd_abort(cchar) 47686a0cc916SBram Moolenaar call s:setup_commands(a:cchar) 47696a0cc916SBram Moolenaar 47706a0cc916SBram Moolenaar call g:Xsetlist([], 'f') 47716a0cc916SBram Moolenaar 47726a0cc916SBram Moolenaar " cexpr/lexpr 47736a0cc916SBram Moolenaar let e = '' 47746a0cc916SBram Moolenaar try 47756a0cc916SBram Moolenaar Xexpr ["F1:10:Line10", "F2:20:Line20"] 47766a0cc916SBram Moolenaar catch /.*/ 47776a0cc916SBram Moolenaar let e = v:exception 47786a0cc916SBram Moolenaar endtry 47796a0cc916SBram Moolenaar call assert_equal('AbortCmd', e) 47806a0cc916SBram Moolenaar call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr) 47816a0cc916SBram Moolenaar 47826a0cc916SBram Moolenaar " cfile/lfile 47836a0cc916SBram Moolenaar call writefile(["F1:10:Line10", "F2:20:Line20"], 'Xfile1') 47846a0cc916SBram Moolenaar let e = '' 47856a0cc916SBram Moolenaar try 47866a0cc916SBram Moolenaar Xfile Xfile1 47876a0cc916SBram Moolenaar catch /.*/ 47886a0cc916SBram Moolenaar let e = v:exception 47896a0cc916SBram Moolenaar endtry 47906a0cc916SBram Moolenaar call assert_equal('AbortCmd', e) 47916a0cc916SBram Moolenaar call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr) 47926a0cc916SBram Moolenaar call delete('Xfile1') 47936a0cc916SBram Moolenaar 47946a0cc916SBram Moolenaar " cgetbuffer/lgetbuffer 47956a0cc916SBram Moolenaar enew! 47966a0cc916SBram Moolenaar call append(0, ["F1:10:Line10", "F2:20:Line20"]) 47976a0cc916SBram Moolenaar let e = '' 47986a0cc916SBram Moolenaar try 47996a0cc916SBram Moolenaar Xgetbuffer 48006a0cc916SBram Moolenaar catch /.*/ 48016a0cc916SBram Moolenaar let e = v:exception 48026a0cc916SBram Moolenaar endtry 48036a0cc916SBram Moolenaar call assert_equal('AbortCmd', e) 48046a0cc916SBram Moolenaar call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr) 48056a0cc916SBram Moolenaar enew! 48066a0cc916SBram Moolenaar 48076a0cc916SBram Moolenaar " vimgrep/lvimgrep 48086a0cc916SBram Moolenaar let e = '' 48096a0cc916SBram Moolenaar try 48106a0cc916SBram Moolenaar Xvimgrep /func/ test_quickfix.vim 48116a0cc916SBram Moolenaar catch /.*/ 48126a0cc916SBram Moolenaar let e = v:exception 48136a0cc916SBram Moolenaar endtry 48146a0cc916SBram Moolenaar call assert_equal('AbortCmd', e) 48156a0cc916SBram Moolenaar call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr) 48166a0cc916SBram Moolenaar 48176a0cc916SBram Moolenaar " helpgrep/lhelpgrep 48186a0cc916SBram Moolenaar let e = '' 48196a0cc916SBram Moolenaar try 48206a0cc916SBram Moolenaar Xhelpgrep quickfix 48216a0cc916SBram Moolenaar catch /.*/ 48226a0cc916SBram Moolenaar let e = v:exception 48236a0cc916SBram Moolenaar endtry 48246a0cc916SBram Moolenaar call assert_equal('AbortCmd', e) 48256a0cc916SBram Moolenaar call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr) 48266a0cc916SBram Moolenaar 48276a0cc916SBram Moolenaar " grep/lgrep 48286a0cc916SBram Moolenaar if has('unix') 48296a0cc916SBram Moolenaar let e = '' 48306a0cc916SBram Moolenaar try 48316a0cc916SBram Moolenaar silent Xgrep func test_quickfix.vim 48326a0cc916SBram Moolenaar catch /.*/ 48336a0cc916SBram Moolenaar let e = v:exception 48346a0cc916SBram Moolenaar endtry 48356a0cc916SBram Moolenaar call assert_equal('AbortCmd', e) 48366a0cc916SBram Moolenaar call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr) 48376a0cc916SBram Moolenaar endif 48386a0cc916SBram Moolenaarendfunc 48396a0cc916SBram Moolenaar 48406a0cc916SBram Moolenaarfunc Test_qfcmd_abort() 48416a0cc916SBram Moolenaar augroup QF_Test 48426a0cc916SBram Moolenaar au! 48436a0cc916SBram Moolenaar autocmd QuickFixCmdPre * throw "AbortCmd" 48446a0cc916SBram Moolenaar augroup END 48456a0cc916SBram Moolenaar 48466a0cc916SBram Moolenaar call Xtest_qfcmd_abort('c') 48476a0cc916SBram Moolenaar call Xtest_qfcmd_abort('l') 48486a0cc916SBram Moolenaar 48496a0cc916SBram Moolenaar augroup QF_Test 48506a0cc916SBram Moolenaar au! 48516a0cc916SBram Moolenaar augroup END 48526a0cc916SBram Moolenaarendfunc 48536a0cc916SBram Moolenaar 4854d8a8c4caSBram Moolenaar" Test for using a file in one of the parent directories. 4855d8a8c4caSBram Moolenaarfunc Test_search_in_dirstack() 4856d8a8c4caSBram Moolenaar call mkdir('Xtestdir/a/b/c', 'p') 4857d8a8c4caSBram Moolenaar let save_cwd = getcwd() 4858d8a8c4caSBram Moolenaar call writefile(["X1_L1", "X1_L2"], 'Xtestdir/Xfile1') 4859d8a8c4caSBram Moolenaar call writefile(["X2_L1", "X2_L2"], 'Xtestdir/a/Xfile2') 4860d8a8c4caSBram Moolenaar call writefile(["X3_L1", "X3_L2"], 'Xtestdir/a/b/Xfile3') 4861d8a8c4caSBram Moolenaar call writefile(["X4_L1", "X4_L2"], 'Xtestdir/a/b/c/Xfile4') 4862d8a8c4caSBram Moolenaar 4863d8a8c4caSBram Moolenaar let lines = "Entering dir Xtestdir\n" . 4864d8a8c4caSBram Moolenaar \ "Entering dir a\n" . 4865d8a8c4caSBram Moolenaar \ "Entering dir b\n" . 4866d8a8c4caSBram Moolenaar \ "Xfile2:2:X2_L2\n" . 4867d8a8c4caSBram Moolenaar \ "Leaving dir a\n" . 4868d8a8c4caSBram Moolenaar \ "Xfile1:2:X1_L2\n" . 4869d8a8c4caSBram Moolenaar \ "Xfile3:1:X3_L1\n" . 4870d8a8c4caSBram Moolenaar \ "Entering dir c\n" . 4871d8a8c4caSBram Moolenaar \ "Xfile4:2:X4_L2\n" . 487288a3e2b2SBram Moolenaar \ "Leaving dir c\n" 4873d8a8c4caSBram Moolenaar set efm=%DEntering\ dir\ %f,%XLeaving\ dir\ %f,%f:%l:%m 487488a3e2b2SBram Moolenaar cexpr lines .. "Leaving dir Xtestdir|\n" | let next = 1 4875d8a8c4caSBram Moolenaar call assert_equal(11, getqflist({'size' : 0}).size) 4876d8a8c4caSBram Moolenaar call assert_equal(4, getqflist({'idx' : 0}).idx) 4877d8a8c4caSBram Moolenaar call assert_equal('X2_L2', getline('.')) 487888a3e2b2SBram Moolenaar call assert_equal(1, next) 4879d8a8c4caSBram Moolenaar cnext 4880d8a8c4caSBram Moolenaar call assert_equal(6, getqflist({'idx' : 0}).idx) 4881d8a8c4caSBram Moolenaar call assert_equal('X1_L2', getline('.')) 4882d8a8c4caSBram Moolenaar cnext 4883d8a8c4caSBram Moolenaar call assert_equal(7, getqflist({'idx' : 0}).idx) 4884d8a8c4caSBram Moolenaar call assert_equal(1, line('$')) 4885d8a8c4caSBram Moolenaar call assert_equal('', getline(1)) 4886d8a8c4caSBram Moolenaar cnext 4887d8a8c4caSBram Moolenaar call assert_equal(9, getqflist({'idx' : 0}).idx) 4888d8a8c4caSBram Moolenaar call assert_equal(1, line('$')) 4889d8a8c4caSBram Moolenaar call assert_equal('', getline(1)) 4890d8a8c4caSBram Moolenaar 4891d8a8c4caSBram Moolenaar set efm& 4892d8a8c4caSBram Moolenaar exe 'cd ' . save_cwd 4893d8a8c4caSBram Moolenaar call delete('Xtestdir', 'rf') 4894d8a8c4caSBram Moolenaarendfunc 4895d8a8c4caSBram Moolenaar 48961860bde9SBram Moolenaar" Test for :cquit 48971860bde9SBram Moolenaarfunc Test_cquit() 48981860bde9SBram Moolenaar " Exit Vim with a non-zero value 48991860bde9SBram Moolenaar if RunVim([], ["cquit 7"], '') 49001860bde9SBram Moolenaar call assert_equal(7, v:shell_error) 49011860bde9SBram Moolenaar endif 49021860bde9SBram Moolenaar 49031860bde9SBram Moolenaar if RunVim([], ["50cquit"], '') 49041860bde9SBram Moolenaar call assert_equal(50, v:shell_error) 49051860bde9SBram Moolenaar endif 49061860bde9SBram Moolenaar 49071860bde9SBram Moolenaar " Exit Vim with default value 49081860bde9SBram Moolenaar if RunVim([], ["cquit"], '') 49091860bde9SBram Moolenaar call assert_equal(1, v:shell_error) 49101860bde9SBram Moolenaar endif 49111860bde9SBram Moolenaar 49121860bde9SBram Moolenaar " Exit Vim with zero value 49131860bde9SBram Moolenaar if RunVim([], ["cquit 0"], '') 49141860bde9SBram Moolenaar call assert_equal(0, v:shell_error) 49151860bde9SBram Moolenaar endif 49161860bde9SBram Moolenaar 49171860bde9SBram Moolenaar " Exit Vim with negative value 49181860bde9SBram Moolenaar call assert_fails('-3cquit', 'E16:') 49191860bde9SBram Moolenaarendfunc 49201860bde9SBram Moolenaar 4921858ba06dSBram Moolenaar" Test for getting a specific item from a quickfix list 4922858ba06dSBram Moolenaarfunc Xtest_getqflist_by_idx(cchar) 4923858ba06dSBram Moolenaar call s:setup_commands(a:cchar) 4924858ba06dSBram Moolenaar " Empty list 4925858ba06dSBram Moolenaar call assert_equal([], g:Xgetlist({'idx' : 1, 'items' : 0}).items) 4926858ba06dSBram Moolenaar Xexpr ['F1:10:L10', 'F1:20:L20'] 4927858ba06dSBram Moolenaar let l = g:Xgetlist({'idx' : 2, 'items' : 0}).items 4928858ba06dSBram Moolenaar call assert_equal(bufnr('F1'), l[0].bufnr) 4929858ba06dSBram Moolenaar call assert_equal(20, l[0].lnum) 4930858ba06dSBram Moolenaar call assert_equal('L20', l[0].text) 4931858ba06dSBram Moolenaar call assert_equal([], g:Xgetlist({'idx' : -1, 'items' : 0}).items) 4932858ba06dSBram Moolenaar call assert_equal([], g:Xgetlist({'idx' : 3, 'items' : 0}).items) 4933858ba06dSBram Moolenaar %bwipe! 4934858ba06dSBram Moolenaarendfunc 4935858ba06dSBram Moolenaar 4936858ba06dSBram Moolenaarfunc Test_getqflist_by_idx() 4937858ba06dSBram Moolenaar call Xtest_getqflist_by_idx('c') 4938858ba06dSBram Moolenaar call Xtest_getqflist_by_idx('l') 4939858ba06dSBram Moolenaarendfunc 4940858ba06dSBram Moolenaar 4941858ba06dSBram Moolenaar" Test for the 'quickfixtextfunc' setting 4942858ba06dSBram Moolenaarfunc Tqfexpr(info) 4943858ba06dSBram Moolenaar if a:info.quickfix 494400e260bbSBram Moolenaar let qfl = getqflist({'id' : a:info.id, 'items' : 1}).items 4945858ba06dSBram Moolenaar else 494600e260bbSBram Moolenaar let qfl = getloclist(a:info.winid, {'id' : a:info.id, 'items' : 1}).items 4947858ba06dSBram Moolenaar endif 4948858ba06dSBram Moolenaar 494900e260bbSBram Moolenaar let l = [] 495000e260bbSBram Moolenaar for idx in range(a:info.start_idx - 1, a:info.end_idx - 1) 495100e260bbSBram Moolenaar let e = qfl[idx] 4952858ba06dSBram Moolenaar let s = '' 4953858ba06dSBram Moolenaar if e.bufnr != 0 4954858ba06dSBram Moolenaar let bname = bufname(e.bufnr) 4955858ba06dSBram Moolenaar let s ..= fnamemodify(bname, ':.') 4956858ba06dSBram Moolenaar endif 4957858ba06dSBram Moolenaar let s ..= '-' 4958858ba06dSBram Moolenaar let s ..= 'L' .. string(e.lnum) .. 'C' .. string(e.col) .. '-' 4959858ba06dSBram Moolenaar let s ..= e.text 496000e260bbSBram Moolenaar call add(l, s) 496100e260bbSBram Moolenaar endfor 4962858ba06dSBram Moolenaar 496300e260bbSBram Moolenaar return l 4964858ba06dSBram Moolenaarendfunc 4965858ba06dSBram Moolenaar 4966858ba06dSBram Moolenaarfunc Xtest_qftextfunc(cchar) 4967858ba06dSBram Moolenaar call s:setup_commands(a:cchar) 4968858ba06dSBram Moolenaar 4969858ba06dSBram Moolenaar set efm=%f:%l:%c:%m 4970858ba06dSBram Moolenaar set quickfixtextfunc=Tqfexpr 4971d43906d2SBram Moolenaar call assert_equal('Tqfexpr', &quickfixtextfunc) 4972d43906d2SBram Moolenaar call assert_equal('', 4973d43906d2SBram Moolenaar \ g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc) 4974858ba06dSBram Moolenaar Xexpr ['F1:10:2:green', 'F1:20:4:blue'] 4975858ba06dSBram Moolenaar Xwindow 4976858ba06dSBram Moolenaar call assert_equal('F1-L10C2-green', getline(1)) 4977858ba06dSBram Moolenaar call assert_equal('F1-L20C4-blue', getline(2)) 4978858ba06dSBram Moolenaar Xclose 4979858ba06dSBram Moolenaar set quickfixtextfunc&vim 4980858ba06dSBram Moolenaar Xwindow 4981858ba06dSBram Moolenaar call assert_equal('F1|10 col 2| green', getline(1)) 4982858ba06dSBram Moolenaar call assert_equal('F1|20 col 4| blue', getline(2)) 4983858ba06dSBram Moolenaar Xclose 4984858ba06dSBram Moolenaar set efm& 4985858ba06dSBram Moolenaar set quickfixtextfunc& 4986858ba06dSBram Moolenaar 4987858ba06dSBram Moolenaar " Test for per list 'quickfixtextfunc' setting 4988858ba06dSBram Moolenaar func PerQfText(info) 4989858ba06dSBram Moolenaar if a:info.quickfix 499000e260bbSBram Moolenaar let qfl = getqflist({'id' : a:info.id, 'items' : 1}).items 4991858ba06dSBram Moolenaar else 499200e260bbSBram Moolenaar let qfl = getloclist(a:info.winid, {'id' : a:info.id, 'items' : 1}).items 4993858ba06dSBram Moolenaar endif 4994858ba06dSBram Moolenaar if empty(qfl) 499500e260bbSBram Moolenaar return [] 4996858ba06dSBram Moolenaar endif 499700e260bbSBram Moolenaar let l = [] 499800e260bbSBram Moolenaar for idx in range(a:info.start_idx - 1, a:info.end_idx - 1) 499900e260bbSBram Moolenaar call add(l, 'Line ' .. qfl[idx].lnum .. ', Col ' .. qfl[idx].col) 500000e260bbSBram Moolenaar endfor 500100e260bbSBram Moolenaar return l 5002858ba06dSBram Moolenaar endfunc 5003858ba06dSBram Moolenaar set quickfixtextfunc=Tqfexpr 5004858ba06dSBram Moolenaar call g:Xsetlist([], ' ', {'quickfixtextfunc' : "PerQfText"}) 5005858ba06dSBram Moolenaar Xaddexpr ['F1:10:2:green', 'F1:20:4:blue'] 5006858ba06dSBram Moolenaar Xwindow 5007858ba06dSBram Moolenaar call assert_equal('Line 10, Col 2', getline(1)) 5008858ba06dSBram Moolenaar call assert_equal('Line 20, Col 4', getline(2)) 5009858ba06dSBram Moolenaar Xclose 5010d43906d2SBram Moolenaar call assert_equal(function('PerQfText'), 5011d43906d2SBram Moolenaar \ g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc) 50127ba5a7efSBram Moolenaar " Add entries to the list when the quickfix buffer is hidden 50137ba5a7efSBram Moolenaar Xaddexpr ['F1:30:6:red'] 50147ba5a7efSBram Moolenaar Xwindow 50157ba5a7efSBram Moolenaar call assert_equal('Line 30, Col 6', getline(3)) 50167ba5a7efSBram Moolenaar Xclose 5017858ba06dSBram Moolenaar call g:Xsetlist([], 'r', {'quickfixtextfunc' : ''}) 5018d43906d2SBram Moolenaar call assert_equal('', g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc) 5019858ba06dSBram Moolenaar set quickfixtextfunc& 5020858ba06dSBram Moolenaar delfunc PerQfText 5021858ba06dSBram Moolenaar 5022858ba06dSBram Moolenaar " Non-existing function 5023858ba06dSBram Moolenaar set quickfixtextfunc=Tabc 5024858ba06dSBram Moolenaar call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue']", 'E117:') 5025858ba06dSBram Moolenaar call assert_fails("Xwindow", 'E117:') 5026858ba06dSBram Moolenaar Xclose 5027858ba06dSBram Moolenaar set quickfixtextfunc& 5028858ba06dSBram Moolenaar 5029858ba06dSBram Moolenaar " set option to a non-function 5030858ba06dSBram Moolenaar set quickfixtextfunc=[10,\ 20] 5031858ba06dSBram Moolenaar call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue']", 'E117:') 5032858ba06dSBram Moolenaar call assert_fails("Xwindow", 'E117:') 5033858ba06dSBram Moolenaar Xclose 5034858ba06dSBram Moolenaar set quickfixtextfunc& 5035858ba06dSBram Moolenaar 5036858ba06dSBram Moolenaar " set option to a function with different set of arguments 5037858ba06dSBram Moolenaar func Xqftext(a, b, c) 5038858ba06dSBram Moolenaar return a:a .. a:b .. a:c 5039858ba06dSBram Moolenaar endfunc 5040858ba06dSBram Moolenaar set quickfixtextfunc=Xqftext 5041858ba06dSBram Moolenaar call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue']", 'E119:') 5042858ba06dSBram Moolenaar call assert_fails("Xwindow", 'E119:') 5043858ba06dSBram Moolenaar Xclose 504400e260bbSBram Moolenaar 504500e260bbSBram Moolenaar " set option to a function that returns a list with non-strings 504600e260bbSBram Moolenaar func Xqftext2(d) 504700e260bbSBram Moolenaar return ['one', [], 'two'] 504800e260bbSBram Moolenaar endfunc 504900e260bbSBram Moolenaar set quickfixtextfunc=Xqftext2 505000e260bbSBram Moolenaar call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue', 'F1:30:6:red']", 505100e260bbSBram Moolenaar \ 'E730:') 505200e260bbSBram Moolenaar call assert_fails('Xwindow', 'E730:') 5053d43906d2SBram Moolenaar call assert_equal(['one', 'F1|20 col 4| blue', 'F1|30 col 6| red'], 5054d43906d2SBram Moolenaar \ getline(1, '$')) 505500e260bbSBram Moolenaar Xclose 505600e260bbSBram Moolenaar 5057858ba06dSBram Moolenaar set quickfixtextfunc& 5058858ba06dSBram Moolenaar delfunc Xqftext 505900e260bbSBram Moolenaar delfunc Xqftext2 5060d43906d2SBram Moolenaar 5061d43906d2SBram Moolenaar " set the global option to a lambda function 5062d43906d2SBram Moolenaar set quickfixtextfunc={d\ ->\ map(g:Xgetlist({'id'\ :\ d.id,\ 'items'\ :\ 1}).items[d.start_idx-1:d.end_idx-1],\ 'v:val.text')} 5063d43906d2SBram Moolenaar Xexpr ['F1:10:2:green', 'F1:20:4:blue'] 5064d43906d2SBram Moolenaar Xwindow 5065d43906d2SBram Moolenaar call assert_equal(['green', 'blue'], getline(1, '$')) 5066d43906d2SBram Moolenaar Xclose 5067d43906d2SBram Moolenaar call assert_equal("{d -> map(g:Xgetlist({'id' : d.id, 'items' : 1}).items[d.start_idx-1:d.end_idx-1], 'v:val.text')}", &quickfixtextfunc) 5068d43906d2SBram Moolenaar set quickfixtextfunc& 5069d43906d2SBram Moolenaar 5070d43906d2SBram Moolenaar " use a lambda function that returns an empty list 5071d43906d2SBram Moolenaar set quickfixtextfunc={d\ ->\ []} 5072d43906d2SBram Moolenaar Xexpr ['F1:10:2:green', 'F1:20:4:blue'] 5073d43906d2SBram Moolenaar Xwindow 5074d43906d2SBram Moolenaar call assert_equal(['F1|10 col 2| green', 'F1|20 col 4| blue'], 5075d43906d2SBram Moolenaar \ getline(1, '$')) 5076d43906d2SBram Moolenaar Xclose 5077d43906d2SBram Moolenaar set quickfixtextfunc& 5078d43906d2SBram Moolenaar 5079d43906d2SBram Moolenaar " use a lambda function that returns a list with empty strings 5080d43906d2SBram Moolenaar set quickfixtextfunc={d\ ->\ ['',\ '']} 5081d43906d2SBram Moolenaar Xexpr ['F1:10:2:green', 'F1:20:4:blue'] 5082d43906d2SBram Moolenaar Xwindow 5083d43906d2SBram Moolenaar call assert_equal(['F1|10 col 2| green', 'F1|20 col 4| blue'], 5084d43906d2SBram Moolenaar \ getline(1, '$')) 5085d43906d2SBram Moolenaar Xclose 5086d43906d2SBram Moolenaar set quickfixtextfunc& 5087d43906d2SBram Moolenaar 5088d43906d2SBram Moolenaar " set the per-quickfix list text function to a lambda function 5089d43906d2SBram Moolenaar call g:Xsetlist([], ' ', 5090d43906d2SBram Moolenaar \ {'quickfixtextfunc' : 5091d43906d2SBram Moolenaar \ {d -> map(g:Xgetlist({'id' : d.id, 'items' : 1}).items[d.start_idx-1:d.end_idx-1], 5092d43906d2SBram Moolenaar \ "'Line ' .. v:val.lnum .. ', Col ' .. v:val.col")}}) 5093d43906d2SBram Moolenaar Xaddexpr ['F1:10:2:green', 'F1:20:4:blue'] 5094d43906d2SBram Moolenaar Xwindow 5095d43906d2SBram Moolenaar call assert_equal('Line 10, Col 2', getline(1)) 5096d43906d2SBram Moolenaar call assert_equal('Line 20, Col 4', getline(2)) 5097d43906d2SBram Moolenaar Xclose 5098d43906d2SBram Moolenaar call assert_match("function('<lambda>\\d\\+')", string(g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc)) 5099d43906d2SBram Moolenaar call g:Xsetlist([], 'f') 5100858ba06dSBram Moolenaarendfunc 5101858ba06dSBram Moolenaar 5102858ba06dSBram Moolenaarfunc Test_qftextfunc() 5103858ba06dSBram Moolenaar call Xtest_qftextfunc('c') 5104858ba06dSBram Moolenaar call Xtest_qftextfunc('l') 5105858ba06dSBram Moolenaarendfunc 5106858ba06dSBram Moolenaar 5107ec98e93aSBram Moolenaar" Running :lhelpgrep command more than once in a help window, doesn't jump to 5108ec98e93aSBram Moolenaar" the help topic 5109ec98e93aSBram Moolenaarfunc Test_lhelpgrep_from_help_window() 5110ec98e93aSBram Moolenaar call mkdir('Xtestdir/doc', 'p') 5111ec98e93aSBram Moolenaar call writefile(['window'], 'Xtestdir/doc/a.txt') 5112ec98e93aSBram Moolenaar call writefile(['buffer'], 'Xtestdir/doc/b.txt') 5113ec98e93aSBram Moolenaar let save_rtp = &rtp 5114ec98e93aSBram Moolenaar let &rtp = 'Xtestdir' 5115ec98e93aSBram Moolenaar lhelpgrep window 5116ec98e93aSBram Moolenaar lhelpgrep buffer 5117ec98e93aSBram Moolenaar call assert_equal('b.txt', fnamemodify(@%, ":p:t")) 5118ec98e93aSBram Moolenaar lhelpgrep window 5119ec98e93aSBram Moolenaar call assert_equal('a.txt', fnamemodify(@%, ":p:t")) 5120ec98e93aSBram Moolenaar let &rtp = save_rtp 5121ec98e93aSBram Moolenaar call delete('Xtestdir', 'rf') 5122ec98e93aSBram Moolenaar new | only! 5123ec98e93aSBram Moolenaarendfunc 5124ec98e93aSBram Moolenaar 5125f7c4d836SBram Moolenaar" Test for the crash fixed by 7.3.715 5126f7c4d836SBram Moolenaarfunc Test_setloclist_crash() 5127f7c4d836SBram Moolenaar %bw! 5128f7c4d836SBram Moolenaar let g:BufNum = bufnr() 5129f7c4d836SBram Moolenaar augroup QF_Test 5130f7c4d836SBram Moolenaar au! 5131f7c4d836SBram Moolenaar au BufUnload * call setloclist(0, [{'bufnr':g:BufNum, 'lnum':1, 'col':1, 'text': 'tango down'}]) 5132f7c4d836SBram Moolenaar augroup END 5133f7c4d836SBram Moolenaar 5134f7c4d836SBram Moolenaar try 5135f7c4d836SBram Moolenaar lvimgrep /.*/ *.mak 5136f7c4d836SBram Moolenaar catch /E926:/ 5137f7c4d836SBram Moolenaar endtry 5138f7c4d836SBram Moolenaar call assert_equal('tango down', getloclist(0, {'items' : 0}).items[0].text) 5139f7c4d836SBram Moolenaar call assert_equal(1, getloclist(0, {'size' : 0}).size) 5140f7c4d836SBram Moolenaar 5141f7c4d836SBram Moolenaar augroup QF_Test 5142f7c4d836SBram Moolenaar au! 5143f7c4d836SBram Moolenaar augroup END 5144f7c4d836SBram Moolenaar unlet g:BufNum 5145f7c4d836SBram Moolenaar %bw! 5146f7c4d836SBram Moolenaarendfunc 5147f7c4d836SBram Moolenaar 51486a0cc916SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab 5149