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>
35*bb01a1efSYegappan Lakshmanan    command! -count=999 -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>
72*bb01a1efSYegappan Lakshmanan    command! -count=999 -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
705e5a2dc87SBram Moolenaardef Test_helpgrep_vim9_restore_cpo()
706e5a2dc87SBram Moolenaar  assert_equal('aABceFs', &cpo)
707e5a2dc87SBram Moolenaar
708e5a2dc87SBram Moolenaar  var rtp_save = &rtp
709e5a2dc87SBram Moolenaar  var dir = 'Xruntime/after'
710e5a2dc87SBram Moolenaar  &rtp ..= ',' .. dir
711e5a2dc87SBram Moolenaar  mkdir(dir .. '/ftplugin', 'p')
71239f3b141SBram Moolenaar  writefile(['vim9script'], dir .. '/ftplugin/qf.vim')
713e5a2dc87SBram Moolenaar  filetype plugin on
714e5a2dc87SBram Moolenaar  silent helpgrep grail
715e5a2dc87SBram Moolenaar  cwindow
716e5a2dc87SBram Moolenaar  silent helpgrep grail
717e5a2dc87SBram Moolenaar
718e5a2dc87SBram Moolenaar  assert_equal('aABceFs', &cpo)
719e5a2dc87SBram Moolenaar  delete(dir, 'rf')
720e5a2dc87SBram Moolenaar  &rtp = rtp_save
721e5a2dc87SBram Moolenaar  cclose
722e5a2dc87SBram Moolenaar  helpclose
723e5a2dc87SBram Moolenaarenddef
724e5a2dc87SBram Moolenaar
7256920c72dSBram Moolenaarfunc Test_errortitle()
7266920c72dSBram Moolenaar  augroup QfBufWinEnter
7276920c72dSBram Moolenaar    au!
7286920c72dSBram Moolenaar    au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
7296920c72dSBram Moolenaar  augroup END
7306920c72dSBram Moolenaar  copen
7316920c72dSBram 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'')'}]
7326920c72dSBram Moolenaar  call setqflist(a)
7336920c72dSBram Moolenaar  call assert_equal(':setqflist()', g:a)
7346920c72dSBram Moolenaar  augroup QfBufWinEnter
7356920c72dSBram Moolenaar    au!
7366920c72dSBram Moolenaar  augroup END
7376920c72dSBram Moolenaar  augroup! QfBufWinEnter
7386920c72dSBram Moolenaarendfunc
739e27dba49SBram Moolenaar
7405584df65SBram Moolenaarfunc Test_vimgreptitle()
7415584df65SBram Moolenaar  augroup QfBufWinEnter
7425584df65SBram Moolenaar    au!
7435584df65SBram Moolenaar    au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
7445584df65SBram Moolenaar  augroup END
7455584df65SBram Moolenaar  try
7465584df65SBram Moolenaar    vimgrep /pattern/j file
7475584df65SBram Moolenaar  catch /E480/
7485584df65SBram Moolenaar  endtry
7495584df65SBram Moolenaar  copen
7505584df65SBram Moolenaar  call assert_equal(':    vimgrep /pattern/j file', g:a)
7515584df65SBram Moolenaar  augroup QfBufWinEnter
7525584df65SBram Moolenaar    au!
7535584df65SBram Moolenaar  augroup END
7545584df65SBram Moolenaar  augroup! QfBufWinEnter
7555584df65SBram Moolenaarendfunc
7565584df65SBram Moolenaar
7572b946c9fSBram Moolenaarfunc XqfTitleTests(cchar)
7583ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
759e27dba49SBram Moolenaar
7603ef5bf7dSBram Moolenaar  Xgetexpr ['file:1:1:message']
7613ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
762e27dba49SBram Moolenaar  if a:cchar == 'c'
763e27dba49SBram Moolenaar    call setqflist(l, 'r')
764e27dba49SBram Moolenaar  else
765e27dba49SBram Moolenaar    call setloclist(0, l, 'r')
766e27dba49SBram Moolenaar  endif
767e27dba49SBram Moolenaar
7683ef5bf7dSBram Moolenaar  Xopen
769e27dba49SBram Moolenaar  if a:cchar == 'c'
770e27dba49SBram Moolenaar    let title = ':setqflist()'
771e27dba49SBram Moolenaar  else
772e27dba49SBram Moolenaar    let title = ':setloclist()'
773e27dba49SBram Moolenaar  endif
774e27dba49SBram Moolenaar  call assert_equal(title, w:quickfix_title)
7753ef5bf7dSBram Moolenaar  Xclose
7762b946c9fSBram Moolenaarendfunc
777e27dba49SBram Moolenaar
778e27dba49SBram Moolenaar" Tests for quickfix window's title
7792b946c9fSBram Moolenaarfunc Test_qf_title()
780e27dba49SBram Moolenaar  call XqfTitleTests('c')
781e27dba49SBram Moolenaar  call XqfTitleTests('l')
7822b946c9fSBram Moolenaarendfunc
783e27dba49SBram Moolenaar
784e27dba49SBram Moolenaar" Tests for 'errorformat'
7852b946c9fSBram Moolenaarfunc Test_efm()
786e27dba49SBram Moolenaar  let save_efm = &efm
787e27dba49SBram Moolenaar  set efm=%EEEE%m,%WWWW%m,%+CCCC%.%#,%-GGGG%.%#
788e27dba49SBram Moolenaar  cgetexpr ['WWWW', 'EEEE', 'CCCC']
789e27dba49SBram Moolenaar  let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
790e27dba49SBram Moolenaar  call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
791e27dba49SBram Moolenaar  cgetexpr ['WWWW', 'GGGG', 'EEEE', 'CCCC']
792e27dba49SBram Moolenaar  let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
793e27dba49SBram Moolenaar  call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
794e27dba49SBram Moolenaar  cgetexpr ['WWWW', 'GGGG', 'ZZZZ', 'EEEE', 'CCCC', 'YYYY']
795e27dba49SBram Moolenaar  let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
796e27dba49SBram Moolenaar  call assert_equal("[['W', 1], ['ZZZZ', 0], ['E^@CCCC', 1], ['YYYY', 0]]", l)
797e27dba49SBram Moolenaar  let &efm = save_efm
7982b946c9fSBram Moolenaarendfunc
7991ff2b64bSBram Moolenaar
8001ff2b64bSBram Moolenaar" This will test for problems in quickfix:
8011ff2b64bSBram Moolenaar" A. incorrectly copying location lists which caused the location list to show
8021ff2b64bSBram Moolenaar"    a different name than the file that was actually being displayed.
8031ff2b64bSBram Moolenaar" B. not reusing the window for which the location list window is opened but
8041ff2b64bSBram Moolenaar"    instead creating new windows.
8051ff2b64bSBram Moolenaar" C. make sure that the location list window is not reused instead of the
8061ff2b64bSBram Moolenaar"    window it belongs to.
8071ff2b64bSBram Moolenaar"
8081ff2b64bSBram Moolenaar" Set up the test environment:
8092b946c9fSBram Moolenaarfunc ReadTestProtocol(name)
8101ff2b64bSBram Moolenaar  let base = substitute(a:name, '\v^test://(.*)%(\.[^.]+)?', '\1', '')
8111ff2b64bSBram Moolenaar  let word = substitute(base, '\v(.*)\..*', '\1', '')
8121ff2b64bSBram Moolenaar
8131ff2b64bSBram Moolenaar  setl modifiable
8141ff2b64bSBram Moolenaar  setl noreadonly
8151ff2b64bSBram Moolenaar  setl noswapfile
8161ff2b64bSBram Moolenaar  setl bufhidden=delete
8171ff2b64bSBram Moolenaar  %del _
8181ff2b64bSBram Moolenaar  " For problem 2:
8191ff2b64bSBram Moolenaar  " 'buftype' has to be set to reproduce the constant opening of new windows
8201ff2b64bSBram Moolenaar  setl buftype=nofile
8211ff2b64bSBram Moolenaar
8221ff2b64bSBram Moolenaar  call setline(1, word)
8231ff2b64bSBram Moolenaar
8241ff2b64bSBram Moolenaar  setl nomodified
8251ff2b64bSBram Moolenaar  setl nomodifiable
8261ff2b64bSBram Moolenaar  setl readonly
8271ff2b64bSBram Moolenaar  exe 'doautocmd BufRead ' . substitute(a:name, '\v^test://(.*)', '\1', '')
8282b946c9fSBram Moolenaarendfunc
8291ff2b64bSBram Moolenaar
8302b946c9fSBram Moolenaarfunc Test_locationlist()
8311ff2b64bSBram Moolenaar  enew
8321ff2b64bSBram Moolenaar
8331ff2b64bSBram Moolenaar  augroup testgroup
8341ff2b64bSBram Moolenaar    au!
8351ff2b64bSBram Moolenaar    autocmd BufReadCmd test://* call ReadTestProtocol(expand("<amatch>"))
8361ff2b64bSBram Moolenaar  augroup END
8371ff2b64bSBram Moolenaar
8381ff2b64bSBram Moolenaar  let words = [ "foo", "bar", "baz", "quux", "shmoo", "spam", "eggs" ]
8391ff2b64bSBram Moolenaar
8401ff2b64bSBram Moolenaar  let qflist = []
8411ff2b64bSBram Moolenaar  for word in words
8421ff2b64bSBram Moolenaar    call add(qflist, {'filename': 'test://' . word . '.txt', 'text': 'file ' . word . '.txt', })
8431ff2b64bSBram Moolenaar    " NOTE: problem 1:
8441ff2b64bSBram Moolenaar    " intentionally not setting 'lnum' so that the quickfix entries are not
8451ff2b64bSBram Moolenaar    " valid
846aad222c9SBram Moolenaar    eval qflist->setloclist(0, ' ')
8471ff2b64bSBram Moolenaar  endfor
8481ff2b64bSBram Moolenaar
8491ff2b64bSBram Moolenaar  " Test A
8501ff2b64bSBram Moolenaar  lrewind
8511ff2b64bSBram Moolenaar  enew
8521ff2b64bSBram Moolenaar  lopen
85399895eacSBram Moolenaar  4lnext
8541ff2b64bSBram Moolenaar  vert split
8551ff2b64bSBram Moolenaar  wincmd L
8561ff2b64bSBram Moolenaar  lopen
8571ff2b64bSBram Moolenaar  wincmd p
8581ff2b64bSBram Moolenaar  lnext
8591ff2b64bSBram Moolenaar  let fileName = expand("%")
8601ff2b64bSBram Moolenaar  wincmd p
8611ff2b64bSBram Moolenaar  let locationListFileName = substitute(getline(line('.')), '\([^|]*\)|.*', '\1', '')
8621ff2b64bSBram Moolenaar  let fileName = substitute(fileName, '\\', '/', 'g')
8631ff2b64bSBram Moolenaar  let locationListFileName = substitute(locationListFileName, '\\', '/', 'g')
8641ff2b64bSBram Moolenaar  call assert_equal("test://bar.txt", fileName)
8651ff2b64bSBram Moolenaar  call assert_equal("test://bar.txt", locationListFileName)
8661ff2b64bSBram Moolenaar
8671ff2b64bSBram Moolenaar  wincmd n | only
8681ff2b64bSBram Moolenaar
8691ff2b64bSBram Moolenaar  " Test B:
8701ff2b64bSBram Moolenaar  lrewind
8711ff2b64bSBram Moolenaar  lopen
8721ff2b64bSBram Moolenaar  2
8731ff2b64bSBram Moolenaar  exe "normal \<CR>"
8741ff2b64bSBram Moolenaar  wincmd p
8751ff2b64bSBram Moolenaar  3
8761ff2b64bSBram Moolenaar  exe "normal \<CR>"
8771ff2b64bSBram Moolenaar  wincmd p
8781ff2b64bSBram Moolenaar  4
8791ff2b64bSBram Moolenaar  exe "normal \<CR>"
8801ff2b64bSBram Moolenaar  call assert_equal(2, winnr('$'))
8811ff2b64bSBram Moolenaar  wincmd n | only
8821ff2b64bSBram Moolenaar
8831ff2b64bSBram Moolenaar  " Test C:
8841ff2b64bSBram Moolenaar  lrewind
8851ff2b64bSBram Moolenaar  lopen
8861ff2b64bSBram Moolenaar  " Let's move the location list window to the top to check whether it (the
8871ff2b64bSBram Moolenaar  " first window found) will be reused when we try to open new windows:
8881ff2b64bSBram Moolenaar  wincmd K
8891ff2b64bSBram Moolenaar  2
8901ff2b64bSBram Moolenaar  exe "normal \<CR>"
8911ff2b64bSBram Moolenaar  wincmd p
8921ff2b64bSBram Moolenaar  3
8931ff2b64bSBram Moolenaar  exe "normal \<CR>"
8941ff2b64bSBram Moolenaar  wincmd p
8951ff2b64bSBram Moolenaar  4
8961ff2b64bSBram Moolenaar  exe "normal \<CR>"
8971ff2b64bSBram Moolenaar  1wincmd w
8981ff2b64bSBram Moolenaar  call assert_equal('quickfix', &buftype)
8991ff2b64bSBram Moolenaar  2wincmd w
9001ff2b64bSBram Moolenaar  let bufferName = expand("%")
9011ff2b64bSBram Moolenaar  let bufferName = substitute(bufferName, '\\', '/', 'g')
9021ff2b64bSBram Moolenaar  call assert_equal('test://quux.txt', bufferName)
9031ff2b64bSBram Moolenaar
9041ff2b64bSBram Moolenaar  wincmd n | only
9051ff2b64bSBram Moolenaar
9061ff2b64bSBram Moolenaar  augroup! testgroup
9072b946c9fSBram Moolenaarendfunc
9080899d698SBram Moolenaar
9092b946c9fSBram Moolenaarfunc Test_locationlist_curwin_was_closed()
9100899d698SBram Moolenaar  augroup testgroup
9110899d698SBram Moolenaar    au!
912d106e5baSBram Moolenaar    autocmd BufReadCmd test_curwin.txt call R(expand("<amatch>"))
9130899d698SBram Moolenaar  augroup END
9140899d698SBram Moolenaar
9152b946c9fSBram Moolenaar  func! R(n)
9160899d698SBram Moolenaar    quit
9170899d698SBram Moolenaar  endfunc
9180899d698SBram Moolenaar
9190899d698SBram Moolenaar  new
9200899d698SBram Moolenaar  let q = []
921d106e5baSBram Moolenaar  call add(q, {'filename': 'test_curwin.txt' })
9220899d698SBram Moolenaar  call setloclist(0, q)
9230899d698SBram Moolenaar  call assert_fails('lrewind', 'E924:')
9240899d698SBram Moolenaar
9250899d698SBram Moolenaar  augroup! testgroup
9262b946c9fSBram Moolenaarendfunc
9277eba3d2cSBram Moolenaar
9282b946c9fSBram Moolenaarfunc Test_locationlist_cross_tab_jump()
9290a9046fbSBram Moolenaar  call writefile(['loclistfoo'], 'loclistfoo')
9300a9046fbSBram Moolenaar  call writefile(['loclistbar'], 'loclistbar')
9310a9046fbSBram Moolenaar  set switchbuf=usetab
9320a9046fbSBram Moolenaar
9330a9046fbSBram Moolenaar  edit loclistfoo
9340a9046fbSBram Moolenaar  tabedit loclistbar
9350a9046fbSBram Moolenaar  silent lgrep loclistfoo loclist*
9360a9046fbSBram Moolenaar  call assert_equal(1, tabpagenr())
9370a9046fbSBram Moolenaar
9380a9046fbSBram Moolenaar  enew | only | tabonly
9390a9046fbSBram Moolenaar  set switchbuf&vim
9400a9046fbSBram Moolenaar  call delete('loclistfoo')
9410a9046fbSBram Moolenaar  call delete('loclistbar')
9422b946c9fSBram Moolenaarendfunc
9430a9046fbSBram Moolenaar
9447eba3d2cSBram Moolenaar" More tests for 'errorformat'
9452b946c9fSBram Moolenaarfunc Test_efm1()
9467eba3d2cSBram Moolenaar  " The 'errorformat' setting is different on non-Unix systems.
9477eba3d2cSBram Moolenaar  " This test works only on Unix-like systems.
9486d91bcb4SBram Moolenaar  CheckUnix
9497eba3d2cSBram Moolenaar
950c79745a8SBram Moolenaar  let l =<< trim [DATA]
951c79745a8SBram Moolenaar    "Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set.
952c79745a8SBram Moolenaar    "Xtestfile", line 6 col 19; this is an error
953c79745a8SBram Moolenaar    gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include  version.c
954c79745a8SBram Moolenaar    Xtestfile:9: parse error before `asd'
955c79745a8SBram Moolenaar    make: *** [vim] Error 1
956c79745a8SBram Moolenaar    in file "Xtestfile" linenr 10: there is an error
957c79745a8SBram Moolenaar
958c79745a8SBram Moolenaar    2 returned
959c79745a8SBram Moolenaar    "Xtestfile", line 11 col 1; this is an error
960c79745a8SBram Moolenaar    "Xtestfile", line 12 col 2; this is another error
961c79745a8SBram Moolenaar    "Xtestfile", line 14:10; this is an error in column 10
962c79745a8SBram Moolenaar    =Xtestfile=, line 15:10; this is another error, but in vcol 10 this time
963c79745a8SBram Moolenaar    "Xtestfile", linenr 16: yet another problem
964c79745a8SBram Moolenaar    Error in "Xtestfile" at line 17:
965c79745a8SBram Moolenaar    x should be a dot
966c79745a8SBram Moolenaar    	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 17
967c79745a8SBram Moolenaar                ^
968c79745a8SBram Moolenaar    Error in "Xtestfile" at line 18:
969c79745a8SBram Moolenaar    x should be a dot
970c79745a8SBram Moolenaar    	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 18
971c79745a8SBram Moolenaar    .............^
972c79745a8SBram Moolenaar    Error in "Xtestfile" at line 19:
973c79745a8SBram Moolenaar    x should be a dot
974c79745a8SBram Moolenaar    	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 19
975c79745a8SBram Moolenaar    --------------^
976c79745a8SBram Moolenaar    Error in "Xtestfile" at line 20:
977c79745a8SBram Moolenaar    x should be a dot
978c79745a8SBram Moolenaar    	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 20
979c79745a8SBram Moolenaar    	       ^
980c79745a8SBram Moolenaar
981c79745a8SBram Moolenaar    Does anyone know what is the problem and how to correction it?
982c79745a8SBram Moolenaar    "Xtestfile", line 21 col 9: What is the title of the quickfix window?
983c79745a8SBram Moolenaar    "Xtestfile", line 22 col 9: What is the title of the quickfix window?
984c79745a8SBram Moolenaar  [DATA]
9857eba3d2cSBram Moolenaar
9867eba3d2cSBram Moolenaar  call writefile(l, 'Xerrorfile1')
9877eba3d2cSBram Moolenaar  call writefile(l[:-2], 'Xerrorfile2')
9887eba3d2cSBram Moolenaar
989e7eb9270SBram Moolenaar  let m =<< [DATA]
990c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  2
991c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  3
992c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  4
993c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  5
994c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  6
995c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  7
996c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  8
997c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  9
998c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 10
999c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 11
1000c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 12
1001c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 13
1002c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 14
1003c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 15
1004c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 16
1005c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 17
1006c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 18
1007c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 19
1008c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 20
1009c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 21
1010c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 22
1011c79745a8SBram Moolenaar[DATA]
10127eba3d2cSBram Moolenaar  call writefile(m, 'Xtestfile')
10137eba3d2cSBram Moolenaar
10147eba3d2cSBram Moolenaar  let save_efm = &efm
10157eba3d2cSBram Moolenaar  set efm+==%f=\\,\ line\ %l%*\\D%v%*[^\ ]\ %m
10167eba3d2cSBram Moolenaar  set efm^=%AError\ in\ \"%f\"\ at\ line\ %l:,%Z%p^,%C%m
10177eba3d2cSBram Moolenaar
10187eba3d2cSBram Moolenaar  exe 'cf Xerrorfile2'
10197eba3d2cSBram Moolenaar  clast
10207eba3d2cSBram Moolenaar  copen
10217eba3d2cSBram Moolenaar  call assert_equal(':cf Xerrorfile2', w:quickfix_title)
10227eba3d2cSBram Moolenaar  wincmd p
10237eba3d2cSBram Moolenaar
10247eba3d2cSBram Moolenaar  exe 'cf Xerrorfile1'
10257eba3d2cSBram Moolenaar  call assert_equal([4, 12], [line('.'), col('.')])
10267eba3d2cSBram Moolenaar  cn
10277eba3d2cSBram Moolenaar  call assert_equal([6, 19], [line('.'), col('.')])
10287eba3d2cSBram Moolenaar  cn
10297eba3d2cSBram Moolenaar  call assert_equal([9, 2], [line('.'), col('.')])
10307eba3d2cSBram Moolenaar  cn
10317eba3d2cSBram Moolenaar  call assert_equal([10, 2], [line('.'), col('.')])
10327eba3d2cSBram Moolenaar  cn
10337eba3d2cSBram Moolenaar  call assert_equal([11, 1], [line('.'), col('.')])
10347eba3d2cSBram Moolenaar  cn
10357eba3d2cSBram Moolenaar  call assert_equal([12, 2], [line('.'), col('.')])
10367eba3d2cSBram Moolenaar  cn
10377eba3d2cSBram Moolenaar  call assert_equal([14, 10], [line('.'), col('.')])
10387eba3d2cSBram Moolenaar  cn
10397eba3d2cSBram Moolenaar  call assert_equal([15, 3, 10], [line('.'), col('.'), virtcol('.')])
10407eba3d2cSBram Moolenaar  cn
10417eba3d2cSBram Moolenaar  call assert_equal([16, 2], [line('.'), col('.')])
10427eba3d2cSBram Moolenaar  cn
10437eba3d2cSBram Moolenaar  call assert_equal([17, 6], [line('.'), col('.')])
10447eba3d2cSBram Moolenaar  cn
10457eba3d2cSBram Moolenaar  call assert_equal([18, 7], [line('.'), col('.')])
10467eba3d2cSBram Moolenaar  cn
10477eba3d2cSBram Moolenaar  call assert_equal([19, 8], [line('.'), col('.')])
10487eba3d2cSBram Moolenaar  cn
10497eba3d2cSBram Moolenaar  call assert_equal([20, 9], [line('.'), col('.')])
10507eba3d2cSBram Moolenaar  clast
10517eba3d2cSBram Moolenaar  cprev
10527eba3d2cSBram Moolenaar  cprev
10537eba3d2cSBram Moolenaar  wincmd w
10547eba3d2cSBram Moolenaar  call assert_equal(':cf Xerrorfile1', w:quickfix_title)
10557eba3d2cSBram Moolenaar  wincmd p
10567eba3d2cSBram Moolenaar
10577eba3d2cSBram Moolenaar  let &efm = save_efm
10587eba3d2cSBram Moolenaar  call delete('Xerrorfile1')
10597eba3d2cSBram Moolenaar  call delete('Xerrorfile2')
10607eba3d2cSBram Moolenaar  call delete('Xtestfile')
10612b946c9fSBram Moolenaarendfunc
1062ffec3c53SBram Moolenaar
1063ab47c61fSBram Moolenaar" Test for quickfix directory stack support
10642b946c9fSBram Moolenaarfunc s:dir_stack_tests(cchar)
106538df43bdSBram Moolenaar  call s:setup_commands(a:cchar)
106638df43bdSBram Moolenaar
1067ab47c61fSBram Moolenaar  let save_efm=&efm
1068ab47c61fSBram Moolenaar  set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
1069ab47c61fSBram Moolenaar
1070361c8f0eSBram Moolenaar  let lines = ["Entering dir 'dir1/a'",
1071361c8f0eSBram Moolenaar		\ 'habits2.txt:1:Nine Healthy Habits',
1072361c8f0eSBram Moolenaar		\ "Entering dir 'b'",
1073361c8f0eSBram Moolenaar		\ 'habits3.txt:2:0 Hours of television',
1074361c8f0eSBram Moolenaar		\ 'habits2.txt:7:5 Small meals',
1075361c8f0eSBram Moolenaar		\ "Entering dir 'dir1/c'",
1076361c8f0eSBram Moolenaar		\ 'habits4.txt:3:1 Hour of exercise',
1077361c8f0eSBram Moolenaar		\ "Leaving dir 'dir1/c'",
1078361c8f0eSBram Moolenaar		\ "Leaving dir 'dir1/a'",
1079361c8f0eSBram Moolenaar		\ 'habits1.txt:4:2 Liters of water',
1080361c8f0eSBram Moolenaar		\ "Entering dir 'dir2'",
1081361c8f0eSBram Moolenaar		\ 'habits5.txt:5:3 Cups of hot green tea',
1082361c8f0eSBram Moolenaar		\ "Leaving dir 'dir2'"
1083361c8f0eSBram Moolenaar		\]
1084ab47c61fSBram Moolenaar
1085361c8f0eSBram Moolenaar  Xexpr ""
1086361c8f0eSBram Moolenaar  for l in lines
1087361c8f0eSBram Moolenaar      Xaddexpr l
1088361c8f0eSBram Moolenaar  endfor
1089ab47c61fSBram Moolenaar
10903ef5bf7dSBram Moolenaar  let qf = g:Xgetlist()
1091ab47c61fSBram Moolenaar
1092ab47c61fSBram Moolenaar  call assert_equal('dir1/a/habits2.txt', bufname(qf[1].bufnr))
1093ab47c61fSBram Moolenaar  call assert_equal(1, qf[1].lnum)
1094ab47c61fSBram Moolenaar  call assert_equal('dir1/a/b/habits3.txt', bufname(qf[3].bufnr))
1095ab47c61fSBram Moolenaar  call assert_equal(2, qf[3].lnum)
1096ab47c61fSBram Moolenaar  call assert_equal('dir1/a/habits2.txt', bufname(qf[4].bufnr))
1097ab47c61fSBram Moolenaar  call assert_equal(7, qf[4].lnum)
1098ab47c61fSBram Moolenaar  call assert_equal('dir1/c/habits4.txt', bufname(qf[6].bufnr))
1099ab47c61fSBram Moolenaar  call assert_equal(3, qf[6].lnum)
1100ab47c61fSBram Moolenaar  call assert_equal('habits1.txt', bufname(qf[9].bufnr))
1101ab47c61fSBram Moolenaar  call assert_equal(4, qf[9].lnum)
1102ab47c61fSBram Moolenaar  call assert_equal('dir2/habits5.txt', bufname(qf[11].bufnr))
1103ab47c61fSBram Moolenaar  call assert_equal(5, qf[11].lnum)
1104ab47c61fSBram Moolenaar
1105ab47c61fSBram Moolenaar  let &efm=save_efm
11062b946c9fSBram Moolenaarendfunc
1107ab47c61fSBram Moolenaar
1108ab47c61fSBram Moolenaar" Tests for %D and %X errorformat options
11092b946c9fSBram Moolenaarfunc Test_efm_dirstack()
1110ab47c61fSBram Moolenaar  " Create the directory stack and files
1111ab47c61fSBram Moolenaar  call mkdir('dir1')
1112ab47c61fSBram Moolenaar  call mkdir('dir1/a')
1113ab47c61fSBram Moolenaar  call mkdir('dir1/a/b')
1114ab47c61fSBram Moolenaar  call mkdir('dir1/c')
1115ab47c61fSBram Moolenaar  call mkdir('dir2')
1116ab47c61fSBram Moolenaar
1117ab47c61fSBram Moolenaar  let lines = ["Nine Healthy Habits",
1118ab47c61fSBram Moolenaar		\ "0 Hours of television",
1119ab47c61fSBram Moolenaar		\ "1 Hour of exercise",
1120ab47c61fSBram Moolenaar		\ "2 Liters of water",
1121ab47c61fSBram Moolenaar		\ "3 Cups of hot green tea",
1122ab47c61fSBram Moolenaar		\ "4 Short mental breaks",
1123ab47c61fSBram Moolenaar		\ "5 Small meals",
1124ab47c61fSBram Moolenaar		\ "6 AM wake up time",
1125ab47c61fSBram Moolenaar		\ "7 Minutes of laughter",
1126ab47c61fSBram Moolenaar		\ "8 Hours of sleep (at least)",
1127ab47c61fSBram Moolenaar		\ "9 PM end of the day and off to bed"
1128ab47c61fSBram Moolenaar		\ ]
1129ab47c61fSBram Moolenaar  call writefile(lines, 'habits1.txt')
1130ab47c61fSBram Moolenaar  call writefile(lines, 'dir1/a/habits2.txt')
1131ab47c61fSBram Moolenaar  call writefile(lines, 'dir1/a/b/habits3.txt')
1132ab47c61fSBram Moolenaar  call writefile(lines, 'dir1/c/habits4.txt')
1133ab47c61fSBram Moolenaar  call writefile(lines, 'dir2/habits5.txt')
1134ab47c61fSBram Moolenaar
1135ab47c61fSBram Moolenaar  call s:dir_stack_tests('c')
1136ab47c61fSBram Moolenaar  call s:dir_stack_tests('l')
1137ab47c61fSBram Moolenaar
1138ab47c61fSBram Moolenaar  call delete('dir1', 'rf')
1139ab47c61fSBram Moolenaar  call delete('dir2', 'rf')
1140ab47c61fSBram Moolenaar  call delete('habits1.txt')
11412b946c9fSBram Moolenaarendfunc
1142ab47c61fSBram Moolenaar
11439b457948SBram Moolenaar" Test for resync after continuing an ignored message
11442b946c9fSBram Moolenaarfunc Xefm_ignore_continuations(cchar)
11459b457948SBram Moolenaar  call s:setup_commands(a:cchar)
11469b457948SBram Moolenaar
11479b457948SBram Moolenaar  let save_efm = &efm
11489b457948SBram Moolenaar
11499b457948SBram Moolenaar  let &efm =
11509b457948SBram Moolenaar	\ '%Eerror %m %l,' .
11519b457948SBram Moolenaar	\ '%-Wignored %m %l,' .
11529b457948SBram Moolenaar	\ '%+Cmore ignored %m %l,' .
11539b457948SBram Moolenaar	\ '%Zignored end'
11549b457948SBram Moolenaar  Xgetexpr ['ignored warning 1', 'more ignored continuation 2', 'ignored end', 'error resync 4']
11559b457948SBram Moolenaar  let l = map(g:Xgetlist(), '[v:val.text, v:val.valid, v:val.lnum, v:val.type]')
11569b457948SBram Moolenaar  call assert_equal([['resync', 1, 4, 'E']], l)
11579b457948SBram Moolenaar
11589b457948SBram Moolenaar  let &efm = save_efm
11592b946c9fSBram Moolenaarendfunc
11609b457948SBram Moolenaar
11612b946c9fSBram Moolenaarfunc Test_efm_ignore_continuations()
11629b457948SBram Moolenaar  call Xefm_ignore_continuations('c')
11639b457948SBram Moolenaar  call Xefm_ignore_continuations('l')
11642b946c9fSBram Moolenaarendfunc
11659b457948SBram Moolenaar
11660fcc7c6dSBram Moolenaar" Tests for invalid error format specifies
11672b946c9fSBram Moolenaarfunc Xinvalid_efm_Tests(cchar)
11680fcc7c6dSBram Moolenaar  call s:setup_commands(a:cchar)
11690fcc7c6dSBram Moolenaar
1170049cba9eSBram Moolenaar  let save_efm = &efm
1171049cba9eSBram Moolenaar
11720fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%f:%l:%m
11730fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E372:')
11740fcc7c6dSBram Moolenaar
11750fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%l:%r:%m
11760fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
11770fcc7c6dSBram Moolenaar
11780fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%O:%f:%l:%m
11790fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
11800fcc7c6dSBram Moolenaar
11810fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%l:%*[^a-z
11820fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E374:')
11830fcc7c6dSBram Moolenaar
11840fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%l:%*c
11850fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E375:')
11860fcc7c6dSBram Moolenaar
11870fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%L%M%N
11880fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E376:')
11890fcc7c6dSBram Moolenaar
11900fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%l:%m:%R
11910fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E377:')
11920fcc7c6dSBram Moolenaar
119370077dd1SBram Moolenaar  " Invalid regular expression
119470077dd1SBram Moolenaar  set efm=%\\%%k
119570077dd1SBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E867:')
119670077dd1SBram Moolenaar
11970fcc7c6dSBram Moolenaar  set efm=
11980fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E378:')
11990fcc7c6dSBram Moolenaar
12000fcc7c6dSBram Moolenaar  set efm=%DEntering\ dir\ abc,%f:%l:%m
12010fcc7c6dSBram Moolenaar  call assert_fails('Xexpr ["Entering dir abc", "abc.txt:1:Hello world"]', 'E379:')
12020fcc7c6dSBram Moolenaar
12030fcc7c6dSBram Moolenaar  let &efm = save_efm
12042b946c9fSBram Moolenaarendfunc
12050fcc7c6dSBram Moolenaar
12062b946c9fSBram Moolenaarfunc Test_invalid_efm()
12070fcc7c6dSBram Moolenaar  call Xinvalid_efm_Tests('c')
12080fcc7c6dSBram Moolenaar  call Xinvalid_efm_Tests('l')
12092b946c9fSBram Moolenaarendfunc
12100fcc7c6dSBram Moolenaar
12110fcc7c6dSBram Moolenaar" TODO:
12120fcc7c6dSBram Moolenaar" Add tests for the following formats in 'errorformat'
12130fcc7c6dSBram Moolenaar"	%r  %O
12142b946c9fSBram Moolenaarfunc Test_efm2()
12150fcc7c6dSBram Moolenaar  let save_efm = &efm
1216049cba9eSBram Moolenaar
1217049cba9eSBram Moolenaar  " Test for %s format in efm
1218049cba9eSBram Moolenaar  set efm=%f:%s
1219049cba9eSBram Moolenaar  cexpr 'Xtestfile:Line search text'
1220049cba9eSBram Moolenaar  let l = getqflist()
122170077dd1SBram Moolenaar  call assert_equal('^\VLine search text\$', l[0].pattern)
122270077dd1SBram Moolenaar  call assert_equal(0, l[0].lnum)
1223049cba9eSBram Moolenaar
1224ee85df37SBram Moolenaar  let l = split(execute('clist', ''), "\n")
1225ee85df37SBram Moolenaar  call assert_equal([' 1 Xtestfile:^\VLine search text\$:  '], l)
1226ee85df37SBram Moolenaar
122770077dd1SBram Moolenaar  " Test for a long line
122870077dd1SBram Moolenaar  cexpr 'Xtestfile:' . repeat('a', 1026)
122970077dd1SBram Moolenaar  let l = getqflist()
123070077dd1SBram Moolenaar  call assert_equal('^\V' . repeat('a', 1019) . '\$', l[0].pattern)
123170077dd1SBram Moolenaar
12320fcc7c6dSBram Moolenaar  " Test for %P, %Q and %t format specifiers
1233c79745a8SBram Moolenaar  let lines =<< trim [DATA]
1234c79745a8SBram Moolenaar    [Xtestfile1]
1235c79745a8SBram Moolenaar    (1,17)  error: ';' missing
1236c79745a8SBram Moolenaar    (21,2)  warning: variable 'z' not defined
1237c79745a8SBram Moolenaar    (67,3)  error: end of file found before string ended
1238c79745a8SBram Moolenaar    --
1239c79745a8SBram Moolenaar
1240c79745a8SBram Moolenaar    [Xtestfile2]
1241c79745a8SBram Moolenaar    --
1242c79745a8SBram Moolenaar
1243c79745a8SBram Moolenaar    [Xtestfile3]
1244c79745a8SBram Moolenaar    NEW compiler v1.1
1245c79745a8SBram Moolenaar    (2,2)   warning: variable 'x' not defined
1246c79745a8SBram Moolenaar    (67,3)  warning: 's' already defined
1247c79745a8SBram Moolenaar    --
1248c79745a8SBram Moolenaar  [DATA]
1249c79745a8SBram Moolenaar
1250ee85df37SBram Moolenaar  set efm=%+P[%f]%r,(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%+Q--%r
1251391b1dd0SBram Moolenaar  " To exercise the push/pop file functionality in quickfix, the test files
1252391b1dd0SBram Moolenaar  " need to be created.
1253391b1dd0SBram Moolenaar  call writefile(['Line1'], 'Xtestfile1')
1254391b1dd0SBram Moolenaar  call writefile(['Line2'], 'Xtestfile2')
1255391b1dd0SBram Moolenaar  call writefile(['Line3'], 'Xtestfile3')
1256361c8f0eSBram Moolenaar  cexpr ""
1257361c8f0eSBram Moolenaar  for l in lines
1258361c8f0eSBram Moolenaar      caddexpr l
1259361c8f0eSBram Moolenaar  endfor
1260049cba9eSBram Moolenaar  let l = getqflist()
1261ee85df37SBram Moolenaar  call assert_equal(12, len(l))
1262049cba9eSBram Moolenaar  call assert_equal(21, l[2].lnum)
1263049cba9eSBram Moolenaar  call assert_equal(2, l[2].col)
12640fcc7c6dSBram Moolenaar  call assert_equal('w', l[2].type)
12650fcc7c6dSBram Moolenaar  call assert_equal('e', l[3].type)
1266391b1dd0SBram Moolenaar  call delete('Xtestfile1')
1267391b1dd0SBram Moolenaar  call delete('Xtestfile2')
1268391b1dd0SBram Moolenaar  call delete('Xtestfile3')
12690fcc7c6dSBram Moolenaar
127070077dd1SBram Moolenaar  " Test for %P, %Q with non-existing files
127170077dd1SBram Moolenaar  cexpr lines
127270077dd1SBram Moolenaar  let l = getqflist()
127370077dd1SBram Moolenaar  call assert_equal(14, len(l))
127470077dd1SBram Moolenaar  call assert_equal('[Xtestfile1]', l[0].text)
127570077dd1SBram Moolenaar  call assert_equal('[Xtestfile2]', l[6].text)
127670077dd1SBram Moolenaar  call assert_equal('[Xtestfile3]', l[9].text)
127770077dd1SBram Moolenaar
12780fcc7c6dSBram Moolenaar  " Tests for %E, %C and %Z format specifiers
1279c79745a8SBram Moolenaar  let lines =<< trim [DATA]
1280c79745a8SBram Moolenaar    Error 275
1281c79745a8SBram Moolenaar    line 42
1282c79745a8SBram Moolenaar    column 3
1283c79745a8SBram Moolenaar    ' ' expected after '--'
1284c79745a8SBram Moolenaar  [DATA]
1285c79745a8SBram Moolenaar
12860fcc7c6dSBram Moolenaar  set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m
12870fcc7c6dSBram Moolenaar  cgetexpr lines
12880fcc7c6dSBram Moolenaar  let l = getqflist()
12890fcc7c6dSBram Moolenaar  call assert_equal(275, l[0].nr)
12900fcc7c6dSBram Moolenaar  call assert_equal(42, l[0].lnum)
12910fcc7c6dSBram Moolenaar  call assert_equal(3, l[0].col)
12920fcc7c6dSBram Moolenaar  call assert_equal('E', l[0].type)
12930fcc7c6dSBram Moolenaar  call assert_equal("\n' ' expected after '--'", l[0].text)
12940fcc7c6dSBram Moolenaar
12950fcc7c6dSBram Moolenaar  " Test for %>
1296c79745a8SBram Moolenaar  let lines =<< trim [DATA]
1297c79745a8SBram Moolenaar    Error in line 147 of foo.c:
1298c79745a8SBram Moolenaar    unknown variable 'i'
1299c79745a8SBram Moolenaar  [DATA]
1300c79745a8SBram Moolenaar
13010fcc7c6dSBram Moolenaar  set efm=unknown\ variable\ %m,%E%>Error\ in\ line\ %l\ of\ %f:,%Z%m
13020fcc7c6dSBram Moolenaar  cgetexpr lines
13030fcc7c6dSBram Moolenaar  let l = getqflist()
13040fcc7c6dSBram Moolenaar  call assert_equal(147, l[0].lnum)
13050fcc7c6dSBram Moolenaar  call assert_equal('E', l[0].type)
13060fcc7c6dSBram Moolenaar  call assert_equal("\nunknown variable 'i'", l[0].text)
1307049cba9eSBram Moolenaar
1308e87e6dddSBram Moolenaar  " Test for %A, %C and other formats
1309c79745a8SBram Moolenaar  let lines =<< trim [DATA]
1310c79745a8SBram Moolenaar    ==============================================================
1311c79745a8SBram Moolenaar    FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest)
1312c79745a8SBram Moolenaar    --------------------------------------------------------------
1313c79745a8SBram Moolenaar    Traceback (most recent call last):
1314c79745a8SBram Moolenaar      File "unittests/dbfacadeTest.py", line 89, in testFoo
1315c79745a8SBram Moolenaar        self.assertEquals(34, dtid)
1316c79745a8SBram Moolenaar      File "/usr/lib/python2.2/unittest.py", line 286, in
1317c79745a8SBram Moolenaar     failUnlessEqual
1318c79745a8SBram Moolenaar        raise self.failureException, \\
131970077dd1SBram Moolenaar    W:AssertionError: 34 != 33
1320c79745a8SBram Moolenaar
1321c79745a8SBram Moolenaar    --------------------------------------------------------------
1322c79745a8SBram Moolenaar    Ran 27 tests in 0.063s
1323c79745a8SBram Moolenaar  [DATA]
1324c79745a8SBram Moolenaar
132570077dd1SBram Moolenaar  set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%t:%m
1326e87e6dddSBram Moolenaar  cgetexpr lines
1327e87e6dddSBram Moolenaar  let l = getqflist()
1328e87e6dddSBram Moolenaar  call assert_equal(8, len(l))
1329e87e6dddSBram Moolenaar  call assert_equal(89, l[4].lnum)
1330e87e6dddSBram Moolenaar  call assert_equal(1, l[4].valid)
1331e87e6dddSBram Moolenaar  call assert_equal('unittests/dbfacadeTest.py', bufname(l[4].bufnr))
133270077dd1SBram Moolenaar  call assert_equal('W', l[4].type)
1333e87e6dddSBram Moolenaar
1334d76ce852SBram Moolenaar  " Test for %o
1335d76ce852SBram Moolenaar  set efm=%f(%o):%l\ %m
1336bc7845daSBram Moolenaar  cgetexpr ['Xotestfile(Language.PureScript.Types):20 Error']
1337bc7845daSBram Moolenaar  call writefile(['Line1'], 'Xotestfile')
1338d76ce852SBram Moolenaar  let l = getqflist()
1339d76ce852SBram Moolenaar  call assert_equal(1, len(l), string(l))
1340d76ce852SBram Moolenaar  call assert_equal('Language.PureScript.Types', l[0].module)
1341d76ce852SBram Moolenaar  copen
1342d76ce852SBram Moolenaar  call assert_equal('Language.PureScript.Types|20| Error', getline(1))
1343d76ce852SBram Moolenaar  call feedkeys("\<CR>", 'xn')
1344bc7845daSBram Moolenaar  call assert_equal('Xotestfile', expand('%:t'))
1345d76ce852SBram Moolenaar  cclose
1346d76ce852SBram Moolenaar  bd
1347bc7845daSBram Moolenaar  call delete("Xotestfile")
1348d76ce852SBram Moolenaar
134970077dd1SBram Moolenaar  " Test for a long module name
135070077dd1SBram Moolenaar  cexpr 'Xtest(' . repeat('m', 1026) . '):15 message'
135170077dd1SBram Moolenaar  let l = getqflist()
135270077dd1SBram Moolenaar  call assert_equal(repeat('m', 1024), l[0].module)
135370077dd1SBram Moolenaar  call assert_equal(15, l[0].lnum)
135470077dd1SBram Moolenaar  call assert_equal('message', l[0].text)
135570077dd1SBram Moolenaar
135699895eacSBram Moolenaar  " The following sequence of commands used to crash Vim
135799895eacSBram Moolenaar  set efm=%W%m
135899895eacSBram Moolenaar  cgetexpr ['msg1']
135999895eacSBram Moolenaar  let l = getqflist()
136099895eacSBram Moolenaar  call assert_equal(1, len(l), string(l))
136199895eacSBram Moolenaar  call assert_equal('msg1', l[0].text)
136299895eacSBram Moolenaar  set efm=%C%m
136399895eacSBram Moolenaar  lexpr 'msg2'
136499895eacSBram Moolenaar  let l = getloclist(0)
136599895eacSBram Moolenaar  call assert_equal(1, len(l), string(l))
136699895eacSBram Moolenaar  call assert_equal('msg2', l[0].text)
136799895eacSBram Moolenaar  lopen
136899895eacSBram Moolenaar  call setqflist([], 'r')
136999895eacSBram Moolenaar  caddbuf
137099895eacSBram Moolenaar  let l = getqflist()
137199895eacSBram Moolenaar  call assert_equal(1, len(l), string(l))
137299895eacSBram Moolenaar  call assert_equal('|| msg2', l[0].text)
137399895eacSBram Moolenaar
137478ddc06bSBram Moolenaar  " When matching error lines, case should be ignored. Test for this.
137578ddc06bSBram Moolenaar  set noignorecase
137678ddc06bSBram Moolenaar  let l=getqflist({'lines' : ['Xtest:FOO10:Line 20'], 'efm':'%f:foo%l:%m'})
137778ddc06bSBram Moolenaar  call assert_equal(10, l.items[0].lnum)
137878ddc06bSBram Moolenaar  call assert_equal('Line 20', l.items[0].text)
137978ddc06bSBram Moolenaar  set ignorecase&
138078ddc06bSBram Moolenaar
138199895eacSBram Moolenaar  new | only
1382049cba9eSBram Moolenaar  let &efm = save_efm
13832b946c9fSBram Moolenaarendfunc
1384049cba9eSBram Moolenaar
1385e928366dSBram Moolenaar" Test for '%t' (error type) field in 'efm'
1386e928366dSBram Moolenaarfunc Test_efm_error_type()
1387e928366dSBram Moolenaar  let save_efm = &efm
1388e928366dSBram Moolenaar
1389e928366dSBram Moolenaar  " error type
1390e928366dSBram Moolenaar  set efm=%f:%l:%t:%m
1391e928366dSBram Moolenaar  cexpr ["Xfile1:10:E:msg1", "Xfile1:20:W:msg2", "Xfile1:30:I:msg3",
1392e928366dSBram Moolenaar        \ "Xfile1:40:N:msg4", "Xfile1:50:R:msg5"]
1393e928366dSBram Moolenaar  let output = split(execute('clist'), "\n")
1394e928366dSBram Moolenaar  call assert_equal([
1395e928366dSBram Moolenaar        \ ' 1 Xfile1:10 error: msg1',
1396e928366dSBram Moolenaar        \ ' 2 Xfile1:20 warning: msg2',
1397e928366dSBram Moolenaar        \ ' 3 Xfile1:30 info: msg3',
1398e928366dSBram Moolenaar        \ ' 4 Xfile1:40 note: msg4',
1399e928366dSBram Moolenaar        \ ' 5 Xfile1:50 R: msg5'], output)
1400e928366dSBram Moolenaar
1401e928366dSBram Moolenaar  " error type and a error number
1402e928366dSBram Moolenaar  set efm=%f:%l:%t:%n:%m
1403e928366dSBram Moolenaar  cexpr ["Xfile1:10:E:2:msg1", "Xfile1:20:W:4:msg2", "Xfile1:30:I:6:msg3",
1404e928366dSBram Moolenaar        \ "Xfile1:40:N:8:msg4", "Xfile1:50:R:3:msg5"]
1405e928366dSBram Moolenaar  let output = split(execute('clist'), "\n")
1406e928366dSBram Moolenaar  call assert_equal([
1407e928366dSBram Moolenaar        \ ' 1 Xfile1:10 error   2: msg1',
1408e928366dSBram Moolenaar        \ ' 2 Xfile1:20 warning   4: msg2',
1409e928366dSBram Moolenaar        \ ' 3 Xfile1:30 info   6: msg3',
1410e928366dSBram Moolenaar        \ ' 4 Xfile1:40 note   8: msg4',
1411e928366dSBram Moolenaar        \ ' 5 Xfile1:50 R   3: msg5'], output)
1412e928366dSBram Moolenaar  let &efm = save_efm
1413e928366dSBram Moolenaarendfunc
1414e928366dSBram Moolenaar
14152b946c9fSBram Moolenaarfunc XquickfixChangedByAutocmd(cchar)
14163ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
1417ffec3c53SBram Moolenaar  if a:cchar == 'c'
1418ffec3c53SBram Moolenaar    let ErrorNr = 'E925'
14192b946c9fSBram Moolenaar    func! ReadFunc()
1420ffec3c53SBram Moolenaar      colder
1421ffec3c53SBram Moolenaar      cgetexpr []
1422ffec3c53SBram Moolenaar    endfunc
1423ffec3c53SBram Moolenaar  else
1424ffec3c53SBram Moolenaar    let ErrorNr = 'E926'
14252b946c9fSBram Moolenaar    func! ReadFunc()
1426ffec3c53SBram Moolenaar      lolder
1427ffec3c53SBram Moolenaar      lgetexpr []
1428ffec3c53SBram Moolenaar    endfunc
1429ffec3c53SBram Moolenaar  endif
1430ffec3c53SBram Moolenaar
1431ffec3c53SBram Moolenaar  augroup testgroup
1432ffec3c53SBram Moolenaar    au!
1433d106e5baSBram Moolenaar    autocmd BufReadCmd test_changed.txt call ReadFunc()
1434ffec3c53SBram Moolenaar  augroup END
1435ffec3c53SBram Moolenaar
1436d106e5baSBram Moolenaar  new | only
1437ffec3c53SBram Moolenaar  let words = [ "a", "b" ]
1438ffec3c53SBram Moolenaar  let qflist = []
1439ffec3c53SBram Moolenaar  for word in words
1440d106e5baSBram Moolenaar    call add(qflist, {'filename': 'test_changed.txt'})
14413ef5bf7dSBram Moolenaar    call g:Xsetlist(qflist, ' ')
1442ffec3c53SBram Moolenaar  endfor
14433ef5bf7dSBram Moolenaar  call assert_fails('Xrewind', ErrorNr . ':')
1444ffec3c53SBram Moolenaar
1445ffec3c53SBram Moolenaar  augroup! testgroup
1446ffec3c53SBram Moolenaarendfunc
1447ffec3c53SBram Moolenaar
14482b946c9fSBram Moolenaarfunc Test_quickfix_was_changed_by_autocmd()
1449ffec3c53SBram Moolenaar  call XquickfixChangedByAutocmd('c')
1450ffec3c53SBram Moolenaar  call XquickfixChangedByAutocmd('l')
14512b946c9fSBram Moolenaarendfunc
14528b20179cSBram Moolenaar
14534d170af0SBram Moolenaarfunc Test_setloclist_in_autocommand()
14544d170af0SBram Moolenaar  call writefile(['test1', 'test2'], 'Xfile')
14554d170af0SBram Moolenaar  edit Xfile
14564d170af0SBram Moolenaar  let s:bufnr = bufnr()
14574d170af0SBram Moolenaar  call setloclist(1,
14584d170af0SBram Moolenaar        \ [{'bufnr' : s:bufnr, 'lnum' : 1, 'text' : 'test1'},
14594d170af0SBram Moolenaar        \  {'bufnr' : s:bufnr, 'lnum' : 2, 'text' : 'test2'}])
14604d170af0SBram Moolenaar
14614d170af0SBram Moolenaar  augroup Test_LocList
14624d170af0SBram Moolenaar    au!
14634d170af0SBram Moolenaar    autocmd BufEnter * call setloclist(1,
14644d170af0SBram Moolenaar          \ [{'bufnr' : s:bufnr, 'lnum' : 1, 'text' : 'test1'},
14654d170af0SBram Moolenaar          \  {'bufnr' : s:bufnr, 'lnum' : 2, 'text' : 'test2'}], 'r')
14664d170af0SBram Moolenaar  augroup END
14674d170af0SBram Moolenaar
14684d170af0SBram Moolenaar  lopen
14694d170af0SBram Moolenaar  call assert_fails('exe "normal j\<CR>"', 'E926:')
14704d170af0SBram Moolenaar
14714d170af0SBram Moolenaar  augroup Test_LocList
14724d170af0SBram Moolenaar    au!
14734d170af0SBram Moolenaar  augroup END
14744d170af0SBram Moolenaar  call delete('Xfile')
14754d170af0SBram Moolenaarendfunc
14764d170af0SBram Moolenaar
14778b20179cSBram Moolenaarfunc Test_caddbuffer_to_empty()
14788b20179cSBram Moolenaar  helpgr quickfix
14798b20179cSBram Moolenaar  call setqflist([], 'r')
14808b20179cSBram Moolenaar  cad
1481f68f1d70SBram Moolenaar  try
1482f68f1d70SBram Moolenaar    cn
1483f68f1d70SBram Moolenaar  catch
1484f68f1d70SBram Moolenaar    " number of matches is unknown
1485f68f1d70SBram Moolenaar    call assert_true(v:exception =~ 'E553:')
1486f68f1d70SBram Moolenaar  endtry
14878b20179cSBram Moolenaar  quit!
14888b20179cSBram Moolenaarendfunc
148989c64d55SBram Moolenaar
149089c64d55SBram Moolenaarfunc Test_cgetexpr_works()
149189c64d55SBram Moolenaar  " this must not crash Vim
149289c64d55SBram Moolenaar  cgetexpr [$x]
14933ef5bf7dSBram Moolenaar  lgetexpr [$x]
149489c64d55SBram Moolenaarendfunc
1495c1808d58SBram Moolenaar
1496c1808d58SBram Moolenaar" Tests for the setqflist() and setloclist() functions
14972b946c9fSBram Moolenaarfunc SetXlistTests(cchar, bnum)
14983ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
1499c1808d58SBram Moolenaar
15003ef5bf7dSBram Moolenaar  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 1},
1501c1808d58SBram Moolenaar	      \  {'bufnr': a:bnum, 'lnum': 2}])
15023ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
1503c1808d58SBram Moolenaar  call assert_equal(2, len(l))
1504c1808d58SBram Moolenaar  call assert_equal(2, l[1].lnum)
1505c1808d58SBram Moolenaar
15063ef5bf7dSBram Moolenaar  Xnext
15073ef5bf7dSBram Moolenaar  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3}], 'a')
15083ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
1509c1808d58SBram Moolenaar  call assert_equal(3, len(l))
15103ef5bf7dSBram Moolenaar  Xnext
1511c1808d58SBram Moolenaar  call assert_equal(3, line('.'))
1512c1808d58SBram Moolenaar
15132b2b8ae5SBram Moolenaar  " Appending entries to the list should not change the cursor position
15142b2b8ae5SBram Moolenaar  " in the quickfix window
15153ef5bf7dSBram Moolenaar  Xwindow
15162b2b8ae5SBram Moolenaar  1
15173ef5bf7dSBram Moolenaar  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 4},
15182b2b8ae5SBram Moolenaar	      \  {'bufnr': a:bnum, 'lnum': 5}], 'a')
15192b2b8ae5SBram Moolenaar  call assert_equal(1, line('.'))
15202b2b8ae5SBram Moolenaar  close
15212b2b8ae5SBram Moolenaar
15223ef5bf7dSBram Moolenaar  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3},
1523c1808d58SBram Moolenaar	      \  {'bufnr': a:bnum, 'lnum': 4},
1524c1808d58SBram Moolenaar	      \  {'bufnr': a:bnum, 'lnum': 5}], 'r')
15253ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
1526c1808d58SBram Moolenaar  call assert_equal(3, len(l))
1527c1808d58SBram Moolenaar  call assert_equal(5, l[2].lnum)
1528c1808d58SBram Moolenaar
15293ef5bf7dSBram Moolenaar  call g:Xsetlist([])
15303ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
1531c1808d58SBram Moolenaar  call assert_equal(0, len(l))
1532ee85df37SBram Moolenaar
1533f1d21c8cSBram Moolenaar  " Tests for setting the 'valid' flag
1534f1d21c8cSBram Moolenaar  call g:Xsetlist([{'bufnr':a:bnum, 'lnum':4, 'valid':0}])
1535f1d21c8cSBram Moolenaar  Xwindow
1536f1d21c8cSBram Moolenaar  call assert_equal(1, winnr('$'))
1537f1d21c8cSBram Moolenaar  let l = g:Xgetlist()
1538f1d21c8cSBram Moolenaar  call g:Xsetlist(l)
1539f1d21c8cSBram Moolenaar  call assert_equal(0, g:Xgetlist()[0].valid)
15409752c72fSBram Moolenaar  " Adding a non-valid entry should not mark the list as having valid entries
15419752c72fSBram Moolenaar  call g:Xsetlist([{'bufnr':a:bnum, 'lnum':5, 'valid':0}], 'a')
15429752c72fSBram Moolenaar  Xwindow
15439752c72fSBram Moolenaar  call assert_equal(1, winnr('$'))
15449752c72fSBram Moolenaar
15459752c72fSBram Moolenaar  " :cnext/:cprev should still work even with invalid entries in the list
15469752c72fSBram Moolenaar  let l = [{'bufnr' : a:bnum, 'lnum' : 1, 'text' : '1', 'valid' : 0},
15479752c72fSBram Moolenaar	      \ {'bufnr' : a:bnum, 'lnum' : 2, 'text' : '2', 'valid' : 0}]
15489752c72fSBram Moolenaar  call g:Xsetlist(l)
15499752c72fSBram Moolenaar  Xnext
15509752c72fSBram Moolenaar  call assert_equal(2, g:Xgetlist({'idx' : 0}).idx)
15519752c72fSBram Moolenaar  Xprev
15529752c72fSBram Moolenaar  call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
15539752c72fSBram Moolenaar  " :cnext/:cprev should still work after appending invalid entries to an
15549752c72fSBram Moolenaar  " empty list
15559752c72fSBram Moolenaar  call g:Xsetlist([])
15569752c72fSBram Moolenaar  call g:Xsetlist(l, 'a')
15579752c72fSBram Moolenaar  Xnext
15589752c72fSBram Moolenaar  call assert_equal(2, g:Xgetlist({'idx' : 0}).idx)
15599752c72fSBram Moolenaar  Xprev
15609752c72fSBram Moolenaar  call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
15619752c72fSBram Moolenaar
1562f1d21c8cSBram Moolenaar  call g:Xsetlist([{'text':'Text1', 'valid':1}])
1563f1d21c8cSBram Moolenaar  Xwindow
1564f1d21c8cSBram Moolenaar  call assert_equal(2, winnr('$'))
1565f1d21c8cSBram Moolenaar  Xclose
1566f1d21c8cSBram Moolenaar  let save_efm = &efm
1567f1d21c8cSBram Moolenaar  set efm=%m
1568f1d21c8cSBram Moolenaar  Xgetexpr 'TestMessage'
1569f1d21c8cSBram Moolenaar  let l = g:Xgetlist()
1570f1d21c8cSBram Moolenaar  call g:Xsetlist(l)
1571f1d21c8cSBram Moolenaar  call assert_equal(1, g:Xgetlist()[0].valid)
1572f1d21c8cSBram Moolenaar  let &efm = save_efm
1573f1d21c8cSBram Moolenaar
1574ee85df37SBram Moolenaar  " Error cases:
1575ee85df37SBram Moolenaar  " Refer to a non-existing buffer and pass a non-dictionary type
1576ee85df37SBram Moolenaar  call assert_fails("call g:Xsetlist([{'bufnr':998, 'lnum':4}," .
1577ee85df37SBram Moolenaar	      \ " {'bufnr':999, 'lnum':5}])", 'E92:')
1578ee85df37SBram Moolenaar  call g:Xsetlist([[1, 2,3]])
1579ee85df37SBram Moolenaar  call assert_equal(0, len(g:Xgetlist()))
158099fa7219SBram Moolenaar  call assert_fails('call g:Xsetlist([], [])', 'E928:')
15812b946c9fSBram Moolenaarendfunc
1582c1808d58SBram Moolenaar
15832b946c9fSBram Moolenaarfunc Test_setqflist()
1584c1808d58SBram Moolenaar  new Xtestfile | only
1585c1808d58SBram Moolenaar  let bnum = bufnr('%')
1586c1808d58SBram Moolenaar  call setline(1, range(1,5))
1587c1808d58SBram Moolenaar
1588c1808d58SBram Moolenaar  call SetXlistTests('c', bnum)
1589c1808d58SBram Moolenaar  call SetXlistTests('l', bnum)
1590c1808d58SBram Moolenaar
15911cee693bSBram Moolenaar  enew!
1592c1808d58SBram Moolenaar  call delete('Xtestfile')
15932b946c9fSBram Moolenaarendfunc
1594d106e5baSBram Moolenaar
15952b946c9fSBram Moolenaarfunc Xlist_empty_middle(cchar)
15963ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
15973ef5bf7dSBram Moolenaar
15981cee693bSBram Moolenaar  " create three quickfix lists
1599ee85df37SBram Moolenaar  let @/ = 'Test_'
1600ee85df37SBram Moolenaar  Xvimgrep // test_quickfix.vim
16013ef5bf7dSBram Moolenaar  let testlen = len(g:Xgetlist())
16021cee693bSBram Moolenaar  call assert_true(testlen > 0)
16033ef5bf7dSBram Moolenaar  Xvimgrep empty test_quickfix.vim
16043ef5bf7dSBram Moolenaar  call assert_true(len(g:Xgetlist()) > 0)
16053ef5bf7dSBram Moolenaar  Xvimgrep matches test_quickfix.vim
16063ef5bf7dSBram Moolenaar  let matchlen = len(g:Xgetlist())
16071cee693bSBram Moolenaar  call assert_true(matchlen > 0)
16083ef5bf7dSBram Moolenaar  Xolder
16091cee693bSBram Moolenaar  " make the middle list empty
16103ef5bf7dSBram Moolenaar  call g:Xsetlist([], 'r')
16113ef5bf7dSBram Moolenaar  call assert_true(len(g:Xgetlist()) == 0)
16123ef5bf7dSBram Moolenaar  Xolder
16133ef5bf7dSBram Moolenaar  call assert_equal(testlen, len(g:Xgetlist()))
16143ef5bf7dSBram Moolenaar  Xnewer
16153ef5bf7dSBram Moolenaar  Xnewer
16163ef5bf7dSBram Moolenaar  call assert_equal(matchlen, len(g:Xgetlist()))
16171cee693bSBram Moolenaarendfunc
16181cee693bSBram Moolenaar
16192b946c9fSBram Moolenaarfunc Test_setqflist_empty_middle()
16203ef5bf7dSBram Moolenaar  call Xlist_empty_middle('c')
16213ef5bf7dSBram Moolenaar  call Xlist_empty_middle('l')
16222b946c9fSBram Moolenaarendfunc
16233ef5bf7dSBram Moolenaar
16242b946c9fSBram Moolenaarfunc Xlist_empty_older(cchar)
16253ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
16263ef5bf7dSBram Moolenaar
16271cee693bSBram Moolenaar  " create three quickfix lists
16283ef5bf7dSBram Moolenaar  Xvimgrep one test_quickfix.vim
16293ef5bf7dSBram Moolenaar  let onelen = len(g:Xgetlist())
16301cee693bSBram Moolenaar  call assert_true(onelen > 0)
16313ef5bf7dSBram Moolenaar  Xvimgrep two test_quickfix.vim
16323ef5bf7dSBram Moolenaar  let twolen = len(g:Xgetlist())
16331cee693bSBram Moolenaar  call assert_true(twolen > 0)
16343ef5bf7dSBram Moolenaar  Xvimgrep three test_quickfix.vim
16353ef5bf7dSBram Moolenaar  let threelen = len(g:Xgetlist())
16361cee693bSBram Moolenaar  call assert_true(threelen > 0)
16373ef5bf7dSBram Moolenaar  Xolder 2
16381cee693bSBram Moolenaar  " make the first list empty, check the others didn't change
16393ef5bf7dSBram Moolenaar  call g:Xsetlist([], 'r')
16403ef5bf7dSBram Moolenaar  call assert_true(len(g:Xgetlist()) == 0)
16413ef5bf7dSBram Moolenaar  Xnewer
16423ef5bf7dSBram Moolenaar  call assert_equal(twolen, len(g:Xgetlist()))
16433ef5bf7dSBram Moolenaar  Xnewer
16443ef5bf7dSBram Moolenaar  call assert_equal(threelen, len(g:Xgetlist()))
16452b946c9fSBram Moolenaarendfunc
16463ef5bf7dSBram Moolenaar
16472b946c9fSBram Moolenaarfunc Test_setqflist_empty_older()
16483ef5bf7dSBram Moolenaar  call Xlist_empty_older('c')
16493ef5bf7dSBram Moolenaar  call Xlist_empty_older('l')
16502b946c9fSBram Moolenaarendfunc
16511cee693bSBram Moolenaar
16522b946c9fSBram Moolenaarfunc XquickfixSetListWithAct(cchar)
16533ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
16543ef5bf7dSBram Moolenaar
1655d106e5baSBram Moolenaar  let list1 = [{'filename': 'fnameA', 'text': 'A'},
1656d106e5baSBram Moolenaar          \    {'filename': 'fnameB', 'text': 'B'}]
1657d106e5baSBram Moolenaar  let list2 = [{'filename': 'fnameC', 'text': 'C'},
1658d106e5baSBram Moolenaar          \    {'filename': 'fnameD', 'text': 'D'},
1659d106e5baSBram Moolenaar          \    {'filename': 'fnameE', 'text': 'E'}]
1660d106e5baSBram Moolenaar
1661eeb1b9c7SBram Moolenaar  " {action} is unspecified.  Same as specifying ' '.
1662d106e5baSBram Moolenaar  new | only
16633ef5bf7dSBram Moolenaar  silent! Xnewer 99
16643ef5bf7dSBram Moolenaar  call g:Xsetlist(list1)
16653ef5bf7dSBram Moolenaar  call g:Xsetlist(list2)
16663ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1667d106e5baSBram Moolenaar  call assert_equal(3, len(li))
1668d106e5baSBram Moolenaar  call assert_equal('C', li[0]['text'])
1669d106e5baSBram Moolenaar  call assert_equal('D', li[1]['text'])
1670d106e5baSBram Moolenaar  call assert_equal('E', li[2]['text'])
16713ef5bf7dSBram Moolenaar  silent! Xolder
16723ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1673d106e5baSBram Moolenaar  call assert_equal(2, len(li))
1674d106e5baSBram Moolenaar  call assert_equal('A', li[0]['text'])
1675d106e5baSBram Moolenaar  call assert_equal('B', li[1]['text'])
1676d106e5baSBram Moolenaar
1677d106e5baSBram Moolenaar  " {action} is specified ' '.
1678d106e5baSBram Moolenaar  new | only
16793ef5bf7dSBram Moolenaar  silent! Xnewer 99
16803ef5bf7dSBram Moolenaar  call g:Xsetlist(list1)
16813ef5bf7dSBram Moolenaar  call g:Xsetlist(list2, ' ')
16823ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1683d106e5baSBram Moolenaar  call assert_equal(3, len(li))
1684d106e5baSBram Moolenaar  call assert_equal('C', li[0]['text'])
1685d106e5baSBram Moolenaar  call assert_equal('D', li[1]['text'])
1686d106e5baSBram Moolenaar  call assert_equal('E', li[2]['text'])
16873ef5bf7dSBram Moolenaar  silent! Xolder
16883ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1689d106e5baSBram Moolenaar  call assert_equal(2, len(li))
1690d106e5baSBram Moolenaar  call assert_equal('A', li[0]['text'])
1691d106e5baSBram Moolenaar  call assert_equal('B', li[1]['text'])
1692d106e5baSBram Moolenaar
1693d106e5baSBram Moolenaar  " {action} is specified 'a'.
1694d106e5baSBram Moolenaar  new | only
16953ef5bf7dSBram Moolenaar  silent! Xnewer 99
16963ef5bf7dSBram Moolenaar  call g:Xsetlist(list1)
16973ef5bf7dSBram Moolenaar  call g:Xsetlist(list2, 'a')
16983ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1699d106e5baSBram Moolenaar  call assert_equal(5, len(li))
1700d106e5baSBram Moolenaar  call assert_equal('A', li[0]['text'])
1701d106e5baSBram Moolenaar  call assert_equal('B', li[1]['text'])
1702d106e5baSBram Moolenaar  call assert_equal('C', li[2]['text'])
1703d106e5baSBram Moolenaar  call assert_equal('D', li[3]['text'])
1704d106e5baSBram Moolenaar  call assert_equal('E', li[4]['text'])
1705d106e5baSBram Moolenaar
1706d106e5baSBram Moolenaar  " {action} is specified 'r'.
1707d106e5baSBram Moolenaar  new | only
17083ef5bf7dSBram Moolenaar  silent! Xnewer 99
17093ef5bf7dSBram Moolenaar  call g:Xsetlist(list1)
17103ef5bf7dSBram Moolenaar  call g:Xsetlist(list2, 'r')
17113ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1712d106e5baSBram Moolenaar  call assert_equal(3, len(li))
1713d106e5baSBram Moolenaar  call assert_equal('C', li[0]['text'])
1714d106e5baSBram Moolenaar  call assert_equal('D', li[1]['text'])
1715d106e5baSBram Moolenaar  call assert_equal('E', li[2]['text'])
1716d106e5baSBram Moolenaar
1717d106e5baSBram Moolenaar  " Test for wrong value.
1718d106e5baSBram Moolenaar  new | only
17193ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(0)", 'E714:')
17203ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(list1, '')", 'E927:')
17213ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(list1, 'aa')", 'E927:')
17223ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(list1, ' a')", 'E927:')
17233ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(list1, 0)", 'E928:')
1724d106e5baSBram Moolenaarendfunc
1725d106e5baSBram Moolenaar
1726a0ca7d00SBram Moolenaarfunc Test_setqflist_invalid_nr()
1727a0ca7d00SBram Moolenaar  " The following command used to crash Vim
1728aad222c9SBram Moolenaar  eval []->setqflist(' ', {'nr' : $XXX_DOES_NOT_EXIST})
1729a0ca7d00SBram Moolenaarendfunc
1730a0ca7d00SBram Moolenaar
173199234f29SBram Moolenaarfunc Test_setqflist_user_sets_buftype()
173299234f29SBram Moolenaar  call setqflist([{'text': 'foo'}, {'text': 'bar'}])
173399234f29SBram Moolenaar  set buftype=quickfix
173499234f29SBram Moolenaar  call setqflist([], 'a')
173599234f29SBram Moolenaar  enew
173699234f29SBram Moolenaarendfunc
173799234f29SBram Moolenaar
17382b946c9fSBram Moolenaarfunc Test_quickfix_set_list_with_act()
1739d106e5baSBram Moolenaar  call XquickfixSetListWithAct('c')
1740d106e5baSBram Moolenaar  call XquickfixSetListWithAct('l')
17412b946c9fSBram Moolenaarendfunc
17426be8c8e1SBram Moolenaar
17432b946c9fSBram Moolenaarfunc XLongLinesTests(cchar)
17443ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
17456be8c8e1SBram Moolenaar
1746049cba9eSBram Moolenaar  call assert_equal(4, len(l))
17476be8c8e1SBram Moolenaar  call assert_equal(1, l[0].lnum)
17486be8c8e1SBram Moolenaar  call assert_equal(1, l[0].col)
1749049cba9eSBram Moolenaar  call assert_equal(1975, len(l[0].text))
17506be8c8e1SBram Moolenaar  call assert_equal(2, l[1].lnum)
17516be8c8e1SBram Moolenaar  call assert_equal(1, l[1].col)
17526be8c8e1SBram Moolenaar  call assert_equal(4070, len(l[1].text))
17536be8c8e1SBram Moolenaar  call assert_equal(3, l[2].lnum)
17546be8c8e1SBram Moolenaar  call assert_equal(1, l[2].col)
1755049cba9eSBram Moolenaar  call assert_equal(4070, len(l[2].text))
1756049cba9eSBram Moolenaar  call assert_equal(4, l[3].lnum)
1757049cba9eSBram Moolenaar  call assert_equal(1, l[3].col)
1758049cba9eSBram Moolenaar  call assert_equal(10, len(l[3].text))
17596be8c8e1SBram Moolenaar
17603ef5bf7dSBram Moolenaar  call g:Xsetlist([], 'r')
17612b946c9fSBram Moolenaarendfunc
17626be8c8e1SBram Moolenaar
17632b946c9fSBram Moolenaarfunc s:long_lines_tests(cchar)
17643ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
17653ef5bf7dSBram Moolenaar
17666be8c8e1SBram Moolenaar  let testfile = 'samples/quickfix.txt'
17676be8c8e1SBram Moolenaar
17686be8c8e1SBram Moolenaar  " file
17693ef5bf7dSBram Moolenaar  exe 'Xgetfile' testfile
17703ef5bf7dSBram Moolenaar  call XLongLinesTests(a:cchar)
17716be8c8e1SBram Moolenaar
17726be8c8e1SBram Moolenaar  " list
17733ef5bf7dSBram Moolenaar  Xexpr readfile(testfile)
17743ef5bf7dSBram Moolenaar  call XLongLinesTests(a:cchar)
17756be8c8e1SBram Moolenaar
17766be8c8e1SBram Moolenaar  " string
17773ef5bf7dSBram Moolenaar  Xexpr join(readfile(testfile), "\n")
17783ef5bf7dSBram Moolenaar  call XLongLinesTests(a:cchar)
17796be8c8e1SBram Moolenaar
17806be8c8e1SBram Moolenaar  " buffer
17813ef5bf7dSBram Moolenaar  exe 'edit' testfile
17823ef5bf7dSBram Moolenaar  exe 'Xbuffer' bufnr('%')
1783f50df392SBram Moolenaar  call XLongLinesTests(a:cchar)
17842b946c9fSBram Moolenaarendfunc
17853ef5bf7dSBram Moolenaar
17862b946c9fSBram Moolenaarfunc Test_long_lines()
17873ef5bf7dSBram Moolenaar  call s:long_lines_tests('c')
17883ef5bf7dSBram Moolenaar  call s:long_lines_tests('l')
17892b946c9fSBram Moolenaarendfunc
1790049cba9eSBram Moolenaar
179159941cbdSBram Moolenaarfunc Test_cgetfile_on_long_lines()
179259941cbdSBram Moolenaar  " Problematic values if the line is longer than 4096 bytes.  Then 1024 bytes
179359941cbdSBram Moolenaar  " are read at a time.
179459941cbdSBram Moolenaar  for len in [4078, 4079, 4080, 5102, 5103, 5104, 6126, 6127, 6128, 7150, 7151, 7152]
179559941cbdSBram Moolenaar    let lines = [
179659941cbdSBram Moolenaar      \ '/tmp/file1:1:1:aaa',
179759941cbdSBram Moolenaar      \ '/tmp/file2:1:1:%s',
179859941cbdSBram Moolenaar      \ '/tmp/file3:1:1:bbb',
179959941cbdSBram Moolenaar      \ '/tmp/file4:1:1:ccc',
180059941cbdSBram Moolenaar      \ ]
180159941cbdSBram Moolenaar    let lines[1] = substitute(lines[1], '%s', repeat('x', len), '')
180259941cbdSBram Moolenaar    call writefile(lines, 'Xcqetfile.txt')
180359941cbdSBram Moolenaar    cgetfile Xcqetfile.txt
180459941cbdSBram Moolenaar    call assert_equal(4, getqflist(#{size: v:true}).size, 'with length ' .. len)
180559941cbdSBram Moolenaar  endfor
180659941cbdSBram Moolenaar  call delete('Xcqetfile.txt')
180759941cbdSBram Moolenaarendfunc
180859941cbdSBram Moolenaar
18092b946c9fSBram Moolenaarfunc s:create_test_file(filename)
1810049cba9eSBram Moolenaar  let l = []
1811049cba9eSBram Moolenaar  for i in range(1, 20)
1812049cba9eSBram Moolenaar      call add(l, 'Line' . i)
1813049cba9eSBram Moolenaar  endfor
1814049cba9eSBram Moolenaar  call writefile(l, a:filename)
18152b946c9fSBram Moolenaarendfunc
1816049cba9eSBram Moolenaar
18172b946c9fSBram Moolenaarfunc Test_switchbuf()
1818049cba9eSBram Moolenaar  call s:create_test_file('Xqftestfile1')
1819049cba9eSBram Moolenaar  call s:create_test_file('Xqftestfile2')
1820049cba9eSBram Moolenaar  call s:create_test_file('Xqftestfile3')
1821049cba9eSBram Moolenaar
1822049cba9eSBram Moolenaar  new | only
1823049cba9eSBram Moolenaar  edit Xqftestfile1
1824049cba9eSBram Moolenaar  let file1_winid = win_getid()
1825049cba9eSBram Moolenaar  new Xqftestfile2
1826049cba9eSBram Moolenaar  let file2_winid = win_getid()
1827049cba9eSBram Moolenaar  cgetexpr ['Xqftestfile1:5:Line5',
1828049cba9eSBram Moolenaar		\ 'Xqftestfile1:6:Line6',
1829049cba9eSBram Moolenaar		\ 'Xqftestfile2:10:Line10',
1830049cba9eSBram Moolenaar		\ 'Xqftestfile2:11:Line11',
1831049cba9eSBram Moolenaar		\ 'Xqftestfile3:15:Line15',
1832049cba9eSBram Moolenaar		\ 'Xqftestfile3:16:Line16']
1833049cba9eSBram Moolenaar
1834049cba9eSBram Moolenaar  new
1835049cba9eSBram Moolenaar  let winid = win_getid()
1836049cba9eSBram Moolenaar  cfirst | cnext
1837049cba9eSBram Moolenaar  call assert_equal(winid, win_getid())
183899895eacSBram Moolenaar  2cnext
1839049cba9eSBram Moolenaar  call assert_equal(winid, win_getid())
184099895eacSBram Moolenaar  2cnext
1841049cba9eSBram Moolenaar  call assert_equal(winid, win_getid())
1842049cba9eSBram Moolenaar
1843f9ae154cSBram Moolenaar  " Test for 'switchbuf' set to search for files in windows in the current
1844f9ae154cSBram Moolenaar  " tabpage and jump to an existing window (if present)
1845049cba9eSBram Moolenaar  set switchbuf=useopen
1846f9ae154cSBram Moolenaar  enew
1847049cba9eSBram Moolenaar  cfirst | cnext
1848049cba9eSBram Moolenaar  call assert_equal(file1_winid, win_getid())
184999895eacSBram Moolenaar  2cnext
1850049cba9eSBram Moolenaar  call assert_equal(file2_winid, win_getid())
185199895eacSBram Moolenaar  2cnext
1852049cba9eSBram Moolenaar  call assert_equal(file2_winid, win_getid())
1853049cba9eSBram Moolenaar
1854f9ae154cSBram Moolenaar  " Test for 'switchbuf' set to search for files in tabpages and jump to an
1855f9ae154cSBram Moolenaar  " existing tabpage (if present)
1856049cba9eSBram Moolenaar  enew | only
1857049cba9eSBram Moolenaar  set switchbuf=usetab
1858049cba9eSBram Moolenaar  tabedit Xqftestfile1
1859049cba9eSBram Moolenaar  tabedit Xqftestfile2
186074240d3fSBram Moolenaar  tabedit Xqftestfile3
1861049cba9eSBram Moolenaar  tabfirst
1862049cba9eSBram Moolenaar  cfirst | cnext
1863049cba9eSBram Moolenaar  call assert_equal(2, tabpagenr())
186499895eacSBram Moolenaar  2cnext
1865049cba9eSBram Moolenaar  call assert_equal(3, tabpagenr())
186674240d3fSBram Moolenaar  6cnext
186774240d3fSBram Moolenaar  call assert_equal(4, tabpagenr())
186874240d3fSBram Moolenaar  2cpfile
186974240d3fSBram Moolenaar  call assert_equal(2, tabpagenr())
187074240d3fSBram Moolenaar  2cnfile
187174240d3fSBram Moolenaar  call assert_equal(4, tabpagenr())
1872049cba9eSBram Moolenaar  tabfirst | tabonly | enew
1873049cba9eSBram Moolenaar
1874f9ae154cSBram Moolenaar  " Test for 'switchbuf' set to open a new window for every file
1875049cba9eSBram Moolenaar  set switchbuf=split
1876049cba9eSBram Moolenaar  cfirst | cnext
1877049cba9eSBram Moolenaar  call assert_equal(1, winnr('$'))
1878049cba9eSBram Moolenaar  cnext | cnext
1879049cba9eSBram Moolenaar  call assert_equal(2, winnr('$'))
1880049cba9eSBram Moolenaar  cnext | cnext
1881049cba9eSBram Moolenaar  call assert_equal(3, winnr('$'))
1882049cba9eSBram Moolenaar
1883f9ae154cSBram Moolenaar  " Test for 'switchbuf' set to open a new tabpage for every file
1884049cba9eSBram Moolenaar  set switchbuf=newtab
1885f9ae154cSBram Moolenaar  enew | only
1886049cba9eSBram Moolenaar  cfirst | cnext
1887049cba9eSBram Moolenaar  call assert_equal(1, tabpagenr('$'))
1888049cba9eSBram Moolenaar  cnext | cnext
1889049cba9eSBram Moolenaar  call assert_equal(2, tabpagenr('$'))
1890049cba9eSBram Moolenaar  cnext | cnext
1891049cba9eSBram Moolenaar  call assert_equal(3, tabpagenr('$'))
1892049cba9eSBram Moolenaar  tabfirst | enew | tabonly | only
1893049cba9eSBram Moolenaar
1894539aa6b2SBram Moolenaar  set switchbuf=uselast
1895539aa6b2SBram Moolenaar  split
1896539aa6b2SBram Moolenaar  let last_winid = win_getid()
1897539aa6b2SBram Moolenaar  copen
1898539aa6b2SBram Moolenaar  exe "normal 1G\<CR>"
1899539aa6b2SBram Moolenaar  call assert_equal(last_winid, win_getid())
1900539aa6b2SBram Moolenaar  enew | only
1901539aa6b2SBram Moolenaar
1902f9ae154cSBram Moolenaar  " With an empty 'switchbuf', jumping to a quickfix entry should open the
1903f9ae154cSBram Moolenaar  " file in an existing window (if present)
1904049cba9eSBram Moolenaar  set switchbuf=
1905049cba9eSBram Moolenaar  edit Xqftestfile1
1906049cba9eSBram Moolenaar  let file1_winid = win_getid()
1907049cba9eSBram Moolenaar  new Xqftestfile2
1908049cba9eSBram Moolenaar  let file2_winid = win_getid()
1909049cba9eSBram Moolenaar  copen
1910049cba9eSBram Moolenaar  exe "normal 1G\<CR>"
1911049cba9eSBram Moolenaar  call assert_equal(file1_winid, win_getid())
1912049cba9eSBram Moolenaar  copen
1913049cba9eSBram Moolenaar  exe "normal 3G\<CR>"
1914049cba9eSBram Moolenaar  call assert_equal(file2_winid, win_getid())
1915049cba9eSBram Moolenaar  copen | only
1916049cba9eSBram Moolenaar  exe "normal 5G\<CR>"
1917049cba9eSBram Moolenaar  call assert_equal(2, winnr('$'))
1918049cba9eSBram Moolenaar  call assert_equal(1, bufwinnr('Xqftestfile3'))
1919049cba9eSBram Moolenaar
1920391b1dd0SBram Moolenaar  " If only quickfix window is open in the current tabpage, jumping to an
19211bc353b6SBram Moolenaar  " entry with 'switchbuf' set to 'usetab' should search in other tabpages.
1922049cba9eSBram Moolenaar  enew | only
1923391b1dd0SBram Moolenaar  set switchbuf=usetab
1924391b1dd0SBram Moolenaar  tabedit Xqftestfile1
1925391b1dd0SBram Moolenaar  tabedit Xqftestfile2
1926391b1dd0SBram Moolenaar  tabedit Xqftestfile3
1927391b1dd0SBram Moolenaar  tabfirst
1928391b1dd0SBram Moolenaar  copen | only
1929391b1dd0SBram Moolenaar  clast
1930391b1dd0SBram Moolenaar  call assert_equal(4, tabpagenr())
1931391b1dd0SBram Moolenaar  tabfirst | tabonly | enew | only
1932049cba9eSBram Moolenaar
1933f9ae154cSBram Moolenaar  " Jumping to a file that is not present in any of the tabpages and the
1934f9ae154cSBram Moolenaar  " current tabpage doesn't have any usable windows, should open it in a new
1935f9ae154cSBram Moolenaar  " window in the current tabpage.
1936f9ae154cSBram Moolenaar  copen | only
1937f9ae154cSBram Moolenaar  cfirst
1938f9ae154cSBram Moolenaar  call assert_equal(1, tabpagenr())
1939bdd2c290SBram Moolenaar  call assert_equal('Xqftestfile1', @%)
1940f9ae154cSBram Moolenaar
1941f9ae154cSBram Moolenaar  " If opening a file changes 'switchbuf', then the new value should be
1942f9ae154cSBram Moolenaar  " retained.
194341d4299fSBram Moolenaar  set modeline&vim
1944f9ae154cSBram Moolenaar  call writefile(["vim: switchbuf=split"], 'Xqftestfile1')
1945f9ae154cSBram Moolenaar  enew | only
1946f9ae154cSBram Moolenaar  set switchbuf&vim
1947f9ae154cSBram Moolenaar  cexpr "Xqftestfile1:1:10"
1948f9ae154cSBram Moolenaar  call assert_equal('split', &switchbuf)
1949f9ae154cSBram Moolenaar  call writefile(["vim: switchbuf=usetab"], 'Xqftestfile1')
1950f9ae154cSBram Moolenaar  enew | only
1951f9ae154cSBram Moolenaar  set switchbuf=useopen
1952f9ae154cSBram Moolenaar  cexpr "Xqftestfile1:1:10"
1953f9ae154cSBram Moolenaar  call assert_equal('usetab', &switchbuf)
1954f9ae154cSBram Moolenaar  call writefile(["vim: switchbuf&vim"], 'Xqftestfile1')
1955f9ae154cSBram Moolenaar  enew | only
1956f9ae154cSBram Moolenaar  set switchbuf=useopen
1957f9ae154cSBram Moolenaar  cexpr "Xqftestfile1:1:10"
1958f9ae154cSBram Moolenaar  call assert_equal('', &switchbuf)
1959f9ae154cSBram Moolenaar
1960049cba9eSBram Moolenaar  call delete('Xqftestfile1')
1961049cba9eSBram Moolenaar  call delete('Xqftestfile2')
1962049cba9eSBram Moolenaar  call delete('Xqftestfile3')
1963391b1dd0SBram Moolenaar  set switchbuf&vim
1964391b1dd0SBram Moolenaar
1965391b1dd0SBram Moolenaar  enew | only
19662b946c9fSBram Moolenaarendfunc
1967049cba9eSBram Moolenaar
19682b946c9fSBram Moolenaarfunc Xadjust_qflnum(cchar)
1969049cba9eSBram Moolenaar  call s:setup_commands(a:cchar)
1970049cba9eSBram Moolenaar
1971049cba9eSBram Moolenaar  enew | only
1972049cba9eSBram Moolenaar
1973c1542744SBram Moolenaar  let fname = 'Xqftestfile' . a:cchar
1974c1542744SBram Moolenaar  call s:create_test_file(fname)
1975c1542744SBram Moolenaar  exe 'edit ' . fname
1976049cba9eSBram Moolenaar
1977c1542744SBram Moolenaar  Xgetexpr [fname . ':5:Line5',
1978c1542744SBram Moolenaar	      \ fname . ':10:Line10',
1979c1542744SBram Moolenaar	      \ fname . ':15:Line15',
1980c1542744SBram Moolenaar	      \ fname . ':20:Line20']
1981049cba9eSBram Moolenaar
1982049cba9eSBram Moolenaar  6,14delete
1983049cba9eSBram Moolenaar  call append(6, ['Buffer', 'Window'])
1984049cba9eSBram Moolenaar
1985049cba9eSBram Moolenaar  let l = g:Xgetlist()
1986049cba9eSBram Moolenaar  call assert_equal(5, l[0].lnum)
1987049cba9eSBram Moolenaar  call assert_equal(6, l[2].lnum)
1988049cba9eSBram Moolenaar  call assert_equal(13, l[3].lnum)
1989049cba9eSBram Moolenaar
1990f9ae154cSBram Moolenaar  " If a file doesn't have any quickfix entries, then deleting lines in the
1991f9ae154cSBram Moolenaar  " file should not update the quickfix list
1992f9ae154cSBram Moolenaar  call g:Xsetlist([], 'f')
1993f9ae154cSBram Moolenaar  1,2delete
1994f9ae154cSBram Moolenaar  call assert_equal([], g:Xgetlist())
1995f9ae154cSBram Moolenaar
1996049cba9eSBram Moolenaar  enew!
1997c1542744SBram Moolenaar  call delete(fname)
19982b946c9fSBram Moolenaarendfunc
1999049cba9eSBram Moolenaar
20002b946c9fSBram Moolenaarfunc Test_adjust_lnum()
2001c1542744SBram Moolenaar  call setloclist(0, [])
2002049cba9eSBram Moolenaar  call Xadjust_qflnum('c')
2003c1542744SBram Moolenaar  call setqflist([])
2004049cba9eSBram Moolenaar  call Xadjust_qflnum('l')
20052b946c9fSBram Moolenaarendfunc
2006049cba9eSBram Moolenaar
2007049cba9eSBram Moolenaar" Tests for the :grep/:lgrep and :grepadd/:lgrepadd commands
20082b946c9fSBram Moolenaarfunc s:test_xgrep(cchar)
2009049cba9eSBram Moolenaar  call s:setup_commands(a:cchar)
2010049cba9eSBram Moolenaar
2011049cba9eSBram Moolenaar  " The following lines are used for the grep test. Don't remove.
2012049cba9eSBram Moolenaar  " Grep_Test_Text: Match 1
2013049cba9eSBram Moolenaar  " Grep_Test_Text: Match 2
2014049cba9eSBram Moolenaar  " GrepAdd_Test_Text: Match 1
2015049cba9eSBram Moolenaar  " GrepAdd_Test_Text: Match 2
2016049cba9eSBram Moolenaar  enew! | only
2017049cba9eSBram Moolenaar  set makeef&vim
2018049cba9eSBram Moolenaar  silent Xgrep Grep_Test_Text: test_quickfix.vim
201915a7bdcbSBram Moolenaar  call assert_true(len(g:Xgetlist()) == 5)
2020049cba9eSBram Moolenaar  Xopen
2021049cba9eSBram Moolenaar  call assert_true(w:quickfix_title =~ '^:grep')
2022049cba9eSBram Moolenaar  Xclose
2023049cba9eSBram Moolenaar  enew
2024049cba9eSBram Moolenaar  set makeef=Temp_File_##
2025049cba9eSBram Moolenaar  silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
202615a7bdcbSBram Moolenaar  call assert_true(len(g:Xgetlist()) == 9)
202715a7bdcbSBram Moolenaar
202815a7bdcbSBram Moolenaar  " Try with 'grepprg' set to 'internal'
202915a7bdcbSBram Moolenaar  set grepprg=internal
203015a7bdcbSBram Moolenaar  silent Xgrep Grep_Test_Text: test_quickfix.vim
203115a7bdcbSBram Moolenaar  silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
203215a7bdcbSBram Moolenaar  call assert_true(len(g:Xgetlist()) == 9)
203315a7bdcbSBram Moolenaar  set grepprg&vim
2034f9ae154cSBram Moolenaar
2035f9ae154cSBram Moolenaar  call writefile(['Vim'], 'XtestTempFile')
2036f9ae154cSBram Moolenaar  set makeef=XtestTempFile
2037f9ae154cSBram Moolenaar  silent Xgrep Grep_Test_Text: test_quickfix.vim
203815a7bdcbSBram Moolenaar  call assert_equal(5, len(g:Xgetlist()))
2039f9ae154cSBram Moolenaar  call assert_false(filereadable('XtestTempFile'))
2040f9ae154cSBram Moolenaar  set makeef&vim
20412b946c9fSBram Moolenaarendfunc
2042049cba9eSBram Moolenaar
20432b946c9fSBram Moolenaarfunc Test_grep()
2044049cba9eSBram Moolenaar  " The grepprg may not be set on non-Unix systems
20456d91bcb4SBram Moolenaar  CheckUnix
2046049cba9eSBram Moolenaar
2047049cba9eSBram Moolenaar  call s:test_xgrep('c')
2048049cba9eSBram Moolenaar  call s:test_xgrep('l')
20492b946c9fSBram Moolenaarendfunc
2050361c8f0eSBram Moolenaar
20512b946c9fSBram Moolenaarfunc Test_two_windows()
2052361c8f0eSBram Moolenaar  " Use one 'errorformat' for two windows.  Add an expression to each of them,
2053361c8f0eSBram Moolenaar  " make sure they each keep their own state.
2054361c8f0eSBram Moolenaar  set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
2055361c8f0eSBram Moolenaar  call mkdir('Xone/a', 'p')
2056361c8f0eSBram Moolenaar  call mkdir('Xtwo/a', 'p')
2057361c8f0eSBram Moolenaar  let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
2058361c8f0eSBram Moolenaar  call writefile(lines, 'Xone/a/one.txt')
2059361c8f0eSBram Moolenaar  call writefile(lines, 'Xtwo/a/two.txt')
2060361c8f0eSBram Moolenaar
2061361c8f0eSBram Moolenaar  new one
2062361c8f0eSBram Moolenaar  let one_id = win_getid()
2063361c8f0eSBram Moolenaar  lexpr ""
2064361c8f0eSBram Moolenaar  new two
2065361c8f0eSBram Moolenaar  let two_id = win_getid()
2066361c8f0eSBram Moolenaar  lexpr ""
2067361c8f0eSBram Moolenaar
2068361c8f0eSBram Moolenaar  laddexpr "Entering dir 'Xtwo/a'"
2069361c8f0eSBram Moolenaar  call win_gotoid(one_id)
2070361c8f0eSBram Moolenaar  laddexpr "Entering dir 'Xone/a'"
2071361c8f0eSBram Moolenaar  call win_gotoid(two_id)
2072361c8f0eSBram Moolenaar  laddexpr 'two.txt:5:two two two'
2073361c8f0eSBram Moolenaar  call win_gotoid(one_id)
2074361c8f0eSBram Moolenaar  laddexpr 'one.txt:3:one one one'
2075361c8f0eSBram Moolenaar
2076361c8f0eSBram Moolenaar  let loc_one = getloclist(one_id)
2077361c8f0eSBram Moolenaar  call assert_equal('Xone/a/one.txt', bufname(loc_one[1].bufnr))
2078361c8f0eSBram Moolenaar  call assert_equal(3, loc_one[1].lnum)
2079361c8f0eSBram Moolenaar
2080361c8f0eSBram Moolenaar  let loc_two = getloclist(two_id)
2081361c8f0eSBram Moolenaar  call assert_equal('Xtwo/a/two.txt', bufname(loc_two[1].bufnr))
2082361c8f0eSBram Moolenaar  call assert_equal(5, loc_two[1].lnum)
2083361c8f0eSBram Moolenaar
2084361c8f0eSBram Moolenaar  call win_gotoid(one_id)
2085361c8f0eSBram Moolenaar  bwipe!
2086361c8f0eSBram Moolenaar  call win_gotoid(two_id)
2087361c8f0eSBram Moolenaar  bwipe!
2088361c8f0eSBram Moolenaar  call delete('Xone', 'rf')
2089361c8f0eSBram Moolenaar  call delete('Xtwo', 'rf')
2090361c8f0eSBram Moolenaarendfunc
2091dcb17001SBram Moolenaar
20922b946c9fSBram Moolenaarfunc XbottomTests(cchar)
2093537ef084SBram Moolenaar  call s:setup_commands(a:cchar)
2094537ef084SBram Moolenaar
2095b6fa30ccSBram Moolenaar  " Calling lbottom without any errors should fail
2096b6fa30ccSBram Moolenaar  if a:cchar == 'l'
2097b6fa30ccSBram Moolenaar      call assert_fails('lbottom', 'E776:')
2098b6fa30ccSBram Moolenaar  endif
2099b6fa30ccSBram Moolenaar
2100537ef084SBram Moolenaar  call g:Xsetlist([{'filename': 'foo', 'lnum': 42}])
2101537ef084SBram Moolenaar  Xopen
2102dcb17001SBram Moolenaar  let wid = win_getid()
2103dcb17001SBram Moolenaar  call assert_equal(1, line('.'))
2104dcb17001SBram Moolenaar  wincmd w
2105537ef084SBram Moolenaar  call g:Xsetlist([{'filename': 'var', 'lnum': 24}], 'a')
2106537ef084SBram Moolenaar  Xbottom
2107dcb17001SBram Moolenaar  call win_gotoid(wid)
2108dcb17001SBram Moolenaar  call assert_equal(2, line('.'))
2109537ef084SBram Moolenaar  Xclose
2110dcb17001SBram Moolenaarendfunc
2111537ef084SBram Moolenaar
2112537ef084SBram Moolenaar" Tests for the :cbottom and :lbottom commands
21132b946c9fSBram Moolenaarfunc Test_cbottom()
2114537ef084SBram Moolenaar  call XbottomTests('c')
2115537ef084SBram Moolenaar  call XbottomTests('l')
21162b946c9fSBram Moolenaarendfunc
2117f6acffbeSBram Moolenaar
21182b946c9fSBram Moolenaarfunc HistoryTest(cchar)
2119f6acffbeSBram Moolenaar  call s:setup_commands(a:cchar)
2120f6acffbeSBram Moolenaar
2121f6acffbeSBram Moolenaar  " clear all lists after the first one, then replace the first one.
2122f6acffbeSBram Moolenaar  call g:Xsetlist([])
2123b6fa30ccSBram Moolenaar  call assert_fails('Xolder 99', 'E380:')
2124f6acffbeSBram Moolenaar  let entry = {'filename': 'foo', 'lnum': 42}
2125f6acffbeSBram Moolenaar  call g:Xsetlist([entry], 'r')
2126f6acffbeSBram Moolenaar  call g:Xsetlist([entry, entry])
2127f6acffbeSBram Moolenaar  call g:Xsetlist([entry, entry, entry])
2128f6acffbeSBram Moolenaar  let res = split(execute(a:cchar . 'hist'), "\n")
2129f6acffbeSBram Moolenaar  call assert_equal(3, len(res))
2130f6acffbeSBram Moolenaar  let common = 'errors     :set' . (a:cchar == 'c' ? 'qf' : 'loc') . 'list()'
2131f6acffbeSBram Moolenaar  call assert_equal('  error list 1 of 3; 1 ' . common, res[0])
2132f6acffbeSBram Moolenaar  call assert_equal('  error list 2 of 3; 2 ' . common, res[1])
2133f6acffbeSBram Moolenaar  call assert_equal('> error list 3 of 3; 3 ' . common, res[2])
2134b4d5fbabSBram Moolenaar
21358ffc7c8bSBram Moolenaar  " Test for changing the quickfix lists
21368ffc7c8bSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 0}).nr)
21378ffc7c8bSBram Moolenaar  exe '1' . a:cchar . 'hist'
21388ffc7c8bSBram Moolenaar  call assert_equal(1, g:Xgetlist({'nr' : 0}).nr)
21398ffc7c8bSBram Moolenaar  exe '3' . a:cchar . 'hist'
21408ffc7c8bSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 0}).nr)
21418ffc7c8bSBram Moolenaar  call assert_fails('-2' . a:cchar . 'hist', 'E16:')
21428ffc7c8bSBram Moolenaar  call assert_fails('4' . a:cchar . 'hist', 'E16:')
21438ffc7c8bSBram Moolenaar
2144b4d5fbabSBram Moolenaar  call g:Xsetlist([], 'f')
2145b4d5fbabSBram Moolenaar  let l = split(execute(a:cchar . 'hist'), "\n")
2146b4d5fbabSBram Moolenaar  call assert_equal('No entries', l[0])
21478ffc7c8bSBram Moolenaar  if a:cchar == 'c'
21488ffc7c8bSBram Moolenaar    call assert_fails('4chist', 'E16:')
21498ffc7c8bSBram Moolenaar  else
21508ffc7c8bSBram Moolenaar    call assert_fails('4lhist', 'E776:')
21518ffc7c8bSBram Moolenaar  endif
21525b69c22fSBram Moolenaar
21535b69c22fSBram Moolenaar  " An empty list should still show the stack history
21545b69c22fSBram Moolenaar  call g:Xsetlist([])
21555b69c22fSBram Moolenaar  let res = split(execute(a:cchar . 'hist'), "\n")
21565b69c22fSBram Moolenaar  call assert_equal('> error list 1 of 1; 0 ' . common, res[0])
21575b69c22fSBram Moolenaar
21585b69c22fSBram Moolenaar  call g:Xsetlist([], 'f')
2159f6acffbeSBram Moolenaarendfunc
2160f6acffbeSBram Moolenaar
2161f6acffbeSBram Moolenaarfunc Test_history()
2162f6acffbeSBram Moolenaar  call HistoryTest('c')
2163f6acffbeSBram Moolenaar  call HistoryTest('l')
2164f6acffbeSBram Moolenaarendfunc
2165015102e9SBram Moolenaar
2166015102e9SBram Moolenaarfunc Test_duplicate_buf()
2167015102e9SBram Moolenaar  " make sure we can get the highest buffer number
2168015102e9SBram Moolenaar  edit DoesNotExist
2169015102e9SBram Moolenaar  edit DoesNotExist2
2170015102e9SBram Moolenaar  let last_buffer = bufnr("$")
2171015102e9SBram Moolenaar
2172015102e9SBram Moolenaar  " make sure only one buffer is created
2173015102e9SBram Moolenaar  call writefile(['this one', 'that one'], 'Xgrepthis')
2174015102e9SBram Moolenaar  vimgrep one Xgrepthis
2175015102e9SBram Moolenaar  vimgrep one Xgrepthis
2176015102e9SBram Moolenaar  call assert_equal(last_buffer + 1, bufnr("$"))
2177015102e9SBram Moolenaar
2178015102e9SBram Moolenaar  call delete('Xgrepthis')
2179015102e9SBram Moolenaarendfunc
2180d823fa91SBram Moolenaar
2181d823fa91SBram Moolenaar" Quickfix/Location list set/get properties tests
21822b946c9fSBram Moolenaarfunc Xproperty_tests(cchar)
2183d823fa91SBram Moolenaar  call s:setup_commands(a:cchar)
2184d823fa91SBram Moolenaar
2185d823fa91SBram Moolenaar  " Error cases
2186d823fa91SBram Moolenaar  call assert_fails('call g:Xgetlist(99)', 'E715:')
2187d823fa91SBram Moolenaar  call assert_fails('call g:Xsetlist(99)', 'E714:')
2188d823fa91SBram Moolenaar  call assert_fails('call g:Xsetlist([], "a", [])', 'E715:')
2189d823fa91SBram Moolenaar
2190d823fa91SBram Moolenaar  " Set and get the title
2191b6fa30ccSBram Moolenaar  call g:Xsetlist([])
2192d823fa91SBram Moolenaar  Xopen
2193d823fa91SBram Moolenaar  wincmd p
2194d823fa91SBram Moolenaar  call g:Xsetlist([{'filename':'foo', 'lnum':27}])
219586f100dcSBram Moolenaar  let s = g:Xsetlist([], 'a', {'title' : 'Sample'})
219686f100dcSBram Moolenaar  call assert_equal(0, s)
2197d823fa91SBram Moolenaar  let d = g:Xgetlist({"title":1})
2198d823fa91SBram Moolenaar  call assert_equal('Sample', d.title)
2199a2aa8a2bSBram Moolenaar  " Try setting title to a non-string value
2200a2aa8a2bSBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'title' : ['Test']}))
2201a2aa8a2bSBram Moolenaar  call assert_equal('Sample', g:Xgetlist({"title":1}).title)
2202d823fa91SBram Moolenaar
2203d823fa91SBram Moolenaar  Xopen
2204d823fa91SBram Moolenaar  call assert_equal('Sample', w:quickfix_title)
2205d823fa91SBram Moolenaar  Xclose
2206d823fa91SBram Moolenaar
22072b529bb6SBram Moolenaar  " Tests for action argument
22082b529bb6SBram Moolenaar  silent! Xolder 999
22092b529bb6SBram Moolenaar  let qfnr = g:Xgetlist({'all':1}).nr
22102b529bb6SBram Moolenaar  call g:Xsetlist([], 'r', {'title' : 'N1'})
22112b529bb6SBram Moolenaar  call assert_equal('N1', g:Xgetlist({'all':1}).title)
22122b529bb6SBram Moolenaar  call g:Xsetlist([], ' ', {'title' : 'N2'})
22132b529bb6SBram Moolenaar  call assert_equal(qfnr + 1, g:Xgetlist({'all':1}).nr)
2214890680caSBram Moolenaar
2215890680caSBram Moolenaar  let res = g:Xgetlist({'nr': 0})
2216890680caSBram Moolenaar  call assert_equal(qfnr + 1, res.nr)
2217890680caSBram Moolenaar  call assert_equal(['nr'], keys(res))
2218890680caSBram Moolenaar
22192b529bb6SBram Moolenaar  call g:Xsetlist([], ' ', {'title' : 'N3'})
22202b529bb6SBram Moolenaar  call assert_equal('N2', g:Xgetlist({'nr':2, 'title':1}).title)
22212b529bb6SBram Moolenaar
2222ee85df37SBram Moolenaar  " Changing the title of an earlier quickfix list
222355b69264SBram Moolenaar  call g:Xsetlist([], 'r', {'title' : 'NewTitle', 'nr' : 2})
2224ee85df37SBram Moolenaar  call assert_equal('NewTitle', g:Xgetlist({'nr':2, 'title':1}).title)
2225ee85df37SBram Moolenaar
2226ee85df37SBram Moolenaar  " Changing the title of an invalid quickfix list
2227ee85df37SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], ' ',
2228ee85df37SBram Moolenaar        \ {'title' : 'SomeTitle', 'nr' : 99}))
2229ee85df37SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], ' ',
2230ee85df37SBram Moolenaar        \ {'title' : 'SomeTitle', 'nr' : 'abc'}))
2231ee85df37SBram Moolenaar
2232ee85df37SBram Moolenaar  if a:cchar == 'c'
2233ee85df37SBram Moolenaar    copen
2234ee85df37SBram Moolenaar    call assert_equal({'winid':win_getid()}, getqflist({'winid':1}))
2235ee85df37SBram Moolenaar    cclose
2236ee85df37SBram Moolenaar  endif
2237ee85df37SBram Moolenaar
2238d823fa91SBram Moolenaar  " Invalid arguments
2239e2e4075fSBram Moolenaar  call assert_fails('call g:Xgetlist([])', 'E715:')
2240e2e4075fSBram Moolenaar  call assert_fails('call g:Xsetlist([], "a", [])', 'E715:')
2241d823fa91SBram Moolenaar  let s = g:Xsetlist([], 'a', {'abc':1})
2242d823fa91SBram Moolenaar  call assert_equal(-1, s)
2243d823fa91SBram Moolenaar
2244d823fa91SBram Moolenaar  call assert_equal({}, g:Xgetlist({'abc':1}))
2245a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'nr':99, 'title':1}).title)
2246a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'nr':[], 'title':1}).title)
2247d823fa91SBram Moolenaar
2248d823fa91SBram Moolenaar  if a:cchar == 'l'
2249890680caSBram Moolenaar    call assert_equal({}, getloclist(99, {'title': 1}))
2250d823fa91SBram Moolenaar  endif
22518f77c5a4SBram Moolenaar
22528f77c5a4SBram Moolenaar  " Context related tests
225386f100dcSBram Moolenaar  let s = g:Xsetlist([], 'a', {'context':[1,2,3]})
225486f100dcSBram Moolenaar  call assert_equal(0, s)
22558f77c5a4SBram Moolenaar  call test_garbagecollect_now()
22568f77c5a4SBram Moolenaar  let d = g:Xgetlist({'context':1})
22578f77c5a4SBram Moolenaar  call assert_equal([1,2,3], d.context)
22588f77c5a4SBram Moolenaar  call g:Xsetlist([], 'a', {'context':{'color':'green'}})
22598f77c5a4SBram Moolenaar  let d = g:Xgetlist({'context':1})
22608f77c5a4SBram Moolenaar  call assert_equal({'color':'green'}, d.context)
22618f77c5a4SBram Moolenaar  call g:Xsetlist([], 'a', {'context':"Context info"})
22628f77c5a4SBram Moolenaar  let d = g:Xgetlist({'context':1})
22638f77c5a4SBram Moolenaar  call assert_equal("Context info", d.context)
22648f77c5a4SBram Moolenaar  call g:Xsetlist([], 'a', {'context':246})
22658f77c5a4SBram Moolenaar  let d = g:Xgetlist({'context':1})
22668f77c5a4SBram Moolenaar  call assert_equal(246, d.context)
226792b83ccfSBram Moolenaar  " set other Vim data types as context
226892b83ccfSBram Moolenaar  call g:Xsetlist([], 'a', {'context' : test_null_blob()})
226992b83ccfSBram Moolenaar  if has('channel')
227092b83ccfSBram Moolenaar    call g:Xsetlist([], 'a', {'context' : test_null_channel()})
227192b83ccfSBram Moolenaar  endif
227292b83ccfSBram Moolenaar  if has('job')
227392b83ccfSBram Moolenaar    call g:Xsetlist([], 'a', {'context' : test_null_job()})
227492b83ccfSBram Moolenaar  endif
227592b83ccfSBram Moolenaar  call g:Xsetlist([], 'a', {'context' : test_null_function()})
227692b83ccfSBram Moolenaar  call g:Xsetlist([], 'a', {'context' : test_null_partial()})
227792b83ccfSBram Moolenaar  call g:Xsetlist([], 'a', {'context' : ''})
227892b83ccfSBram Moolenaar  call test_garbagecollect_now()
22798f77c5a4SBram Moolenaar  if a:cchar == 'l'
22808f77c5a4SBram Moolenaar    " Test for copying context across two different location lists
22818f77c5a4SBram Moolenaar    new | only
22828f77c5a4SBram Moolenaar    let w1_id = win_getid()
22838f77c5a4SBram Moolenaar    let l = [1]
22848f77c5a4SBram Moolenaar    call setloclist(0, [], 'a', {'context':l})
22858f77c5a4SBram Moolenaar    new
22868f77c5a4SBram Moolenaar    let w2_id = win_getid()
22878f77c5a4SBram Moolenaar    call add(l, 2)
22888f77c5a4SBram Moolenaar    call assert_equal([1, 2], getloclist(w1_id, {'context':1}).context)
22898f77c5a4SBram Moolenaar    call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
22908f77c5a4SBram Moolenaar    unlet! l
22918f77c5a4SBram Moolenaar    call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
22928f77c5a4SBram Moolenaar    only
22938f77c5a4SBram Moolenaar    call setloclist(0, [], 'f')
2294a6d4849cSBram Moolenaar    call assert_equal('', getloclist(0, {'context':1}).context)
22958f77c5a4SBram Moolenaar  endif
22966e62da3eSBram Moolenaar
22976e62da3eSBram Moolenaar  " Test for changing the context of previous quickfix lists
22986e62da3eSBram Moolenaar  call g:Xsetlist([], 'f')
22996e62da3eSBram Moolenaar  Xexpr "One"
23006e62da3eSBram Moolenaar  Xexpr "Two"
23016e62da3eSBram Moolenaar  Xexpr "Three"
230255b69264SBram Moolenaar  call g:Xsetlist([], 'r', {'context' : [1], 'nr' : 1})
230355b69264SBram Moolenaar  call g:Xsetlist([], 'a', {'context' : [2], 'nr' : 2})
23046e62da3eSBram Moolenaar  " Also, check for setting the context using quickfix list number zero.
230555b69264SBram Moolenaar  call g:Xsetlist([], 'r', {'context' : [3], 'nr' : 0})
23066e62da3eSBram Moolenaar  call test_garbagecollect_now()
23076e62da3eSBram Moolenaar  let l = g:Xgetlist({'nr' : 1, 'context' : 1})
23086e62da3eSBram Moolenaar  call assert_equal([1], l.context)
23096e62da3eSBram Moolenaar  let l = g:Xgetlist({'nr' : 2, 'context' : 1})
23106e62da3eSBram Moolenaar  call assert_equal([2], l.context)
23116e62da3eSBram Moolenaar  let l = g:Xgetlist({'nr' : 3, 'context' : 1})
23126e62da3eSBram Moolenaar  call assert_equal([3], l.context)
23136e62da3eSBram Moolenaar
23146e62da3eSBram Moolenaar  " Test for changing the context through reference and for garbage
23156e62da3eSBram Moolenaar  " collection of quickfix context
23166e62da3eSBram Moolenaar  let l = ["red"]
23176e62da3eSBram Moolenaar  call g:Xsetlist([], ' ', {'context' : l})
23186e62da3eSBram Moolenaar  call add(l, "blue")
23196e62da3eSBram Moolenaar  let x = g:Xgetlist({'context' : 1})
23206e62da3eSBram Moolenaar  call add(x.context, "green")
23216e62da3eSBram Moolenaar  call assert_equal(["red", "blue", "green"], l)
23226e62da3eSBram Moolenaar  call assert_equal(["red", "blue", "green"], x.context)
23236e62da3eSBram Moolenaar  unlet l
23246e62da3eSBram Moolenaar  call test_garbagecollect_now()
23256e62da3eSBram Moolenaar  let m = g:Xgetlist({'context' : 1})
23266e62da3eSBram Moolenaar  call assert_equal(["red", "blue", "green"], m.context)
23276a8958dbSBram Moolenaar
23286a8958dbSBram Moolenaar  " Test for setting/getting items
23296a8958dbSBram Moolenaar  Xexpr ""
23306a8958dbSBram Moolenaar  let qfprev = g:Xgetlist({'nr':0})
233186f100dcSBram Moolenaar  let s = g:Xsetlist([], ' ', {'title':'Green',
23326a8958dbSBram Moolenaar        \ 'items' : [{'filename':'F1', 'lnum':10}]})
233386f100dcSBram Moolenaar  call assert_equal(0, s)
23346a8958dbSBram Moolenaar  let qfcur = g:Xgetlist({'nr':0})
23356a8958dbSBram Moolenaar  call assert_true(qfcur.nr == qfprev.nr + 1)
23366a8958dbSBram Moolenaar  let l = g:Xgetlist({'items':1})
23376a8958dbSBram Moolenaar  call assert_equal('F1', bufname(l.items[0].bufnr))
23386a8958dbSBram Moolenaar  call assert_equal(10, l.items[0].lnum)
23396a8958dbSBram Moolenaar  call g:Xsetlist([], 'a', {'items' : [{'filename':'F2', 'lnum':20},
23406a8958dbSBram Moolenaar        \  {'filename':'F2', 'lnum':30}]})
23416a8958dbSBram Moolenaar  let l = g:Xgetlist({'items':1})
23426a8958dbSBram Moolenaar  call assert_equal('F2', bufname(l.items[2].bufnr))
23436a8958dbSBram Moolenaar  call assert_equal(30, l.items[2].lnum)
23446a8958dbSBram Moolenaar  call g:Xsetlist([], 'r', {'items' : [{'filename':'F3', 'lnum':40}]})
23456a8958dbSBram Moolenaar  let l = g:Xgetlist({'items':1})
23466a8958dbSBram Moolenaar  call assert_equal('F3', bufname(l.items[0].bufnr))
23476a8958dbSBram Moolenaar  call assert_equal(40, l.items[0].lnum)
23486a8958dbSBram Moolenaar  call g:Xsetlist([], 'r', {'items' : []})
23496a8958dbSBram Moolenaar  let l = g:Xgetlist({'items':1})
23506a8958dbSBram Moolenaar  call assert_equal(0, len(l.items))
23516a8958dbSBram Moolenaar
2352b4d5fbabSBram Moolenaar  call g:Xsetlist([], 'r', {'title' : 'TestTitle'})
2353b4d5fbabSBram Moolenaar  call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]})
2354b4d5fbabSBram Moolenaar  call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]})
2355b4d5fbabSBram Moolenaar  call assert_equal('TestTitle', g:Xgetlist({'title' : 1}).title)
2356b4d5fbabSBram Moolenaar
2357c9cc9c78SBram Moolenaar  " Test for getting id of window associated with a location list window
2358c9cc9c78SBram Moolenaar  if a:cchar == 'l'
2359c9cc9c78SBram Moolenaar    only
2360c9cc9c78SBram Moolenaar    call assert_equal(0, g:Xgetlist({'all' : 1}).filewinid)
2361c9cc9c78SBram Moolenaar    let wid = win_getid()
2362c9cc9c78SBram Moolenaar    Xopen
2363c9cc9c78SBram Moolenaar    call assert_equal(wid, g:Xgetlist({'filewinid' : 1}).filewinid)
2364c9cc9c78SBram Moolenaar    wincmd w
2365c9cc9c78SBram Moolenaar    call assert_equal(0, g:Xgetlist({'filewinid' : 1}).filewinid)
2366c9cc9c78SBram Moolenaar    only
2367c9cc9c78SBram Moolenaar  endif
2368c9cc9c78SBram Moolenaar
2369ae338338SBram Moolenaar  " The following used to crash Vim with address sanitizer
2370ae338338SBram Moolenaar  call g:Xsetlist([], 'f')
2371ae338338SBram Moolenaar  call g:Xsetlist([], 'a', {'items' : [{'filename':'F1', 'lnum':10}]})
2372ae338338SBram Moolenaar  call assert_equal(10, g:Xgetlist({'items':1}).items[0].lnum)
2373ae338338SBram Moolenaar
2374a2aa8a2bSBram Moolenaar  " Try setting the items using a string
2375a2aa8a2bSBram Moolenaar  call assert_equal(-1, g:Xsetlist([], ' ', {'items' : 'Test'}))
2376a2aa8a2bSBram Moolenaar
23776a8958dbSBram Moolenaar  " Save and restore the quickfix stack
23786a8958dbSBram Moolenaar  call g:Xsetlist([], 'f')
23796a8958dbSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
23806a8958dbSBram Moolenaar  Xexpr "File1:10:Line1"
23816a8958dbSBram Moolenaar  Xexpr "File2:20:Line2"
23826a8958dbSBram Moolenaar  Xexpr "File3:30:Line3"
23836a8958dbSBram Moolenaar  let last_qf = g:Xgetlist({'nr':'$'}).nr
23846a8958dbSBram Moolenaar  call assert_equal(3, last_qf)
23856a8958dbSBram Moolenaar  let qstack = []
23866a8958dbSBram Moolenaar  for i in range(1, last_qf)
23876a8958dbSBram Moolenaar    let qstack = add(qstack, g:Xgetlist({'nr':i, 'all':1}))
23886a8958dbSBram Moolenaar  endfor
23896a8958dbSBram Moolenaar  call g:Xsetlist([], 'f')
23906a8958dbSBram Moolenaar  for i in range(len(qstack))
23916a8958dbSBram Moolenaar    call g:Xsetlist([], ' ', qstack[i])
23926a8958dbSBram Moolenaar  endfor
23936a8958dbSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
23946a8958dbSBram Moolenaar  call assert_equal(10, g:Xgetlist({'nr':1, 'items':1}).items[0].lnum)
23956a8958dbSBram Moolenaar  call assert_equal(20, g:Xgetlist({'nr':2, 'items':1}).items[0].lnum)
23966a8958dbSBram Moolenaar  call assert_equal(30, g:Xgetlist({'nr':3, 'items':1}).items[0].lnum)
23976a8958dbSBram Moolenaar  call g:Xsetlist([], 'f')
23986a8958dbSBram Moolenaar
23996a8958dbSBram Moolenaar  " Swap two quickfix lists
24006a8958dbSBram Moolenaar  Xexpr "File1:10:Line10"
24016a8958dbSBram Moolenaar  Xexpr "File2:20:Line20"
24026a8958dbSBram Moolenaar  Xexpr "File3:30:Line30"
24036a8958dbSBram Moolenaar  call g:Xsetlist([], 'r', {'nr':1,'title':'Colors','context':['Colors']})
24046a8958dbSBram Moolenaar  call g:Xsetlist([], 'r', {'nr':2,'title':'Fruits','context':['Fruits']})
24056a8958dbSBram Moolenaar  let l1=g:Xgetlist({'nr':1,'all':1})
24066a8958dbSBram Moolenaar  let l2=g:Xgetlist({'nr':2,'all':1})
2407a539f4f1SBram Moolenaar  let save_id = l1.id
2408a539f4f1SBram Moolenaar  let l1.id=l2.id
2409a539f4f1SBram Moolenaar  let l2.id=save_id
24106a8958dbSBram Moolenaar  call g:Xsetlist([], 'r', l1)
24116a8958dbSBram Moolenaar  call g:Xsetlist([], 'r', l2)
24126a8958dbSBram Moolenaar  let newl1=g:Xgetlist({'nr':1,'all':1})
24136a8958dbSBram Moolenaar  let newl2=g:Xgetlist({'nr':2,'all':1})
2414b4d5fbabSBram Moolenaar  call assert_equal('Fruits', newl1.title)
24156a8958dbSBram Moolenaar  call assert_equal(['Fruits'], newl1.context)
24166a8958dbSBram Moolenaar  call assert_equal('Line20', newl1.items[0].text)
2417b4d5fbabSBram Moolenaar  call assert_equal('Colors', newl2.title)
24186a8958dbSBram Moolenaar  call assert_equal(['Colors'], newl2.context)
24196a8958dbSBram Moolenaar  call assert_equal('Line10', newl2.items[0].text)
24206a8958dbSBram Moolenaar  call g:Xsetlist([], 'f')
2421be7a50c2SBram Moolenaar
2422be7a50c2SBram Moolenaar  " Cannot specify both a non-empty list argument and a dict argument
2423be7a50c2SBram Moolenaar  call assert_fails("call g:Xsetlist([{}], ' ', {})", 'E475:')
24242b946c9fSBram Moolenaarendfunc
2425d823fa91SBram Moolenaar
24262b946c9fSBram Moolenaarfunc Test_qf_property()
2427d823fa91SBram Moolenaar  call Xproperty_tests('c')
2428d823fa91SBram Moolenaar  call Xproperty_tests('l')
24292b946c9fSBram Moolenaarendfunc
243004c4ce65SBram Moolenaar
24315b69c22fSBram Moolenaar" Test for setting the current index in the location/quickfix list
24325b69c22fSBram Moolenaarfunc Xtest_setqfidx(cchar)
24335b69c22fSBram Moolenaar  call s:setup_commands(a:cchar)
24345b69c22fSBram Moolenaar
24355b69c22fSBram Moolenaar  Xgetexpr "F1:10:1:Line1\nF2:20:2:Line2\nF3:30:3:Line3"
24365b69c22fSBram Moolenaar  Xgetexpr "F4:10:1:Line1\nF5:20:2:Line2\nF6:30:3:Line3"
24375b69c22fSBram Moolenaar  Xgetexpr "F7:10:1:Line1\nF8:20:2:Line2\nF9:30:3:Line3"
24385b69c22fSBram Moolenaar
24395b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 3, 'idx' : 2})
24405b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'idx' : 2})
24415b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 3})
24425b69c22fSBram Moolenaar  Xolder 2
24435b69c22fSBram Moolenaar  Xopen
24445b69c22fSBram Moolenaar  call assert_equal(3, line('.'))
24455b69c22fSBram Moolenaar  Xnewer
24465b69c22fSBram Moolenaar  call assert_equal(2, line('.'))
24475b69c22fSBram Moolenaar  Xnewer
24485b69c22fSBram Moolenaar  call assert_equal(2, line('.'))
24495b69c22fSBram Moolenaar  " Update the current index with the quickfix window open
24505b69c22fSBram Moolenaar  wincmd w
24515b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 3, 'idx' : 3})
24525b69c22fSBram Moolenaar  Xopen
24535b69c22fSBram Moolenaar  call assert_equal(3, line('.'))
24545b69c22fSBram Moolenaar  Xclose
24555b69c22fSBram Moolenaar
24565b69c22fSBram Moolenaar  " Set the current index to the last entry
24575b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : '$'})
24585b69c22fSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
24595b69c22fSBram Moolenaar  " A large value should set the index to the last index
24605b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 1})
24615b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 999})
24625b69c22fSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
24635b69c22fSBram Moolenaar  " Invalid index values
24645b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : -1})
24655b69c22fSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
24665b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 0})
24675b69c22fSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
24685b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 'xx'})
24695b69c22fSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
24705b69c22fSBram Moolenaar  call assert_fails("call g:Xsetlist([], 'a', {'nr':1, 'idx':[]})", 'E745:')
24715b69c22fSBram Moolenaar
24725b69c22fSBram Moolenaar  call g:Xsetlist([], 'f')
24735b69c22fSBram Moolenaar  new | only
24745b69c22fSBram Moolenaarendfunc
24755b69c22fSBram Moolenaar
24765b69c22fSBram Moolenaarfunc Test_setqfidx()
24775b69c22fSBram Moolenaar  call Xtest_setqfidx('c')
24785b69c22fSBram Moolenaar  call Xtest_setqfidx('l')
24795b69c22fSBram Moolenaarendfunc
24805b69c22fSBram Moolenaar
248104c4ce65SBram Moolenaar" Tests for the QuickFixCmdPre/QuickFixCmdPost autocommands
24822b946c9fSBram Moolenaarfunc QfAutoCmdHandler(loc, cmd)
248304c4ce65SBram Moolenaar  call add(g:acmds, a:loc . a:cmd)
24842b946c9fSBram Moolenaarendfunc
248504c4ce65SBram Moolenaar
24862b946c9fSBram Moolenaarfunc Test_Autocmd()
248704c4ce65SBram Moolenaar  autocmd QuickFixCmdPre * call QfAutoCmdHandler('pre', expand('<amatch>'))
248804c4ce65SBram Moolenaar  autocmd QuickFixCmdPost * call QfAutoCmdHandler('post', expand('<amatch>'))
248904c4ce65SBram Moolenaar
249004c4ce65SBram Moolenaar  let g:acmds = []
249104c4ce65SBram Moolenaar  cexpr "F1:10:Line 10"
249204c4ce65SBram Moolenaar  caddexpr "F1:20:Line 20"
249304c4ce65SBram Moolenaar  cgetexpr "F1:30:Line 30"
24941ed2276fSBram Moolenaar  cexpr ""
24951ed2276fSBram Moolenaar  caddexpr ""
24961ed2276fSBram Moolenaar  cgetexpr ""
24971ed2276fSBram Moolenaar  silent! cexpr non_existing_func()
24981ed2276fSBram Moolenaar  silent! caddexpr non_existing_func()
24991ed2276fSBram Moolenaar  silent! cgetexpr non_existing_func()
250004c4ce65SBram Moolenaar  let l = ['precexpr',
250104c4ce65SBram Moolenaar	      \ 'postcexpr',
250204c4ce65SBram Moolenaar	      \ 'precaddexpr',
250304c4ce65SBram Moolenaar	      \ 'postcaddexpr',
250404c4ce65SBram Moolenaar	      \ 'precgetexpr',
250504c4ce65SBram Moolenaar	      \ 'postcgetexpr',
25061ed2276fSBram Moolenaar	      \ 'precexpr',
25071ed2276fSBram Moolenaar	      \ 'postcexpr',
25081ed2276fSBram Moolenaar	      \ 'precaddexpr',
25091ed2276fSBram Moolenaar	      \ 'postcaddexpr',
25101ed2276fSBram Moolenaar	      \ 'precgetexpr',
25111ed2276fSBram Moolenaar	      \ 'postcgetexpr',
25121ed2276fSBram Moolenaar	      \ 'precexpr',
25131ed2276fSBram Moolenaar	      \ 'precaddexpr',
25141ed2276fSBram Moolenaar	      \ 'precgetexpr']
25151ed2276fSBram Moolenaar  call assert_equal(l, g:acmds)
25161ed2276fSBram Moolenaar
25171ed2276fSBram Moolenaar  let g:acmds = []
25181ed2276fSBram Moolenaar  enew! | call append(0, "F2:10:Line 10")
25191ed2276fSBram Moolenaar  cbuffer!
25201ed2276fSBram Moolenaar  enew! | call append(0, "F2:20:Line 20")
25211ed2276fSBram Moolenaar  cgetbuffer
25221ed2276fSBram Moolenaar  enew! | call append(0, "F2:30:Line 30")
25231ed2276fSBram Moolenaar  caddbuffer
25241ed2276fSBram Moolenaar  new
25251ed2276fSBram Moolenaar  let bnum = bufnr('%')
25261ed2276fSBram Moolenaar  bunload
25271ed2276fSBram Moolenaar  exe 'silent! cbuffer! ' . bnum
25281ed2276fSBram Moolenaar  exe 'silent! cgetbuffer ' . bnum
25291ed2276fSBram Moolenaar  exe 'silent! caddbuffer ' . bnum
25301ed2276fSBram Moolenaar  enew!
25311ed2276fSBram Moolenaar  let l = ['precbuffer',
253204c4ce65SBram Moolenaar	      \ 'postcbuffer',
253304c4ce65SBram Moolenaar	      \ 'precgetbuffer',
253404c4ce65SBram Moolenaar	      \ 'postcgetbuffer',
253504c4ce65SBram Moolenaar	      \ 'precaddbuffer',
25361ed2276fSBram Moolenaar	      \ 'postcaddbuffer',
25371ed2276fSBram Moolenaar	      \ 'precbuffer',
25381ed2276fSBram Moolenaar	      \ 'precgetbuffer',
25391ed2276fSBram Moolenaar	      \ 'precaddbuffer']
254004c4ce65SBram Moolenaar  call assert_equal(l, g:acmds)
25411ed2276fSBram Moolenaar
25421ed2276fSBram Moolenaar  call writefile(['Xtest:1:Line1'], 'Xtest')
25431ed2276fSBram Moolenaar  call writefile([], 'Xempty')
25441ed2276fSBram Moolenaar  let g:acmds = []
25451ed2276fSBram Moolenaar  cfile Xtest
25461ed2276fSBram Moolenaar  caddfile Xtest
25471ed2276fSBram Moolenaar  cgetfile Xtest
25481ed2276fSBram Moolenaar  cfile Xempty
25491ed2276fSBram Moolenaar  caddfile Xempty
25501ed2276fSBram Moolenaar  cgetfile Xempty
25511ed2276fSBram Moolenaar  silent! cfile do_not_exist
25521ed2276fSBram Moolenaar  silent! caddfile do_not_exist
25531ed2276fSBram Moolenaar  silent! cgetfile do_not_exist
25541ed2276fSBram Moolenaar  let l = ['precfile',
25551ed2276fSBram Moolenaar	      \ 'postcfile',
25561ed2276fSBram Moolenaar	      \ 'precaddfile',
25571ed2276fSBram Moolenaar	      \ 'postcaddfile',
25581ed2276fSBram Moolenaar	      \ 'precgetfile',
25591ed2276fSBram Moolenaar	      \ 'postcgetfile',
25601ed2276fSBram Moolenaar	      \ 'precfile',
25611ed2276fSBram Moolenaar	      \ 'postcfile',
25621ed2276fSBram Moolenaar	      \ 'precaddfile',
25631ed2276fSBram Moolenaar	      \ 'postcaddfile',
25641ed2276fSBram Moolenaar	      \ 'precgetfile',
25651ed2276fSBram Moolenaar	      \ 'postcgetfile',
25661ed2276fSBram Moolenaar	      \ 'precfile',
25671ed2276fSBram Moolenaar	      \ 'postcfile',
25681ed2276fSBram Moolenaar	      \ 'precaddfile',
25691ed2276fSBram Moolenaar	      \ 'postcaddfile',
25701ed2276fSBram Moolenaar	      \ 'precgetfile',
25711ed2276fSBram Moolenaar	      \ 'postcgetfile']
25721ed2276fSBram Moolenaar  call assert_equal(l, g:acmds)
25731ed2276fSBram Moolenaar
25741ed2276fSBram Moolenaar  let g:acmds = []
25751ed2276fSBram Moolenaar  helpgrep quickfix
25761ed2276fSBram Moolenaar  silent! helpgrep non_existing_help_topic
25771ed2276fSBram Moolenaar  vimgrep test Xtest
25781ed2276fSBram Moolenaar  vimgrepadd test Xtest
25791ed2276fSBram Moolenaar  silent! vimgrep non_existing_test Xtest
25801ed2276fSBram Moolenaar  silent! vimgrepadd non_existing_test Xtest
25811ed2276fSBram Moolenaar  set makeprg=
25821ed2276fSBram Moolenaar  silent! make
25831ed2276fSBram Moolenaar  set makeprg&
25841ed2276fSBram Moolenaar  let l = ['prehelpgrep',
25851ed2276fSBram Moolenaar	      \ 'posthelpgrep',
25861ed2276fSBram Moolenaar	      \ 'prehelpgrep',
25871ed2276fSBram Moolenaar	      \ 'posthelpgrep',
25881ed2276fSBram Moolenaar	      \ 'previmgrep',
25891ed2276fSBram Moolenaar	      \ 'postvimgrep',
25901ed2276fSBram Moolenaar	      \ 'previmgrepadd',
25911ed2276fSBram Moolenaar	      \ 'postvimgrepadd',
25921ed2276fSBram Moolenaar	      \ 'previmgrep',
25931ed2276fSBram Moolenaar	      \ 'postvimgrep',
25941ed2276fSBram Moolenaar	      \ 'previmgrepadd',
25951ed2276fSBram Moolenaar	      \ 'postvimgrepadd',
25961ed2276fSBram Moolenaar	      \ 'premake',
25971ed2276fSBram Moolenaar	      \ 'postmake']
25981ed2276fSBram Moolenaar  call assert_equal(l, g:acmds)
25991ed2276fSBram Moolenaar
26001ed2276fSBram Moolenaar  if has('unix')
26011ed2276fSBram Moolenaar    " Run this test only on Unix-like systems. The grepprg may not be set on
26021ed2276fSBram Moolenaar    " non-Unix systems.
26031ed2276fSBram Moolenaar    " The following lines are used for the grep test. Don't remove.
26041ed2276fSBram Moolenaar    " Grep_Autocmd_Text: Match 1
26051ed2276fSBram Moolenaar    " GrepAdd_Autocmd_Text: Match 2
26061ed2276fSBram Moolenaar    let g:acmds = []
26071ed2276fSBram Moolenaar    silent grep Grep_Autocmd_Text test_quickfix.vim
26081ed2276fSBram Moolenaar    silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim
26091ed2276fSBram Moolenaar    silent grep abc123def Xtest
26101ed2276fSBram Moolenaar    silent grepadd abc123def Xtest
261115a7bdcbSBram Moolenaar    set grepprg=internal
261215a7bdcbSBram Moolenaar    silent grep Grep_Autocmd_Text test_quickfix.vim
261315a7bdcbSBram Moolenaar    silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim
261415a7bdcbSBram Moolenaar    silent lgrep Grep_Autocmd_Text test_quickfix.vim
261515a7bdcbSBram Moolenaar    silent lgrepadd GrepAdd_Autocmd_Text test_quickfix.vim
261615a7bdcbSBram Moolenaar    set grepprg&vim
26171ed2276fSBram Moolenaar    let l = ['pregrep',
26181ed2276fSBram Moolenaar		\ 'postgrep',
26191ed2276fSBram Moolenaar		\ 'pregrepadd',
26201ed2276fSBram Moolenaar		\ 'postgrepadd',
26211ed2276fSBram Moolenaar		\ 'pregrep',
26221ed2276fSBram Moolenaar		\ 'postgrep',
26231ed2276fSBram Moolenaar		\ 'pregrepadd',
262415a7bdcbSBram Moolenaar		\ 'postgrepadd',
262515a7bdcbSBram Moolenaar		\ 'pregrep',
262615a7bdcbSBram Moolenaar		\ 'postgrep',
262715a7bdcbSBram Moolenaar		\ 'pregrepadd',
262815a7bdcbSBram Moolenaar		\ 'postgrepadd',
262915a7bdcbSBram Moolenaar		\ 'prelgrep',
263015a7bdcbSBram Moolenaar		\ 'postlgrep',
263115a7bdcbSBram Moolenaar		\ 'prelgrepadd',
263215a7bdcbSBram Moolenaar		\ 'postlgrepadd']
26331ed2276fSBram Moolenaar    call assert_equal(l, g:acmds)
26341ed2276fSBram Moolenaar  endif
26351ed2276fSBram Moolenaar
26361ed2276fSBram Moolenaar  call delete('Xtest')
26371ed2276fSBram Moolenaar  call delete('Xempty')
2638b254af31SBram Moolenaar  au! QuickFixCmdPre
2639b254af31SBram Moolenaar  au! QuickFixCmdPost
26402b946c9fSBram Moolenaarendfunc
264121662be2SBram Moolenaar
26422b946c9fSBram Moolenaarfunc Test_Autocmd_Exception()
264321662be2SBram Moolenaar  set efm=%m
264421662be2SBram Moolenaar  lgetexpr '?'
264521662be2SBram Moolenaar
264621662be2SBram Moolenaar  try
264721662be2SBram Moolenaar    call DoesNotExit()
264821662be2SBram Moolenaar  catch
264921662be2SBram Moolenaar    lgetexpr '1'
265021662be2SBram Moolenaar  finally
265121662be2SBram Moolenaar    lgetexpr '1'
265221662be2SBram Moolenaar  endtry
265321662be2SBram Moolenaar
265421662be2SBram Moolenaar  call assert_equal('1', getloclist(0)[0].text)
265521662be2SBram Moolenaar
265621662be2SBram Moolenaar  set efm&vim
26572b946c9fSBram Moolenaarendfunc
265863bed3d3SBram Moolenaar
26592b946c9fSBram Moolenaarfunc Test_caddbuffer_wrong()
26602b946c9fSBram Moolenaar  " This used to cause a memory access in freed memory.
266163bed3d3SBram Moolenaar  let save_efm = &efm
266263bed3d3SBram Moolenaar  set efm=%EEEE%m,%WWWW,%+CCCC%>%#,%GGGG%.#
266363bed3d3SBram Moolenaar  cgetexpr ['WWWW', 'EEEE', 'CCCC']
266463bed3d3SBram Moolenaar  let &efm = save_efm
26652b946c9fSBram Moolenaar  caddbuffer
266663bed3d3SBram Moolenaar  bwipe!
266763bed3d3SBram Moolenaarendfunc
26682b946c9fSBram Moolenaar
26692b946c9fSBram Moolenaarfunc Test_caddexpr_wrong()
26702b946c9fSBram Moolenaar  " This used to cause a memory access in freed memory.
26712b946c9fSBram Moolenaar  cbuffer
26722b946c9fSBram Moolenaar  cbuffer
26732b946c9fSBram Moolenaar  copen
26742b946c9fSBram Moolenaar  let save_efm = &efm
26752b946c9fSBram Moolenaar  set efm=%
26762b946c9fSBram Moolenaar  call assert_fails('caddexpr ""', 'E376:')
26772b946c9fSBram Moolenaar  let &efm = save_efm
26782b946c9fSBram Moolenaarendfunc
26797618e00dSBram Moolenaar
26807618e00dSBram Moolenaarfunc Test_dirstack_cleanup()
26817618e00dSBram Moolenaar  " This used to cause a memory access in freed memory.
26827618e00dSBram Moolenaar  let save_efm = &efm
26837618e00dSBram Moolenaar  lexpr '0'
26847618e00dSBram Moolenaar  lopen
26857618e00dSBram Moolenaar  fun X(c)
26867618e00dSBram Moolenaar    let save_efm=&efm
26877618e00dSBram Moolenaar    set efm=%D%f
26887618e00dSBram Moolenaar    if a:c == 'c'
26897618e00dSBram Moolenaar      caddexpr '::'
26907618e00dSBram Moolenaar    else
26917618e00dSBram Moolenaar      laddexpr ':0:0'
26927618e00dSBram Moolenaar    endif
26937618e00dSBram Moolenaar    let &efm=save_efm
26947618e00dSBram Moolenaar  endfun
26957618e00dSBram Moolenaar  call X('c')
26967618e00dSBram Moolenaar  call X('l')
26977618e00dSBram Moolenaar  call setqflist([], 'r')
26987618e00dSBram Moolenaar  caddbuffer
26997618e00dSBram Moolenaar  let &efm = save_efm
27007618e00dSBram Moolenaarendfunc
2701391b1dd0SBram Moolenaar
2702391b1dd0SBram Moolenaar" Tests for jumping to entries from the location list window and quickfix
2703391b1dd0SBram Moolenaar" window
2704391b1dd0SBram Moolenaarfunc Test_cwindow_jump()
2705391b1dd0SBram Moolenaar  set efm=%f%%%l%%%m
2706391b1dd0SBram Moolenaar  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2707391b1dd0SBram Moolenaar  lopen | only
2708391b1dd0SBram Moolenaar  lfirst
2709391b1dd0SBram Moolenaar  call assert_true(winnr('$') == 2)
2710391b1dd0SBram Moolenaar  call assert_true(winnr() == 1)
2711391b1dd0SBram Moolenaar  " Location list for the new window should be set
2712391b1dd0SBram Moolenaar  call assert_true(getloclist(0)[2].text == 'Line 30')
2713391b1dd0SBram Moolenaar
2714391b1dd0SBram Moolenaar  " Open a scratch buffer
2715391b1dd0SBram Moolenaar  " Open a new window and create a location list
2716391b1dd0SBram Moolenaar  " Open the location list window and close the other window
2717391b1dd0SBram Moolenaar  " Jump to an entry.
2718eeb1b9c7SBram Moolenaar  " Should create a new window and jump to the entry. The scratch buffer
2719391b1dd0SBram Moolenaar  " should not be used.
2720391b1dd0SBram Moolenaar  enew | only
2721391b1dd0SBram Moolenaar  set buftype=nofile
2722391b1dd0SBram Moolenaar  below new
2723391b1dd0SBram Moolenaar  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2724391b1dd0SBram Moolenaar  lopen
2725391b1dd0SBram Moolenaar  2wincmd c
2726391b1dd0SBram Moolenaar  lnext
2727391b1dd0SBram Moolenaar  call assert_true(winnr('$') == 3)
2728391b1dd0SBram Moolenaar  call assert_true(winnr() == 2)
2729391b1dd0SBram Moolenaar
2730391b1dd0SBram Moolenaar  " Open two windows with two different location lists
2731391b1dd0SBram Moolenaar  " Open the location list window and close the previous window
2732391b1dd0SBram Moolenaar  " Jump to an entry in the location list window
2733391b1dd0SBram Moolenaar  " Should open the file in the first window and not set the location list.
2734391b1dd0SBram Moolenaar  enew | only
2735391b1dd0SBram Moolenaar  lgetexpr ["F1%5%Line 5"]
2736391b1dd0SBram Moolenaar  below new
2737391b1dd0SBram Moolenaar  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2738391b1dd0SBram Moolenaar  lopen
2739391b1dd0SBram Moolenaar  2wincmd c
2740391b1dd0SBram Moolenaar  lnext
2741391b1dd0SBram Moolenaar  call assert_true(winnr() == 1)
2742391b1dd0SBram Moolenaar  call assert_true(getloclist(0)[0].text == 'Line 5')
2743391b1dd0SBram Moolenaar
2744391b1dd0SBram Moolenaar  enew | only
2745391b1dd0SBram Moolenaar  cgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2746391b1dd0SBram Moolenaar  copen
2747391b1dd0SBram Moolenaar  cnext
2748391b1dd0SBram Moolenaar  call assert_true(winnr('$') == 2)
2749391b1dd0SBram Moolenaar  call assert_true(winnr() == 1)
2750391b1dd0SBram Moolenaar
2751f9ae154cSBram Moolenaar  " open the quickfix buffer in two windows and jump to an entry. Should open
2752f9ae154cSBram Moolenaar  " the file in the first quickfix window.
2753f9ae154cSBram Moolenaar  enew | only
2754f9ae154cSBram Moolenaar  copen
2755f9ae154cSBram Moolenaar  let bnum = bufnr('')
2756f9ae154cSBram Moolenaar  exe 'sbuffer ' . bnum
2757f9ae154cSBram Moolenaar  wincmd b
2758f9ae154cSBram Moolenaar  cfirst
2759f9ae154cSBram Moolenaar  call assert_equal(2, winnr())
2760bdd2c290SBram Moolenaar  call assert_equal('F1', @%)
2761f9ae154cSBram Moolenaar  enew | only
2762f9ae154cSBram Moolenaar  exe 'sb' bnum
2763f9ae154cSBram Moolenaar  exe 'botright sb' bnum
2764f9ae154cSBram Moolenaar  wincmd t
2765f9ae154cSBram Moolenaar  clast
2766f9ae154cSBram Moolenaar  call assert_equal(2, winnr())
2767f9ae154cSBram Moolenaar  call assert_equal('quickfix', getwinvar(1, '&buftype'))
2768f9ae154cSBram Moolenaar  call assert_equal('quickfix', getwinvar(3, '&buftype'))
2769f9ae154cSBram Moolenaar
27704b96df5aSBram Moolenaar  " Jumping to a file from the location list window should find a usable
277115a7bdcbSBram Moolenaar  " window by wrapping around the window list.
277215a7bdcbSBram Moolenaar  enew | only
277315a7bdcbSBram Moolenaar  call setloclist(0, [], 'f')
277415a7bdcbSBram Moolenaar  new | new
277515a7bdcbSBram Moolenaar  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
277615a7bdcbSBram Moolenaar  lopen
277715a7bdcbSBram Moolenaar  1close
277815a7bdcbSBram Moolenaar  call assert_equal(0, getloclist(3, {'id' : 0}).id)
277915a7bdcbSBram Moolenaar  lnext
278015a7bdcbSBram Moolenaar  call assert_equal(3, winnr())
278115a7bdcbSBram Moolenaar  call assert_equal(getloclist(1, {'id' : 0}).id, getloclist(3, {'id' : 0}).id)
278215a7bdcbSBram Moolenaar
2783391b1dd0SBram Moolenaar  enew | only
2784391b1dd0SBram Moolenaar  set efm&vim
2785391b1dd0SBram Moolenaarendfunc
2786ee85df37SBram Moolenaar
2787e00fdf35SBram Moolenaarfunc Test_cwindow_highlight()
2788e00fdf35SBram Moolenaar  CheckScreendump
2789e00fdf35SBram Moolenaar
2790e00fdf35SBram Moolenaar  let lines =<< trim END
2791e00fdf35SBram Moolenaar	call setline(1, ['some', 'text', 'with', 'matches'])
2792e00fdf35SBram Moolenaar	write XCwindow
2793e00fdf35SBram Moolenaar	vimgrep e XCwindow
2794e00fdf35SBram Moolenaar	redraw
2795e00fdf35SBram Moolenaar	cwindow 4
2796e00fdf35SBram Moolenaar  END
2797e00fdf35SBram Moolenaar  call writefile(lines, 'XtestCwindow')
2798e00fdf35SBram Moolenaar  let buf = RunVimInTerminal('-S XtestCwindow', #{rows: 12})
2799e00fdf35SBram Moolenaar  call VerifyScreenDump(buf, 'Test_quickfix_cwindow_1', {})
2800e00fdf35SBram Moolenaar
2801e00fdf35SBram Moolenaar  call term_sendkeys(buf, ":cnext\<CR>")
2802e00fdf35SBram Moolenaar  call VerifyScreenDump(buf, 'Test_quickfix_cwindow_2', {})
2803e00fdf35SBram Moolenaar
2804e00fdf35SBram Moolenaar  " clean up
2805e00fdf35SBram Moolenaar  call StopVimInTerminal(buf)
2806e00fdf35SBram Moolenaar  call delete('XtestCwindow')
2807e00fdf35SBram Moolenaar  call delete('XCwindow')
2808e00fdf35SBram Moolenaarendfunc
2809e00fdf35SBram Moolenaar
2810ee85df37SBram Moolenaarfunc XvimgrepTests(cchar)
2811ee85df37SBram Moolenaar  call s:setup_commands(a:cchar)
2812ee85df37SBram Moolenaar
2813ee85df37SBram Moolenaar  call writefile(['Editor:VIM vim',
2814ee85df37SBram Moolenaar	      \ 'Editor:Emacs EmAcS',
2815ee85df37SBram Moolenaar	      \ 'Editor:Notepad NOTEPAD'], 'Xtestfile1')
2816ee85df37SBram Moolenaar  call writefile(['Linux', 'MacOS', 'MS-Windows'], 'Xtestfile2')
2817ee85df37SBram Moolenaar
2818ee85df37SBram Moolenaar  " Error cases
2819ee85df37SBram Moolenaar  call assert_fails('Xvimgrep /abc *', 'E682:')
2820ee85df37SBram Moolenaar
2821ee85df37SBram Moolenaar  let @/=''
2822ee85df37SBram Moolenaar  call assert_fails('Xvimgrep // *', 'E35:')
2823ee85df37SBram Moolenaar
2824ee85df37SBram Moolenaar  call assert_fails('Xvimgrep abc', 'E683:')
2825ee85df37SBram Moolenaar  call assert_fails('Xvimgrep a1b2c3 Xtestfile1', 'E480:')
2826ee85df37SBram Moolenaar  call assert_fails('Xvimgrep pat Xa1b2c3', 'E480:')
2827ee85df37SBram Moolenaar
2828ee85df37SBram Moolenaar  Xexpr ""
2829ee85df37SBram Moolenaar  Xvimgrepadd Notepad Xtestfile1
2830ee85df37SBram Moolenaar  Xvimgrepadd MacOS Xtestfile2
2831ee85df37SBram Moolenaar  let l = g:Xgetlist()
2832ee85df37SBram Moolenaar  call assert_equal(2, len(l))
2833ee85df37SBram Moolenaar  call assert_equal('Editor:Notepad NOTEPAD', l[0].text)
2834ee85df37SBram Moolenaar
2835f9ae154cSBram Moolenaar  10Xvimgrep #\cvim#g Xtestfile?
2836ee85df37SBram Moolenaar  let l = g:Xgetlist()
2837ee85df37SBram Moolenaar  call assert_equal(2, len(l))
2838ee85df37SBram Moolenaar  call assert_equal(8, l[0].col)
2839ee85df37SBram Moolenaar  call assert_equal(12, l[1].col)
2840ee85df37SBram Moolenaar
2841ee85df37SBram Moolenaar  1Xvimgrep ?Editor? Xtestfile*
2842ee85df37SBram Moolenaar  let l = g:Xgetlist()
2843ee85df37SBram Moolenaar  call assert_equal(1, len(l))
2844ee85df37SBram Moolenaar  call assert_equal('Editor:VIM vim', l[0].text)
2845ee85df37SBram Moolenaar
2846ee85df37SBram Moolenaar  edit +3 Xtestfile2
2847ee85df37SBram Moolenaar  Xvimgrep +\cemacs+j Xtestfile1
2848ee85df37SBram Moolenaar  let l = g:Xgetlist()
2849bdd2c290SBram Moolenaar  call assert_equal('Xtestfile2', @%)
2850ee85df37SBram Moolenaar  call assert_equal('Editor:Emacs EmAcS', l[0].text)
2851ee85df37SBram Moolenaar
28522225ebb4SBram Moolenaar  " Test for unloading a buffer after vimgrep searched the buffer
28532225ebb4SBram Moolenaar  %bwipe
28542225ebb4SBram Moolenaar  Xvimgrep /Editor/j Xtestfile*
28552225ebb4SBram Moolenaar  call assert_equal(0, getbufinfo('Xtestfile1')[0].loaded)
28562225ebb4SBram Moolenaar  call assert_equal([], getbufinfo('Xtestfile2'))
28572225ebb4SBram Moolenaar
2858ee85df37SBram Moolenaar  call delete('Xtestfile1')
2859ee85df37SBram Moolenaar  call delete('Xtestfile2')
2860ee85df37SBram Moolenaarendfunc
2861ee85df37SBram Moolenaar
2862ee85df37SBram Moolenaar" Tests for the :vimgrep command
2863ee85df37SBram Moolenaarfunc Test_vimgrep()
2864ee85df37SBram Moolenaar  call XvimgrepTests('c')
2865ee85df37SBram Moolenaar  call XvimgrepTests('l')
2866ee85df37SBram Moolenaarendfunc
286769f40be6SBram Moolenaar
2868f8c6a171SBram Moolenaarfunc Test_vimgrep_wildcards_expanded_once()
2869f8c6a171SBram Moolenaar  new X[id-01] file.txt
2870f8c6a171SBram Moolenaar  call setline(1, 'some text to search for')
2871f8c6a171SBram Moolenaar  vimgrep text %
2872f8c6a171SBram Moolenaar  bwipe!
2873f8c6a171SBram Moolenaarendfunc
2874f8c6a171SBram Moolenaar
28751c299434SBram Moolenaar" Test for incsearch highlighting of the :vimgrep pattern
28761c299434SBram Moolenaar" This test used to cause "E315: ml_get: invalid lnum" errors.
28771c299434SBram Moolenaarfunc Test_vimgrep_incsearch()
28781c299434SBram Moolenaar  enew
28791c299434SBram Moolenaar  set incsearch
28801c299434SBram Moolenaar  call test_override("char_avail", 1)
28811c299434SBram Moolenaar
28821c299434SBram Moolenaar  call feedkeys(":2vimgrep assert test_quickfix.vim test_cdo.vim\<CR>", "ntx")
28831c299434SBram Moolenaar  let l = getqflist()
28841c299434SBram Moolenaar  call assert_equal(2, len(l))
28851c299434SBram Moolenaar
28861c299434SBram Moolenaar  call test_override("ALL", 0)
28871c299434SBram Moolenaar  set noincsearch
28881c299434SBram Moolenaarendfunc
28891c299434SBram Moolenaar
28909f6277bdSBram Moolenaar" Test vimgrep with the last search pattern not set
28919f6277bdSBram Moolenaarfunc Test_vimgrep_with_no_last_search_pat()
28929f6277bdSBram Moolenaar  let lines =<< trim [SCRIPT]
28939f6277bdSBram Moolenaar    call assert_fails('vimgrep // *', 'E35:')
28949f6277bdSBram Moolenaar    call writefile(v:errors, 'Xresult')
28959f6277bdSBram Moolenaar    qall!
28969f6277bdSBram Moolenaar  [SCRIPT]
28979f6277bdSBram Moolenaar  call writefile(lines, 'Xscript')
28989f6277bdSBram Moolenaar  if RunVim([], [], '--clean -S Xscript')
28999f6277bdSBram Moolenaar    call assert_equal([], readfile('Xresult'))
29009f6277bdSBram Moolenaar  endif
29019f6277bdSBram Moolenaar  call delete('Xscript')
29029f6277bdSBram Moolenaar  call delete('Xresult')
29039f6277bdSBram Moolenaarendfunc
29049f6277bdSBram Moolenaar
2905997cd1a1SBram Moolenaar" Test vimgrep without swap file
2906997cd1a1SBram Moolenaarfunc Test_vimgrep_without_swap_file()
2907997cd1a1SBram Moolenaar  let lines =<< trim [SCRIPT]
2908997cd1a1SBram Moolenaar    vimgrep grep test_c*
2909997cd1a1SBram Moolenaar    call writefile(['done'], 'Xresult')
2910997cd1a1SBram Moolenaar    qall!
2911997cd1a1SBram Moolenaar  [SCRIPT]
2912997cd1a1SBram Moolenaar  call writefile(lines, 'Xscript')
2913997cd1a1SBram Moolenaar  if RunVim([], [], '--clean -n -S Xscript Xscript')
2914997cd1a1SBram Moolenaar    call assert_equal(['done'], readfile('Xresult'))
2915997cd1a1SBram Moolenaar  endif
2916997cd1a1SBram Moolenaar  call delete('Xscript')
2917997cd1a1SBram Moolenaar  call delete('Xresult')
2918997cd1a1SBram Moolenaarendfunc
2919997cd1a1SBram Moolenaar
29208ce4b7edSBram Moolenaarfunc Test_vimgrep_existing_swapfile()
29218ce4b7edSBram Moolenaar  call writefile(['match apple with apple'], 'Xapple')
29228ce4b7edSBram Moolenaar  call writefile(['swapfile'], '.Xapple.swp')
29238ce4b7edSBram Moolenaar  let g:foundSwap = 0
29248ce4b7edSBram Moolenaar  let g:ignoreSwapExists = 1
29258ce4b7edSBram Moolenaar  augroup grep
29268ce4b7edSBram Moolenaar    au SwapExists * let foundSwap = 1 | let v:swapchoice = 'e'
29278ce4b7edSBram Moolenaar  augroup END
29288ce4b7edSBram Moolenaar  vimgrep apple Xapple
29298ce4b7edSBram Moolenaar  call assert_equal(1, g:foundSwap)
29308ce4b7edSBram Moolenaar  call assert_match('.Xapple.swo', swapname(''))
29318ce4b7edSBram Moolenaar
29328ce4b7edSBram Moolenaar  call delete('Xapple')
29336d91bcb4SBram Moolenaar  call delete('.Xapple.swp')
29348ce4b7edSBram Moolenaar  augroup grep
29358ce4b7edSBram Moolenaar    au! SwapExists
29368ce4b7edSBram Moolenaar  augroup END
29378ce4b7edSBram Moolenaar  unlet g:ignoreSwapExists
29388ce4b7edSBram Moolenaarendfunc
29398ce4b7edSBram Moolenaar
294069f40be6SBram Moolenaarfunc XfreeTests(cchar)
294169f40be6SBram Moolenaar  call s:setup_commands(a:cchar)
294269f40be6SBram Moolenaar
294369f40be6SBram Moolenaar  enew | only
294469f40be6SBram Moolenaar
294569f40be6SBram Moolenaar  " Deleting the quickfix stack should work even When the current list is
294669f40be6SBram Moolenaar  " somewhere in the middle of the stack
294769f40be6SBram Moolenaar  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
294869f40be6SBram Moolenaar  Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
294969f40be6SBram Moolenaar  Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
295069f40be6SBram Moolenaar  Xolder
295169f40be6SBram Moolenaar  call g:Xsetlist([], 'f')
295269f40be6SBram Moolenaar  call assert_equal(0, len(g:Xgetlist()))
295369f40be6SBram Moolenaar
295469f40be6SBram Moolenaar  " After deleting the stack, adding a new list should create a stack with a
295569f40be6SBram Moolenaar  " single list.
295669f40be6SBram Moolenaar  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
295769f40be6SBram Moolenaar  call assert_equal(1, g:Xgetlist({'all':1}).nr)
295869f40be6SBram Moolenaar
295969f40be6SBram Moolenaar  " Deleting the stack from a quickfix window should update/clear the
296069f40be6SBram Moolenaar  " quickfix/location list window.
296169f40be6SBram Moolenaar  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
296269f40be6SBram Moolenaar  Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
296369f40be6SBram Moolenaar  Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
296469f40be6SBram Moolenaar  Xolder
296569f40be6SBram Moolenaar  Xwindow
296669f40be6SBram Moolenaar  call g:Xsetlist([], 'f')
296769f40be6SBram Moolenaar  call assert_equal(2, winnr('$'))
296869f40be6SBram Moolenaar  call assert_equal(1, line('$'))
296969f40be6SBram Moolenaar  Xclose
297069f40be6SBram Moolenaar
297169f40be6SBram Moolenaar  " Deleting the stack from a non-quickfix window should update/clear the
297269f40be6SBram Moolenaar  " quickfix/location list window.
297369f40be6SBram Moolenaar  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
297469f40be6SBram Moolenaar  Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
297569f40be6SBram Moolenaar  Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
297669f40be6SBram Moolenaar  Xolder
297769f40be6SBram Moolenaar  Xwindow
297869f40be6SBram Moolenaar  wincmd p
297969f40be6SBram Moolenaar  call g:Xsetlist([], 'f')
298069f40be6SBram Moolenaar  call assert_equal(0, len(g:Xgetlist()))
298169f40be6SBram Moolenaar  wincmd p
298269f40be6SBram Moolenaar  call assert_equal(2, winnr('$'))
298369f40be6SBram Moolenaar  call assert_equal(1, line('$'))
298469f40be6SBram Moolenaar
298569f40be6SBram Moolenaar  " After deleting the location list stack, if the location list window is
298669f40be6SBram Moolenaar  " opened, then a new location list should be created. So opening the
298769f40be6SBram Moolenaar  " location list window again should not create a new window.
298869f40be6SBram Moolenaar  if a:cchar == 'l'
298969f40be6SBram Moolenaar      lexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
299069f40be6SBram Moolenaar      wincmd p
299169f40be6SBram Moolenaar      lopen
299269f40be6SBram Moolenaar      call assert_equal(2, winnr('$'))
299369f40be6SBram Moolenaar  endif
299469f40be6SBram Moolenaar  Xclose
299569f40be6SBram Moolenaarendfunc
299669f40be6SBram Moolenaar
299774240d3fSBram Moolenaar" Tests for the quickfix free functionality
299869f40be6SBram Moolenaarfunc Test_qf_free()
299969f40be6SBram Moolenaar  call XfreeTests('c')
300069f40be6SBram Moolenaar  call XfreeTests('l')
300169f40be6SBram Moolenaarendfunc
30026e62da3eSBram Moolenaar
30036e62da3eSBram Moolenaar" Test for buffer overflow when parsing lines and adding new entries to
30046e62da3eSBram Moolenaar" the quickfix list.
30056e62da3eSBram Moolenaarfunc Test_bufoverflow()
30066e62da3eSBram Moolenaar  set efm=%f:%l:%m
30076e62da3eSBram Moolenaar  cgetexpr ['File1:100:' . repeat('x', 1025)]
30086e62da3eSBram Moolenaar
30096e62da3eSBram Moolenaar  set efm=%+GCompiler:\ %.%#,%f:%l:%m
30106e62da3eSBram Moolenaar  cgetexpr ['Compiler: ' . repeat('a', 1015), 'File1:10:Hello World']
30116e62da3eSBram Moolenaar
30126e62da3eSBram Moolenaar  set efm=%DEntering\ directory\ %f,%f:%l:%m
30136e62da3eSBram Moolenaar  cgetexpr ['Entering directory ' . repeat('a', 1006),
30146e62da3eSBram Moolenaar	      \ 'File1:10:Hello World']
30156e62da3eSBram Moolenaar  set efm&vim
30166e62da3eSBram Moolenaarendfunc
30176e62da3eSBram Moolenaar
3018875feea6SBram Moolenaar" Tests for getting the quickfix stack size
3019875feea6SBram Moolenaarfunc XsizeTests(cchar)
3020875feea6SBram Moolenaar  call s:setup_commands(a:cchar)
3021875feea6SBram Moolenaar
3022875feea6SBram Moolenaar  call g:Xsetlist([], 'f')
3023875feea6SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
3024a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'nr':'$', 'all':1}).title)
3025a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr':0}).nr)
3026875feea6SBram Moolenaar
3027875feea6SBram Moolenaar  Xexpr "File1:10:Line1"
3028875feea6SBram Moolenaar  Xexpr "File2:20:Line2"
3029875feea6SBram Moolenaar  Xexpr "File3:30:Line3"
3030875feea6SBram Moolenaar  Xolder | Xolder
3031875feea6SBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
3032875feea6SBram Moolenaar  call g:Xsetlist([], 'f')
3033875feea6SBram Moolenaar
3034875feea6SBram Moolenaar  Xexpr "File1:10:Line1"
3035875feea6SBram Moolenaar  Xexpr "File2:20:Line2"
3036875feea6SBram Moolenaar  Xexpr "File3:30:Line3"
3037875feea6SBram Moolenaar  Xolder | Xolder
3038875feea6SBram Moolenaar  call g:Xsetlist([], 'a', {'nr':'$', 'title':'Compiler'})
3039875feea6SBram Moolenaar  call assert_equal('Compiler', g:Xgetlist({'nr':3, 'all':1}).title)
3040875feea6SBram Moolenaarendfunc
3041875feea6SBram Moolenaar
3042875feea6SBram Moolenaarfunc Test_Qf_Size()
3043875feea6SBram Moolenaar  call XsizeTests('c')
3044875feea6SBram Moolenaar  call XsizeTests('l')
3045875feea6SBram Moolenaarendfunc
30461814183bSBram Moolenaar
30479c4fefffSBram Moolenaarfunc Test_cclose_from_copen()
30489c4fefffSBram Moolenaar    augroup QF_Test
30499c4fefffSBram Moolenaar	au!
3050e2e4075fSBram Moolenaar        au FileType qf :call assert_fails(':cclose', 'E788:')
30519c4fefffSBram Moolenaar    augroup END
30529c4fefffSBram Moolenaar    copen
30539c4fefffSBram Moolenaar    augroup QF_Test
30549c4fefffSBram Moolenaar	au!
30559c4fefffSBram Moolenaar    augroup END
30569c4fefffSBram Moolenaar    augroup! QF_Test
30579c4fefffSBram Moolenaarendfunc
30589c4fefffSBram Moolenaar
30591814183bSBram Moolenaarfunc Test_cclose_in_autocmd()
30601814183bSBram Moolenaar  " Problem is only triggered if "starting" is zero, so that the OptionsSet
30611814183bSBram Moolenaar  " event will be triggered.
30621814183bSBram Moolenaar  call test_override('starting', 1)
30631814183bSBram Moolenaar  augroup QF_Test
30641814183bSBram Moolenaar    au!
3065e2e4075fSBram Moolenaar    au FileType qf :call assert_fails(':cclose', 'E788:')
30661814183bSBram Moolenaar  augroup END
30671814183bSBram Moolenaar  copen
30681814183bSBram Moolenaar  augroup QF_Test
30691814183bSBram Moolenaar    au!
30701814183bSBram Moolenaar  augroup END
30711814183bSBram Moolenaar  augroup! QF_Test
30721814183bSBram Moolenaar  call test_override('starting', 0)
30731814183bSBram Moolenaarendfunc
30749c4fefffSBram Moolenaar
3075379fb76bSBram Moolenaar" Check that ":file" without an argument is possible even when "curbuf_lock"
3076379fb76bSBram Moolenaar" is set.
3077379fb76bSBram Moolenaarfunc Test_file_from_copen()
3078379fb76bSBram Moolenaar  " Works without argument.
3079379fb76bSBram Moolenaar  augroup QF_Test
3080379fb76bSBram Moolenaar    au!
3081379fb76bSBram Moolenaar    au FileType qf file
3082379fb76bSBram Moolenaar  augroup END
3083379fb76bSBram Moolenaar  copen
3084379fb76bSBram Moolenaar
3085379fb76bSBram Moolenaar  augroup QF_Test
3086379fb76bSBram Moolenaar    au!
3087379fb76bSBram Moolenaar  augroup END
3088379fb76bSBram Moolenaar  cclose
3089379fb76bSBram Moolenaar
3090379fb76bSBram Moolenaar  " Fails with argument.
3091379fb76bSBram Moolenaar  augroup QF_Test
3092379fb76bSBram Moolenaar    au!
3093e2e4075fSBram Moolenaar    au FileType qf call assert_fails(':file foo', 'E788:')
3094379fb76bSBram Moolenaar  augroup END
3095379fb76bSBram Moolenaar  copen
3096379fb76bSBram Moolenaar  augroup QF_Test
3097379fb76bSBram Moolenaar    au!
3098379fb76bSBram Moolenaar  augroup END
3099379fb76bSBram Moolenaar  cclose
3100379fb76bSBram Moolenaar
3101379fb76bSBram Moolenaar  augroup! QF_Test
31026a0cc916SBram Moolenaarendfunc
3103379fb76bSBram Moolenaar
31049c4fefffSBram Moolenaarfunc Test_resize_from_copen()
31059c4fefffSBram Moolenaar  augroup QF_Test
31069c4fefffSBram Moolenaar    au!
31079c4fefffSBram Moolenaar    au FileType qf resize 5
31089c4fefffSBram Moolenaar  augroup END
31099c4fefffSBram Moolenaar  try
31109c4fefffSBram Moolenaar    " This should succeed without any exception.  No other buffers are
31119c4fefffSBram Moolenaar    " involved in the autocmd.
31129c4fefffSBram Moolenaar    copen
31139c4fefffSBram Moolenaar  finally
31149c4fefffSBram Moolenaar    augroup QF_Test
31159c4fefffSBram Moolenaar      au!
31169c4fefffSBram Moolenaar    augroup END
31179c4fefffSBram Moolenaar    augroup! QF_Test
31189c4fefffSBram Moolenaar  endtry
31199c4fefffSBram Moolenaarendfunc
3120a8788f4dSBram Moolenaar
312133aecb1fSBram Moolenaarfunc Test_vimgrep_with_textlock()
312233aecb1fSBram Moolenaar  new
312333aecb1fSBram Moolenaar
312433aecb1fSBram Moolenaar  " Simple way to execute something with "textwinlock" set.
312533aecb1fSBram Moolenaar  " Check that vimgrep without jumping can be executed.
312633aecb1fSBram Moolenaar  au InsertCharPre * vimgrep /RunTheTest/j runtest.vim
312733aecb1fSBram Moolenaar  normal ax
312833aecb1fSBram Moolenaar  let qflist = getqflist()
312933aecb1fSBram Moolenaar  call assert_true(len(qflist) > 0)
313033aecb1fSBram Moolenaar  call assert_match('RunTheTest', qflist[0].text)
313133aecb1fSBram Moolenaar  call setqflist([], 'r')
313233aecb1fSBram Moolenaar  au! InsertCharPre
313333aecb1fSBram Moolenaar
313433aecb1fSBram Moolenaar  " Check that vimgrepadd without jumping can be executed.
313533aecb1fSBram Moolenaar  au InsertCharPre * vimgrepadd /RunTheTest/j runtest.vim
313633aecb1fSBram Moolenaar  normal ax
313733aecb1fSBram Moolenaar  let qflist = getqflist()
313833aecb1fSBram Moolenaar  call assert_true(len(qflist) > 0)
313933aecb1fSBram Moolenaar  call assert_match('RunTheTest', qflist[0].text)
314033aecb1fSBram Moolenaar  call setqflist([], 'r')
314133aecb1fSBram Moolenaar  au! InsertCharPre
314233aecb1fSBram Moolenaar
314333aecb1fSBram Moolenaar  " Check that lvimgrep without jumping can be executed.
314433aecb1fSBram Moolenaar  au InsertCharPre * lvimgrep /RunTheTest/j runtest.vim
314533aecb1fSBram Moolenaar  normal ax
314633aecb1fSBram Moolenaar  let qflist = getloclist(0)
314733aecb1fSBram Moolenaar  call assert_true(len(qflist) > 0)
314833aecb1fSBram Moolenaar  call assert_match('RunTheTest', qflist[0].text)
314933aecb1fSBram Moolenaar  call setloclist(0, [], 'r')
315033aecb1fSBram Moolenaar  au! InsertCharPre
315133aecb1fSBram Moolenaar
315233aecb1fSBram Moolenaar  " Check that lvimgrepadd without jumping can be executed.
315333aecb1fSBram Moolenaar  au InsertCharPre * lvimgrepadd /RunTheTest/j runtest.vim
315433aecb1fSBram Moolenaar  normal ax
315533aecb1fSBram Moolenaar  let qflist = getloclist(0)
315633aecb1fSBram Moolenaar  call assert_true(len(qflist) > 0)
315733aecb1fSBram Moolenaar  call assert_match('RunTheTest', qflist[0].text)
315833aecb1fSBram Moolenaar  call setloclist(0, [], 'r')
315933aecb1fSBram Moolenaar  au! InsertCharPre
316033aecb1fSBram Moolenaar
316133aecb1fSBram Moolenaar  " trying to jump will give an error
316233aecb1fSBram Moolenaar  au InsertCharPre * vimgrep /RunTheTest/ runtest.vim
316333aecb1fSBram Moolenaar  call assert_fails('normal ax', 'E565:')
316433aecb1fSBram Moolenaar  au! InsertCharPre
316533aecb1fSBram Moolenaar
316633aecb1fSBram Moolenaar  au InsertCharPre * vimgrepadd /RunTheTest/ runtest.vim
316733aecb1fSBram Moolenaar  call assert_fails('normal ax', 'E565:')
316833aecb1fSBram Moolenaar  au! InsertCharPre
316933aecb1fSBram Moolenaar
317033aecb1fSBram Moolenaar  au InsertCharPre * lvimgrep /RunTheTest/ runtest.vim
317133aecb1fSBram Moolenaar  call assert_fails('normal ax', 'E565:')
317233aecb1fSBram Moolenaar  au! InsertCharPre
317333aecb1fSBram Moolenaar
317433aecb1fSBram Moolenaar  au InsertCharPre * lvimgrepadd /RunTheTest/ runtest.vim
317533aecb1fSBram Moolenaar  call assert_fails('normal ax', 'E565:')
317633aecb1fSBram Moolenaar  au! InsertCharPre
317733aecb1fSBram Moolenaar
317833aecb1fSBram Moolenaar  bwipe!
317933aecb1fSBram Moolenaarendfunc
318033aecb1fSBram Moolenaar
3181a8788f4dSBram Moolenaar" Tests for the quickfix buffer b:changedtick variable
3182a8788f4dSBram Moolenaarfunc Xchangedtick_tests(cchar)
3183a8788f4dSBram Moolenaar  call s:setup_commands(a:cchar)
3184a8788f4dSBram Moolenaar
3185a8788f4dSBram Moolenaar  new | only
3186a8788f4dSBram Moolenaar
3187a8788f4dSBram Moolenaar  Xexpr "" | Xexpr "" | Xexpr ""
3188a8788f4dSBram Moolenaar
3189a8788f4dSBram Moolenaar  Xopen
3190a8788f4dSBram Moolenaar  Xolder
3191a8788f4dSBram Moolenaar  Xolder
3192a8788f4dSBram Moolenaar  Xaddexpr "F1:10:Line10"
3193a8788f4dSBram Moolenaar  Xaddexpr "F2:20:Line20"
3194a8788f4dSBram Moolenaar  call g:Xsetlist([{"filename":"F3", "lnum":30, "text":"Line30"}], 'a')
3195a8788f4dSBram Moolenaar  call g:Xsetlist([], 'f')
3196a8788f4dSBram Moolenaar  call assert_equal(8, getbufvar('%', 'changedtick'))
3197a8788f4dSBram Moolenaar  Xclose
3198a8788f4dSBram Moolenaarendfunc
3199a8788f4dSBram Moolenaar
3200a8788f4dSBram Moolenaarfunc Test_changedtick()
3201a8788f4dSBram Moolenaar  call Xchangedtick_tests('c')
3202a8788f4dSBram Moolenaar  call Xchangedtick_tests('l')
3203a8788f4dSBram Moolenaarendfunc
3204d28cc3f5SBram Moolenaar
3205ae338338SBram Moolenaar" Tests for parsing an expression using setqflist()
3206ae338338SBram Moolenaarfunc Xsetexpr_tests(cchar)
3207ae338338SBram Moolenaar  call s:setup_commands(a:cchar)
3208ae338338SBram Moolenaar
3209ae338338SBram Moolenaar  let t = ["File1:10:Line10", "File1:20:Line20"]
32102c809b7cSBram Moolenaar  call g:Xsetlist([], ' ', {'lines' : t})
32112c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'lines' : ["File1:30:Line30"]})
3212ae338338SBram Moolenaar
3213ae338338SBram Moolenaar  let l = g:Xgetlist()
3214ae338338SBram Moolenaar  call assert_equal(3, len(l))
3215ae338338SBram Moolenaar  call assert_equal(20, l[1].lnum)
3216ae338338SBram Moolenaar  call assert_equal('Line30', l[2].text)
32172c809b7cSBram Moolenaar  call g:Xsetlist([], 'r', {'lines' : ["File2:5:Line5"]})
3218ae338338SBram Moolenaar  let l = g:Xgetlist()
3219ae338338SBram Moolenaar  call assert_equal(1, len(l))
3220ae338338SBram Moolenaar  call assert_equal('Line5', l[0].text)
32212c809b7cSBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : 10}))
32222c809b7cSBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : "F1:10:L10"}))
3223ae338338SBram Moolenaar
3224ae338338SBram Moolenaar  call g:Xsetlist([], 'f')
3225ae338338SBram Moolenaar  " Add entries to multiple lists
32262c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:10:Line10"]})
32272c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:20:Line20"]})
32282c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:15:Line15"]})
32292c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:25:Line25"]})
3230ae338338SBram Moolenaar  call assert_equal('Line15', g:Xgetlist({'nr':1, 'items':1}).items[1].text)
3231ae338338SBram Moolenaar  call assert_equal('Line25', g:Xgetlist({'nr':2, 'items':1}).items[1].text)
323236538225SBram Moolenaar
323336538225SBram Moolenaar  " Adding entries using a custom efm
323436538225SBram Moolenaar  set efm&
323536538225SBram Moolenaar  call g:Xsetlist([], ' ', {'efm' : '%f#%l#%m',
323636538225SBram Moolenaar				\ 'lines' : ["F1#10#L10", "F2#20#L20"]})
323736538225SBram Moolenaar  call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
323836538225SBram Moolenaar  call g:Xsetlist([], 'a', {'efm' : '%f#%l#%m', 'lines' : ["F3:30:L30"]})
323936538225SBram Moolenaar  call assert_equal('F3:30:L30', g:Xgetlist({'items':1}).items[2].text)
324036538225SBram Moolenaar  call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
324136538225SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'efm' : [],
324236538225SBram Moolenaar				\ 'lines' : ['F1:10:L10']}))
3243ae338338SBram Moolenaarendfunc
3244ae338338SBram Moolenaar
3245ae338338SBram Moolenaarfunc Test_setexpr()
3246ae338338SBram Moolenaar  call Xsetexpr_tests('c')
3247ae338338SBram Moolenaar  call Xsetexpr_tests('l')
3248ae338338SBram Moolenaarendfunc
3249ae338338SBram Moolenaar
3250ae338338SBram Moolenaar" Tests for per quickfix/location list directory stack
3251ae338338SBram Moolenaarfunc Xmultidirstack_tests(cchar)
3252ae338338SBram Moolenaar  call s:setup_commands(a:cchar)
3253ae338338SBram Moolenaar
3254ae338338SBram Moolenaar  call g:Xsetlist([], 'f')
3255ae338338SBram Moolenaar  Xexpr "" | Xexpr ""
3256ae338338SBram Moolenaar
32572c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["Entering dir 'Xone/a'"]})
32582c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["Entering dir 'Xtwo/a'"]})
32592c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["one.txt:3:one one one"]})
32602c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["two.txt:5:two two two"]})
3261ae338338SBram Moolenaar
3262ae338338SBram Moolenaar  let l1 = g:Xgetlist({'nr':1, 'items':1})
3263ae338338SBram Moolenaar  let l2 = g:Xgetlist({'nr':2, 'items':1})
3264ae338338SBram Moolenaar  call assert_equal('Xone/a/one.txt', bufname(l1.items[1].bufnr))
3265ae338338SBram Moolenaar  call assert_equal(3, l1.items[1].lnum)
3266ae338338SBram Moolenaar  call assert_equal('Xtwo/a/two.txt', bufname(l2.items[1].bufnr))
3267ae338338SBram Moolenaar  call assert_equal(5, l2.items[1].lnum)
3268ae338338SBram Moolenaarendfunc
3269ae338338SBram Moolenaar
3270ae338338SBram Moolenaarfunc Test_multidirstack()
3271ae338338SBram Moolenaar  call mkdir('Xone/a', 'p')
3272ae338338SBram Moolenaar  call mkdir('Xtwo/a', 'p')
3273ae338338SBram Moolenaar  let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
3274ae338338SBram Moolenaar  call writefile(lines, 'Xone/a/one.txt')
3275ae338338SBram Moolenaar  call writefile(lines, 'Xtwo/a/two.txt')
3276ae338338SBram Moolenaar  let save_efm = &efm
3277ae338338SBram Moolenaar  set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
3278ae338338SBram Moolenaar
3279ae338338SBram Moolenaar  call Xmultidirstack_tests('c')
3280ae338338SBram Moolenaar  call Xmultidirstack_tests('l')
3281ae338338SBram Moolenaar
3282ae338338SBram Moolenaar  let &efm = save_efm
3283ae338338SBram Moolenaar  call delete('Xone', 'rf')
3284ae338338SBram Moolenaar  call delete('Xtwo', 'rf')
3285ae338338SBram Moolenaarendfunc
3286ae338338SBram Moolenaar
3287ae338338SBram Moolenaar" Tests for per quickfix/location list file stack
3288ae338338SBram Moolenaarfunc Xmultifilestack_tests(cchar)
3289ae338338SBram Moolenaar  call s:setup_commands(a:cchar)
3290ae338338SBram Moolenaar
3291ae338338SBram Moolenaar  call g:Xsetlist([], 'f')
3292ae338338SBram Moolenaar  Xexpr "" | Xexpr ""
3293ae338338SBram Moolenaar
32942c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["[one.txt]"]})
32952c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["[two.txt]"]})
32962c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["(3,5) one one one"]})
32972c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["(5,9) two two two"]})
3298ae338338SBram Moolenaar
3299ae338338SBram Moolenaar  let l1 = g:Xgetlist({'nr':1, 'items':1})
3300ae338338SBram Moolenaar  let l2 = g:Xgetlist({'nr':2, 'items':1})
3301ae338338SBram Moolenaar  call assert_equal('one.txt', bufname(l1.items[1].bufnr))
3302ae338338SBram Moolenaar  call assert_equal(3, l1.items[1].lnum)
3303ae338338SBram Moolenaar  call assert_equal('two.txt', bufname(l2.items[1].bufnr))
3304ae338338SBram Moolenaar  call assert_equal(5, l2.items[1].lnum)
3305e333e79fSBram Moolenaar
3306e333e79fSBram Moolenaar  " Test for start of a new error line in the same line where a previous
3307e333e79fSBram Moolenaar  " error line ends with a file stack.
3308e333e79fSBram Moolenaar  let efm_val = 'Error\ l%l\ in\ %f,'
3309e333e79fSBram Moolenaar  let efm_val .= '%-P%>(%f%r,Error\ l%l\ in\ %m,%-Q)%r'
3310e333e79fSBram Moolenaar  let l = g:Xgetlist({'lines' : [
3311e333e79fSBram Moolenaar	      \ '(one.txt',
3312e333e79fSBram Moolenaar	      \ 'Error l4 in one.txt',
3313e333e79fSBram Moolenaar	      \ ') (two.txt',
3314e333e79fSBram Moolenaar	      \ 'Error l6 in two.txt',
3315e333e79fSBram Moolenaar	      \ ')',
3316e333e79fSBram Moolenaar	      \ 'Error l8 in one.txt'
3317e333e79fSBram Moolenaar	      \ ], 'efm' : efm_val})
3318e333e79fSBram Moolenaar  call assert_equal(3, len(l.items))
3319e333e79fSBram Moolenaar  call assert_equal('one.txt', bufname(l.items[0].bufnr))
3320e333e79fSBram Moolenaar  call assert_equal(4, l.items[0].lnum)
3321e333e79fSBram Moolenaar  call assert_equal('one.txt', l.items[0].text)
3322e333e79fSBram Moolenaar  call assert_equal('two.txt', bufname(l.items[1].bufnr))
3323e333e79fSBram Moolenaar  call assert_equal(6, l.items[1].lnum)
3324e333e79fSBram Moolenaar  call assert_equal('two.txt', l.items[1].text)
3325e333e79fSBram Moolenaar  call assert_equal('one.txt', bufname(l.items[2].bufnr))
3326e333e79fSBram Moolenaar  call assert_equal(8, l.items[2].lnum)
3327e333e79fSBram Moolenaar  call assert_equal('', l.items[2].text)
3328ae338338SBram Moolenaarendfunc
3329ae338338SBram Moolenaar
3330ae338338SBram Moolenaarfunc Test_multifilestack()
3331ae338338SBram Moolenaar  let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
3332ae338338SBram Moolenaar  call writefile(lines, 'one.txt')
3333ae338338SBram Moolenaar  call writefile(lines, 'two.txt')
3334ae338338SBram Moolenaar  let save_efm = &efm
3335ae338338SBram Moolenaar  set efm=%+P[%f],(%l\\,%c)\ %m,%-Q
3336ae338338SBram Moolenaar
3337ae338338SBram Moolenaar  call Xmultifilestack_tests('c')
3338ae338338SBram Moolenaar  call Xmultifilestack_tests('l')
3339ae338338SBram Moolenaar
3340ae338338SBram Moolenaar  let &efm = save_efm
3341ae338338SBram Moolenaar  call delete('one.txt')
3342ae338338SBram Moolenaar  call delete('two.txt')
3343ae338338SBram Moolenaarendfunc
3344ae338338SBram Moolenaar
3345ae338338SBram Moolenaar" Tests for per buffer 'efm' setting
3346ae338338SBram Moolenaarfunc Test_perbuf_efm()
3347ae338338SBram Moolenaar  call writefile(["File1-10-Line10"], 'one.txt')
3348ae338338SBram Moolenaar  call writefile(["File2#20#Line20"], 'two.txt')
3349ae338338SBram Moolenaar  set efm=%f#%l#%m
3350ae338338SBram Moolenaar  new | only
3351ae338338SBram Moolenaar  new
3352ae338338SBram Moolenaar  setlocal efm=%f-%l-%m
3353ae338338SBram Moolenaar  cfile one.txt
3354ae338338SBram Moolenaar  wincmd w
3355ae338338SBram Moolenaar  caddfile two.txt
3356ae338338SBram Moolenaar
3357ae338338SBram Moolenaar  let l = getqflist()
3358ae338338SBram Moolenaar  call assert_equal(10, l[0].lnum)
3359ae338338SBram Moolenaar  call assert_equal('Line20', l[1].text)
3360ae338338SBram Moolenaar
3361ae338338SBram Moolenaar  set efm&
3362ae338338SBram Moolenaar  new | only
3363ae338338SBram Moolenaar  call delete('one.txt')
3364ae338338SBram Moolenaar  call delete('two.txt')
3365ae338338SBram Moolenaarendfunc
3366ae338338SBram Moolenaar
3367d28cc3f5SBram Moolenaar" Open multiple help windows using ":lhelpgrep
3368d28cc3f5SBram Moolenaar" This test used to crash Vim
3369d28cc3f5SBram Moolenaarfunc Test_Multi_LL_Help()
3370d28cc3f5SBram Moolenaar  new | only
3371d28cc3f5SBram Moolenaar  lhelpgrep window
3372d28cc3f5SBram Moolenaar  lopen
3373d28cc3f5SBram Moolenaar  e#
3374d28cc3f5SBram Moolenaar  lhelpgrep buffer
3375d28cc3f5SBram Moolenaar  call assert_equal(3, winnr('$'))
3376d28cc3f5SBram Moolenaar  call assert_true(len(getloclist(1)) != 0)
3377d28cc3f5SBram Moolenaar  call assert_true(len(getloclist(2)) != 0)
3378d28cc3f5SBram Moolenaar  new | only
3379d28cc3f5SBram Moolenaarendfunc
338055b69264SBram Moolenaar
338155b69264SBram Moolenaar" Tests for adding new quickfix lists using setqflist()
338255b69264SBram Moolenaarfunc XaddQf_tests(cchar)
338355b69264SBram Moolenaar  call s:setup_commands(a:cchar)
338455b69264SBram Moolenaar
338555b69264SBram Moolenaar  " Create a new list using ' ' for action
338655b69264SBram Moolenaar  call g:Xsetlist([], 'f')
338755b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'title' : 'Test1'})
338855b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
338955b69264SBram Moolenaar  call assert_equal(1, l.nr)
339055b69264SBram Moolenaar  call assert_equal('Test1', l.title)
339155b69264SBram Moolenaar
339255b69264SBram Moolenaar  " Create a new list using ' ' for action and '$' for 'nr'
339355b69264SBram Moolenaar  call g:Xsetlist([], 'f')
339455b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'title' : 'Test2', 'nr' : '$'})
339555b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
339655b69264SBram Moolenaar  call assert_equal(1, l.nr)
339755b69264SBram Moolenaar  call assert_equal('Test2', l.title)
339855b69264SBram Moolenaar
339955b69264SBram Moolenaar  " Create a new list using 'a' for action
340055b69264SBram Moolenaar  call g:Xsetlist([], 'f')
340155b69264SBram Moolenaar  call g:Xsetlist([], 'a', {'title' : 'Test3'})
340255b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
340355b69264SBram Moolenaar  call assert_equal(1, l.nr)
340455b69264SBram Moolenaar  call assert_equal('Test3', l.title)
340555b69264SBram Moolenaar
340655b69264SBram Moolenaar  " Create a new list using 'a' for action and '$' for 'nr'
340755b69264SBram Moolenaar  call g:Xsetlist([], 'f')
340855b69264SBram Moolenaar  call g:Xsetlist([], 'a', {'title' : 'Test3', 'nr' : '$'})
340955b69264SBram Moolenaar  call g:Xsetlist([], 'a', {'title' : 'Test4'})
341055b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
341155b69264SBram Moolenaar  call assert_equal(1, l.nr)
341255b69264SBram Moolenaar  call assert_equal('Test4', l.title)
341355b69264SBram Moolenaar
341455b69264SBram Moolenaar  " Adding a quickfix list should remove all the lists following the current
341555b69264SBram Moolenaar  " list.
341655b69264SBram Moolenaar  Xexpr "" | Xexpr "" | Xexpr ""
341755b69264SBram Moolenaar  silent! 10Xolder
341855b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'title' : 'Test5'})
341955b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
342055b69264SBram Moolenaar  call assert_equal(2, l.nr)
342155b69264SBram Moolenaar  call assert_equal('Test5', l.title)
342255b69264SBram Moolenaar
342355b69264SBram Moolenaar  " Add a quickfix list using '$' as the list number.
342455b69264SBram Moolenaar  let lastqf = g:Xgetlist({'nr':'$'}).nr
342555b69264SBram Moolenaar  silent! 99Xolder
342655b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test6'})
342755b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
342855b69264SBram Moolenaar  call assert_equal(lastqf + 1, l.nr)
342955b69264SBram Moolenaar  call assert_equal('Test6', l.title)
343055b69264SBram Moolenaar
343155b69264SBram Moolenaar  " Add a quickfix list using 'nr' set to one more than the quickfix
343255b69264SBram Moolenaar  " list size.
343355b69264SBram Moolenaar  let lastqf = g:Xgetlist({'nr':'$'}).nr
343455b69264SBram Moolenaar  silent! 99Xolder
343555b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'nr' : lastqf + 1, 'title' : 'Test7'})
343655b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
343755b69264SBram Moolenaar  call assert_equal(lastqf + 1, l.nr)
343855b69264SBram Moolenaar  call assert_equal('Test7', l.title)
343955b69264SBram Moolenaar
344055b69264SBram Moolenaar  " Add a quickfix list to a stack with 10 lists using 'nr' set to '$'
344155b69264SBram Moolenaar  exe repeat('Xexpr "" |', 9) . 'Xexpr ""'
344255b69264SBram Moolenaar  silent! 99Xolder
344355b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test8'})
344455b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
344555b69264SBram Moolenaar  call assert_equal(10, l.nr)
344655b69264SBram Moolenaar  call assert_equal('Test8', l.title)
344755b69264SBram Moolenaar
344855b69264SBram Moolenaar  " Add a quickfix list using 'nr' set to a value greater than 10
344955b69264SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 12, 'title' : 'Test9'}))
345055b69264SBram Moolenaar
345155b69264SBram Moolenaar  " Try adding a quickfix list with 'nr' set to a value greater than the
345255b69264SBram Moolenaar  " quickfix list size but less than 10.
345355b69264SBram Moolenaar  call g:Xsetlist([], 'f')
345455b69264SBram Moolenaar  Xexpr "" | Xexpr "" | Xexpr ""
345555b69264SBram Moolenaar  silent! 99Xolder
345655b69264SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 8, 'title' : 'Test10'}))
345755b69264SBram Moolenaar
345855b69264SBram Moolenaar  " Add a quickfix list using 'nr' set to a some string or list
345955b69264SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : [1,2], 'title' : 'Test11'}))
346055b69264SBram Moolenaarendfunc
346155b69264SBram Moolenaar
346255b69264SBram Moolenaarfunc Test_add_qf()
346355b69264SBram Moolenaar  call XaddQf_tests('c')
346455b69264SBram Moolenaar  call XaddQf_tests('l')
346555b69264SBram Moolenaarendfunc
34667adf06f4SBram Moolenaar
34677adf06f4SBram Moolenaar" Test for getting the quickfix list items from some text without modifying
34687adf06f4SBram Moolenaar" the quickfix stack
34692c809b7cSBram Moolenaarfunc XgetListFromLines(cchar)
34707adf06f4SBram Moolenaar  call s:setup_commands(a:cchar)
34717adf06f4SBram Moolenaar  call g:Xsetlist([], 'f')
34727adf06f4SBram Moolenaar
34732c809b7cSBram Moolenaar  let l = g:Xgetlist({'lines' : ["File2:20:Line20", "File2:30:Line30"]}).items
34747adf06f4SBram Moolenaar  call assert_equal(2, len(l))
34757adf06f4SBram Moolenaar  call assert_equal(30, l[1].lnum)
34767adf06f4SBram Moolenaar
34772c809b7cSBram Moolenaar  call assert_equal({}, g:Xgetlist({'lines' : 10}))
34782c809b7cSBram Moolenaar  call assert_equal({}, g:Xgetlist({'lines' : 'File1:10:Line10'}))
34792c809b7cSBram Moolenaar  call assert_equal([], g:Xgetlist({'lines' : []}).items)
34802c809b7cSBram Moolenaar  call assert_equal([], g:Xgetlist({'lines' : [10, 20]}).items)
34817adf06f4SBram Moolenaar
348236538225SBram Moolenaar  " Parse text using a custom efm
348336538225SBram Moolenaar  set efm&
348436538225SBram Moolenaar  let l = g:Xgetlist({'lines':['File3#30#Line30'], 'efm' : '%f#%l#%m'}).items
348536538225SBram Moolenaar  call assert_equal('Line30', l[0].text)
348636538225SBram Moolenaar  let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : '%f-%l-%m'}).items
348736538225SBram Moolenaar  call assert_equal('File3:30:Line30', l[0].text)
348836538225SBram Moolenaar  let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : [1,2]})
348936538225SBram Moolenaar  call assert_equal({}, l)
349036538225SBram Moolenaar  call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':'%2'})", 'E376:')
349136538225SBram Moolenaar  call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':''})", 'E378:')
349236538225SBram Moolenaar
34937adf06f4SBram Moolenaar  " Make sure that the quickfix stack is not modified
34947adf06f4SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
34957adf06f4SBram Moolenaarendfunc
34967adf06f4SBram Moolenaar
34972c809b7cSBram Moolenaarfunc Test_get_list_from_lines()
34982c809b7cSBram Moolenaar  call XgetListFromLines('c')
34992c809b7cSBram Moolenaar  call XgetListFromLines('l')
35007adf06f4SBram Moolenaarendfunc
3501a539f4f1SBram Moolenaar
3502a539f4f1SBram Moolenaar" Tests for the quickfix list id
3503a539f4f1SBram Moolenaarfunc Xqfid_tests(cchar)
3504a539f4f1SBram Moolenaar  call s:setup_commands(a:cchar)
3505a539f4f1SBram Moolenaar
3506a539f4f1SBram Moolenaar  call g:Xsetlist([], 'f')
3507a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':0}).id)
3508a539f4f1SBram Moolenaar  Xexpr ''
3509a539f4f1SBram Moolenaar  let start_id = g:Xgetlist({'id' : 0}).id
3510a539f4f1SBram Moolenaar  Xexpr '' | Xexpr ''
3511a539f4f1SBram Moolenaar  Xolder
3512a539f4f1SBram Moolenaar  call assert_equal(start_id, g:Xgetlist({'id':0, 'nr':1}).id)
3513a539f4f1SBram Moolenaar  call assert_equal(start_id + 1, g:Xgetlist({'id':0, 'nr':0}).id)
3514a539f4f1SBram Moolenaar  call assert_equal(start_id + 2, g:Xgetlist({'id':0, 'nr':'$'}).id)
3515a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':0, 'nr':99}).id)
3516a539f4f1SBram Moolenaar  call assert_equal(2, g:Xgetlist({'id':start_id + 1, 'nr':0}).nr)
3517a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':99, 'nr':0}).id)
3518a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':"abc", 'nr':0}).id)
3519a539f4f1SBram Moolenaar
3520a539f4f1SBram Moolenaar  call g:Xsetlist([], 'a', {'id':start_id, 'context':[1,2]})
3521a539f4f1SBram Moolenaar  call assert_equal([1,2], g:Xgetlist({'nr':1, 'context':1}).context)
35222c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'id':start_id+1, 'lines':['F1:10:L10']})
3523a539f4f1SBram Moolenaar  call assert_equal('L10', g:Xgetlist({'nr':2, 'items':1}).items[0].text)
3524a539f4f1SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'id':999, 'title':'Vim'}))
3525a539f4f1SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'id':'abc', 'title':'Vim'}))
3526a539f4f1SBram Moolenaar
3527a539f4f1SBram Moolenaar  let qfid = g:Xgetlist({'id':0, 'nr':0})
3528a539f4f1SBram Moolenaar  call g:Xsetlist([], 'f')
3529a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':qfid, 'nr':0}).id)
3530a539f4f1SBram Moolenaarendfunc
3531a539f4f1SBram Moolenaar
3532a539f4f1SBram Moolenaarfunc Test_qf_id()
3533a539f4f1SBram Moolenaar  call Xqfid_tests('c')
3534a539f4f1SBram Moolenaar  call Xqfid_tests('l')
3535a539f4f1SBram Moolenaarendfunc
353674240d3fSBram Moolenaar
353774240d3fSBram Moolenaarfunc Xqfjump_tests(cchar)
353874240d3fSBram Moolenaar  call s:setup_commands(a:cchar)
353974240d3fSBram Moolenaar
354074240d3fSBram Moolenaar  call writefile(["Line1\tFoo", "Line2"], 'F1')
354174240d3fSBram Moolenaar  call writefile(["Line1\tBar", "Line2"], 'F2')
354274240d3fSBram Moolenaar  call writefile(["Line1\tBaz", "Line2"], 'F3')
354374240d3fSBram Moolenaar
354474240d3fSBram Moolenaar  call g:Xsetlist([], 'f')
354574240d3fSBram Moolenaar
354674240d3fSBram Moolenaar  " Tests for
354774240d3fSBram Moolenaar  "   Jumping to a line using a pattern
354874240d3fSBram Moolenaar  "   Jumping to a column greater than the last column in a line
354974240d3fSBram Moolenaar  "   Jumping to a line greater than the last line in the file
355074240d3fSBram Moolenaar  let l = []
355174240d3fSBram Moolenaar  for i in range(1, 7)
355274240d3fSBram Moolenaar    call add(l, {})
355374240d3fSBram Moolenaar  endfor
355474240d3fSBram Moolenaar  let l[0].filename='F1'
355574240d3fSBram Moolenaar  let l[0].pattern='Line1'
355674240d3fSBram Moolenaar  let l[1].filename='F2'
355774240d3fSBram Moolenaar  let l[1].pattern='Line1'
355874240d3fSBram Moolenaar  let l[2].filename='F3'
355974240d3fSBram Moolenaar  let l[2].pattern='Line1'
356074240d3fSBram Moolenaar  let l[3].filename='F3'
356174240d3fSBram Moolenaar  let l[3].lnum=1
356274240d3fSBram Moolenaar  let l[3].col=9
356374240d3fSBram Moolenaar  let l[3].vcol=1
356474240d3fSBram Moolenaar  let l[4].filename='F3'
356574240d3fSBram Moolenaar  let l[4].lnum=99
356674240d3fSBram Moolenaar  let l[5].filename='F3'
356774240d3fSBram Moolenaar  let l[5].lnum=1
356874240d3fSBram Moolenaar  let l[5].col=99
356974240d3fSBram Moolenaar  let l[5].vcol=1
357074240d3fSBram Moolenaar  let l[6].filename='F3'
357174240d3fSBram Moolenaar  let l[6].pattern='abcxyz'
357274240d3fSBram Moolenaar
357374240d3fSBram Moolenaar  call g:Xsetlist([], ' ', {'items' : l})
357474240d3fSBram Moolenaar  Xopen | only
357574240d3fSBram Moolenaar  2Xnext
357674240d3fSBram Moolenaar  call assert_equal(3, g:Xgetlist({'idx' : 0}).idx)
3577bdd2c290SBram Moolenaar  call assert_equal('F3', @%)
357874240d3fSBram Moolenaar  Xnext
357974240d3fSBram Moolenaar  call assert_equal(7, col('.'))
358074240d3fSBram Moolenaar  Xnext
358174240d3fSBram Moolenaar  call assert_equal(2, line('.'))
358274240d3fSBram Moolenaar  Xnext
358374240d3fSBram Moolenaar  call assert_equal(9, col('.'))
358474240d3fSBram Moolenaar  2
358574240d3fSBram Moolenaar  Xnext
358674240d3fSBram Moolenaar  call assert_equal(2, line('.'))
358774240d3fSBram Moolenaar
358874240d3fSBram Moolenaar  if a:cchar == 'l'
358974240d3fSBram Moolenaar    " When jumping to a location list entry in the location list window and
359074240d3fSBram Moolenaar    " no usable windows are available, then a new window should be opened.
359174240d3fSBram Moolenaar    enew! | new | only
359274240d3fSBram Moolenaar    call g:Xsetlist([], 'f')
359374240d3fSBram Moolenaar    setlocal buftype=nofile
359474240d3fSBram Moolenaar    new
359574240d3fSBram 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']})
359674240d3fSBram Moolenaar    Xopen
359774240d3fSBram Moolenaar    let winid = win_getid()
359874240d3fSBram Moolenaar    wincmd p
359974240d3fSBram Moolenaar    close
360074240d3fSBram Moolenaar    call win_gotoid(winid)
360174240d3fSBram Moolenaar    Xnext
360274240d3fSBram Moolenaar    call assert_equal(3, winnr('$'))
360374240d3fSBram Moolenaar    call assert_equal(1, winnr())
360474240d3fSBram Moolenaar    call assert_equal(2, line('.'))
360574240d3fSBram Moolenaar
360674240d3fSBram Moolenaar    " When jumping to an entry in the location list window and the window
360774240d3fSBram Moolenaar    " associated with the location list is not present and a window containing
360874240d3fSBram Moolenaar    " the file is already present, then that window should be used.
360974240d3fSBram Moolenaar    close
361074240d3fSBram Moolenaar    belowright new
361174240d3fSBram Moolenaar    call g:Xsetlist([], 'f')
361274240d3fSBram Moolenaar    edit F3
361374240d3fSBram Moolenaar    call win_gotoid(winid)
361474240d3fSBram Moolenaar    Xlast
361574240d3fSBram Moolenaar    call assert_equal(3, winnr())
361674240d3fSBram Moolenaar    call assert_equal(6, g:Xgetlist({'size' : 1}).size)
361774240d3fSBram Moolenaar    call assert_equal(winid, g:Xgetlist({'winid' : 1}).winid)
361874240d3fSBram Moolenaar  endif
361974240d3fSBram Moolenaar
362074240d3fSBram Moolenaar  " Cleanup
362174240d3fSBram Moolenaar  enew!
362274240d3fSBram Moolenaar  new | only
362374240d3fSBram Moolenaar
362474240d3fSBram Moolenaar  call delete('F1')
362574240d3fSBram Moolenaar  call delete('F2')
362674240d3fSBram Moolenaar  call delete('F3')
362774240d3fSBram Moolenaarendfunc
362874240d3fSBram Moolenaar
362974240d3fSBram Moolenaarfunc Test_qfjump()
363074240d3fSBram Moolenaar  call Xqfjump_tests('c')
363174240d3fSBram Moolenaar  call Xqfjump_tests('l')
363274240d3fSBram Moolenaarendfunc
3633a6d4849cSBram Moolenaar
3634a6d4849cSBram Moolenaar" Tests for the getqflist() and getloclist() functions when the list is not
3635a6d4849cSBram Moolenaar" present or is empty
3636a6d4849cSBram Moolenaarfunc Xgetlist_empty_tests(cchar)
3637a6d4849cSBram Moolenaar  call s:setup_commands(a:cchar)
3638a6d4849cSBram Moolenaar
3639a6d4849cSBram Moolenaar  " Empty quickfix stack
3640a6d4849cSBram Moolenaar  call g:Xsetlist([], 'f')
3641a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'context' : 0}).context)
3642a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : 0}).id)
3643a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
3644a6d4849cSBram Moolenaar  call assert_equal([], g:Xgetlist({'items' : 0}).items)
3645a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 0}).nr)
3646a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'size' : 0}).size)
3647a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'title' : 0}).title)
3648a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
3649b254af31SBram Moolenaar  call assert_equal(0, g:Xgetlist({'changedtick' : 0}).changedtick)
3650c9cc9c78SBram Moolenaar  if a:cchar == 'c'
3651c9cc9c78SBram Moolenaar    call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
3652647e24baSBram Moolenaar		  \ 'items' : [], 'nr' : 0, 'size' : 0, 'qfbufnr' : 0,
3653d43906d2SBram Moolenaar		  \ 'title' : '', 'winid' : 0, 'changedtick': 0,
3654d43906d2SBram Moolenaar                  \ 'quickfixtextfunc' : ''}, g:Xgetlist({'all' : 0}))
3655c9cc9c78SBram Moolenaar  else
3656c9cc9c78SBram Moolenaar    call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
3657c9cc9c78SBram Moolenaar		\ 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '',
3658647e24baSBram Moolenaar		\ 'winid' : 0, 'changedtick': 0, 'filewinid' : 0,
3659d43906d2SBram Moolenaar		\ 'qfbufnr' : 0, 'quickfixtextfunc' : ''},
3660c9cc9c78SBram Moolenaar		\ g:Xgetlist({'all' : 0}))
3661c9cc9c78SBram Moolenaar  endif
3662a6d4849cSBram Moolenaar
36632ec364e9SBram Moolenaar  " Quickfix window with empty stack
36642ec364e9SBram Moolenaar  silent! Xopen
36652ec364e9SBram Moolenaar  let qfwinid = (a:cchar == 'c') ? win_getid() : 0
3666647e24baSBram Moolenaar  let qfbufnr = (a:cchar == 'c') ? bufnr('') : 0
36672ec364e9SBram Moolenaar  call assert_equal(qfwinid, g:Xgetlist({'winid' : 0}).winid)
36682ec364e9SBram Moolenaar  Xclose
36692ec364e9SBram Moolenaar
3670a6d4849cSBram Moolenaar  " Empty quickfix list
3671a6d4849cSBram Moolenaar  Xexpr ""
3672a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'context' : 0}).context)
3673a6d4849cSBram Moolenaar  call assert_notequal(0, g:Xgetlist({'id' : 0}).id)
3674a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
3675a6d4849cSBram Moolenaar  call assert_equal([], g:Xgetlist({'items' : 0}).items)
3676a6d4849cSBram Moolenaar  call assert_notequal(0, g:Xgetlist({'nr' : 0}).nr)
3677a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'size' : 0}).size)
3678a6d4849cSBram Moolenaar  call assert_notequal('', g:Xgetlist({'title' : 0}).title)
3679a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
3680b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3681a6d4849cSBram Moolenaar
3682a6d4849cSBram Moolenaar  let qfid = g:Xgetlist({'id' : 0}).id
3683a6d4849cSBram Moolenaar  call g:Xsetlist([], 'f')
3684a6d4849cSBram Moolenaar
3685a6d4849cSBram Moolenaar  " Non-existing quickfix identifier
3686a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'id' : qfid, 'context' : 0}).context)
3687a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid}).id)
3688a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'idx' : 0}).idx)
3689a6d4849cSBram Moolenaar  call assert_equal([], g:Xgetlist({'id' : qfid, 'items' : 0}).items)
3690a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'nr' : 0}).nr)
3691a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'size' : 0}).size)
3692a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'id' : qfid, 'title' : 0}).title)
3693a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'winid' : 0}).winid)
3694b254af31SBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'changedtick' : 0}).changedtick)
3695c9cc9c78SBram Moolenaar  if a:cchar == 'c'
3696c9cc9c78SBram Moolenaar    call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3697c9cc9c78SBram Moolenaar		\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
3698d43906d2SBram Moolenaar		\ 'qfbufnr' : qfbufnr, 'quickfixtextfunc' : '',
3699c9cc9c78SBram Moolenaar		\ 'changedtick' : 0}, g:Xgetlist({'id' : qfid, 'all' : 0}))
3700c9cc9c78SBram Moolenaar  else
3701c9cc9c78SBram Moolenaar    call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3702c9cc9c78SBram Moolenaar		\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
3703d43906d2SBram Moolenaar		\ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0,
3704d43906d2SBram Moolenaar                \ 'quickfixtextfunc' : ''},
3705c9cc9c78SBram Moolenaar		\ g:Xgetlist({'id' : qfid, 'all' : 0}))
3706c9cc9c78SBram Moolenaar  endif
3707a6d4849cSBram Moolenaar
3708a6d4849cSBram Moolenaar  " Non-existing quickfix list number
3709a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'nr' : 5, 'context' : 0}).context)
3710a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5}).nr)
3711a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'idx' : 0}).idx)
3712a6d4849cSBram Moolenaar  call assert_equal([], g:Xgetlist({'nr' : 5, 'items' : 0}).items)
3713a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'id' : 0}).id)
3714a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'size' : 0}).size)
3715a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'nr' : 5, 'title' : 0}).title)
3716a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'winid' : 0}).winid)
3717b254af31SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'changedtick' : 0}).changedtick)
3718c9cc9c78SBram Moolenaar  if a:cchar == 'c'
3719c9cc9c78SBram Moolenaar    call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3720c9cc9c78SBram Moolenaar		\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
3721d43906d2SBram Moolenaar		\ 'changedtick' : 0, 'qfbufnr' : qfbufnr,
3722d43906d2SBram Moolenaar                \ 'quickfixtextfunc' : ''}, g:Xgetlist({'nr' : 5, 'all' : 0}))
3723c9cc9c78SBram Moolenaar  else
3724c9cc9c78SBram Moolenaar    call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3725c9cc9c78SBram Moolenaar		\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
3726d43906d2SBram Moolenaar		\ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0,
3727d43906d2SBram Moolenaar                \ 'quickfixtextfunc' : ''}, g:Xgetlist({'nr' : 5, 'all' : 0}))
3728c9cc9c78SBram Moolenaar  endif
3729a6d4849cSBram Moolenaarendfunc
3730a6d4849cSBram Moolenaar
3731a6d4849cSBram Moolenaarfunc Test_getqflist()
3732a6d4849cSBram Moolenaar  call Xgetlist_empty_tests('c')
3733a6d4849cSBram Moolenaar  call Xgetlist_empty_tests('l')
3734a6d4849cSBram Moolenaarendfunc
3735b254af31SBram Moolenaar
3736a0ca7d00SBram Moolenaarfunc Test_getqflist_invalid_nr()
3737a0ca7d00SBram Moolenaar  " The following commands used to crash Vim
3738a0ca7d00SBram Moolenaar  cexpr ""
3739a0ca7d00SBram Moolenaar  call getqflist({'nr' : $XXX_DOES_NOT_EXIST_XXX})
3740a0ca7d00SBram Moolenaar
3741a0ca7d00SBram Moolenaar  " Cleanup
3742a0ca7d00SBram Moolenaar  call setqflist([], 'r')
3743a0ca7d00SBram Moolenaarendfunc
3744a0ca7d00SBram Moolenaar
3745b254af31SBram Moolenaar" Tests for the quickfix/location list changedtick
3746b254af31SBram Moolenaarfunc Xqftick_tests(cchar)
3747b254af31SBram Moolenaar  call s:setup_commands(a:cchar)
3748b254af31SBram Moolenaar
3749b254af31SBram Moolenaar  call g:Xsetlist([], 'f')
3750b254af31SBram Moolenaar
3751b254af31SBram Moolenaar  Xexpr "F1:10:Line10"
3752b254af31SBram Moolenaar  let qfid = g:Xgetlist({'id' : 0}).id
3753b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3754b254af31SBram Moolenaar  Xaddexpr "F2:20:Line20\nF2:21:Line21"
3755b254af31SBram Moolenaar  call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3756b254af31SBram Moolenaar  call g:Xsetlist([], 'a', {'lines' : ["F3:30:Line30", "F3:31:Line31"]})
3757b254af31SBram Moolenaar  call assert_equal(3, g:Xgetlist({'changedtick' : 0}).changedtick)
3758b254af31SBram Moolenaar  call g:Xsetlist([], 'r', {'lines' : ["F4:40:Line40"]})
3759b254af31SBram Moolenaar  call assert_equal(4, g:Xgetlist({'changedtick' : 0}).changedtick)
3760b254af31SBram Moolenaar  call g:Xsetlist([], 'a', {'title' : 'New Title'})
3761b254af31SBram Moolenaar  call assert_equal(5, g:Xgetlist({'changedtick' : 0}).changedtick)
3762b254af31SBram Moolenaar
3763b254af31SBram Moolenaar  enew!
3764b254af31SBram Moolenaar  call append(0, ["F5:50:L50", "F6:60:L60"])
3765b254af31SBram Moolenaar  Xaddbuffer
3766b254af31SBram Moolenaar  call assert_equal(6, g:Xgetlist({'changedtick' : 0}).changedtick)
3767b254af31SBram Moolenaar  enew!
3768b254af31SBram Moolenaar
3769b254af31SBram Moolenaar  call g:Xsetlist([], 'a', {'context' : {'bus' : 'pci'}})
3770b254af31SBram Moolenaar  call assert_equal(7, g:Xgetlist({'changedtick' : 0}).changedtick)
3771b254af31SBram Moolenaar  call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3772b254af31SBram Moolenaar	      \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'a')
3773b254af31SBram Moolenaar  call assert_equal(8, g:Xgetlist({'changedtick' : 0}).changedtick)
3774b254af31SBram Moolenaar  call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3775b254af31SBram Moolenaar	      \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], ' ')
3776b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3777b254af31SBram Moolenaar  call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3778b254af31SBram Moolenaar	      \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'r')
3779b254af31SBram Moolenaar  call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3780b254af31SBram Moolenaar
3781b254af31SBram Moolenaar  call writefile(["F8:80:L80", "F8:81:L81"], "Xone")
3782b254af31SBram Moolenaar  Xfile Xone
3783b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3784b254af31SBram Moolenaar  Xaddfile Xone
3785b254af31SBram Moolenaar  call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3786b254af31SBram Moolenaar
3787b254af31SBram Moolenaar  " Test case for updating a non-current quickfix list
3788b254af31SBram Moolenaar  call g:Xsetlist([], 'f')
3789b254af31SBram Moolenaar  Xexpr "F1:1:L1"
3790b254af31SBram Moolenaar  Xexpr "F2:2:L2"
3791b254af31SBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, "lines" : ["F10:10:L10"]})
3792b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3793b254af31SBram Moolenaar  call assert_equal(2, g:Xgetlist({'nr' : 1, 'changedtick' : 0}).changedtick)
3794b254af31SBram Moolenaar
3795b254af31SBram Moolenaar  call delete("Xone")
3796b254af31SBram Moolenaarendfunc
3797b254af31SBram Moolenaar
3798b254af31SBram Moolenaarfunc Test_qf_tick()
3799b254af31SBram Moolenaar  call Xqftick_tests('c')
3800b254af31SBram Moolenaar  call Xqftick_tests('l')
3801b254af31SBram Moolenaarendfunc
380212237448SBram Moolenaar
3803c631f2dfSBram Moolenaar" Test helpgrep with lang specifier
3804c631f2dfSBram Moolenaarfunc Xtest_helpgrep_with_lang_specifier(cchar)
3805c631f2dfSBram Moolenaar  call s:setup_commands(a:cchar)
3806c631f2dfSBram Moolenaar  Xhelpgrep Vim@en
3807c631f2dfSBram Moolenaar  call assert_equal('help', &filetype)
3808c631f2dfSBram Moolenaar  call assert_notequal(0, g:Xgetlist({'nr' : '$'}).nr)
3809c631f2dfSBram Moolenaar  new | only
3810c631f2dfSBram Moolenaarendfunc
3811c631f2dfSBram Moolenaar
3812c631f2dfSBram Moolenaarfunc Test_helpgrep_with_lang_specifier()
3813c631f2dfSBram Moolenaar  call Xtest_helpgrep_with_lang_specifier('c')
3814c631f2dfSBram Moolenaar  call Xtest_helpgrep_with_lang_specifier('l')
3815c631f2dfSBram Moolenaarendfunc
3816c631f2dfSBram Moolenaar
381712237448SBram Moolenaar" The following test used to crash Vim.
381812237448SBram Moolenaar" Open the location list window and close the regular window associated with
381912237448SBram Moolenaar" the location list. When the garbage collection runs now, it incorrectly
382012237448SBram Moolenaar" marks the location list context as not in use and frees the context.
382112237448SBram Moolenaarfunc Test_ll_window_ctx()
382212237448SBram Moolenaar  call setloclist(0, [], 'f')
382312237448SBram Moolenaar  call setloclist(0, [], 'a', {'context' : []})
382412237448SBram Moolenaar  lopen | only
382512237448SBram Moolenaar  call test_garbagecollect_now()
382612237448SBram Moolenaar  echo getloclist(0, {'context' : 1}).context
382712237448SBram Moolenaar  enew | only
382812237448SBram Moolenaarendfunc
382912237448SBram Moolenaar
383014a4deb0SBram Moolenaar" The following test used to crash vim
383114a4deb0SBram Moolenaarfunc Test_lfile_crash()
383214a4deb0SBram Moolenaar  sp Xtest
383314a4deb0SBram Moolenaar  au QuickFixCmdPre * bw
3834e2e4075fSBram Moolenaar  call assert_fails('lfile', 'E40:')
383514a4deb0SBram Moolenaar  au! QuickFixCmdPre
383614a4deb0SBram Moolenaarendfunc
38373c097226SBram Moolenaar
38383c097226SBram Moolenaar" The following test used to crash vim
38393c097226SBram Moolenaarfunc Test_lbuffer_crash()
38403c097226SBram Moolenaar  sv Xtest
38413c097226SBram Moolenaar  augroup QF_Test
38423c097226SBram Moolenaar    au!
38439a046fd0SBram Moolenaar    au QuickFixCmdPre,QuickFixCmdPost,BufEnter,BufLeave * bw
38443c097226SBram Moolenaar  augroup END
38453c097226SBram Moolenaar  lbuffer
38463c097226SBram Moolenaar  augroup QF_Test
38473c097226SBram Moolenaar    au!
38483c097226SBram Moolenaar  augroup END
38493c097226SBram Moolenaarendfunc
38503c097226SBram Moolenaar
38513c097226SBram Moolenaar" The following test used to crash vim
38523c097226SBram Moolenaarfunc Test_lexpr_crash()
38533c097226SBram Moolenaar  augroup QF_Test
38543c097226SBram Moolenaar    au!
38559a046fd0SBram Moolenaar    au QuickFixCmdPre,QuickFixCmdPost,BufEnter,BufLeave * call setloclist(0, [], 'f')
38563c097226SBram Moolenaar  augroup END
38573c097226SBram Moolenaar  lexpr ""
38583c097226SBram Moolenaar  augroup QF_Test
38593c097226SBram Moolenaar    au!
38603c097226SBram Moolenaar  augroup END
38619f84ded3SBram Moolenaar
38623c097226SBram Moolenaar  enew | only
38639f84ded3SBram Moolenaar  augroup QF_Test
38649f84ded3SBram Moolenaar    au!
38659f84ded3SBram Moolenaar    au BufNew * call setloclist(0, [], 'f')
38669f84ded3SBram Moolenaar  augroup END
38679f84ded3SBram Moolenaar  lexpr 'x:1:x'
38689f84ded3SBram Moolenaar  augroup QF_Test
38699f84ded3SBram Moolenaar    au!
38709f84ded3SBram Moolenaar  augroup END
38719f84ded3SBram Moolenaar
38729f84ded3SBram Moolenaar  enew | only
38739f84ded3SBram Moolenaar  lexpr ''
38749f84ded3SBram Moolenaar  lopen
38759f84ded3SBram Moolenaar  augroup QF_Test
38769f84ded3SBram Moolenaar    au!
38779f84ded3SBram Moolenaar    au FileType * call setloclist(0, [], 'f')
38789f84ded3SBram Moolenaar  augroup END
38799f84ded3SBram Moolenaar  lexpr ''
38809f84ded3SBram Moolenaar  augroup QF_Test
38819f84ded3SBram Moolenaar    au!
38829f84ded3SBram Moolenaar  augroup END
38833c097226SBram Moolenaarendfunc
38843c097226SBram Moolenaar
38853c097226SBram Moolenaar" The following test used to crash Vim
38863c097226SBram Moolenaarfunc Test_lvimgrep_crash()
38873c097226SBram Moolenaar  sv Xtest
38883c097226SBram Moolenaar  augroup QF_Test
38893c097226SBram Moolenaar    au!
38909a046fd0SBram Moolenaar    au QuickFixCmdPre,QuickFixCmdPost,BufEnter,BufLeave * call setloclist(0, [], 'f')
38913c097226SBram Moolenaar  augroup END
38923c097226SBram Moolenaar  lvimgrep quickfix test_quickfix.vim
38933c097226SBram Moolenaar  augroup QF_Test
38943c097226SBram Moolenaar    au!
38953c097226SBram Moolenaar  augroup END
3896b6f1480aSBram Moolenaar
3897b6f1480aSBram Moolenaar  new | only
3898b6f1480aSBram Moolenaar  augroup QF_Test
3899b6f1480aSBram Moolenaar    au!
3900b6f1480aSBram Moolenaar    au BufEnter * call setloclist(0, [], 'r')
3901b6f1480aSBram Moolenaar  augroup END
3902b6f1480aSBram Moolenaar  call assert_fails('lvimgrep Test_lvimgrep_crash *', 'E926:')
3903b6f1480aSBram Moolenaar  augroup QF_Test
3904b6f1480aSBram Moolenaar    au!
3905b6f1480aSBram Moolenaar  augroup END
3906b6f1480aSBram Moolenaar
39073c097226SBram Moolenaar  enew | only
39083c097226SBram Moolenaarendfunc
3909de04654dSBram Moolenaar
39102573af35SBram Moolenaarfunc Test_lvimgrep_crash2()
39112573af35SBram Moolenaar  au BufNewFile x sfind
39129b7bf9e9SBram Moolenaar  call assert_fails('lvimgrep x x', 'E471:')
39139b7bf9e9SBram Moolenaar  call assert_fails('lvimgrep x x x', 'E471:')
39142573af35SBram Moolenaar
39152573af35SBram Moolenaar  au! BufNewFile
39162573af35SBram Moolenaarendfunc
39172573af35SBram Moolenaar
3918de04654dSBram Moolenaar" Test for the position of the quickfix and location list window
3919de04654dSBram Moolenaarfunc Test_qfwin_pos()
3920de04654dSBram Moolenaar  " Open two windows
3921de04654dSBram Moolenaar  new | only
3922de04654dSBram Moolenaar  new
3923de04654dSBram Moolenaar  cexpr ['F1:10:L10']
3924de04654dSBram Moolenaar  copen
3925de04654dSBram Moolenaar  " Quickfix window should be the bottom most window
3926de04654dSBram Moolenaar  call assert_equal(3, winnr())
3927de04654dSBram Moolenaar  close
3928de04654dSBram Moolenaar  " Open at the very top
3929de04654dSBram Moolenaar  wincmd t
3930de04654dSBram Moolenaar  topleft copen
3931de04654dSBram Moolenaar  call assert_equal(1, winnr())
3932de04654dSBram Moolenaar  close
3933de04654dSBram Moolenaar  " open left of the current window
3934de04654dSBram Moolenaar  wincmd t
3935de04654dSBram Moolenaar  below new
3936de04654dSBram Moolenaar  leftabove copen
3937de04654dSBram Moolenaar  call assert_equal(2, winnr())
3938de04654dSBram Moolenaar  close
3939de04654dSBram Moolenaar  " open right of the current window
3940de04654dSBram Moolenaar  rightbelow copen
3941de04654dSBram Moolenaar  call assert_equal(3, winnr())
3942de04654dSBram Moolenaar  close
3943de04654dSBram Moolenaarendfunc
3944e1bb879fSBram Moolenaar
3945e1bb879fSBram Moolenaar" Tests for quickfix/location lists changed by autocommands when
3946e1bb879fSBram Moolenaar" :vimgrep/:lvimgrep commands are running.
3947e1bb879fSBram Moolenaarfunc Test_vimgrep_autocmd()
3948e1bb879fSBram Moolenaar  call setqflist([], 'f')
3949e1bb879fSBram Moolenaar  call writefile(['stars'], 'Xtest1.txt')
3950e1bb879fSBram Moolenaar  call writefile(['stars'], 'Xtest2.txt')
3951e1bb879fSBram Moolenaar
3952e1bb879fSBram Moolenaar  " Test 1:
3953e1bb879fSBram Moolenaar  " When searching for a pattern using :vimgrep, if the quickfix list is
3954e1bb879fSBram Moolenaar  " changed by an autocmd, the results should be added to the correct quickfix
3955e1bb879fSBram Moolenaar  " list.
3956e1bb879fSBram Moolenaar  autocmd BufRead Xtest2.txt cexpr '' | cexpr ''
3957e1bb879fSBram Moolenaar  silent vimgrep stars Xtest*.txt
3958e1bb879fSBram Moolenaar  call assert_equal(1, getqflist({'nr' : 0}).nr)
3959e1bb879fSBram Moolenaar  call assert_equal(3, getqflist({'nr' : '$'}).nr)
3960e1bb879fSBram Moolenaar  call assert_equal('Xtest2.txt', bufname(getqflist()[1].bufnr))
3961e1bb879fSBram Moolenaar  au! BufRead Xtest2.txt
3962e1bb879fSBram Moolenaar
3963e1bb879fSBram Moolenaar  " Test 2:
3964e1bb879fSBram Moolenaar  " When searching for a pattern using :vimgrep, if the quickfix list is
3965e1bb879fSBram Moolenaar  " freed, then a error should be given.
3966e1bb879fSBram Moolenaar  silent! %bwipe!
3967e1bb879fSBram Moolenaar  call setqflist([], 'f')
3968e1bb879fSBram Moolenaar  autocmd BufRead Xtest2.txt for i in range(10) | cexpr '' | endfor
3969e1bb879fSBram Moolenaar  call assert_fails('vimgrep stars Xtest*.txt', 'E925:')
3970e1bb879fSBram Moolenaar  au! BufRead Xtest2.txt
3971e1bb879fSBram Moolenaar
3972e1bb879fSBram Moolenaar  " Test 3:
3973e1bb879fSBram Moolenaar  " When searching for a pattern using :lvimgrep, if the location list is
3974e1bb879fSBram Moolenaar  " freed, then the command should error out.
3975e1bb879fSBram Moolenaar  silent! %bwipe!
3976e1bb879fSBram Moolenaar  let g:save_winid = win_getid()
3977e1bb879fSBram Moolenaar  autocmd BufRead Xtest2.txt call setloclist(g:save_winid, [], 'f')
3978e1bb879fSBram Moolenaar  call assert_fails('lvimgrep stars Xtest*.txt', 'E926:')
3979e1bb879fSBram Moolenaar  au! BufRead Xtest2.txt
3980e1bb879fSBram Moolenaar
3981e1bb879fSBram Moolenaar  call delete('Xtest1.txt')
3982e1bb879fSBram Moolenaar  call delete('Xtest2.txt')
3983e1bb879fSBram Moolenaar  call setqflist([], 'f')
3984e1bb879fSBram Moolenaarendfunc
39853b9474b4SBram Moolenaar
3986f9ae154cSBram Moolenaar" Test for an autocmd changing the current directory when running vimgrep
3987f9ae154cSBram Moolenaarfunc Xvimgrep_autocmd_cd(cchar)
3988f9ae154cSBram Moolenaar  call s:setup_commands(a:cchar)
3989f9ae154cSBram Moolenaar
3990f9ae154cSBram Moolenaar  %bwipe
3991f9ae154cSBram Moolenaar  let save_cwd = getcwd()
3992f9ae154cSBram Moolenaar
3993f9ae154cSBram Moolenaar  augroup QF_Test
3994f9ae154cSBram Moolenaar    au!
3995f9ae154cSBram Moolenaar    autocmd BufRead * silent cd %:p:h
3996f9ae154cSBram Moolenaar  augroup END
3997f9ae154cSBram Moolenaar
3998f9ae154cSBram Moolenaar  10Xvimgrep /vim/ Xdir/**
3999f9ae154cSBram Moolenaar  let l = g:Xgetlist()
4000f9ae154cSBram Moolenaar  call assert_equal('f1.txt', bufname(l[0].bufnr))
4001f9ae154cSBram Moolenaar  call assert_equal('f2.txt', fnamemodify(bufname(l[2].bufnr), ':t'))
4002f9ae154cSBram Moolenaar
4003f9ae154cSBram Moolenaar  augroup QF_Test
4004f9ae154cSBram Moolenaar    au!
4005f9ae154cSBram Moolenaar  augroup END
4006f9ae154cSBram Moolenaar
4007f9ae154cSBram Moolenaar  exe 'cd ' . save_cwd
4008f9ae154cSBram Moolenaarendfunc
4009f9ae154cSBram Moolenaar
4010f9ae154cSBram Moolenaarfunc Test_vimgrep_autocmd_cd()
4011f9ae154cSBram Moolenaar  call mkdir('Xdir/a', 'p')
4012f9ae154cSBram Moolenaar  call mkdir('Xdir/b', 'p')
4013f9ae154cSBram Moolenaar  call writefile(['a_L1_vim', 'a_L2_vim'], 'Xdir/a/f1.txt')
4014f9ae154cSBram Moolenaar  call writefile(['b_L1_vim', 'b_L2_vim'], 'Xdir/b/f2.txt')
4015f9ae154cSBram Moolenaar  call Xvimgrep_autocmd_cd('c')
4016f9ae154cSBram Moolenaar  call Xvimgrep_autocmd_cd('l')
4017f9ae154cSBram Moolenaar  %bwipe
4018f9ae154cSBram Moolenaar  call delete('Xdir', 'rf')
4019f9ae154cSBram Moolenaarendfunc
4020f9ae154cSBram Moolenaar
40213b9474b4SBram Moolenaar" The following test used to crash Vim
40223b9474b4SBram Moolenaarfunc Test_lhelpgrep_autocmd()
40233b9474b4SBram Moolenaar  lhelpgrep quickfix
40243b9474b4SBram Moolenaar  autocmd QuickFixCmdPost * call setloclist(0, [], 'f')
40253b9474b4SBram Moolenaar  lhelpgrep buffer
40263b9474b4SBram Moolenaar  call assert_equal('help', &filetype)
40273b9474b4SBram Moolenaar  call assert_equal(0, getloclist(0, {'nr' : '$'}).nr)
40283b9474b4SBram Moolenaar  lhelpgrep tabpage
40293b9474b4SBram Moolenaar  call assert_equal('help', &filetype)
40303b9474b4SBram Moolenaar  call assert_equal(1, getloclist(0, {'nr' : '$'}).nr)
40313b9474b4SBram Moolenaar  au! QuickFixCmdPost
4032b6f1480aSBram Moolenaar
4033b6f1480aSBram Moolenaar  new | only
4034b6f1480aSBram Moolenaar  augroup QF_Test
4035b6f1480aSBram Moolenaar    au!
4036b6f1480aSBram Moolenaar    au BufEnter * call setqflist([], 'f')
4037b6f1480aSBram Moolenaar  augroup END
4038b6f1480aSBram Moolenaar  call assert_fails('helpgrep quickfix', 'E925:')
4039dbfa795dSBram Moolenaar  " run the test with a help window already open
4040dbfa795dSBram Moolenaar  help
4041dbfa795dSBram Moolenaar  wincmd w
4042dbfa795dSBram Moolenaar  call assert_fails('helpgrep quickfix', 'E925:')
4043b6f1480aSBram Moolenaar  augroup QF_Test
4044b6f1480aSBram Moolenaar    au! BufEnter
4045b6f1480aSBram Moolenaar  augroup END
4046b6f1480aSBram Moolenaar
4047b6f1480aSBram Moolenaar  new | only
4048b6f1480aSBram Moolenaar  augroup QF_Test
4049b6f1480aSBram Moolenaar    au!
4050b6f1480aSBram Moolenaar    au BufEnter * call setqflist([], 'r')
4051b6f1480aSBram Moolenaar  augroup END
4052b6f1480aSBram Moolenaar  call assert_fails('helpgrep quickfix', 'E925:')
4053b6f1480aSBram Moolenaar  augroup QF_Test
4054b6f1480aSBram Moolenaar    au! BufEnter
4055b6f1480aSBram Moolenaar  augroup END
4056b6f1480aSBram Moolenaar
4057b6f1480aSBram Moolenaar  new | only
4058b6f1480aSBram Moolenaar  augroup QF_Test
4059b6f1480aSBram Moolenaar    au!
4060b6f1480aSBram Moolenaar    au BufEnter * call setloclist(0, [], 'r')
4061b6f1480aSBram Moolenaar  augroup END
4062b6f1480aSBram Moolenaar  call assert_fails('lhelpgrep quickfix', 'E926:')
4063b6f1480aSBram Moolenaar  augroup QF_Test
4064b6f1480aSBram Moolenaar    au! BufEnter
4065b6f1480aSBram Moolenaar  augroup END
4066b6f1480aSBram Moolenaar
40673b9474b4SBram Moolenaar  new | only
40683b9474b4SBram Moolenaarendfunc
4069a796d46fSBram Moolenaar
4070a796d46fSBram Moolenaar" Test for shortening/simplifying the file name when opening the
4071a796d46fSBram Moolenaar" quickfix window or when displaying the quickfix list
4072a796d46fSBram Moolenaarfunc Test_shorten_fname()
40736d91bcb4SBram Moolenaar  CheckUnix
4074a796d46fSBram Moolenaar  %bwipe
4075a796d46fSBram Moolenaar  " Create a quickfix list with a absolute path filename
4076a796d46fSBram Moolenaar  let fname = getcwd() . '/test_quickfix.vim'
4077a796d46fSBram Moolenaar  call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'})
4078a796d46fSBram Moolenaar  call assert_equal(fname, bufname('test_quickfix.vim'))
4079a796d46fSBram Moolenaar  " Opening the quickfix window should simplify the file path
4080a796d46fSBram Moolenaar  cwindow
4081a796d46fSBram Moolenaar  call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
4082a796d46fSBram Moolenaar  cclose
4083a796d46fSBram Moolenaar  %bwipe
4084a796d46fSBram Moolenaar  " Create a quickfix list with a absolute path filename
4085a796d46fSBram Moolenaar  call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'})
4086a796d46fSBram Moolenaar  call assert_equal(fname, bufname('test_quickfix.vim'))
4087a796d46fSBram Moolenaar  " Displaying the quickfix list should simplify the file path
4088a796d46fSBram Moolenaar  silent! clist
4089a796d46fSBram Moolenaar  call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
40908ec92c97SBram Moolenaar  " Add a few entries for the same file with different paths and check whether
40918ec92c97SBram Moolenaar  " the buffer name is shortened
40928ec92c97SBram Moolenaar  %bwipe
40938ec92c97SBram Moolenaar  call setqflist([], 'f')
40948ec92c97SBram Moolenaar  call setqflist([{'filename' : 'test_quickfix.vim', 'lnum' : 10},
40958ec92c97SBram Moolenaar        \ {'filename' : '../testdir/test_quickfix.vim', 'lnum' : 20},
40968ec92c97SBram Moolenaar        \ {'filename' : fname, 'lnum' : 30}], ' ')
40978ec92c97SBram Moolenaar  copen
40988ec92c97SBram Moolenaar  call assert_equal(['test_quickfix.vim|10| ',
40998ec92c97SBram Moolenaar        \ 'test_quickfix.vim|20| ',
41008ec92c97SBram Moolenaar        \ 'test_quickfix.vim|30| '], getline(1, '$'))
41018ec92c97SBram Moolenaar  cclose
4102a796d46fSBram Moolenaarendfunc
41038b62e310SBram Moolenaar
41048b62e310SBram Moolenaar" Quickfix title tests
41058b62e310SBram Moolenaar" In the below tests, 'exe "cmd"' is used to invoke the quickfix commands.
41068b62e310SBram Moolenaar" Otherwise due to indentation, the title is set with spaces at the beginning
41078b62e310SBram Moolenaar" of the command.
41088b62e310SBram Moolenaarfunc Test_qftitle()
41098b62e310SBram Moolenaar  call writefile(["F1:1:Line1"], 'Xerr')
41108b62e310SBram Moolenaar
41118b62e310SBram Moolenaar  " :cexpr
41128b62e310SBram Moolenaar  exe "cexpr readfile('Xerr')"
41138b62e310SBram Moolenaar  call assert_equal(":cexpr readfile('Xerr')", getqflist({'title' : 1}).title)
41148b62e310SBram Moolenaar
41158b62e310SBram Moolenaar  " :cgetexpr
41168b62e310SBram Moolenaar  exe "cgetexpr readfile('Xerr')"
41178b62e310SBram Moolenaar  call assert_equal(":cgetexpr readfile('Xerr')",
41188b62e310SBram Moolenaar					\ getqflist({'title' : 1}).title)
41198b62e310SBram Moolenaar
41208b62e310SBram Moolenaar  " :caddexpr
41218b62e310SBram Moolenaar  call setqflist([], 'f')
41228b62e310SBram Moolenaar  exe "caddexpr readfile('Xerr')"
41238b62e310SBram Moolenaar  call assert_equal(":caddexpr readfile('Xerr')",
41248b62e310SBram Moolenaar					\ getqflist({'title' : 1}).title)
41258b62e310SBram Moolenaar
41268b62e310SBram Moolenaar  " :cbuffer
41278b62e310SBram Moolenaar  new Xerr
41288b62e310SBram Moolenaar  exe "cbuffer"
41298b62e310SBram Moolenaar  call assert_equal(':cbuffer (Xerr)', getqflist({'title' : 1}).title)
41308b62e310SBram Moolenaar
41318b62e310SBram Moolenaar  " :cgetbuffer
41328b62e310SBram Moolenaar  edit Xerr
41338b62e310SBram Moolenaar  exe "cgetbuffer"
41348b62e310SBram Moolenaar  call assert_equal(':cgetbuffer (Xerr)', getqflist({'title' : 1}).title)
41358b62e310SBram Moolenaar
41368b62e310SBram Moolenaar  " :caddbuffer
41378b62e310SBram Moolenaar  call setqflist([], 'f')
41388b62e310SBram Moolenaar  edit Xerr
41398b62e310SBram Moolenaar  exe "caddbuffer"
41408b62e310SBram Moolenaar  call assert_equal(':caddbuffer (Xerr)', getqflist({'title' : 1}).title)
41418b62e310SBram Moolenaar
41428b62e310SBram Moolenaar  " :cfile
41438b62e310SBram Moolenaar  exe "cfile Xerr"
41448b62e310SBram Moolenaar  call assert_equal(':cfile Xerr', getqflist({'title' : 1}).title)
41458b62e310SBram Moolenaar
41468b62e310SBram Moolenaar  " :cgetfile
41478b62e310SBram Moolenaar  exe "cgetfile Xerr"
41488b62e310SBram Moolenaar  call assert_equal(':cgetfile Xerr', getqflist({'title' : 1}).title)
41498b62e310SBram Moolenaar
41508b62e310SBram Moolenaar  " :caddfile
41518b62e310SBram Moolenaar  call setqflist([], 'f')
41528b62e310SBram Moolenaar  exe "caddfile Xerr"
41538b62e310SBram Moolenaar  call assert_equal(':caddfile Xerr', getqflist({'title' : 1}).title)
41548b62e310SBram Moolenaar
41558b62e310SBram Moolenaar  " :grep
41568b62e310SBram Moolenaar  set grepprg=internal
41578b62e310SBram Moolenaar  exe "grep F1 Xerr"
41588b62e310SBram Moolenaar  call assert_equal(':grep F1 Xerr', getqflist({'title' : 1}).title)
41598b62e310SBram Moolenaar
41608b62e310SBram Moolenaar  " :grepadd
41618b62e310SBram Moolenaar  call setqflist([], 'f')
41628b62e310SBram Moolenaar  exe "grepadd F1 Xerr"
41638b62e310SBram Moolenaar  call assert_equal(':grepadd F1 Xerr', getqflist({'title' : 1}).title)
41648b62e310SBram Moolenaar  set grepprg&vim
41658b62e310SBram Moolenaar
41668b62e310SBram Moolenaar  " :vimgrep
41678b62e310SBram Moolenaar  exe "vimgrep F1 Xerr"
41688b62e310SBram Moolenaar  call assert_equal(':vimgrep F1 Xerr', getqflist({'title' : 1}).title)
41698b62e310SBram Moolenaar
41708b62e310SBram Moolenaar  " :vimgrepadd
41718b62e310SBram Moolenaar  call setqflist([], 'f')
41728b62e310SBram Moolenaar  exe "vimgrepadd F1 Xerr"
41738b62e310SBram Moolenaar  call assert_equal(':vimgrepadd F1 Xerr', getqflist({'title' : 1}).title)
41748b62e310SBram Moolenaar
41758b62e310SBram Moolenaar  call setqflist(['F1:10:L10'], ' ')
41768b62e310SBram Moolenaar  call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
41778b62e310SBram Moolenaar
41788b62e310SBram Moolenaar  call setqflist([], 'f')
41798b62e310SBram Moolenaar  call setqflist(['F1:10:L10'], 'a')
41808b62e310SBram Moolenaar  call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
41818b62e310SBram Moolenaar
41828b62e310SBram Moolenaar  call setqflist([], 'f')
41838b62e310SBram Moolenaar  call setqflist(['F1:10:L10'], 'r')
41848b62e310SBram Moolenaar  call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
41858b62e310SBram Moolenaar
41868b62e310SBram Moolenaar  close
41878b62e310SBram Moolenaar  call delete('Xerr')
41888b62e310SBram Moolenaar
41898b62e310SBram Moolenaar  call setqflist([], ' ', {'title' : 'Errors'})
41908b62e310SBram Moolenaar  copen
41918b62e310SBram Moolenaar  call assert_equal('Errors', w:quickfix_title)
41928b62e310SBram Moolenaar  call setqflist([], 'r', {'items' : [{'filename' : 'a.c', 'lnum' : 10}]})
41938b62e310SBram Moolenaar  call assert_equal('Errors', w:quickfix_title)
41948b62e310SBram Moolenaar  cclose
4195530bed99SBram Moolenaar
4196530bed99SBram Moolenaar  " Switching to another quickfix list in one tab page should update the
4197530bed99SBram Moolenaar  " quickfix window title and statusline in all the other tab pages also
4198530bed99SBram Moolenaar  call setqflist([], 'f')
4199530bed99SBram Moolenaar  %bw!
4200530bed99SBram Moolenaar  cgetexpr ['file_one:1:1: error in the first quickfix list']
4201530bed99SBram Moolenaar  call setqflist([], 'a', {'title': 'first quickfix list'})
4202530bed99SBram Moolenaar  cgetexpr ['file_two:2:1: error in the second quickfix list']
4203530bed99SBram Moolenaar  call setqflist([], 'a', {'title': 'second quickfix list'})
4204530bed99SBram Moolenaar  copen
4205530bed99SBram Moolenaar  wincmd t
4206530bed99SBram Moolenaar  tabnew two
4207530bed99SBram Moolenaar  copen
4208530bed99SBram Moolenaar  wincmd t
4209530bed99SBram Moolenaar  colder
4210530bed99SBram Moolenaar  call assert_equal('first quickfix list', gettabwinvar(1, 2, 'quickfix_title'))
4211530bed99SBram Moolenaar  call assert_equal('first quickfix list', gettabwinvar(2, 2, 'quickfix_title'))
4212530bed99SBram Moolenaar  call assert_equal(1, tabpagewinnr(1))
4213530bed99SBram Moolenaar  call assert_equal(1, tabpagewinnr(2))
4214530bed99SBram Moolenaar  tabnew
4215530bed99SBram Moolenaar  call setqflist([], 'a', {'title': 'new quickfix title'})
4216530bed99SBram Moolenaar  call assert_equal('new quickfix title', gettabwinvar(1, 2, 'quickfix_title'))
4217530bed99SBram Moolenaar  call assert_equal('new quickfix title', gettabwinvar(2, 2, 'quickfix_title'))
4218530bed99SBram Moolenaar  %bw!
42198b62e310SBram Moolenaarendfunc
4220600323b4SBram Moolenaar
4221600323b4SBram Moolenaarfunc Test_lbuffer_with_bwipe()
4222600323b4SBram Moolenaar  new
4223600323b4SBram Moolenaar  new
4224600323b4SBram Moolenaar  augroup nasty
42259a046fd0SBram Moolenaar    au QuickFixCmdPre,QuickFixCmdPost,BufEnter,BufLeave * bwipe
4226600323b4SBram Moolenaar  augroup END
4227600323b4SBram Moolenaar  lbuffer
4228600323b4SBram Moolenaar  augroup nasty
4229600323b4SBram Moolenaar    au!
4230600323b4SBram Moolenaar  augroup END
4231600323b4SBram Moolenaarendfunc
42320366c016SBram Moolenaar
4233531b9a3aSBram Moolenaar" Test for an autocmd freeing the quickfix/location list when cexpr/lexpr is
4234531b9a3aSBram Moolenaar" running
4235531b9a3aSBram Moolenaarfunc Xexpr_acmd_freelist(cchar)
4236531b9a3aSBram Moolenaar  call s:setup_commands(a:cchar)
4237531b9a3aSBram Moolenaar
42389a046fd0SBram Moolenaar  " This was using freed memory (but with what events?)
42390366c016SBram Moolenaar  augroup nasty
42409a046fd0SBram Moolenaar    au QuickFixCmdPre,QuickFixCmdPost,BufEnter,BufLeave * call g:Xsetlist([], 'f')
42410366c016SBram Moolenaar  augroup END
4242531b9a3aSBram Moolenaar  Xexpr "x"
42430366c016SBram Moolenaar  augroup nasty
42440366c016SBram Moolenaar    au!
42450366c016SBram Moolenaar  augroup END
42460366c016SBram Moolenaarendfunc
4247531b9a3aSBram Moolenaar
4248531b9a3aSBram Moolenaarfunc Test_cexpr_acmd_freelist()
4249531b9a3aSBram Moolenaar  call Xexpr_acmd_freelist('c')
4250531b9a3aSBram Moolenaar  call Xexpr_acmd_freelist('l')
4251531b9a3aSBram Moolenaarendfunc
4252531b9a3aSBram Moolenaar
4253531b9a3aSBram Moolenaar" Test for commands that create a new quickfix/location list and jump to the
4254531b9a3aSBram Moolenaar" first error automatically.
4255531b9a3aSBram Moolenaarfunc Xjumpto_first_error_test(cchar)
4256531b9a3aSBram Moolenaar  call s:setup_commands(a:cchar)
4257531b9a3aSBram Moolenaar
4258531b9a3aSBram Moolenaar  call s:create_test_file('Xtestfile1')
4259531b9a3aSBram Moolenaar  call s:create_test_file('Xtestfile2')
4260531b9a3aSBram Moolenaar  let l = ['Xtestfile1:2:Line2', 'Xtestfile2:4:Line4']
4261531b9a3aSBram Moolenaar
4262531b9a3aSBram Moolenaar  " Test for cexpr/lexpr
4263531b9a3aSBram Moolenaar  enew
4264531b9a3aSBram Moolenaar  Xexpr l
4265bdd2c290SBram Moolenaar  call assert_equal('Xtestfile1', @%)
4266531b9a3aSBram Moolenaar  call assert_equal(2, line('.'))
4267531b9a3aSBram Moolenaar
4268531b9a3aSBram Moolenaar  " Test for cfile/lfile
4269531b9a3aSBram Moolenaar  enew
4270531b9a3aSBram Moolenaar  call writefile(l, 'Xerr')
4271531b9a3aSBram Moolenaar  Xfile Xerr
4272bdd2c290SBram Moolenaar  call assert_equal('Xtestfile1', @%)
4273531b9a3aSBram Moolenaar  call assert_equal(2, line('.'))
4274531b9a3aSBram Moolenaar
4275531b9a3aSBram Moolenaar  " Test for cbuffer/lbuffer
4276531b9a3aSBram Moolenaar  edit Xerr
4277531b9a3aSBram Moolenaar  Xbuffer
4278bdd2c290SBram Moolenaar  call assert_equal('Xtestfile1', @%)
4279531b9a3aSBram Moolenaar  call assert_equal(2, line('.'))
4280531b9a3aSBram Moolenaar
4281531b9a3aSBram Moolenaar  call delete('Xerr')
4282531b9a3aSBram Moolenaar  call delete('Xtestfile1')
4283531b9a3aSBram Moolenaar  call delete('Xtestfile2')
4284531b9a3aSBram Moolenaarendfunc
4285531b9a3aSBram Moolenaar
4286531b9a3aSBram Moolenaarfunc Test_jumpto_first_error()
4287531b9a3aSBram Moolenaar  call Xjumpto_first_error_test('c')
4288531b9a3aSBram Moolenaar  call Xjumpto_first_error_test('l')
4289531b9a3aSBram Moolenaarendfunc
4290531b9a3aSBram Moolenaar
4291531b9a3aSBram Moolenaar" Test for a quickfix autocmd changing the quickfix/location list before
4292531b9a3aSBram Moolenaar" jumping to the first error in the new list.
4293531b9a3aSBram Moolenaarfunc Xautocmd_changelist(cchar)
4294531b9a3aSBram Moolenaar  call s:setup_commands(a:cchar)
4295531b9a3aSBram Moolenaar
4296531b9a3aSBram Moolenaar  " Test for cfile/lfile
4297531b9a3aSBram Moolenaar  call s:create_test_file('Xtestfile1')
4298531b9a3aSBram Moolenaar  call s:create_test_file('Xtestfile2')
4299531b9a3aSBram Moolenaar  Xexpr 'Xtestfile1:2:Line2'
4300531b9a3aSBram Moolenaar  autocmd QuickFixCmdPost * Xolder
4301531b9a3aSBram Moolenaar  call writefile(['Xtestfile2:4:Line4'], 'Xerr')
4302531b9a3aSBram Moolenaar  Xfile Xerr
4303bdd2c290SBram Moolenaar  call assert_equal('Xtestfile2', @%)
4304531b9a3aSBram Moolenaar  call assert_equal(4, line('.'))
4305531b9a3aSBram Moolenaar  autocmd! QuickFixCmdPost
4306531b9a3aSBram Moolenaar
4307531b9a3aSBram Moolenaar  " Test for cbuffer/lbuffer
4308531b9a3aSBram Moolenaar  call g:Xsetlist([], 'f')
4309531b9a3aSBram Moolenaar  Xexpr 'Xtestfile1:2:Line2'
4310531b9a3aSBram Moolenaar  autocmd QuickFixCmdPost * Xolder
4311531b9a3aSBram Moolenaar  call writefile(['Xtestfile2:4:Line4'], 'Xerr')
4312531b9a3aSBram Moolenaar  edit Xerr
4313531b9a3aSBram Moolenaar  Xbuffer
4314bdd2c290SBram Moolenaar  call assert_equal('Xtestfile2', @%)
4315531b9a3aSBram Moolenaar  call assert_equal(4, line('.'))
4316531b9a3aSBram Moolenaar  autocmd! QuickFixCmdPost
4317531b9a3aSBram Moolenaar
4318531b9a3aSBram Moolenaar  " Test for cexpr/lexpr
4319531b9a3aSBram Moolenaar  call g:Xsetlist([], 'f')
4320531b9a3aSBram Moolenaar  Xexpr 'Xtestfile1:2:Line2'
4321531b9a3aSBram Moolenaar  autocmd QuickFixCmdPost * Xolder
4322531b9a3aSBram Moolenaar  Xexpr 'Xtestfile2:4:Line4'
4323bdd2c290SBram Moolenaar  call assert_equal('Xtestfile2', @%)
4324531b9a3aSBram Moolenaar  call assert_equal(4, line('.'))
4325531b9a3aSBram Moolenaar  autocmd! QuickFixCmdPost
4326531b9a3aSBram Moolenaar
4327851332eaSBram Moolenaar  " The grepprg may not be set on non-Unix systems
4328851332eaSBram Moolenaar  if has('unix')
4329531b9a3aSBram Moolenaar    " Test for grep/lgrep
4330531b9a3aSBram Moolenaar    call g:Xsetlist([], 'f')
4331531b9a3aSBram Moolenaar    Xexpr 'Xtestfile1:2:Line2'
4332531b9a3aSBram Moolenaar    autocmd QuickFixCmdPost * Xolder
4333531b9a3aSBram Moolenaar    silent Xgrep Line5 Xtestfile2
4334bdd2c290SBram Moolenaar    call assert_equal('Xtestfile2', @%)
4335531b9a3aSBram Moolenaar    call assert_equal(5, line('.'))
4336531b9a3aSBram Moolenaar    autocmd! QuickFixCmdPost
4337851332eaSBram Moolenaar  endif
4338531b9a3aSBram Moolenaar
4339531b9a3aSBram Moolenaar  " Test for vimgrep/lvimgrep
4340531b9a3aSBram Moolenaar  call g:Xsetlist([], 'f')
4341531b9a3aSBram Moolenaar  Xexpr 'Xtestfile1:2:Line2'
4342531b9a3aSBram Moolenaar  autocmd QuickFixCmdPost * Xolder
4343531b9a3aSBram Moolenaar  silent Xvimgrep Line5 Xtestfile2
4344bdd2c290SBram Moolenaar  call assert_equal('Xtestfile2', @%)
4345531b9a3aSBram Moolenaar  call assert_equal(5, line('.'))
4346531b9a3aSBram Moolenaar  autocmd! QuickFixCmdPost
4347531b9a3aSBram Moolenaar
43483f347e47SBram Moolenaar  " Test for autocommands clearing the quickfix list before jumping to the
43493f347e47SBram Moolenaar  " first error. This should not result in an error
43503f347e47SBram Moolenaar  autocmd QuickFixCmdPost * call g:Xsetlist([], 'r')
43513f347e47SBram Moolenaar  let v:errmsg = ''
43523f347e47SBram Moolenaar  " Test for cfile/lfile
43533f347e47SBram Moolenaar  Xfile Xerr
43543f347e47SBram Moolenaar  call assert_true(v:errmsg !~# 'E42:')
43553f347e47SBram Moolenaar  " Test for cbuffer/lbuffer
43563f347e47SBram Moolenaar  edit Xerr
43573f347e47SBram Moolenaar  Xbuffer
43583f347e47SBram Moolenaar  call assert_true(v:errmsg !~# 'E42:')
43593f347e47SBram Moolenaar  " Test for cexpr/lexpr
43603f347e47SBram Moolenaar  Xexpr 'Xtestfile2:4:Line4'
43613f347e47SBram Moolenaar  call assert_true(v:errmsg !~# 'E42:')
43623f347e47SBram Moolenaar  " Test for grep/lgrep
43633f347e47SBram Moolenaar  " The grepprg may not be set on non-Unix systems
43643f347e47SBram Moolenaar  if has('unix')
43653f347e47SBram Moolenaar    silent Xgrep Line5 Xtestfile2
43663f347e47SBram Moolenaar    call assert_true(v:errmsg !~# 'E42:')
43673f347e47SBram Moolenaar  endif
43683f347e47SBram Moolenaar  " Test for vimgrep/lvimgrep
43693f347e47SBram Moolenaar  call assert_fails('silent Xvimgrep Line5 Xtestfile2', 'E480:')
43703f347e47SBram Moolenaar  autocmd! QuickFixCmdPost
43713f347e47SBram Moolenaar
4372531b9a3aSBram Moolenaar  call delete('Xerr')
4373531b9a3aSBram Moolenaar  call delete('Xtestfile1')
4374531b9a3aSBram Moolenaar  call delete('Xtestfile2')
4375531b9a3aSBram Moolenaarendfunc
4376531b9a3aSBram Moolenaar
4377531b9a3aSBram Moolenaarfunc Test_autocmd_changelist()
4378531b9a3aSBram Moolenaar  call Xautocmd_changelist('c')
4379531b9a3aSBram Moolenaar  call Xautocmd_changelist('l')
4380531b9a3aSBram Moolenaarendfunc
43814cde86c2SBram Moolenaar
43824cde86c2SBram Moolenaar" Tests for the ':filter /pat/ clist' command
43834cde86c2SBram Moolenaarfunc Test_filter_clist()
43844cde86c2SBram Moolenaar  cexpr ['Xfile1:10:10:Line 10', 'Xfile2:15:15:Line 15']
43854cde86c2SBram Moolenaar  call assert_equal([' 2 Xfile2:15 col 15: Line 15'],
43864cde86c2SBram Moolenaar			\ split(execute('filter /Line 15/ clist'), "\n"))
43874cde86c2SBram Moolenaar  call assert_equal([' 1 Xfile1:10 col 10: Line 10'],
43884cde86c2SBram Moolenaar			\ split(execute('filter /Xfile1/ clist'), "\n"))
43894cde86c2SBram Moolenaar  call assert_equal([], split(execute('filter /abc/ clist'), "\n"))
43904cde86c2SBram Moolenaar
43914cde86c2SBram Moolenaar  call setqflist([{'module' : 'abc', 'pattern' : 'pat1'},
43924cde86c2SBram Moolenaar			\ {'module' : 'pqr', 'pattern' : 'pat2'}], ' ')
43934cde86c2SBram Moolenaar  call assert_equal([' 2 pqr:pat2:  '],
43944cde86c2SBram Moolenaar			\ split(execute('filter /pqr/ clist'), "\n"))
43954cde86c2SBram Moolenaar  call assert_equal([' 1 abc:pat1:  '],
43964cde86c2SBram Moolenaar			\ split(execute('filter /pat1/ clist'), "\n"))
43974cde86c2SBram Moolenaarendfunc
43980a08c63dSBram Moolenaar
43990a08c63dSBram Moolenaar" Tests for the "CTRL-W <CR>" command.
44000a08c63dSBram Moolenaarfunc Xview_result_split_tests(cchar)
44010a08c63dSBram Moolenaar  call s:setup_commands(a:cchar)
44020a08c63dSBram Moolenaar
44030a08c63dSBram Moolenaar  " Test that "CTRL-W <CR>" in a qf/ll window fails with empty list.
44040a08c63dSBram Moolenaar  call g:Xsetlist([])
44050a08c63dSBram Moolenaar  Xopen
44060a08c63dSBram Moolenaar  let l:win_count = winnr('$')
4407e2e4075fSBram Moolenaar  call assert_fails('execute "normal! \<C-W>\<CR>"', 'E42:')
44080a08c63dSBram Moolenaar  call assert_equal(l:win_count, winnr('$'))
44090a08c63dSBram Moolenaar  Xclose
44100a08c63dSBram Moolenaarendfunc
44110a08c63dSBram Moolenaar
44120a08c63dSBram Moolenaarfunc Test_view_result_split()
44130a08c63dSBram Moolenaar  call Xview_result_split_tests('c')
44140a08c63dSBram Moolenaar  call Xview_result_split_tests('l')
44150a08c63dSBram Moolenaarendfunc
44162dfcef4cSBram Moolenaar
44172dfcef4cSBram Moolenaar" Test that :cc sets curswant
44182dfcef4cSBram Moolenaarfunc Test_curswant()
44192dfcef4cSBram Moolenaar  helpgrep quickfix
44202dfcef4cSBram Moolenaar  normal! llll
44212dfcef4cSBram Moolenaar  1cc
44222dfcef4cSBram Moolenaar  call assert_equal(getcurpos()[4], virtcol('.'))
44232dfcef4cSBram Moolenaar  cclose | helpclose
44242dfcef4cSBram Moolenaarendfunc
4425b244373bSBram Moolenaar
4426b244373bSBram Moolenaar" Test for opening a file from the quickfix window using CTRL-W <Enter>
4427b244373bSBram Moolenaar" doesn't leave an empty buffer around.
4428b244373bSBram Moolenaarfunc Test_splitview()
4429b244373bSBram Moolenaar  call s:create_test_file('Xtestfile1')
4430b244373bSBram Moolenaar  call s:create_test_file('Xtestfile2')
4431b244373bSBram Moolenaar  new | only
4432b244373bSBram Moolenaar  let last_bufnr = bufnr('Test_sv_1', 1)
4433b244373bSBram Moolenaar  let l = ['Xtestfile1:2:Line2', 'Xtestfile2:4:Line4']
4434b244373bSBram Moolenaar  cgetexpr l
4435b244373bSBram Moolenaar  copen
4436b244373bSBram Moolenaar  let numbufs = len(getbufinfo())
4437b244373bSBram Moolenaar  exe "normal \<C-W>\<CR>"
4438b244373bSBram Moolenaar  copen
4439b244373bSBram Moolenaar  exe "normal j\<C-W>\<CR>"
4440b244373bSBram Moolenaar  " Make sure new empty buffers are not created
4441b244373bSBram Moolenaar  call assert_equal(numbufs, len(getbufinfo()))
4442b244373bSBram Moolenaar  " Creating a new buffer should use the next available buffer number
4443b244373bSBram Moolenaar  call assert_equal(last_bufnr + 4, bufnr("Test_sv_2", 1))
4444b244373bSBram Moolenaar  bwipe Test_sv_1
4445b244373bSBram Moolenaar  bwipe Test_sv_2
4446b244373bSBram Moolenaar  new | only
4447b244373bSBram Moolenaar
4448b244373bSBram Moolenaar  " When split opening files from location list window, make sure that two
4449b244373bSBram Moolenaar  " windows doesn't refer to the same location list
4450b244373bSBram Moolenaar  lgetexpr l
4451b244373bSBram Moolenaar  let locid = getloclist(0, {'id' : 0}).id
4452b244373bSBram Moolenaar  lopen
4453b244373bSBram Moolenaar  exe "normal \<C-W>\<CR>"
4454b244373bSBram Moolenaar  call assert_notequal(locid, getloclist(0, {'id' : 0}).id)
4455b244373bSBram Moolenaar  call assert_equal(0, getloclist(0, {'winid' : 0}).winid)
4456b244373bSBram Moolenaar  new | only
4457b244373bSBram Moolenaar
4458b244373bSBram Moolenaar  " When split opening files from a helpgrep location list window, a new help
4459eeb1b9c7SBram Moolenaar  " window should be opened with a copy of the location list.
4460b244373bSBram Moolenaar  lhelpgrep window
4461b244373bSBram Moolenaar  let locid = getloclist(0, {'id' : 0}).id
4462b244373bSBram Moolenaar  lwindow
4463b244373bSBram Moolenaar  exe "normal j\<C-W>\<CR>"
4464b244373bSBram Moolenaar  call assert_notequal(locid, getloclist(0, {'id' : 0}).id)
4465b244373bSBram Moolenaar  call assert_equal(0, getloclist(0, {'winid' : 0}).winid)
4466b244373bSBram Moolenaar  new | only
4467b244373bSBram Moolenaar
4468406cd90fSBram Moolenaar  " Using :split or :vsplit from a quickfix window should behave like a :new
4469406cd90fSBram Moolenaar  " or a :vnew command
4470406cd90fSBram Moolenaar  copen
4471406cd90fSBram Moolenaar  split
4472406cd90fSBram Moolenaar  call assert_equal(3, winnr('$'))
4473406cd90fSBram Moolenaar  let l = getwininfo()
4474406cd90fSBram Moolenaar  call assert_equal([0, 0, 1], [l[0].quickfix, l[1].quickfix, l[2].quickfix])
4475406cd90fSBram Moolenaar  close
4476406cd90fSBram Moolenaar  copen
4477406cd90fSBram Moolenaar  vsplit
4478406cd90fSBram Moolenaar  let l = getwininfo()
4479406cd90fSBram Moolenaar  call assert_equal([0, 0, 1], [l[0].quickfix, l[1].quickfix, l[2].quickfix])
4480406cd90fSBram Moolenaar  new | only
4481406cd90fSBram Moolenaar
4482b244373bSBram Moolenaar  call delete('Xtestfile1')
4483b244373bSBram Moolenaar  call delete('Xtestfile2')
4484b244373bSBram Moolenaarendfunc
4485c45eb770SBram Moolenaar
4486c45eb770SBram Moolenaar" Test for parsing entries using visual screen column
4487c45eb770SBram Moolenaarfunc Test_viscol()
4488c45eb770SBram Moolenaar  enew
4489c45eb770SBram Moolenaar  call writefile(["Col1\tCol2\tCol3"], 'Xfile1')
4490c45eb770SBram Moolenaar  edit Xfile1
4491c45eb770SBram Moolenaar
4492c45eb770SBram Moolenaar  " Use byte offset for column number
4493c45eb770SBram Moolenaar  set efm&
4494c45eb770SBram Moolenaar  cexpr "Xfile1:1:5:XX\nXfile1:1:9:YY\nXfile1:1:20:ZZ"
4495c45eb770SBram Moolenaar  call assert_equal([5, 8], [col('.'), virtcol('.')])
4496c45eb770SBram Moolenaar  cnext
4497c45eb770SBram Moolenaar  call assert_equal([9, 12], [col('.'), virtcol('.')])
4498c45eb770SBram Moolenaar  cnext
4499c45eb770SBram Moolenaar  call assert_equal([14, 20], [col('.'), virtcol('.')])
4500c45eb770SBram Moolenaar
4501c45eb770SBram Moolenaar  " Use screen column offset for column number
4502c45eb770SBram Moolenaar  set efm=%f:%l:%v:%m
4503c45eb770SBram Moolenaar  cexpr "Xfile1:1:8:XX\nXfile1:1:12:YY\nXfile1:1:20:ZZ"
4504c45eb770SBram Moolenaar  call assert_equal([5, 8], [col('.'), virtcol('.')])
4505c45eb770SBram Moolenaar  cnext
4506c45eb770SBram Moolenaar  call assert_equal([9, 12], [col('.'), virtcol('.')])
4507c45eb770SBram Moolenaar  cnext
4508c45eb770SBram Moolenaar  call assert_equal([14, 20], [col('.'), virtcol('.')])
4509c45eb770SBram Moolenaar  cexpr "Xfile1:1:6:XX\nXfile1:1:15:YY\nXfile1:1:24:ZZ"
4510c45eb770SBram Moolenaar  call assert_equal([5, 8], [col('.'), virtcol('.')])
4511c45eb770SBram Moolenaar  cnext
4512c45eb770SBram Moolenaar  call assert_equal([10, 16], [col('.'), virtcol('.')])
4513c45eb770SBram Moolenaar  cnext
4514c45eb770SBram Moolenaar  call assert_equal([14, 20], [col('.'), virtcol('.')])
4515c45eb770SBram Moolenaar
4516c45eb770SBram Moolenaar  enew
4517c45eb770SBram Moolenaar  call writefile(["Col1\täü\töß\tCol4"], 'Xfile1')
4518c45eb770SBram Moolenaar
4519c45eb770SBram Moolenaar  " Use byte offset for column number
4520c45eb770SBram Moolenaar  set efm&
4521c45eb770SBram Moolenaar  cexpr "Xfile1:1:8:XX\nXfile1:1:11:YY\nXfile1:1:16:ZZ"
4522c45eb770SBram Moolenaar  call assert_equal([8, 10], [col('.'), virtcol('.')])
4523c45eb770SBram Moolenaar  cnext
4524c45eb770SBram Moolenaar  call assert_equal([11, 17], [col('.'), virtcol('.')])
4525c45eb770SBram Moolenaar  cnext
4526c45eb770SBram Moolenaar  call assert_equal([16, 25], [col('.'), virtcol('.')])
4527c45eb770SBram Moolenaar
4528c45eb770SBram Moolenaar  " Use screen column offset for column number
4529c45eb770SBram Moolenaar  set efm=%f:%l:%v:%m
4530c45eb770SBram Moolenaar  cexpr "Xfile1:1:10:XX\nXfile1:1:17:YY\nXfile1:1:25:ZZ"
4531c45eb770SBram Moolenaar  call assert_equal([8, 10], [col('.'), virtcol('.')])
4532c45eb770SBram Moolenaar  cnext
4533c45eb770SBram Moolenaar  call assert_equal([11, 17], [col('.'), virtcol('.')])
4534c45eb770SBram Moolenaar  cnext
4535c45eb770SBram Moolenaar  call assert_equal([16, 25], [col('.'), virtcol('.')])
4536c45eb770SBram Moolenaar
4537c95940c0SBram Moolenaar  " Use screen column number with a multi-line error message
4538c95940c0SBram Moolenaar  enew
4539c95940c0SBram Moolenaar  call writefile(["à test"], 'Xfile1')
4540c95940c0SBram Moolenaar  set efm=%E===\ %f\ ===,%C%l:%v,%Z%m
4541c95940c0SBram Moolenaar  cexpr ["=== Xfile1 ===", "1:3", "errormsg"]
4542c95940c0SBram Moolenaar  call assert_equal('Xfile1', @%)
4543c95940c0SBram Moolenaar  call assert_equal([0, 1, 4, 0], getpos('.'))
4544c95940c0SBram Moolenaar
4545c95940c0SBram Moolenaar  " Repeat previous test with byte offset %c: ensure that fix to issue #7145
4546c95940c0SBram Moolenaar  " does not break this
4547c95940c0SBram Moolenaar  set efm=%E===\ %f\ ===,%C%l:%c,%Z%m
4548c95940c0SBram Moolenaar  cexpr ["=== Xfile1 ===", "1:3", "errormsg"]
4549c95940c0SBram Moolenaar  call assert_equal('Xfile1', @%)
4550c95940c0SBram Moolenaar  call assert_equal([0, 1, 3, 0], getpos('.'))
4551c95940c0SBram Moolenaar
4552c45eb770SBram Moolenaar  enew | only
4553c45eb770SBram Moolenaar  set efm&
4554c45eb770SBram Moolenaar  call delete('Xfile1')
4555c45eb770SBram Moolenaarendfunc
4556ee8188fcSBram Moolenaar
4557ee8188fcSBram Moolenaar" Test for the quickfix window buffer
4558ee8188fcSBram Moolenaarfunc Xqfbuf_test(cchar)
4559ee8188fcSBram Moolenaar  call s:setup_commands(a:cchar)
4560ee8188fcSBram Moolenaar
4561ee8188fcSBram Moolenaar  " Quickfix buffer should be reused across closing and opening a quickfix
4562ee8188fcSBram Moolenaar  " window
4563ee8188fcSBram Moolenaar  Xexpr "F1:10:Line10"
4564ee8188fcSBram Moolenaar  Xopen
4565ee8188fcSBram Moolenaar  let qfbnum = bufnr('')
4566ee8188fcSBram Moolenaar  Xclose
4567ee8188fcSBram Moolenaar  " Even after the quickfix window is closed, the buffer should be loaded
4568ee8188fcSBram Moolenaar  call assert_true(bufloaded(qfbnum))
4569647e24baSBram Moolenaar  call assert_true(qfbnum, g:Xgetlist({'qfbufnr' : 0}).qfbufnr)
4570ee8188fcSBram Moolenaar  Xopen
4571ee8188fcSBram Moolenaar  " Buffer should be reused when opening the window again
4572ee8188fcSBram Moolenaar  call assert_equal(qfbnum, bufnr(''))
4573ee8188fcSBram Moolenaar  Xclose
4574ee8188fcSBram Moolenaar
4575ee8188fcSBram Moolenaar  if a:cchar == 'l'
4576ee8188fcSBram Moolenaar    %bwipe
4577ee8188fcSBram Moolenaar    " For a location list, when both the file window and the location list
4578ee8188fcSBram Moolenaar    " window for the list are closed, then the buffer should be freed.
4579ee8188fcSBram Moolenaar    new | only
4580ee8188fcSBram Moolenaar    lexpr "F1:10:Line10"
4581ee8188fcSBram Moolenaar    let wid = win_getid()
4582ee8188fcSBram Moolenaar    lopen
4583ee8188fcSBram Moolenaar    let qfbnum = bufnr('')
4584ee8188fcSBram Moolenaar    call assert_match(qfbnum . ' %a-  "\[Location List]"', execute('ls'))
4585ee8188fcSBram Moolenaar    close
4586ee8188fcSBram Moolenaar    " When the location list window is closed, the buffer name should not
4587ee8188fcSBram Moolenaar    " change to 'Quickfix List'
4588647e24baSBram Moolenaar    call assert_match(qfbnum . 'u h-  "\[Location List]"', execute('ls!'))
4589ee8188fcSBram Moolenaar    call assert_true(bufloaded(qfbnum))
4590ee8188fcSBram Moolenaar
4591d82a81caSBram Moolenaar    " After deleting a location list buffer using ":bdelete", opening the
4592d82a81caSBram Moolenaar    " location list window should mark the buffer as a location list buffer.
4593d82a81caSBram Moolenaar    exe "bdelete " . qfbnum
4594d82a81caSBram Moolenaar    lopen
4595d82a81caSBram Moolenaar    call assert_equal("quickfix", &buftype)
4596d82a81caSBram Moolenaar    call assert_equal(1, getwininfo(win_getid(winnr()))[0].loclist)
4597d82a81caSBram Moolenaar    call assert_equal(wid, getloclist(0, {'filewinid' : 0}).filewinid)
4598d82a81caSBram Moolenaar    call assert_false(&swapfile)
4599d82a81caSBram Moolenaar    lclose
4600d82a81caSBram Moolenaar
4601eeb1b9c7SBram Moolenaar    " When the location list is cleared for the window, the buffer should be
4602eeb1b9c7SBram Moolenaar    " removed
4603eeb1b9c7SBram Moolenaar    call setloclist(0, [], 'f')
4604eeb1b9c7SBram Moolenaar    call assert_false(bufexists(qfbnum))
4605647e24baSBram Moolenaar    call assert_equal(0, getloclist(0, {'qfbufnr' : 0}).qfbufnr)
4606eeb1b9c7SBram Moolenaar
4607eeb1b9c7SBram Moolenaar    " When the location list is freed with the location list window open, the
4608eeb1b9c7SBram Moolenaar    " location list buffer should not be lost. It should be reused when the
4609eeb1b9c7SBram Moolenaar    " location list is again populated.
4610eeb1b9c7SBram Moolenaar    lexpr "F1:10:Line10"
4611eeb1b9c7SBram Moolenaar    lopen
4612eeb1b9c7SBram Moolenaar    let wid = win_getid()
4613eeb1b9c7SBram Moolenaar    let qfbnum = bufnr('')
4614eeb1b9c7SBram Moolenaar    wincmd p
4615eeb1b9c7SBram Moolenaar    call setloclist(0, [], 'f')
4616eeb1b9c7SBram Moolenaar    lexpr "F1:10:Line10"
4617eeb1b9c7SBram Moolenaar    lopen
4618eeb1b9c7SBram Moolenaar    call assert_equal(wid, win_getid())
4619eeb1b9c7SBram Moolenaar    call assert_equal(qfbnum, bufnr(''))
4620eeb1b9c7SBram Moolenaar    lclose
4621eeb1b9c7SBram Moolenaar
4622eeb1b9c7SBram Moolenaar    " When the window with the location list is closed, the buffer should be
4623eeb1b9c7SBram Moolenaar    " removed
4624ee8188fcSBram Moolenaar    new | only
4625eeb1b9c7SBram Moolenaar    call assert_false(bufexists(qfbnum))
4626ee8188fcSBram Moolenaar  endif
4627ee8188fcSBram Moolenaarendfunc
4628ee8188fcSBram Moolenaar
4629ee8188fcSBram Moolenaarfunc Test_qfbuf()
4630ee8188fcSBram Moolenaar  call Xqfbuf_test('c')
4631ee8188fcSBram Moolenaar  call Xqfbuf_test('l')
4632ee8188fcSBram Moolenaarendfunc
4633eeb1b9c7SBram Moolenaar
4634eeb1b9c7SBram Moolenaar" If there is an autocmd to use only one window, then opening the location
4635eeb1b9c7SBram Moolenaar" list window used to crash Vim.
4636eeb1b9c7SBram Moolenaarfunc Test_winonly_autocmd()
4637eeb1b9c7SBram Moolenaar  call s:create_test_file('Xtest1')
4638eeb1b9c7SBram Moolenaar  " Autocmd to show only one Vim window at a time
4639eeb1b9c7SBram Moolenaar  autocmd WinEnter * only
4640eeb1b9c7SBram Moolenaar  new
4641eeb1b9c7SBram Moolenaar  " Load the location list
4642eeb1b9c7SBram Moolenaar  lexpr "Xtest1:5:Line5\nXtest1:10:Line10\nXtest1:15:Line15"
4643eeb1b9c7SBram Moolenaar  let loclistid = getloclist(0, {'id' : 0}).id
4644eeb1b9c7SBram Moolenaar  " Open the location list window. Only this window will be shown and the file
4645eeb1b9c7SBram Moolenaar  " window is closed.
4646eeb1b9c7SBram Moolenaar  lopen
4647eeb1b9c7SBram Moolenaar  call assert_equal(loclistid, getloclist(0, {'id' : 0}).id)
4648eeb1b9c7SBram Moolenaar  " Jump to an entry in the location list and make sure that the cursor is
4649eeb1b9c7SBram Moolenaar  " positioned correctly.
4650eeb1b9c7SBram Moolenaar  ll 3
4651eeb1b9c7SBram Moolenaar  call assert_equal(loclistid, getloclist(0, {'id' : 0}).id)
4652bdd2c290SBram Moolenaar  call assert_equal('Xtest1', @%)
4653eeb1b9c7SBram Moolenaar  call assert_equal(15, line('.'))
4654eeb1b9c7SBram Moolenaar  " Cleanup
4655eeb1b9c7SBram Moolenaar  autocmd! WinEnter
4656eeb1b9c7SBram Moolenaar  new | only
4657eeb1b9c7SBram Moolenaar  call delete('Xtest1')
4658eeb1b9c7SBram Moolenaarendfunc
465939803d82SBram Moolenaar
466039803d82SBram Moolenaar" Test to make sure that an empty quickfix buffer is not reused for loading
466139803d82SBram Moolenaar" a normal buffer.
466239803d82SBram Moolenaarfunc Test_empty_qfbuf()
466339803d82SBram Moolenaar  enew | only
466439803d82SBram Moolenaar  call writefile(["Test"], 'Xfile1')
466539803d82SBram Moolenaar  call setqflist([], 'f')
466639803d82SBram Moolenaar  copen | only
466739803d82SBram Moolenaar  let qfbuf = bufnr('')
466839803d82SBram Moolenaar  edit Xfile1
466939803d82SBram Moolenaar  call assert_notequal(qfbuf, bufnr(''))
467039803d82SBram Moolenaar  enew
467139803d82SBram Moolenaar  call delete('Xfile1')
467239803d82SBram Moolenaarendfunc
46733ff33114SBram Moolenaar
46743ff33114SBram Moolenaar" Test for the :cbelow, :cabove, :lbelow and :labove commands.
4675cf6a55c4SBram Moolenaar" And for the :cafter, :cbefore, :lafter and :lbefore commands.
46763ff33114SBram Moolenaarfunc Xtest_below(cchar)
46773ff33114SBram Moolenaar  call s:setup_commands(a:cchar)
46783ff33114SBram Moolenaar
46793ff33114SBram Moolenaar  " No quickfix/location list
46803ff33114SBram Moolenaar  call assert_fails('Xbelow', 'E42:')
46813ff33114SBram Moolenaar  call assert_fails('Xabove', 'E42:')
4682cf6a55c4SBram Moolenaar  call assert_fails('Xbefore', 'E42:')
4683cf6a55c4SBram Moolenaar  call assert_fails('Xafter', 'E42:')
46843ff33114SBram Moolenaar
46853ff33114SBram Moolenaar  " Empty quickfix/location list
46863ff33114SBram Moolenaar  call g:Xsetlist([])
46873ff33114SBram Moolenaar  call assert_fails('Xbelow', 'E42:')
46883ff33114SBram Moolenaar  call assert_fails('Xabove', 'E42:')
4689cf6a55c4SBram Moolenaar  call assert_fails('Xbefore', 'E42:')
4690cf6a55c4SBram Moolenaar  call assert_fails('Xafter', 'E42:')
46913ff33114SBram Moolenaar
46923ff33114SBram Moolenaar  call s:create_test_file('X1')
46933ff33114SBram Moolenaar  call s:create_test_file('X2')
46943ff33114SBram Moolenaar  call s:create_test_file('X3')
46953ff33114SBram Moolenaar  call s:create_test_file('X4')
46963ff33114SBram Moolenaar
46973ff33114SBram Moolenaar  " Invalid entries
46983ff33114SBram Moolenaar  edit X1
46993ff33114SBram Moolenaar  call g:Xsetlist(["E1", "E2"])
47003ff33114SBram Moolenaar  call assert_fails('Xbelow', 'E42:')
47013ff33114SBram Moolenaar  call assert_fails('Xabove', 'E42:')
47023ff33114SBram Moolenaar  call assert_fails('3Xbelow', 'E42:')
47033ff33114SBram Moolenaar  call assert_fails('4Xabove', 'E42:')
4704cf6a55c4SBram Moolenaar  call assert_fails('Xbefore', 'E42:')
4705cf6a55c4SBram Moolenaar  call assert_fails('Xafter', 'E42:')
4706cf6a55c4SBram Moolenaar  call assert_fails('3Xbefore', 'E42:')
4707cf6a55c4SBram Moolenaar  call assert_fails('4Xafter', 'E42:')
47083ff33114SBram Moolenaar
47093ff33114SBram Moolenaar  " Test the commands with various arguments
4710cf6a55c4SBram Moolenaar  Xexpr ["X1:5:3:L5", "X2:5:2:L5", "X2:10:3:L10", "X2:15:4:L15", "X3:3:5:L3"]
47113ff33114SBram Moolenaar  edit +7 X2
47123ff33114SBram Moolenaar  Xabove
4713bdd2c290SBram Moolenaar  call assert_equal(['X2', 5], [@%, line('.')])
47143ff33114SBram Moolenaar  call assert_fails('Xabove', 'E553:')
4715cf6a55c4SBram Moolenaar  normal 7G
4716cf6a55c4SBram Moolenaar  Xbefore
4717bdd2c290SBram Moolenaar  call assert_equal(['X2', 5, 2], [@%, line('.'), col('.')])
4718cf6a55c4SBram Moolenaar  call assert_fails('Xbefore', 'E553:')
4719cf6a55c4SBram Moolenaar
47203ff33114SBram Moolenaar  normal 2j
47213ff33114SBram Moolenaar  Xbelow
4722bdd2c290SBram Moolenaar  call assert_equal(['X2', 10], [@%, line('.')])
4723cf6a55c4SBram Moolenaar  normal 7G
4724cf6a55c4SBram Moolenaar  Xafter
4725bdd2c290SBram Moolenaar  call assert_equal(['X2', 10, 3], [@%, line('.'), col('.')])
4726cf6a55c4SBram Moolenaar
47273ff33114SBram Moolenaar  " Last error in this file
47283ff33114SBram Moolenaar  Xbelow 99
4729bdd2c290SBram Moolenaar  call assert_equal(['X2', 15], [@%, line('.')])
47303ff33114SBram Moolenaar  call assert_fails('Xbelow', 'E553:')
4731cf6a55c4SBram Moolenaar  normal gg
4732cf6a55c4SBram Moolenaar  Xafter 99
4733bdd2c290SBram Moolenaar  call assert_equal(['X2', 15, 4], [@%, line('.'), col('.')])
4734cf6a55c4SBram Moolenaar  call assert_fails('Xafter', 'E553:')
4735cf6a55c4SBram Moolenaar
47363ff33114SBram Moolenaar  " First error in this file
47373ff33114SBram Moolenaar  Xabove 99
4738bdd2c290SBram Moolenaar  call assert_equal(['X2', 5], [@%, line('.')])
47393ff33114SBram Moolenaar  call assert_fails('Xabove', 'E553:')
4740cf6a55c4SBram Moolenaar  normal G
4741cf6a55c4SBram Moolenaar  Xbefore 99
4742bdd2c290SBram Moolenaar  call assert_equal(['X2', 5, 2], [@%, line('.'), col('.')])
4743cf6a55c4SBram Moolenaar  call assert_fails('Xbefore', 'E553:')
4744cf6a55c4SBram Moolenaar
47453ff33114SBram Moolenaar  normal gg
47463ff33114SBram Moolenaar  Xbelow 2
4747bdd2c290SBram Moolenaar  call assert_equal(['X2', 10], [@%, line('.')])
4748cf6a55c4SBram Moolenaar  normal gg
4749cf6a55c4SBram Moolenaar  Xafter 2
4750bdd2c290SBram Moolenaar  call assert_equal(['X2', 10, 3], [@%, line('.'), col('.')])
4751cf6a55c4SBram Moolenaar
47523ff33114SBram Moolenaar  normal G
47533ff33114SBram Moolenaar  Xabove 2
4754bdd2c290SBram Moolenaar  call assert_equal(['X2', 10], [@%, line('.')])
4755cf6a55c4SBram Moolenaar  normal G
4756cf6a55c4SBram Moolenaar  Xbefore 2
4757bdd2c290SBram Moolenaar  call assert_equal(['X2', 10, 3], [@%, line('.'), col('.')])
4758cf6a55c4SBram Moolenaar
47593ff33114SBram Moolenaar  edit X4
47603ff33114SBram Moolenaar  call assert_fails('Xabove', 'E42:')
47613ff33114SBram Moolenaar  call assert_fails('Xbelow', 'E42:')
4762cf6a55c4SBram Moolenaar  call assert_fails('Xbefore', 'E42:')
4763cf6a55c4SBram Moolenaar  call assert_fails('Xafter', 'E42:')
47643ff33114SBram Moolenaar  if a:cchar == 'l'
47653ff33114SBram Moolenaar    " If a buffer has location list entries from some other window but not
47663ff33114SBram Moolenaar    " from the current window, then the commands should fail.
47673ff33114SBram Moolenaar    edit X1 | split | call setloclist(0, [], 'f')
47683ff33114SBram Moolenaar    call assert_fails('Xabove', 'E776:')
47693ff33114SBram Moolenaar    call assert_fails('Xbelow', 'E776:')
4770cf6a55c4SBram Moolenaar    call assert_fails('Xbefore', 'E776:')
4771cf6a55c4SBram Moolenaar    call assert_fails('Xafter', 'E776:')
47723ff33114SBram Moolenaar    close
47733ff33114SBram Moolenaar  endif
47743ff33114SBram Moolenaar
47753ff33114SBram Moolenaar  " Test for lines with multiple quickfix entries
47763ff33114SBram Moolenaar  Xexpr ["X1:5:L5", "X2:5:1:L5_1", "X2:5:2:L5_2", "X2:5:3:L5_3",
47773ff33114SBram Moolenaar	      \ "X2:10:1:L10_1", "X2:10:2:L10_2", "X2:10:3:L10_3",
47783ff33114SBram Moolenaar	      \ "X2:15:1:L15_1", "X2:15:2:L15_2", "X2:15:3:L15_3", "X3:3:L3"]
47793ff33114SBram Moolenaar  edit +1 X2
47803ff33114SBram Moolenaar  Xbelow 2
4781bdd2c290SBram Moolenaar  call assert_equal(['X2', 10, 1], [@%, line('.'), col('.')])
4782cf6a55c4SBram Moolenaar  normal 1G
4783cf6a55c4SBram Moolenaar  Xafter 2
4784bdd2c290SBram Moolenaar  call assert_equal(['X2', 5, 2], [@%, line('.'), col('.')])
4785cf6a55c4SBram Moolenaar
47863ff33114SBram Moolenaar  normal gg
47873ff33114SBram Moolenaar  Xbelow 99
4788bdd2c290SBram Moolenaar  call assert_equal(['X2', 15, 1], [@%, line('.'), col('.')])
4789cf6a55c4SBram Moolenaar  normal gg
4790cf6a55c4SBram Moolenaar  Xafter 99
4791bdd2c290SBram Moolenaar  call assert_equal(['X2', 15, 3], [@%, line('.'), col('.')])
4792cf6a55c4SBram Moolenaar
47933ff33114SBram Moolenaar  normal G
47943ff33114SBram Moolenaar  Xabove 2
4795bdd2c290SBram Moolenaar  call assert_equal(['X2', 10, 1], [@%, line('.'), col('.')])
47963ff33114SBram Moolenaar  normal G
4797cf6a55c4SBram Moolenaar  Xbefore 2
4798bdd2c290SBram Moolenaar  call assert_equal(['X2', 15, 2], [@%, line('.'), col('.')])
4799cf6a55c4SBram Moolenaar
4800cf6a55c4SBram Moolenaar  normal G
48013ff33114SBram Moolenaar  Xabove 99
4802bdd2c290SBram Moolenaar  call assert_equal(['X2', 5, 1], [@%, line('.'), col('.')])
4803cf6a55c4SBram Moolenaar  normal G
4804cf6a55c4SBram Moolenaar  Xbefore 99
4805bdd2c290SBram Moolenaar  call assert_equal(['X2', 5, 1], [@%, line('.'), col('.')])
4806cf6a55c4SBram Moolenaar
48073ff33114SBram Moolenaar  normal 10G
48083ff33114SBram Moolenaar  Xabove
4809bdd2c290SBram Moolenaar  call assert_equal(['X2', 5, 1], [@%, line('.'), col('.')])
4810cf6a55c4SBram Moolenaar  normal 10G$
4811cf6a55c4SBram Moolenaar  2Xbefore
4812bdd2c290SBram Moolenaar  call assert_equal(['X2', 10, 2], [@%, line('.'), col('.')])
4813cf6a55c4SBram Moolenaar
48143ff33114SBram Moolenaar  normal 10G
48153ff33114SBram Moolenaar  Xbelow
4816bdd2c290SBram Moolenaar  call assert_equal(['X2', 15, 1], [@%, line('.'), col('.')])
4817cf6a55c4SBram Moolenaar  normal 9G
4818cf6a55c4SBram Moolenaar  5Xafter
4819bdd2c290SBram Moolenaar  call assert_equal(['X2', 15, 2], [@%, line('.'), col('.')])
48203ff33114SBram Moolenaar
48213ff33114SBram Moolenaar  " Invalid range
48223ff33114SBram Moolenaar  if a:cchar == 'c'
482325190db2SBram Moolenaar    call assert_fails('-2cbelow', 'E16:')
4824cf6a55c4SBram Moolenaar    call assert_fails('-2cafter', 'E16:')
48253ff33114SBram Moolenaar  else
482625190db2SBram Moolenaar    call assert_fails('-2lbelow', 'E16:')
4827cf6a55c4SBram Moolenaar    call assert_fails('-2lafter', 'E16:')
48283ff33114SBram Moolenaar  endif
48293ff33114SBram Moolenaar
48303ff33114SBram Moolenaar  call delete('X1')
48313ff33114SBram Moolenaar  call delete('X2')
48323ff33114SBram Moolenaar  call delete('X3')
48333ff33114SBram Moolenaar  call delete('X4')
48343ff33114SBram Moolenaarendfunc
48353ff33114SBram Moolenaar
48363ff33114SBram Moolenaarfunc Test_cbelow()
48373ff33114SBram Moolenaar  call Xtest_below('c')
48383ff33114SBram Moolenaar  call Xtest_below('l')
48393ff33114SBram Moolenaarendfunc
484025190db2SBram Moolenaar
484125190db2SBram Moolenaarfunc Test_quickfix_count()
484225190db2SBram Moolenaar  let commands = [
484325190db2SBram Moolenaar	\ 'cNext',
484425190db2SBram Moolenaar	\ 'cNfile',
484525190db2SBram Moolenaar	\ 'cabove',
484625190db2SBram Moolenaar	\ 'cbelow',
484725190db2SBram Moolenaar	\ 'cfirst',
484825190db2SBram Moolenaar	\ 'clast',
484925190db2SBram Moolenaar	\ 'cnewer',
485025190db2SBram Moolenaar	\ 'cnext',
485125190db2SBram Moolenaar	\ 'cnfile',
485225190db2SBram Moolenaar	\ 'colder',
485325190db2SBram Moolenaar	\ 'cprevious',
485425190db2SBram Moolenaar	\ 'crewind',
485525190db2SBram Moolenaar	\
485625190db2SBram Moolenaar	\ 'lNext',
485725190db2SBram Moolenaar	\ 'lNfile',
485825190db2SBram Moolenaar	\ 'labove',
485925190db2SBram Moolenaar	\ 'lbelow',
486025190db2SBram Moolenaar	\ 'lfirst',
486125190db2SBram Moolenaar	\ 'llast',
486225190db2SBram Moolenaar	\ 'lnewer',
486325190db2SBram Moolenaar	\ 'lnext',
486425190db2SBram Moolenaar	\ 'lnfile',
486525190db2SBram Moolenaar	\ 'lolder',
486625190db2SBram Moolenaar	\ 'lprevious',
486725190db2SBram Moolenaar	\ 'lrewind',
486825190db2SBram Moolenaar	\ ]
486925190db2SBram Moolenaar  for cmd in commands
487025190db2SBram Moolenaar    call assert_fails('-1' .. cmd, 'E16:')
487125190db2SBram Moolenaar    call assert_fails('.' .. cmd, 'E16:')
487225190db2SBram Moolenaar    call assert_fails('%' .. cmd, 'E16:')
487325190db2SBram Moolenaar    call assert_fails('$' .. cmd, 'E16:')
487425190db2SBram Moolenaar  endfor
487525190db2SBram Moolenaarendfunc
48766a0cc916SBram Moolenaar
48776a0cc916SBram Moolenaar" Test for aborting quickfix commands using QuickFixCmdPre
48786a0cc916SBram Moolenaarfunc Xtest_qfcmd_abort(cchar)
48796a0cc916SBram Moolenaar  call s:setup_commands(a:cchar)
48806a0cc916SBram Moolenaar
48816a0cc916SBram Moolenaar  call g:Xsetlist([], 'f')
48826a0cc916SBram Moolenaar
48836a0cc916SBram Moolenaar  " cexpr/lexpr
48846a0cc916SBram Moolenaar  let e = ''
48856a0cc916SBram Moolenaar  try
48866a0cc916SBram Moolenaar    Xexpr ["F1:10:Line10", "F2:20:Line20"]
48876a0cc916SBram Moolenaar  catch /.*/
48886a0cc916SBram Moolenaar    let e = v:exception
48896a0cc916SBram Moolenaar  endtry
48906a0cc916SBram Moolenaar  call assert_equal('AbortCmd', e)
48916a0cc916SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
48926a0cc916SBram Moolenaar
48936a0cc916SBram Moolenaar  " cfile/lfile
48946a0cc916SBram Moolenaar  call writefile(["F1:10:Line10", "F2:20:Line20"], 'Xfile1')
48956a0cc916SBram Moolenaar  let e = ''
48966a0cc916SBram Moolenaar  try
48976a0cc916SBram Moolenaar    Xfile Xfile1
48986a0cc916SBram Moolenaar  catch /.*/
48996a0cc916SBram Moolenaar    let e = v:exception
49006a0cc916SBram Moolenaar  endtry
49016a0cc916SBram Moolenaar  call assert_equal('AbortCmd', e)
49026a0cc916SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
49036a0cc916SBram Moolenaar  call delete('Xfile1')
49046a0cc916SBram Moolenaar
49056a0cc916SBram Moolenaar  " cgetbuffer/lgetbuffer
49066a0cc916SBram Moolenaar  enew!
49076a0cc916SBram Moolenaar  call append(0, ["F1:10:Line10", "F2:20:Line20"])
49086a0cc916SBram Moolenaar  let e = ''
49096a0cc916SBram Moolenaar  try
49106a0cc916SBram Moolenaar    Xgetbuffer
49116a0cc916SBram Moolenaar  catch /.*/
49126a0cc916SBram Moolenaar    let e = v:exception
49136a0cc916SBram Moolenaar  endtry
49146a0cc916SBram Moolenaar  call assert_equal('AbortCmd', e)
49156a0cc916SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
49166a0cc916SBram Moolenaar  enew!
49176a0cc916SBram Moolenaar
49186a0cc916SBram Moolenaar  " vimgrep/lvimgrep
49196a0cc916SBram Moolenaar  let e = ''
49206a0cc916SBram Moolenaar  try
49216a0cc916SBram Moolenaar    Xvimgrep /func/ test_quickfix.vim
49226a0cc916SBram Moolenaar  catch /.*/
49236a0cc916SBram Moolenaar    let e = v:exception
49246a0cc916SBram Moolenaar  endtry
49256a0cc916SBram Moolenaar  call assert_equal('AbortCmd', e)
49266a0cc916SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
49276a0cc916SBram Moolenaar
49286a0cc916SBram Moolenaar  " helpgrep/lhelpgrep
49296a0cc916SBram Moolenaar  let e = ''
49306a0cc916SBram Moolenaar  try
49316a0cc916SBram Moolenaar    Xhelpgrep quickfix
49326a0cc916SBram Moolenaar  catch /.*/
49336a0cc916SBram Moolenaar    let e = v:exception
49346a0cc916SBram Moolenaar  endtry
49356a0cc916SBram Moolenaar  call assert_equal('AbortCmd', e)
49366a0cc916SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
49376a0cc916SBram Moolenaar
49386a0cc916SBram Moolenaar  " grep/lgrep
49396a0cc916SBram Moolenaar  if has('unix')
49406a0cc916SBram Moolenaar    let e = ''
49416a0cc916SBram Moolenaar    try
49426a0cc916SBram Moolenaar      silent Xgrep func test_quickfix.vim
49436a0cc916SBram Moolenaar    catch /.*/
49446a0cc916SBram Moolenaar      let e = v:exception
49456a0cc916SBram Moolenaar    endtry
49466a0cc916SBram Moolenaar    call assert_equal('AbortCmd', e)
49476a0cc916SBram Moolenaar    call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
49486a0cc916SBram Moolenaar  endif
49496a0cc916SBram Moolenaarendfunc
49506a0cc916SBram Moolenaar
49516a0cc916SBram Moolenaarfunc Test_qfcmd_abort()
49526a0cc916SBram Moolenaar  augroup QF_Test
49536a0cc916SBram Moolenaar    au!
49546a0cc916SBram Moolenaar    autocmd  QuickFixCmdPre * throw "AbortCmd"
49556a0cc916SBram Moolenaar  augroup END
49566a0cc916SBram Moolenaar
49576a0cc916SBram Moolenaar  call Xtest_qfcmd_abort('c')
49586a0cc916SBram Moolenaar  call Xtest_qfcmd_abort('l')
49596a0cc916SBram Moolenaar
49606a0cc916SBram Moolenaar  augroup QF_Test
49616a0cc916SBram Moolenaar    au!
49626a0cc916SBram Moolenaar  augroup END
49636a0cc916SBram Moolenaarendfunc
49646a0cc916SBram Moolenaar
4965d8a8c4caSBram Moolenaar" Test for using a file in one of the parent directories.
4966d8a8c4caSBram Moolenaarfunc Test_search_in_dirstack()
4967d8a8c4caSBram Moolenaar  call mkdir('Xtestdir/a/b/c', 'p')
4968d8a8c4caSBram Moolenaar  let save_cwd = getcwd()
4969d8a8c4caSBram Moolenaar  call writefile(["X1_L1", "X1_L2"], 'Xtestdir/Xfile1')
4970d8a8c4caSBram Moolenaar  call writefile(["X2_L1", "X2_L2"], 'Xtestdir/a/Xfile2')
4971d8a8c4caSBram Moolenaar  call writefile(["X3_L1", "X3_L2"], 'Xtestdir/a/b/Xfile3')
4972d8a8c4caSBram Moolenaar  call writefile(["X4_L1", "X4_L2"], 'Xtestdir/a/b/c/Xfile4')
4973d8a8c4caSBram Moolenaar
4974d8a8c4caSBram Moolenaar  let lines = "Entering dir Xtestdir\n" .
4975d8a8c4caSBram Moolenaar	      \ "Entering dir a\n" .
4976d8a8c4caSBram Moolenaar	      \ "Entering dir b\n" .
4977d8a8c4caSBram Moolenaar	      \ "Xfile2:2:X2_L2\n" .
4978d8a8c4caSBram Moolenaar	      \ "Leaving dir a\n" .
4979d8a8c4caSBram Moolenaar	      \ "Xfile1:2:X1_L2\n" .
4980d8a8c4caSBram Moolenaar	      \ "Xfile3:1:X3_L1\n" .
4981d8a8c4caSBram Moolenaar	      \ "Entering dir c\n" .
4982d8a8c4caSBram Moolenaar	      \ "Xfile4:2:X4_L2\n" .
498388a3e2b2SBram Moolenaar	      \ "Leaving dir c\n"
4984d8a8c4caSBram Moolenaar  set efm=%DEntering\ dir\ %f,%XLeaving\ dir\ %f,%f:%l:%m
498588a3e2b2SBram Moolenaar  cexpr lines .. "Leaving dir Xtestdir|\n" | let next = 1
4986d8a8c4caSBram Moolenaar  call assert_equal(11, getqflist({'size' : 0}).size)
4987d8a8c4caSBram Moolenaar  call assert_equal(4, getqflist({'idx' : 0}).idx)
4988d8a8c4caSBram Moolenaar  call assert_equal('X2_L2', getline('.'))
498988a3e2b2SBram Moolenaar  call assert_equal(1, next)
4990d8a8c4caSBram Moolenaar  cnext
4991d8a8c4caSBram Moolenaar  call assert_equal(6, getqflist({'idx' : 0}).idx)
4992d8a8c4caSBram Moolenaar  call assert_equal('X1_L2', getline('.'))
4993d8a8c4caSBram Moolenaar  cnext
4994d8a8c4caSBram Moolenaar  call assert_equal(7, getqflist({'idx' : 0}).idx)
4995d8a8c4caSBram Moolenaar  call assert_equal(1, line('$'))
4996d8a8c4caSBram Moolenaar  call assert_equal('', getline(1))
4997d8a8c4caSBram Moolenaar  cnext
4998d8a8c4caSBram Moolenaar  call assert_equal(9, getqflist({'idx' : 0}).idx)
4999d8a8c4caSBram Moolenaar  call assert_equal(1, line('$'))
5000d8a8c4caSBram Moolenaar  call assert_equal('', getline(1))
5001d8a8c4caSBram Moolenaar
5002d8a8c4caSBram Moolenaar  set efm&
5003d8a8c4caSBram Moolenaar  exe 'cd ' . save_cwd
5004d8a8c4caSBram Moolenaar  call delete('Xtestdir', 'rf')
5005d8a8c4caSBram Moolenaarendfunc
5006d8a8c4caSBram Moolenaar
50071860bde9SBram Moolenaar" Test for :cquit
50081860bde9SBram Moolenaarfunc Test_cquit()
50091860bde9SBram Moolenaar  " Exit Vim with a non-zero value
50101860bde9SBram Moolenaar  if RunVim([], ["cquit 7"], '')
50111860bde9SBram Moolenaar    call assert_equal(7, v:shell_error)
50121860bde9SBram Moolenaar  endif
50131860bde9SBram Moolenaar
50141860bde9SBram Moolenaar  if RunVim([], ["50cquit"], '')
50151860bde9SBram Moolenaar    call assert_equal(50, v:shell_error)
50161860bde9SBram Moolenaar  endif
50171860bde9SBram Moolenaar
50181860bde9SBram Moolenaar  " Exit Vim with default value
50191860bde9SBram Moolenaar  if RunVim([], ["cquit"], '')
50201860bde9SBram Moolenaar    call assert_equal(1, v:shell_error)
50211860bde9SBram Moolenaar  endif
50221860bde9SBram Moolenaar
50231860bde9SBram Moolenaar  " Exit Vim with zero value
50241860bde9SBram Moolenaar  if RunVim([], ["cquit 0"], '')
50251860bde9SBram Moolenaar    call assert_equal(0, v:shell_error)
50261860bde9SBram Moolenaar  endif
50271860bde9SBram Moolenaar
50281860bde9SBram Moolenaar  " Exit Vim with negative value
50291860bde9SBram Moolenaar  call assert_fails('-3cquit', 'E16:')
50301860bde9SBram Moolenaarendfunc
50311860bde9SBram Moolenaar
5032858ba06dSBram Moolenaar" Test for getting a specific item from a quickfix list
5033858ba06dSBram Moolenaarfunc Xtest_getqflist_by_idx(cchar)
5034858ba06dSBram Moolenaar  call s:setup_commands(a:cchar)
5035858ba06dSBram Moolenaar  " Empty list
5036858ba06dSBram Moolenaar  call assert_equal([], g:Xgetlist({'idx' : 1, 'items' : 0}).items)
5037858ba06dSBram Moolenaar  Xexpr ['F1:10:L10', 'F1:20:L20']
5038858ba06dSBram Moolenaar  let l = g:Xgetlist({'idx' : 2, 'items' : 0}).items
5039858ba06dSBram Moolenaar  call assert_equal(bufnr('F1'), l[0].bufnr)
5040858ba06dSBram Moolenaar  call assert_equal(20, l[0].lnum)
5041858ba06dSBram Moolenaar  call assert_equal('L20', l[0].text)
5042858ba06dSBram Moolenaar  call assert_equal([], g:Xgetlist({'idx' : -1, 'items' : 0}).items)
5043858ba06dSBram Moolenaar  call assert_equal([], g:Xgetlist({'idx' : 3, 'items' : 0}).items)
5044858ba06dSBram Moolenaar  %bwipe!
5045858ba06dSBram Moolenaarendfunc
5046858ba06dSBram Moolenaar
5047858ba06dSBram Moolenaarfunc Test_getqflist_by_idx()
5048858ba06dSBram Moolenaar  call Xtest_getqflist_by_idx('c')
5049858ba06dSBram Moolenaar  call Xtest_getqflist_by_idx('l')
5050858ba06dSBram Moolenaarendfunc
5051858ba06dSBram Moolenaar
5052858ba06dSBram Moolenaar" Test for the 'quickfixtextfunc' setting
5053858ba06dSBram Moolenaarfunc Tqfexpr(info)
5054858ba06dSBram Moolenaar  if a:info.quickfix
505500e260bbSBram Moolenaar    let qfl = getqflist({'id' : a:info.id, 'items' : 1}).items
5056858ba06dSBram Moolenaar  else
505700e260bbSBram Moolenaar    let qfl = getloclist(a:info.winid, {'id' : a:info.id, 'items' : 1}).items
5058858ba06dSBram Moolenaar  endif
5059858ba06dSBram Moolenaar
506000e260bbSBram Moolenaar  let l = []
506100e260bbSBram Moolenaar  for idx in range(a:info.start_idx - 1, a:info.end_idx - 1)
506200e260bbSBram Moolenaar    let e = qfl[idx]
5063858ba06dSBram Moolenaar    let s = ''
5064858ba06dSBram Moolenaar    if e.bufnr != 0
5065858ba06dSBram Moolenaar      let bname = bufname(e.bufnr)
5066858ba06dSBram Moolenaar      let s ..= fnamemodify(bname, ':.')
5067858ba06dSBram Moolenaar    endif
5068858ba06dSBram Moolenaar    let s ..= '-'
5069858ba06dSBram Moolenaar    let s ..= 'L' .. string(e.lnum) .. 'C' .. string(e.col) .. '-'
5070858ba06dSBram Moolenaar    let s ..= e.text
507100e260bbSBram Moolenaar    call add(l, s)
507200e260bbSBram Moolenaar  endfor
5073858ba06dSBram Moolenaar
507400e260bbSBram Moolenaar  return l
5075858ba06dSBram Moolenaarendfunc
5076858ba06dSBram Moolenaar
5077858ba06dSBram Moolenaarfunc Xtest_qftextfunc(cchar)
5078858ba06dSBram Moolenaar  call s:setup_commands(a:cchar)
5079858ba06dSBram Moolenaar
5080858ba06dSBram Moolenaar  set efm=%f:%l:%c:%m
5081858ba06dSBram Moolenaar  set quickfixtextfunc=Tqfexpr
5082d43906d2SBram Moolenaar  call assert_equal('Tqfexpr', &quickfixtextfunc)
5083d43906d2SBram Moolenaar  call assert_equal('',
5084d43906d2SBram Moolenaar        \ g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc)
5085858ba06dSBram Moolenaar  Xexpr ['F1:10:2:green', 'F1:20:4:blue']
5086858ba06dSBram Moolenaar  Xwindow
5087858ba06dSBram Moolenaar  call assert_equal('F1-L10C2-green', getline(1))
5088858ba06dSBram Moolenaar  call assert_equal('F1-L20C4-blue', getline(2))
5089858ba06dSBram Moolenaar  Xclose
5090858ba06dSBram Moolenaar  set quickfixtextfunc&vim
5091858ba06dSBram Moolenaar  Xwindow
5092858ba06dSBram Moolenaar  call assert_equal('F1|10 col 2| green', getline(1))
5093858ba06dSBram Moolenaar  call assert_equal('F1|20 col 4| blue', getline(2))
5094858ba06dSBram Moolenaar  Xclose
5095858ba06dSBram Moolenaar  set efm&
5096858ba06dSBram Moolenaar  set quickfixtextfunc&
5097858ba06dSBram Moolenaar
5098858ba06dSBram Moolenaar  " Test for per list 'quickfixtextfunc' setting
5099858ba06dSBram Moolenaar  func PerQfText(info)
5100858ba06dSBram Moolenaar    if a:info.quickfix
510100e260bbSBram Moolenaar      let qfl = getqflist({'id' : a:info.id, 'items' : 1}).items
5102858ba06dSBram Moolenaar    else
510300e260bbSBram Moolenaar      let qfl = getloclist(a:info.winid, {'id' : a:info.id, 'items' : 1}).items
5104858ba06dSBram Moolenaar    endif
5105858ba06dSBram Moolenaar    if empty(qfl)
510600e260bbSBram Moolenaar      return []
5107858ba06dSBram Moolenaar    endif
510800e260bbSBram Moolenaar    let l = []
510900e260bbSBram Moolenaar    for idx in range(a:info.start_idx - 1, a:info.end_idx - 1)
511000e260bbSBram Moolenaar      call add(l, 'Line ' .. qfl[idx].lnum .. ', Col ' .. qfl[idx].col)
511100e260bbSBram Moolenaar    endfor
511200e260bbSBram Moolenaar    return l
5113858ba06dSBram Moolenaar  endfunc
5114858ba06dSBram Moolenaar  set quickfixtextfunc=Tqfexpr
5115858ba06dSBram Moolenaar  call g:Xsetlist([], ' ', {'quickfixtextfunc' : "PerQfText"})
5116858ba06dSBram Moolenaar  Xaddexpr ['F1:10:2:green', 'F1:20:4:blue']
5117858ba06dSBram Moolenaar  Xwindow
5118858ba06dSBram Moolenaar  call assert_equal('Line 10, Col 2', getline(1))
5119858ba06dSBram Moolenaar  call assert_equal('Line 20, Col 4', getline(2))
5120858ba06dSBram Moolenaar  Xclose
5121d43906d2SBram Moolenaar  call assert_equal(function('PerQfText'),
5122d43906d2SBram Moolenaar        \ g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc)
51237ba5a7efSBram Moolenaar  " Add entries to the list when the quickfix buffer is hidden
51247ba5a7efSBram Moolenaar  Xaddexpr ['F1:30:6:red']
51257ba5a7efSBram Moolenaar  Xwindow
51267ba5a7efSBram Moolenaar  call assert_equal('Line 30, Col 6', getline(3))
51277ba5a7efSBram Moolenaar  Xclose
5128858ba06dSBram Moolenaar  call g:Xsetlist([], 'r', {'quickfixtextfunc' : ''})
5129d43906d2SBram Moolenaar  call assert_equal('', g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc)
5130858ba06dSBram Moolenaar  set quickfixtextfunc&
5131858ba06dSBram Moolenaar  delfunc PerQfText
5132858ba06dSBram Moolenaar
5133858ba06dSBram Moolenaar  " Non-existing function
5134858ba06dSBram Moolenaar  set quickfixtextfunc=Tabc
5135858ba06dSBram Moolenaar  call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue']", 'E117:')
5136858ba06dSBram Moolenaar  call assert_fails("Xwindow", 'E117:')
5137858ba06dSBram Moolenaar  Xclose
5138858ba06dSBram Moolenaar  set quickfixtextfunc&
5139858ba06dSBram Moolenaar
5140858ba06dSBram Moolenaar  " set option to a non-function
5141858ba06dSBram Moolenaar  set quickfixtextfunc=[10,\ 20]
5142858ba06dSBram Moolenaar  call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue']", 'E117:')
5143858ba06dSBram Moolenaar  call assert_fails("Xwindow", 'E117:')
5144858ba06dSBram Moolenaar  Xclose
5145858ba06dSBram Moolenaar  set quickfixtextfunc&
5146858ba06dSBram Moolenaar
5147858ba06dSBram Moolenaar  " set option to a function with different set of arguments
5148858ba06dSBram Moolenaar  func Xqftext(a, b, c)
5149858ba06dSBram Moolenaar    return a:a .. a:b .. a:c
5150858ba06dSBram Moolenaar  endfunc
5151858ba06dSBram Moolenaar  set quickfixtextfunc=Xqftext
5152858ba06dSBram Moolenaar  call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue']", 'E119:')
5153858ba06dSBram Moolenaar  call assert_fails("Xwindow", 'E119:')
5154858ba06dSBram Moolenaar  Xclose
515500e260bbSBram Moolenaar
515600e260bbSBram Moolenaar  " set option to a function that returns a list with non-strings
515700e260bbSBram Moolenaar  func Xqftext2(d)
515800e260bbSBram Moolenaar    return ['one', [], 'two']
515900e260bbSBram Moolenaar  endfunc
516000e260bbSBram Moolenaar  set quickfixtextfunc=Xqftext2
516100e260bbSBram Moolenaar  call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue', 'F1:30:6:red']",
516200e260bbSBram Moolenaar                                                                  \ 'E730:')
516300e260bbSBram Moolenaar  call assert_fails('Xwindow', 'E730:')
5164d43906d2SBram Moolenaar  call assert_equal(['one', 'F1|20 col 4| blue', 'F1|30 col 6| red'],
5165d43906d2SBram Moolenaar        \ getline(1, '$'))
516600e260bbSBram Moolenaar  Xclose
516700e260bbSBram Moolenaar
5168858ba06dSBram Moolenaar  set quickfixtextfunc&
5169858ba06dSBram Moolenaar  delfunc Xqftext
517000e260bbSBram Moolenaar  delfunc Xqftext2
5171d43906d2SBram Moolenaar
5172d43906d2SBram Moolenaar  " set the global option to a lambda function
5173d43906d2SBram Moolenaar  set quickfixtextfunc={d\ ->\ map(g:Xgetlist({'id'\ :\ d.id,\ 'items'\ :\ 1}).items[d.start_idx-1:d.end_idx-1],\ 'v:val.text')}
5174d43906d2SBram Moolenaar  Xexpr ['F1:10:2:green', 'F1:20:4:blue']
5175d43906d2SBram Moolenaar  Xwindow
5176d43906d2SBram Moolenaar  call assert_equal(['green', 'blue'], getline(1, '$'))
5177d43906d2SBram Moolenaar  Xclose
5178d43906d2SBram 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)
5179d43906d2SBram Moolenaar  set quickfixtextfunc&
5180d43906d2SBram Moolenaar
5181d43906d2SBram Moolenaar  " use a lambda function that returns an empty list
5182d43906d2SBram Moolenaar  set quickfixtextfunc={d\ ->\ []}
5183d43906d2SBram Moolenaar  Xexpr ['F1:10:2:green', 'F1:20:4:blue']
5184d43906d2SBram Moolenaar  Xwindow
5185d43906d2SBram Moolenaar  call assert_equal(['F1|10 col 2| green', 'F1|20 col 4| blue'],
5186d43906d2SBram Moolenaar        \ getline(1, '$'))
5187d43906d2SBram Moolenaar  Xclose
5188d43906d2SBram Moolenaar  set quickfixtextfunc&
5189d43906d2SBram Moolenaar
5190d43906d2SBram Moolenaar  " use a lambda function that returns a list with empty strings
5191d43906d2SBram Moolenaar  set quickfixtextfunc={d\ ->\ ['',\ '']}
5192d43906d2SBram Moolenaar  Xexpr ['F1:10:2:green', 'F1:20:4:blue']
5193d43906d2SBram Moolenaar  Xwindow
5194d43906d2SBram Moolenaar  call assert_equal(['F1|10 col 2| green', 'F1|20 col 4| blue'],
5195d43906d2SBram Moolenaar        \ getline(1, '$'))
5196d43906d2SBram Moolenaar  Xclose
5197d43906d2SBram Moolenaar  set quickfixtextfunc&
5198d43906d2SBram Moolenaar
5199d43906d2SBram Moolenaar  " set the per-quickfix list text function to a lambda function
5200d43906d2SBram Moolenaar  call g:Xsetlist([], ' ',
5201d43906d2SBram Moolenaar        \ {'quickfixtextfunc' :
5202d43906d2SBram Moolenaar        \   {d -> map(g:Xgetlist({'id' : d.id, 'items' : 1}).items[d.start_idx-1:d.end_idx-1],
5203d43906d2SBram Moolenaar        \ "'Line ' .. v:val.lnum .. ', Col ' .. v:val.col")}})
5204d43906d2SBram Moolenaar  Xaddexpr ['F1:10:2:green', 'F1:20:4:blue']
5205d43906d2SBram Moolenaar  Xwindow
5206d43906d2SBram Moolenaar  call assert_equal('Line 10, Col 2', getline(1))
5207d43906d2SBram Moolenaar  call assert_equal('Line 20, Col 4', getline(2))
5208d43906d2SBram Moolenaar  Xclose
5209d43906d2SBram Moolenaar  call assert_match("function('<lambda>\\d\\+')", string(g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc))
5210d43906d2SBram Moolenaar  call g:Xsetlist([], 'f')
5211858ba06dSBram Moolenaarendfunc
5212858ba06dSBram Moolenaar
5213858ba06dSBram Moolenaarfunc Test_qftextfunc()
5214858ba06dSBram Moolenaar  call Xtest_qftextfunc('c')
5215858ba06dSBram Moolenaar  call Xtest_qftextfunc('l')
5216858ba06dSBram Moolenaarendfunc
5217858ba06dSBram Moolenaar
5218ec98e93aSBram Moolenaar" Running :lhelpgrep command more than once in a help window, doesn't jump to
5219ec98e93aSBram Moolenaar" the help topic
5220ec98e93aSBram Moolenaarfunc Test_lhelpgrep_from_help_window()
5221ec98e93aSBram Moolenaar  call mkdir('Xtestdir/doc', 'p')
5222ec98e93aSBram Moolenaar  call writefile(['window'], 'Xtestdir/doc/a.txt')
5223ec98e93aSBram Moolenaar  call writefile(['buffer'], 'Xtestdir/doc/b.txt')
5224ec98e93aSBram Moolenaar  let save_rtp = &rtp
5225ec98e93aSBram Moolenaar  let &rtp = 'Xtestdir'
5226ec98e93aSBram Moolenaar  lhelpgrep window
5227ec98e93aSBram Moolenaar  lhelpgrep buffer
5228ec98e93aSBram Moolenaar  call assert_equal('b.txt', fnamemodify(@%, ":p:t"))
5229ec98e93aSBram Moolenaar  lhelpgrep window
5230ec98e93aSBram Moolenaar  call assert_equal('a.txt', fnamemodify(@%, ":p:t"))
5231ec98e93aSBram Moolenaar  let &rtp = save_rtp
5232ec98e93aSBram Moolenaar  call delete('Xtestdir', 'rf')
5233ec98e93aSBram Moolenaar  new | only!
5234ec98e93aSBram Moolenaarendfunc
5235ec98e93aSBram Moolenaar
5236f7c4d836SBram Moolenaar" Test for the crash fixed by 7.3.715
5237f7c4d836SBram Moolenaarfunc Test_setloclist_crash()
5238f7c4d836SBram Moolenaar  %bw!
5239f7c4d836SBram Moolenaar  let g:BufNum = bufnr()
5240f7c4d836SBram Moolenaar  augroup QF_Test
5241f7c4d836SBram Moolenaar    au!
5242f7c4d836SBram Moolenaar    au BufUnload * call setloclist(0, [{'bufnr':g:BufNum, 'lnum':1, 'col':1, 'text': 'tango down'}])
5243f7c4d836SBram Moolenaar  augroup END
5244f7c4d836SBram Moolenaar
5245f7c4d836SBram Moolenaar  try
5246f7c4d836SBram Moolenaar    lvimgrep /.*/ *.mak
5247f7c4d836SBram Moolenaar  catch /E926:/
5248f7c4d836SBram Moolenaar  endtry
5249f7c4d836SBram Moolenaar  call assert_equal('tango down', getloclist(0, {'items' : 0}).items[0].text)
5250f7c4d836SBram Moolenaar  call assert_equal(1, getloclist(0, {'size' : 0}).size)
5251f7c4d836SBram Moolenaar
5252f7c4d836SBram Moolenaar  augroup QF_Test
5253f7c4d836SBram Moolenaar    au!
5254f7c4d836SBram Moolenaar  augroup END
5255f7c4d836SBram Moolenaar  unlet g:BufNum
5256f7c4d836SBram Moolenaar  %bw!
5257f7c4d836SBram Moolenaarendfunc
5258f7c4d836SBram Moolenaar
52592ce77903SBram Moolenaar" Test for adding an invalid entry with the quickfix window open and making
52602ce77903SBram Moolenaar" sure that the window contents are not changed
52612ce77903SBram Moolenaarfunc Test_add_invalid_entry_with_qf_window()
52622ce77903SBram Moolenaar  call setqflist([], 'f')
52632ce77903SBram Moolenaar  cexpr "Xfile1:10:aa"
52642ce77903SBram Moolenaar  copen
52652ce77903SBram Moolenaar  call setqflist(['bb'], 'a')
52662ce77903SBram Moolenaar  call assert_equal(1, line('$'))
52672ce77903SBram Moolenaar  call assert_equal(['Xfile1|10| aa'], getline(1, '$'))
52682ce77903SBram Moolenaar  call assert_equal([{'lnum': 10, 'bufnr': bufnr('Xfile1'), 'col': 0, 'pattern': '', 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'module': '', 'text': 'aa'}], getqflist())
52692ce77903SBram Moolenaar  cclose
52702ce77903SBram Moolenaarendfunc
52712ce77903SBram Moolenaar
52729e40c4b1SBram Moolenaar" Test for very weird problem: autocommand causes a failure, resulting opening
52739e40c4b1SBram Moolenaar" the quickfix window to fail. This still splits the window, but otherwise
52749e40c4b1SBram Moolenaar" should not mess up buffers.
52759e40c4b1SBram Moolenaarfunc Test_quickfix_window_fails_to_open()
52769e40c4b1SBram Moolenaar  CheckScreendump
52779e40c4b1SBram Moolenaar
52789e40c4b1SBram Moolenaar  let lines =<< trim END
52799e40c4b1SBram Moolenaar      anything
52809e40c4b1SBram Moolenaar      try
52819e40c4b1SBram Moolenaar        anything
52829e40c4b1SBram Moolenaar      endtry
52839e40c4b1SBram Moolenaar  END
52849e40c4b1SBram Moolenaar  call writefile(lines, 'XquickfixFails')
52859e40c4b1SBram Moolenaar
52869e40c4b1SBram Moolenaar  let lines =<< trim END
52879e40c4b1SBram Moolenaar      split XquickfixFails
52889e40c4b1SBram Moolenaar      silent vimgrep anything %
52899e40c4b1SBram Moolenaar      normal o
52909e40c4b1SBram Moolenaar      au BufLeave * ++once source XquickfixFails
52919e40c4b1SBram Moolenaar      " This will trigger the autocommand, which causes an error, what follows
52929e40c4b1SBram Moolenaar      " is aborted but the window was already split.
52939e40c4b1SBram Moolenaar      silent! cwindow
52949e40c4b1SBram Moolenaar  END
52959e40c4b1SBram Moolenaar  call writefile(lines, 'XtestWinFails')
52969e40c4b1SBram Moolenaar  let buf = RunVimInTerminal('-S XtestWinFails', #{rows: 13})
52979e40c4b1SBram Moolenaar  call VerifyScreenDump(buf, 'Test_quickfix_window_fails', {})
52989e40c4b1SBram Moolenaar
52999e40c4b1SBram Moolenaar  " clean up
53009e40c4b1SBram Moolenaar  call term_sendkeys(buf, ":bwipe!\<CR>")
53019e40c4b1SBram Moolenaar  call term_wait(buf)
53029e40c4b1SBram Moolenaar  call StopVimInTerminal(buf)
53039e40c4b1SBram Moolenaar  call delete('XtestWinFails')
53049e40c4b1SBram Moolenaar  call delete('XquickfixFails')
53059e40c4b1SBram Moolenaarendfunc
53069e40c4b1SBram Moolenaar
53072d870f8dSBram Moolenaar" Test for updating the quickfix buffer whenever the associated quickfix list
5308287153c5SBram Moolenaar" is changed.
5309287153c5SBram Moolenaarfunc Xqfbuf_update(cchar)
5310287153c5SBram Moolenaar  call s:setup_commands(a:cchar)
5311287153c5SBram Moolenaar
5312287153c5SBram Moolenaar  Xexpr "F1:1:line1"
5313287153c5SBram Moolenaar  Xopen
5314287153c5SBram Moolenaar  call assert_equal(['F1|1| line1'], getline(1, '$'))
5315287153c5SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
5316287153c5SBram Moolenaar
5317287153c5SBram Moolenaar  " Test setqflist() using the 'lines' key in 'what'
5318287153c5SBram Moolenaar  " add a new entry
5319287153c5SBram Moolenaar  call g:Xsetlist([], 'a', {'lines' : ['F2:2: line2']})
5320287153c5SBram Moolenaar  call assert_equal(['F1|1| line1', 'F2|2| line2'], getline(1, '$'))
5321287153c5SBram Moolenaar  call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
5322287153c5SBram Moolenaar  " replace all the entries with a single entry
5323287153c5SBram Moolenaar  call g:Xsetlist([], 'r', {'lines' : ['F3:3: line3']})
5324287153c5SBram Moolenaar  call assert_equal(['F3|3| line3'], getline(1, '$'))
5325287153c5SBram Moolenaar  call assert_equal(3, g:Xgetlist({'changedtick' : 0}).changedtick)
5326287153c5SBram Moolenaar  " remove all the entries
5327287153c5SBram Moolenaar  call g:Xsetlist([], 'r', {'lines' : []})
5328287153c5SBram Moolenaar  call assert_equal([''], getline(1, '$'))
5329287153c5SBram Moolenaar  call assert_equal(4, g:Xgetlist({'changedtick' : 0}).changedtick)
5330287153c5SBram Moolenaar  " add a new list
5331287153c5SBram Moolenaar  call g:Xsetlist([], ' ', {'lines' : ['F4:4: line4']})
5332287153c5SBram Moolenaar  call assert_equal(['F4|4| line4'], getline(1, '$'))
5333287153c5SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
5334287153c5SBram Moolenaar
5335287153c5SBram Moolenaar  " Test setqflist() using the 'items' key in 'what'
5336287153c5SBram Moolenaar  " add a new entry
5337287153c5SBram Moolenaar  call g:Xsetlist([], 'a', {'items' : [{'filename' : 'F5', 'lnum' : 5, 'text' : 'line5'}]})
5338287153c5SBram Moolenaar  call assert_equal(['F4|4| line4', 'F5|5| line5'], getline(1, '$'))
5339287153c5SBram Moolenaar  call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
5340287153c5SBram Moolenaar  " replace all the entries with a single entry
5341287153c5SBram Moolenaar  call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F6', 'lnum' : 6, 'text' : 'line6'}]})
5342287153c5SBram Moolenaar  call assert_equal(['F6|6| line6'], getline(1, '$'))
5343287153c5SBram Moolenaar  call assert_equal(3, g:Xgetlist({'changedtick' : 0}).changedtick)
5344287153c5SBram Moolenaar  " remove all the entries
5345287153c5SBram Moolenaar  call g:Xsetlist([], 'r', {'items' : []})
5346287153c5SBram Moolenaar  call assert_equal([''], getline(1, '$'))
5347287153c5SBram Moolenaar  call assert_equal(4, g:Xgetlist({'changedtick' : 0}).changedtick)
5348287153c5SBram Moolenaar  " add a new list
5349287153c5SBram Moolenaar  call g:Xsetlist([], ' ', {'items' : [{'filename' : 'F7', 'lnum' : 7, 'text' : 'line7'}]})
5350287153c5SBram Moolenaar  call assert_equal(['F7|7| line7'], getline(1, '$'))
5351287153c5SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
5352287153c5SBram Moolenaar
5353287153c5SBram Moolenaar  call g:Xsetlist([], ' ', {})
5354287153c5SBram Moolenaar  call assert_equal([''], getline(1, '$'))
5355287153c5SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
5356287153c5SBram Moolenaar
5357287153c5SBram Moolenaar  Xclose
5358287153c5SBram Moolenaarendfunc
5359287153c5SBram Moolenaar
5360287153c5SBram Moolenaarfunc Test_qfbuf_update()
5361287153c5SBram Moolenaar  call Xqfbuf_update('c')
5362287153c5SBram Moolenaar  call Xqfbuf_update('l')
5363287153c5SBram Moolenaarendfunc
5364287153c5SBram Moolenaar
53658c801b37SBram Moolenaarfunc Test_vimgrep_noswapfile()
53668c801b37SBram Moolenaar  set noswapfile
53678c801b37SBram Moolenaar  call writefile(['one', 'two', 'three'], 'Xgreppie')
53688c801b37SBram Moolenaar  vimgrep two Xgreppie
53698c801b37SBram Moolenaar  call assert_equal('two', getline('.'))
53708c801b37SBram Moolenaar
53718c801b37SBram Moolenaar  call delete('Xgreppie')
53728c801b37SBram Moolenaar  set swapfile
53738c801b37SBram Moolenaarendfunc
53748c801b37SBram Moolenaar
5375*bb01a1efSYegappan Lakshmanan" Test for the :vimgrep 'f' flag (fuzzy match)
5376*bb01a1efSYegappan Lakshmananfunc Xvimgrep_fuzzy_match(cchar)
5377*bb01a1efSYegappan Lakshmanan  call s:setup_commands(a:cchar)
5378*bb01a1efSYegappan Lakshmanan
5379*bb01a1efSYegappan Lakshmanan  Xvimgrep /three one/f Xfile*
5380*bb01a1efSYegappan Lakshmanan  let l = g:Xgetlist()
5381*bb01a1efSYegappan Lakshmanan  call assert_equal(2, len(l))
5382*bb01a1efSYegappan Lakshmanan  call assert_equal(['Xfile1', 1, 9, 'one two three'],
5383*bb01a1efSYegappan Lakshmanan        \ [bufname(l[0].bufnr), l[0].lnum, l[0].col, l[0].text])
5384*bb01a1efSYegappan Lakshmanan  call assert_equal(['Xfile2', 2, 1, 'three one two'],
5385*bb01a1efSYegappan Lakshmanan        \ [bufname(l[1].bufnr), l[1].lnum, l[1].col, l[1].text])
5386*bb01a1efSYegappan Lakshmanan
5387*bb01a1efSYegappan Lakshmanan  Xvimgrep /the/f Xfile*
5388*bb01a1efSYegappan Lakshmanan  let l = g:Xgetlist()
5389*bb01a1efSYegappan Lakshmanan  call assert_equal(3, len(l))
5390*bb01a1efSYegappan Lakshmanan  call assert_equal(['Xfile1', 1, 9, 'one two three'],
5391*bb01a1efSYegappan Lakshmanan        \ [bufname(l[0].bufnr), l[0].lnum, l[0].col, l[0].text])
5392*bb01a1efSYegappan Lakshmanan  call assert_equal(['Xfile2', 2, 1, 'three one two'],
5393*bb01a1efSYegappan Lakshmanan        \ [bufname(l[1].bufnr), l[1].lnum, l[1].col, l[1].text])
5394*bb01a1efSYegappan Lakshmanan  call assert_equal(['Xfile2', 4, 4, 'aaathreeaaa'],
5395*bb01a1efSYegappan Lakshmanan        \ [bufname(l[2].bufnr), l[2].lnum, l[2].col, l[2].text])
5396*bb01a1efSYegappan Lakshmanan
5397*bb01a1efSYegappan Lakshmanan  Xvimgrep /aaa/fg Xfile*
5398*bb01a1efSYegappan Lakshmanan  let l = g:Xgetlist()
5399*bb01a1efSYegappan Lakshmanan  call assert_equal(4, len(l))
5400*bb01a1efSYegappan Lakshmanan  call assert_equal(['Xfile1', 2, 1, 'aaaaaa'],
5401*bb01a1efSYegappan Lakshmanan        \ [bufname(l[0].bufnr), l[0].lnum, l[0].col, l[0].text])
5402*bb01a1efSYegappan Lakshmanan  call assert_equal(['Xfile1', 2, 4, 'aaaaaa'],
5403*bb01a1efSYegappan Lakshmanan        \ [bufname(l[1].bufnr), l[1].lnum, l[1].col, l[1].text])
5404*bb01a1efSYegappan Lakshmanan  call assert_equal(['Xfile2', 4, 1, 'aaathreeaaa'],
5405*bb01a1efSYegappan Lakshmanan        \ [bufname(l[2].bufnr), l[2].lnum, l[2].col, l[2].text])
5406*bb01a1efSYegappan Lakshmanan  call assert_equal(['Xfile2', 4, 9, 'aaathreeaaa'],
5407*bb01a1efSYegappan Lakshmanan        \ [bufname(l[3].bufnr), l[3].lnum, l[3].col, l[3].text])
5408*bb01a1efSYegappan Lakshmanan
5409*bb01a1efSYegappan Lakshmanan  call assert_fails('Xvimgrep /xyz/fg Xfile*', 'E480:')
5410*bb01a1efSYegappan Lakshmananendfunc
5411*bb01a1efSYegappan Lakshmanan
5412*bb01a1efSYegappan Lakshmananfunc Test_vimgrep_fuzzy_match()
5413*bb01a1efSYegappan Lakshmanan  call writefile(['one two three', 'aaaaaa'], 'Xfile1')
5414*bb01a1efSYegappan Lakshmanan  call writefile(['one', 'three one two', 'two', 'aaathreeaaa'], 'Xfile2')
5415*bb01a1efSYegappan Lakshmanan  call Xvimgrep_fuzzy_match('c')
5416*bb01a1efSYegappan Lakshmanan  call Xvimgrep_fuzzy_match('l')
5417*bb01a1efSYegappan Lakshmanan  call delete('Xfile1')
5418*bb01a1efSYegappan Lakshmanan  call delete('Xfile2')
5419*bb01a1efSYegappan Lakshmananendfunc
5420*bb01a1efSYegappan Lakshmanan
54216a0cc916SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
5422