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