1eeb1b9c7SBram Moolenaar" Test for the quickfix feature.
2da59dd5dSBram Moolenaar
3b46fecd3SBram Moolenaarsource check.vim
4b46fecd3SBram MoolenaarCheckFeature quickfix
5da59dd5dSBram Moolenaar
6e00fdf35SBram Moolenaarsource screendump.vim
7e00fdf35SBram Moolenaar
87eba3d2cSBram Moolenaarset encoding=utf-8
97eba3d2cSBram Moolenaar
102b946c9fSBram Moolenaarfunc s:setup_commands(cchar)
113ef5bf7dSBram Moolenaar  if a:cchar == 'c'
123ef5bf7dSBram Moolenaar    command! -nargs=* -bang Xlist <mods>clist<bang> <args>
133ef5bf7dSBram Moolenaar    command! -nargs=* Xgetexpr <mods>cgetexpr <args>
14361c8f0eSBram Moolenaar    command! -nargs=* Xaddexpr <mods>caddexpr <args>
1555b69264SBram Moolenaar    command! -nargs=* -count Xolder <mods><count>colder <args>
163ef5bf7dSBram Moolenaar    command! -nargs=* Xnewer <mods>cnewer <args>
173ef5bf7dSBram Moolenaar    command! -nargs=* Xopen <mods> copen <args>
183ef5bf7dSBram Moolenaar    command! -nargs=* Xwindow <mods>cwindow <args>
19537ef084SBram Moolenaar    command! -nargs=* Xbottom <mods>cbottom <args>
203ef5bf7dSBram Moolenaar    command! -nargs=* Xclose <mods>cclose <args>
213ef5bf7dSBram Moolenaar    command! -nargs=* -bang Xfile <mods>cfile<bang> <args>
223ef5bf7dSBram Moolenaar    command! -nargs=* Xgetfile <mods>cgetfile <args>
233ef5bf7dSBram Moolenaar    command! -nargs=* Xaddfile <mods>caddfile <args>
243ef5bf7dSBram Moolenaar    command! -nargs=* -bang Xbuffer <mods>cbuffer<bang> <args>
253ef5bf7dSBram Moolenaar    command! -nargs=* Xgetbuffer <mods>cgetbuffer <args>
263ef5bf7dSBram Moolenaar    command! -nargs=* Xaddbuffer <mods>caddbuffer <args>
273ef5bf7dSBram Moolenaar    command! -nargs=* Xrewind <mods>crewind <args>
2899895eacSBram Moolenaar    command! -count -nargs=* -bang Xnext <mods><count>cnext<bang> <args>
2999895eacSBram Moolenaar    command! -count -nargs=* -bang Xprev <mods><count>cprev<bang> <args>
300fcc7c6dSBram Moolenaar    command! -nargs=* -bang Xfirst <mods>cfirst<bang> <args>
310fcc7c6dSBram Moolenaar    command! -nargs=* -bang Xlast <mods>clast<bang> <args>
3225190db2SBram Moolenaar    command! -count -nargs=* -bang Xnfile <mods><count>cnfile<bang> <args>
330fcc7c6dSBram Moolenaar    command! -nargs=* -bang Xpfile <mods>cpfile<bang> <args>
343ef5bf7dSBram Moolenaar    command! -nargs=* Xexpr <mods>cexpr <args>
35f9ae154cSBram Moolenaar    command! -count -nargs=* Xvimgrep <mods> <count>vimgrep <args>
36ee85df37SBram Moolenaar    command! -nargs=* Xvimgrepadd <mods> vimgrepadd <args>
37049cba9eSBram Moolenaar    command! -nargs=* Xgrep <mods> grep <args>
38049cba9eSBram Moolenaar    command! -nargs=* Xgrepadd <mods> grepadd <args>
39049cba9eSBram Moolenaar    command! -nargs=* Xhelpgrep helpgrep <args>
4074240d3fSBram Moolenaar    command! -nargs=0 -count Xcc <count>cc
413ff33114SBram Moolenaar    command! -count=1 -nargs=0 Xbelow <mods><count>cbelow
423ff33114SBram Moolenaar    command! -count=1 -nargs=0 Xabove <mods><count>cabove
43cf6a55c4SBram Moolenaar    command! -count=1 -nargs=0 Xbefore <mods><count>cbefore
44cf6a55c4SBram Moolenaar    command! -count=1 -nargs=0 Xafter <mods><count>cafter
453ef5bf7dSBram Moolenaar    let g:Xgetlist = function('getqflist')
463ef5bf7dSBram Moolenaar    let g:Xsetlist = function('setqflist')
47b6fa30ccSBram Moolenaar    call setqflist([], 'f')
483ef5bf7dSBram Moolenaar  else
493ef5bf7dSBram Moolenaar    command! -nargs=* -bang Xlist <mods>llist<bang> <args>
503ef5bf7dSBram Moolenaar    command! -nargs=* Xgetexpr <mods>lgetexpr <args>
51361c8f0eSBram Moolenaar    command! -nargs=* Xaddexpr <mods>laddexpr <args>
5255b69264SBram Moolenaar    command! -nargs=* -count Xolder <mods><count>lolder <args>
533ef5bf7dSBram Moolenaar    command! -nargs=* Xnewer <mods>lnewer <args>
543ef5bf7dSBram Moolenaar    command! -nargs=* Xopen <mods> lopen <args>
553ef5bf7dSBram Moolenaar    command! -nargs=* Xwindow <mods>lwindow <args>
56537ef084SBram Moolenaar    command! -nargs=* Xbottom <mods>lbottom <args>
573ef5bf7dSBram Moolenaar    command! -nargs=* Xclose <mods>lclose <args>
583ef5bf7dSBram Moolenaar    command! -nargs=* -bang Xfile <mods>lfile<bang> <args>
593ef5bf7dSBram Moolenaar    command! -nargs=* Xgetfile <mods>lgetfile <args>
603ef5bf7dSBram Moolenaar    command! -nargs=* Xaddfile <mods>laddfile <args>
613ef5bf7dSBram Moolenaar    command! -nargs=* -bang Xbuffer <mods>lbuffer<bang> <args>
623ef5bf7dSBram Moolenaar    command! -nargs=* Xgetbuffer <mods>lgetbuffer <args>
633ef5bf7dSBram Moolenaar    command! -nargs=* Xaddbuffer <mods>laddbuffer <args>
643ef5bf7dSBram Moolenaar    command! -nargs=* Xrewind <mods>lrewind <args>
6599895eacSBram Moolenaar    command! -count -nargs=* -bang Xnext <mods><count>lnext<bang> <args>
6699895eacSBram Moolenaar    command! -count -nargs=* -bang Xprev <mods><count>lprev<bang> <args>
670fcc7c6dSBram Moolenaar    command! -nargs=* -bang Xfirst <mods>lfirst<bang> <args>
680fcc7c6dSBram Moolenaar    command! -nargs=* -bang Xlast <mods>llast<bang> <args>
6925190db2SBram Moolenaar    command! -count -nargs=* -bang Xnfile <mods><count>lnfile<bang> <args>
700fcc7c6dSBram Moolenaar    command! -nargs=* -bang Xpfile <mods>lpfile<bang> <args>
713ef5bf7dSBram Moolenaar    command! -nargs=* Xexpr <mods>lexpr <args>
72f9ae154cSBram Moolenaar    command! -count -nargs=* Xvimgrep <mods> <count>lvimgrep <args>
73ee85df37SBram Moolenaar    command! -nargs=* Xvimgrepadd <mods> lvimgrepadd <args>
74049cba9eSBram Moolenaar    command! -nargs=* Xgrep <mods> lgrep <args>
75049cba9eSBram Moolenaar    command! -nargs=* Xgrepadd <mods> lgrepadd <args>
76049cba9eSBram Moolenaar    command! -nargs=* Xhelpgrep lhelpgrep <args>
7774240d3fSBram Moolenaar    command! -nargs=0 -count Xcc <count>ll
783ff33114SBram Moolenaar    command! -count=1 -nargs=0 Xbelow <mods><count>lbelow
793ff33114SBram Moolenaar    command! -count=1 -nargs=0 Xabove <mods><count>labove
80cf6a55c4SBram Moolenaar    command! -count=1 -nargs=0 Xbefore <mods><count>lbefore
81cf6a55c4SBram Moolenaar    command! -count=1 -nargs=0 Xafter <mods><count>lafter
823ef5bf7dSBram Moolenaar    let g:Xgetlist = function('getloclist', [0])
833ef5bf7dSBram Moolenaar    let g:Xsetlist = function('setloclist', [0])
84b6fa30ccSBram Moolenaar    call setloclist(0, [], 'f')
853ef5bf7dSBram Moolenaar  endif
862b946c9fSBram Moolenaarendfunc
873ef5bf7dSBram Moolenaar
88da59dd5dSBram Moolenaar" Tests for the :clist and :llist commands
892b946c9fSBram Moolenaarfunc XlistTests(cchar)
903ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
91da59dd5dSBram Moolenaar
92b6fa30ccSBram Moolenaar  if a:cchar == 'l'
93b6fa30ccSBram Moolenaar      call assert_fails('llist', 'E776:')
94b6fa30ccSBram Moolenaar  endif
95da59dd5dSBram Moolenaar  " With an empty list, command should return error
963ef5bf7dSBram Moolenaar  Xgetexpr []
973ef5bf7dSBram Moolenaar  silent! Xlist
98da59dd5dSBram Moolenaar  call assert_true(v:errmsg ==# 'E42: No Errors')
99da59dd5dSBram Moolenaar
100da59dd5dSBram Moolenaar  " Populate the list and then try
1013ef5bf7dSBram Moolenaar  Xgetexpr ['non-error 1', 'Xtestfile1:1:3:Line1',
102da59dd5dSBram Moolenaar		  \ 'non-error 2', 'Xtestfile2:2:2:Line2',
10388a3e2b2SBram Moolenaar		  \ 'non-error| 3', 'Xtestfile3:3:1:Line3']
104da59dd5dSBram Moolenaar
105da59dd5dSBram Moolenaar  " List only valid entries
106ee85df37SBram Moolenaar  let l = split(execute('Xlist', ''), "\n")
107da59dd5dSBram Moolenaar  call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
108da59dd5dSBram Moolenaar		   \ ' 4 Xtestfile2:2 col 2: Line2',
109da59dd5dSBram Moolenaar		   \ ' 6 Xtestfile3:3 col 1: Line3'], l)
110da59dd5dSBram Moolenaar
111da59dd5dSBram Moolenaar  " List all the entries
112ee85df37SBram Moolenaar  let l = split(execute('Xlist!', ''), "\n")
113da59dd5dSBram Moolenaar  call assert_equal([' 1: non-error 1', ' 2 Xtestfile1:1 col 3: Line1',
114da59dd5dSBram Moolenaar		   \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2',
11588a3e2b2SBram Moolenaar		   \ ' 5: non-error| 3', ' 6 Xtestfile3:3 col 1: Line3'], l)
116da59dd5dSBram Moolenaar
117da59dd5dSBram Moolenaar  " List a range of errors
118ee85df37SBram Moolenaar  let l = split(execute('Xlist 3,6', ''), "\n")
119da59dd5dSBram Moolenaar  call assert_equal([' 4 Xtestfile2:2 col 2: Line2',
120da59dd5dSBram Moolenaar		   \ ' 6 Xtestfile3:3 col 1: Line3'], l)
121da59dd5dSBram Moolenaar
122ee85df37SBram Moolenaar  let l = split(execute('Xlist! 3,4', ''), "\n")
123da59dd5dSBram Moolenaar  call assert_equal([' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
124da59dd5dSBram Moolenaar
125ee85df37SBram Moolenaar  let l = split(execute('Xlist -6,-4', ''), "\n")
126da59dd5dSBram Moolenaar  call assert_equal([' 2 Xtestfile1:1 col 3: Line1'], l)
127da59dd5dSBram Moolenaar
128ee85df37SBram Moolenaar  let l = split(execute('Xlist! -5,-3', ''), "\n")
129da59dd5dSBram Moolenaar  call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
130da59dd5dSBram Moolenaar		   \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
131391b1dd0SBram Moolenaar
132391b1dd0SBram Moolenaar  " Test for '+'
133ee85df37SBram Moolenaar  let l = split(execute('Xlist! +2', ''), "\n")
134391b1dd0SBram Moolenaar  call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
135391b1dd0SBram Moolenaar		   \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
136ee85df37SBram Moolenaar
137ee85df37SBram Moolenaar  " Different types of errors
138ee85df37SBram Moolenaar  call g:Xsetlist([{'lnum':10,'col':5,'type':'W', 'text':'Warning','nr':11},
139ee85df37SBram Moolenaar	      \ {'lnum':20,'col':10,'type':'e','text':'Error','nr':22},
140ee85df37SBram Moolenaar	      \ {'lnum':30,'col':15,'type':'i','text':'Info','nr':33},
141ee85df37SBram Moolenaar	      \ {'lnum':40,'col':20,'type':'x', 'text':'Other','nr':44},
142ee85df37SBram Moolenaar	      \ {'lnum':50,'col':25,'type':"\<C-A>",'text':'one','nr':55}])
143ee85df37SBram Moolenaar  let l = split(execute('Xlist', ""), "\n")
144ee85df37SBram Moolenaar  call assert_equal([' 1:10 col 5 warning  11: Warning',
145ee85df37SBram Moolenaar	      \ ' 2:20 col 10 error  22: Error',
146ee85df37SBram Moolenaar	      \ ' 3:30 col 15 info  33: Info',
147ee85df37SBram Moolenaar	      \ ' 4:40 col 20 x  44: Other',
148ee85df37SBram Moolenaar	      \ ' 5:50 col 25  55: one'], l)
149ee85df37SBram Moolenaar
150d76ce852SBram Moolenaar  " Test for module names, one needs to explicitly set `'valid':v:true` so
151d76ce852SBram Moolenaar  call g:Xsetlist([
152d76ce852SBram Moolenaar	\ {'lnum':10,'col':5,'type':'W','module':'Data.Text','text':'ModuleWarning','nr':11,'valid':v:true},
153d76ce852SBram Moolenaar	\ {'lnum':20,'col':10,'type':'W','module':'Data.Text','filename':'Data/Text.hs','text':'ModuleWarning','nr':22,'valid':v:true},
154d76ce852SBram Moolenaar	\ {'lnum':30,'col':15,'type':'W','filename':'Data/Text.hs','text':'FileWarning','nr':33,'valid':v:true}])
155d76ce852SBram Moolenaar  let l = split(execute('Xlist', ""), "\n")
156d76ce852SBram Moolenaar  call assert_equal([' 1 Data.Text:10 col 5 warning  11: ModuleWarning',
157d76ce852SBram Moolenaar	\ ' 2 Data.Text:20 col 10 warning  22: ModuleWarning',
158d76ce852SBram Moolenaar	\ ' 3 Data/Text.hs:30 col 15 warning  33: FileWarning'], l)
159d76ce852SBram Moolenaar
160f9ae154cSBram Moolenaar  " For help entries in the quickfix list, only the filename without directory
161f9ae154cSBram Moolenaar  " should be displayed
162f9ae154cSBram Moolenaar  Xhelpgrep setqflist()
163f9ae154cSBram Moolenaar  let l = split(execute('Xlist 1', ''), "\n")
164f9ae154cSBram Moolenaar  call assert_match('^ 1 [^\\/]\{-}:', l[0])
165f9ae154cSBram Moolenaar
166ee85df37SBram Moolenaar  " Error cases
167ee85df37SBram Moolenaar  call assert_fails('Xlist abc', 'E488:')
1682b946c9fSBram Moolenaarendfunc
169da59dd5dSBram Moolenaar
1702b946c9fSBram Moolenaarfunc Test_clist()
171da59dd5dSBram Moolenaar  call XlistTests('c')
172da59dd5dSBram Moolenaar  call XlistTests('l')
1732b946c9fSBram Moolenaarendfunc
174da59dd5dSBram Moolenaar
175da59dd5dSBram Moolenaar" Tests for the :colder, :cnewer, :lolder and :lnewer commands
176da59dd5dSBram Moolenaar" Note that this test assumes that a quickfix/location list is
177cfc0a350SBram Moolenaar" already set by the caller.
1782b946c9fSBram Moolenaarfunc XageTests(cchar)
1793ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
180da59dd5dSBram Moolenaar
18187f59b09SBram Moolenaar  if a:cchar == 'l'
18287f59b09SBram Moolenaar    " No location list for the current window
18387f59b09SBram Moolenaar    call assert_fails('lolder', 'E776:')
18487f59b09SBram Moolenaar    call assert_fails('lnewer', 'E776:')
18587f59b09SBram Moolenaar  endif
18687f59b09SBram Moolenaar
187cf1ba35fSBram Moolenaar  let list = [{'bufnr': bufnr('%'), 'lnum': 1}]
188b6fa30ccSBram Moolenaar  call g:Xsetlist(list)
189b6fa30ccSBram Moolenaar
190da59dd5dSBram Moolenaar  " Jumping to a non existent list should return error
1913ef5bf7dSBram Moolenaar  silent! Xolder 99
192da59dd5dSBram Moolenaar  call assert_true(v:errmsg ==# 'E380: At bottom of quickfix stack')
193da59dd5dSBram Moolenaar
1943ef5bf7dSBram Moolenaar  silent! Xnewer 99
195da59dd5dSBram Moolenaar  call assert_true(v:errmsg ==# 'E381: At top of quickfix stack')
196da59dd5dSBram Moolenaar
197da59dd5dSBram Moolenaar  " Add three quickfix/location lists
1983ef5bf7dSBram Moolenaar  Xgetexpr ['Xtestfile1:1:3:Line1']
1993ef5bf7dSBram Moolenaar  Xgetexpr ['Xtestfile2:2:2:Line2']
2003ef5bf7dSBram Moolenaar  Xgetexpr ['Xtestfile3:3:1:Line3']
201da59dd5dSBram Moolenaar
202da59dd5dSBram Moolenaar  " Go back two lists
2033ef5bf7dSBram Moolenaar  Xolder
2043ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
205da59dd5dSBram Moolenaar  call assert_equal('Line2', l[0].text)
206da59dd5dSBram Moolenaar
207da59dd5dSBram Moolenaar  " Go forward two lists
2083ef5bf7dSBram Moolenaar  Xnewer
2093ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
210da59dd5dSBram Moolenaar  call assert_equal('Line3', l[0].text)
211da59dd5dSBram Moolenaar
212da59dd5dSBram Moolenaar  " Test for the optional count argument
2133ef5bf7dSBram Moolenaar  Xolder 2
2143ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
215da59dd5dSBram Moolenaar  call assert_equal('Line1', l[0].text)
216da59dd5dSBram Moolenaar
2173ef5bf7dSBram Moolenaar  Xnewer 2
2183ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
219da59dd5dSBram Moolenaar  call assert_equal('Line3', l[0].text)
2202b946c9fSBram Moolenaarendfunc
221da59dd5dSBram Moolenaar
2222b946c9fSBram Moolenaarfunc Test_cage()
223da59dd5dSBram Moolenaar  call XageTests('c')
224da59dd5dSBram Moolenaar  call XageTests('l')
2252b946c9fSBram Moolenaarendfunc
226da59dd5dSBram Moolenaar
227da59dd5dSBram Moolenaar" Tests for the :cwindow, :lwindow :cclose, :lclose, :copen and :lopen
228da59dd5dSBram Moolenaar" commands
2292b946c9fSBram Moolenaarfunc XwindowTests(cchar)
2303ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
231da59dd5dSBram Moolenaar
232b6fa30ccSBram Moolenaar  " Opening the location list window without any errors should fail
233b6fa30ccSBram Moolenaar  if a:cchar == 'l'
234b6fa30ccSBram Moolenaar      call assert_fails('lopen', 'E776:')
235b6fa30ccSBram Moolenaar  endif
236b6fa30ccSBram Moolenaar
237da59dd5dSBram Moolenaar  " Create a list with no valid entries
2383ef5bf7dSBram Moolenaar  Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
239da59dd5dSBram Moolenaar
240da59dd5dSBram Moolenaar  " Quickfix/Location window should not open with no valid errors
2413ef5bf7dSBram Moolenaar  Xwindow
242da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 1)
243da59dd5dSBram Moolenaar
244da59dd5dSBram Moolenaar  " Create a list with valid entries
2453ef5bf7dSBram Moolenaar  Xgetexpr ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2',
2463ef5bf7dSBram Moolenaar		  \ 'Xtestfile3:3:1:Line3']
247da59dd5dSBram Moolenaar
248da59dd5dSBram Moolenaar  " Open the window
2493ef5bf7dSBram Moolenaar  Xwindow
250da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 2 && winnr() == 2 &&
251da59dd5dSBram Moolenaar	\ getline('.') ==# 'Xtestfile1|1 col 3| Line1')
252537ef084SBram Moolenaar  redraw!
253da59dd5dSBram Moolenaar
254da59dd5dSBram Moolenaar  " Close the window
2553ef5bf7dSBram Moolenaar  Xclose
256da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 1)
257da59dd5dSBram Moolenaar
258da59dd5dSBram Moolenaar  " Create a list with no valid entries
2593ef5bf7dSBram Moolenaar  Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
260da59dd5dSBram Moolenaar
261da59dd5dSBram Moolenaar  " Open the window
2623ef5bf7dSBram Moolenaar  Xopen 5
263da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 2 && getline('.') ==# '|| non-error 1'
264da59dd5dSBram Moolenaar		      \  && winheight('.') == 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 &&
270da59dd5dSBram Moolenaar	\ winheight('.') == 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
362049cba9eSBram 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:')
5050fcc7c6dSBram Moolenaar  call assert_fails('Xprev', 'E553')
5060fcc7c6dSBram 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('.'))
5290fcc7c6dSBram Moolenaar  call assert_fails('Xnext', 'E553')
5300fcc7c6dSBram Moolenaar  call assert_fails('Xnfile', 'E553')
531f9ae154cSBram Moolenaar  " To process the range using quickfix list entries, directly use the
532f9ae154cSBram Moolenaar  " quickfix commands (don't use the user defined commands)
533f9ae154cSBram Moolenaar  if a:cchar == 'c'
534f9ae154cSBram Moolenaar    $cc
535f9ae154cSBram Moolenaar  else
536f9ae154cSBram Moolenaar    $ll
537f9ae154cSBram Moolenaar  endif
538f9ae154cSBram Moolenaar  call assert_equal(6, g:Xgetlist({'idx':0}).idx)
5390fcc7c6dSBram Moolenaar  Xrewind
540bdd2c290SBram Moolenaar  call assert_equal('Xqftestfile1', @%)
5410fcc7c6dSBram Moolenaar  call assert_equal(5, line('.'))
5420fcc7c6dSBram Moolenaar
54399895eacSBram Moolenaar  10Xnext
544bdd2c290SBram Moolenaar  call assert_equal('Xqftestfile2', @%)
54599895eacSBram Moolenaar  call assert_equal(11, line('.'))
54699895eacSBram Moolenaar  10Xprev
547bdd2c290SBram Moolenaar  call assert_equal('Xqftestfile1', @%)
54899895eacSBram Moolenaar  call assert_equal(5, line('.'))
54999895eacSBram Moolenaar
55074240d3fSBram Moolenaar  " Jumping to an error from the error window using cc command
55174240d3fSBram Moolenaar  Xgetexpr ['Xqftestfile1:5:Line5',
55274240d3fSBram Moolenaar		\ 'Xqftestfile1:6:Line6',
55374240d3fSBram Moolenaar		\ 'Xqftestfile2:10:Line10',
55474240d3fSBram Moolenaar		\ 'Xqftestfile2:11:Line11']
55574240d3fSBram Moolenaar  Xopen
55674240d3fSBram Moolenaar  10Xcc
55774240d3fSBram Moolenaar  call assert_equal(11, line('.'))
558bdd2c290SBram Moolenaar  call assert_equal('Xqftestfile2', @%)
559f0cee197SBram Moolenaar  Xopen
560f0cee197SBram Moolenaar  call cursor(2, 1)
561f0cee197SBram Moolenaar  if a:cchar == 'c'
562f0cee197SBram Moolenaar    .cc
563f0cee197SBram Moolenaar  else
564f0cee197SBram Moolenaar    .ll
565f0cee197SBram Moolenaar  endif
566f0cee197SBram Moolenaar  call assert_equal(6, line('.'))
567bdd2c290SBram Moolenaar  call assert_equal('Xqftestfile1', @%)
56874240d3fSBram Moolenaar
56974240d3fSBram Moolenaar  " Jumping to an error from the error window (when only the error window is
57074240d3fSBram Moolenaar  " present)
57174240d3fSBram Moolenaar  Xopen | only
57274240d3fSBram Moolenaar  Xlast 1
57374240d3fSBram Moolenaar  call assert_equal(5, line('.'))
574bdd2c290SBram Moolenaar  call assert_equal('Xqftestfile1', @%)
57574240d3fSBram Moolenaar
576ee85df37SBram Moolenaar  Xexpr ""
577ee85df37SBram Moolenaar  call assert_fails('Xnext', 'E42:')
578ee85df37SBram Moolenaar
5790fcc7c6dSBram Moolenaar  call delete('Xqftestfile1')
5800fcc7c6dSBram Moolenaar  call delete('Xqftestfile2')
581fc2b270cSBram Moolenaar
582fc2b270cSBram Moolenaar  " Should be able to use next/prev with invalid entries
583fc2b270cSBram Moolenaar  Xexpr ""
584fc2b270cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
585fc2b270cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'size' : 0}).size)
58688a3e2b2SBram Moolenaar  Xaddexpr ['foo', 'bar', 'baz', 'quux', 'sh|moo']
587fc2b270cSBram Moolenaar  call assert_equal(5, g:Xgetlist({'size' : 0}).size)
588fc2b270cSBram Moolenaar  Xlast
589fc2b270cSBram Moolenaar  call assert_equal(5, g:Xgetlist({'idx' : 0}).idx)
590fc2b270cSBram Moolenaar  Xfirst
591fc2b270cSBram Moolenaar  call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
592fc2b270cSBram Moolenaar  2Xnext
593fc2b270cSBram Moolenaar  call assert_equal(3, g:Xgetlist({'idx' : 0}).idx)
5942b946c9fSBram Moolenaarendfunc
5950fcc7c6dSBram Moolenaar
5962b946c9fSBram Moolenaarfunc Test_browse()
5970fcc7c6dSBram Moolenaar  call Xtest_browse('c')
5980fcc7c6dSBram Moolenaar  call Xtest_browse('l')
5992b946c9fSBram Moolenaarendfunc
6000fcc7c6dSBram Moolenaar
6012b946c9fSBram Moolenaarfunc Test_nomem()
6028e8df251SBram Moolenaar  call test_alloc_fail(GetAllocId('qf_dirname_start'), 0, 0)
603a260b87dSBram Moolenaar  call assert_fails('vimgrep vim runtest.vim', 'E342:')
60475bdf6aaSBram Moolenaar
605ce90e36fSBram Moolenaar  call GetAllocId('qf_dirname_now')->test_alloc_fail(0, 0)
606a260b87dSBram Moolenaar  call assert_fails('vimgrep vim runtest.vim', 'E342:')
60775bdf6aaSBram Moolenaar
6088e8df251SBram Moolenaar  call test_alloc_fail(GetAllocId('qf_namebuf'), 0, 0)
609a260b87dSBram Moolenaar  call assert_fails('cfile runtest.vim', 'E342:')
61075bdf6aaSBram Moolenaar
6118e8df251SBram Moolenaar  call test_alloc_fail(GetAllocId('qf_errmsg'), 0, 0)
612a260b87dSBram Moolenaar  call assert_fails('cfile runtest.vim', 'E342:')
61375bdf6aaSBram Moolenaar
6148e8df251SBram Moolenaar  call test_alloc_fail(GetAllocId('qf_pattern'), 0, 0)
615a260b87dSBram Moolenaar  call assert_fails('cfile runtest.vim', 'E342:')
61675bdf6aaSBram Moolenaar
61775bdf6aaSBram Moolenaarendfunc
61875bdf6aaSBram Moolenaar
6192b946c9fSBram Moolenaarfunc s:test_xhelpgrep(cchar)
620049cba9eSBram Moolenaar  call s:setup_commands(a:cchar)
621049cba9eSBram Moolenaar  Xhelpgrep quickfix
622049cba9eSBram Moolenaar  Xopen
623049cba9eSBram Moolenaar  if a:cchar == 'c'
624049cba9eSBram Moolenaar    let title_text = ':helpgrep quickfix'
625049cba9eSBram Moolenaar  else
626049cba9eSBram Moolenaar    let title_text = ':lhelpgrep quickfix'
627049cba9eSBram Moolenaar  endif
628049cba9eSBram Moolenaar  call assert_true(w:quickfix_title =~ title_text, w:quickfix_title)
62999895eacSBram Moolenaar
63099895eacSBram Moolenaar  " Jumping to a help topic should open the help window
63199895eacSBram Moolenaar  only
63299895eacSBram Moolenaar  Xnext
63399895eacSBram Moolenaar  call assert_true(&buftype == 'help')
63499895eacSBram Moolenaar  call assert_true(winnr('$') == 2)
63599895eacSBram Moolenaar  " Jumping to the next match should reuse the help window
63699895eacSBram Moolenaar  Xnext
63799895eacSBram Moolenaar  call assert_true(&buftype == 'help')
63899895eacSBram Moolenaar  call assert_true(winnr() == 1)
63999895eacSBram Moolenaar  call assert_true(winnr('$') == 2)
64099895eacSBram Moolenaar  " Jumping to the next match from the quickfix window should reuse the help
64199895eacSBram Moolenaar  " window
64299895eacSBram Moolenaar  Xopen
64399895eacSBram Moolenaar  Xnext
64499895eacSBram Moolenaar  call assert_true(&buftype == 'help')
64599895eacSBram Moolenaar  call assert_true(winnr() == 1)
64699895eacSBram Moolenaar  call assert_true(winnr('$') == 2)
64799895eacSBram Moolenaar
64862ef7974SBram Moolenaar  " This wipes out the buffer, make sure that doesn't cause trouble.
649049cba9eSBram Moolenaar  Xclose
650ee85df37SBram Moolenaar
651f9ae154cSBram Moolenaar  " When the current window is vertically split, jumping to a help match
652f9ae154cSBram Moolenaar  " should open the help window at the top.
653f9ae154cSBram Moolenaar  only | enew
654f9ae154cSBram Moolenaar  let w1 = win_getid()
655f9ae154cSBram Moolenaar  vert new
656f9ae154cSBram Moolenaar  let w2 = win_getid()
657f9ae154cSBram Moolenaar  Xnext
658f9ae154cSBram Moolenaar  let w3 = win_getid()
659f9ae154cSBram Moolenaar  call assert_true(&buftype == 'help')
660f9ae154cSBram Moolenaar  call assert_true(winnr() == 1)
661a106e6cdSBram Moolenaar  " See jump_to_help_window() for details
662a106e6cdSBram Moolenaar  let w2_width = winwidth(w2)
663a106e6cdSBram Moolenaar  if w2_width != &columns && w2_width < 80
664a106e6cdSBram Moolenaar    call assert_equal(['col', [['leaf', w3],
665a106e6cdSBram Moolenaar          \ ['row', [['leaf', w2], ['leaf', w1]]]]], winlayout())
666a106e6cdSBram Moolenaar  else
667a106e6cdSBram Moolenaar    call assert_equal(['row', [['col', [['leaf', w3], ['leaf', w2]]],
668a106e6cdSBram Moolenaar          \ ['leaf', w1]]] , winlayout())
669a106e6cdSBram Moolenaar  endif
670f9ae154cSBram Moolenaar
671f9ae154cSBram Moolenaar  new | only
672f9ae154cSBram Moolenaar  set buftype=help
673f9ae154cSBram Moolenaar  set modified
674f9ae154cSBram Moolenaar  call assert_fails('Xnext', 'E37:')
675f9ae154cSBram Moolenaar  set nomodified
676f9ae154cSBram Moolenaar  new | only
677f9ae154cSBram Moolenaar
678b4d5fbabSBram Moolenaar  if a:cchar == 'l'
679b4d5fbabSBram Moolenaar      " When a help window is present, running :lhelpgrep should reuse the
680b4d5fbabSBram Moolenaar      " help window and not the current window
681b4d5fbabSBram Moolenaar      new | only
682b4d5fbabSBram Moolenaar      call g:Xsetlist([], 'f')
683b4d5fbabSBram Moolenaar      help index.txt
684b4d5fbabSBram Moolenaar      wincmd w
685b4d5fbabSBram Moolenaar      lhelpgrep quickfix
686b4d5fbabSBram Moolenaar      call assert_equal(1, winnr())
687b4d5fbabSBram Moolenaar      call assert_notequal([], getloclist(1))
688b4d5fbabSBram Moolenaar      call assert_equal([], getloclist(2))
689b4d5fbabSBram Moolenaar  endif
690b4d5fbabSBram Moolenaar
69199895eacSBram Moolenaar  new | only
69299895eacSBram Moolenaar
693ee85df37SBram Moolenaar  " Search for non existing help string
694ee85df37SBram Moolenaar  call assert_fails('Xhelpgrep a1b2c3', 'E480:')
695108e7b42SBram Moolenaar  " Invalid regular expression
6969b7bf9e9SBram Moolenaar  call assert_fails('Xhelpgrep \@<!', 'E866:')
6972b946c9fSBram Moolenaarendfunc
698049cba9eSBram Moolenaar
6992b946c9fSBram Moolenaarfunc Test_helpgrep()
700049cba9eSBram Moolenaar  call s:test_xhelpgrep('c')
701cf25fdb8SBram Moolenaar  helpclose
702049cba9eSBram Moolenaar  call s:test_xhelpgrep('l')
70362ef7974SBram Moolenaarendfunc
70475bdf6aaSBram Moolenaar
7056920c72dSBram Moolenaarfunc Test_errortitle()
7066920c72dSBram Moolenaar  augroup QfBufWinEnter
7076920c72dSBram Moolenaar    au!
7086920c72dSBram Moolenaar    au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
7096920c72dSBram Moolenaar  augroup END
7106920c72dSBram Moolenaar  copen
7116920c72dSBram Moolenaar  let a=[{'lnum': 308, 'bufnr': bufnr(''), 'col': 58, 'valid': 1, 'vcol': 0, 'nr': 0, 'type': '', 'pattern': '', 'text': '    au BufWinEnter * :let g:a=get(w:, ''quickfix_title'', ''NONE'')'}]
7126920c72dSBram Moolenaar  call setqflist(a)
7136920c72dSBram Moolenaar  call assert_equal(':setqflist()', g:a)
7146920c72dSBram Moolenaar  augroup QfBufWinEnter
7156920c72dSBram Moolenaar    au!
7166920c72dSBram Moolenaar  augroup END
7176920c72dSBram Moolenaar  augroup! QfBufWinEnter
7186920c72dSBram Moolenaarendfunc
719e27dba49SBram Moolenaar
7205584df65SBram Moolenaarfunc Test_vimgreptitle()
7215584df65SBram Moolenaar  augroup QfBufWinEnter
7225584df65SBram Moolenaar    au!
7235584df65SBram Moolenaar    au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
7245584df65SBram Moolenaar  augroup END
7255584df65SBram Moolenaar  try
7265584df65SBram Moolenaar    vimgrep /pattern/j file
7275584df65SBram Moolenaar  catch /E480/
7285584df65SBram Moolenaar  endtry
7295584df65SBram Moolenaar  copen
7305584df65SBram Moolenaar  call assert_equal(':    vimgrep /pattern/j file', g:a)
7315584df65SBram Moolenaar  augroup QfBufWinEnter
7325584df65SBram Moolenaar    au!
7335584df65SBram Moolenaar  augroup END
7345584df65SBram Moolenaar  augroup! QfBufWinEnter
7355584df65SBram Moolenaarendfunc
7365584df65SBram Moolenaar
7372b946c9fSBram Moolenaarfunc XqfTitleTests(cchar)
7383ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
739e27dba49SBram Moolenaar
7403ef5bf7dSBram Moolenaar  Xgetexpr ['file:1:1:message']
7413ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
742e27dba49SBram Moolenaar  if a:cchar == 'c'
743e27dba49SBram Moolenaar    call setqflist(l, 'r')
744e27dba49SBram Moolenaar  else
745e27dba49SBram Moolenaar    call setloclist(0, l, 'r')
746e27dba49SBram Moolenaar  endif
747e27dba49SBram Moolenaar
7483ef5bf7dSBram Moolenaar  Xopen
749e27dba49SBram Moolenaar  if a:cchar == 'c'
750e27dba49SBram Moolenaar    let title = ':setqflist()'
751e27dba49SBram Moolenaar  else
752e27dba49SBram Moolenaar    let title = ':setloclist()'
753e27dba49SBram Moolenaar  endif
754e27dba49SBram Moolenaar  call assert_equal(title, w:quickfix_title)
7553ef5bf7dSBram Moolenaar  Xclose
7562b946c9fSBram Moolenaarendfunc
757e27dba49SBram Moolenaar
758e27dba49SBram Moolenaar" Tests for quickfix window's title
7592b946c9fSBram Moolenaarfunc Test_qf_title()
760e27dba49SBram Moolenaar  call XqfTitleTests('c')
761e27dba49SBram Moolenaar  call XqfTitleTests('l')
7622b946c9fSBram Moolenaarendfunc
763e27dba49SBram Moolenaar
764e27dba49SBram Moolenaar" Tests for 'errorformat'
7652b946c9fSBram Moolenaarfunc Test_efm()
766e27dba49SBram Moolenaar  let save_efm = &efm
767e27dba49SBram Moolenaar  set efm=%EEEE%m,%WWWW%m,%+CCCC%.%#,%-GGGG%.%#
768e27dba49SBram Moolenaar  cgetexpr ['WWWW', 'EEEE', 'CCCC']
769e27dba49SBram Moolenaar  let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
770e27dba49SBram Moolenaar  call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
771e27dba49SBram Moolenaar  cgetexpr ['WWWW', 'GGGG', 'EEEE', 'CCCC']
772e27dba49SBram Moolenaar  let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
773e27dba49SBram Moolenaar  call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
774e27dba49SBram Moolenaar  cgetexpr ['WWWW', 'GGGG', 'ZZZZ', 'EEEE', 'CCCC', 'YYYY']
775e27dba49SBram Moolenaar  let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
776e27dba49SBram Moolenaar  call assert_equal("[['W', 1], ['ZZZZ', 0], ['E^@CCCC', 1], ['YYYY', 0]]", l)
777e27dba49SBram Moolenaar  let &efm = save_efm
7782b946c9fSBram Moolenaarendfunc
7791ff2b64bSBram Moolenaar
7801ff2b64bSBram Moolenaar" This will test for problems in quickfix:
7811ff2b64bSBram Moolenaar" A. incorrectly copying location lists which caused the location list to show
7821ff2b64bSBram Moolenaar"    a different name than the file that was actually being displayed.
7831ff2b64bSBram Moolenaar" B. not reusing the window for which the location list window is opened but
7841ff2b64bSBram Moolenaar"    instead creating new windows.
7851ff2b64bSBram Moolenaar" C. make sure that the location list window is not reused instead of the
7861ff2b64bSBram Moolenaar"    window it belongs to.
7871ff2b64bSBram Moolenaar"
7881ff2b64bSBram Moolenaar" Set up the test environment:
7892b946c9fSBram Moolenaarfunc ReadTestProtocol(name)
7901ff2b64bSBram Moolenaar  let base = substitute(a:name, '\v^test://(.*)%(\.[^.]+)?', '\1', '')
7911ff2b64bSBram Moolenaar  let word = substitute(base, '\v(.*)\..*', '\1', '')
7921ff2b64bSBram Moolenaar
7931ff2b64bSBram Moolenaar  setl modifiable
7941ff2b64bSBram Moolenaar  setl noreadonly
7951ff2b64bSBram Moolenaar  setl noswapfile
7961ff2b64bSBram Moolenaar  setl bufhidden=delete
7971ff2b64bSBram Moolenaar  %del _
7981ff2b64bSBram Moolenaar  " For problem 2:
7991ff2b64bSBram Moolenaar  " 'buftype' has to be set to reproduce the constant opening of new windows
8001ff2b64bSBram Moolenaar  setl buftype=nofile
8011ff2b64bSBram Moolenaar
8021ff2b64bSBram Moolenaar  call setline(1, word)
8031ff2b64bSBram Moolenaar
8041ff2b64bSBram Moolenaar  setl nomodified
8051ff2b64bSBram Moolenaar  setl nomodifiable
8061ff2b64bSBram Moolenaar  setl readonly
8071ff2b64bSBram Moolenaar  exe 'doautocmd BufRead ' . substitute(a:name, '\v^test://(.*)', '\1', '')
8082b946c9fSBram Moolenaarendfunc
8091ff2b64bSBram Moolenaar
8102b946c9fSBram Moolenaarfunc Test_locationlist()
8111ff2b64bSBram Moolenaar    enew
8121ff2b64bSBram Moolenaar
8131ff2b64bSBram Moolenaar    augroup testgroup
8141ff2b64bSBram Moolenaar      au!
8151ff2b64bSBram Moolenaar      autocmd BufReadCmd test://* call ReadTestProtocol(expand("<amatch>"))
8161ff2b64bSBram Moolenaar    augroup END
8171ff2b64bSBram Moolenaar
8181ff2b64bSBram Moolenaar    let words = [ "foo", "bar", "baz", "quux", "shmoo", "spam", "eggs" ]
8191ff2b64bSBram Moolenaar
8201ff2b64bSBram Moolenaar    let qflist = []
8211ff2b64bSBram Moolenaar    for word in words
8221ff2b64bSBram Moolenaar      call add(qflist, {'filename': 'test://' . word . '.txt', 'text': 'file ' . word . '.txt', })
8231ff2b64bSBram Moolenaar      " NOTE: problem 1:
8241ff2b64bSBram Moolenaar      " intentionally not setting 'lnum' so that the quickfix entries are not
8251ff2b64bSBram Moolenaar      " valid
826aad222c9SBram Moolenaar      eval qflist->setloclist(0, ' ')
8271ff2b64bSBram Moolenaar    endfor
8281ff2b64bSBram Moolenaar
8291ff2b64bSBram Moolenaar    " Test A
8301ff2b64bSBram Moolenaar    lrewind
8311ff2b64bSBram Moolenaar    enew
8321ff2b64bSBram Moolenaar    lopen
83399895eacSBram Moolenaar    4lnext
8341ff2b64bSBram Moolenaar    vert split
8351ff2b64bSBram Moolenaar    wincmd L
8361ff2b64bSBram Moolenaar    lopen
8371ff2b64bSBram Moolenaar    wincmd p
8381ff2b64bSBram Moolenaar    lnext
8391ff2b64bSBram Moolenaar    let fileName = expand("%")
8401ff2b64bSBram Moolenaar    wincmd p
8411ff2b64bSBram Moolenaar    let locationListFileName = substitute(getline(line('.')), '\([^|]*\)|.*', '\1', '')
8421ff2b64bSBram Moolenaar    let fileName = substitute(fileName, '\\', '/', 'g')
8431ff2b64bSBram Moolenaar    let locationListFileName = substitute(locationListFileName, '\\', '/', 'g')
8441ff2b64bSBram Moolenaar    call assert_equal("test://bar.txt", fileName)
8451ff2b64bSBram Moolenaar    call assert_equal("test://bar.txt", locationListFileName)
8461ff2b64bSBram Moolenaar
8471ff2b64bSBram Moolenaar    wincmd n | only
8481ff2b64bSBram Moolenaar
8491ff2b64bSBram Moolenaar    " Test B:
8501ff2b64bSBram Moolenaar    lrewind
8511ff2b64bSBram Moolenaar    lopen
8521ff2b64bSBram Moolenaar    2
8531ff2b64bSBram Moolenaar    exe "normal \<CR>"
8541ff2b64bSBram Moolenaar    wincmd p
8551ff2b64bSBram Moolenaar    3
8561ff2b64bSBram Moolenaar    exe "normal \<CR>"
8571ff2b64bSBram Moolenaar    wincmd p
8581ff2b64bSBram Moolenaar    4
8591ff2b64bSBram Moolenaar    exe "normal \<CR>"
8601ff2b64bSBram Moolenaar    call assert_equal(2, winnr('$'))
8611ff2b64bSBram Moolenaar    wincmd n | only
8621ff2b64bSBram Moolenaar
8631ff2b64bSBram Moolenaar    " Test C:
8641ff2b64bSBram Moolenaar    lrewind
8651ff2b64bSBram Moolenaar    lopen
8661ff2b64bSBram Moolenaar    " Let's move the location list window to the top to check whether it (the
8671ff2b64bSBram Moolenaar    " first window found) will be reused when we try to open new windows:
8681ff2b64bSBram Moolenaar    wincmd K
8691ff2b64bSBram Moolenaar    2
8701ff2b64bSBram Moolenaar    exe "normal \<CR>"
8711ff2b64bSBram Moolenaar    wincmd p
8721ff2b64bSBram Moolenaar    3
8731ff2b64bSBram Moolenaar    exe "normal \<CR>"
8741ff2b64bSBram Moolenaar    wincmd p
8751ff2b64bSBram Moolenaar    4
8761ff2b64bSBram Moolenaar    exe "normal \<CR>"
8771ff2b64bSBram Moolenaar    1wincmd w
8781ff2b64bSBram Moolenaar    call assert_equal('quickfix', &buftype)
8791ff2b64bSBram Moolenaar    2wincmd w
8801ff2b64bSBram Moolenaar    let bufferName = expand("%")
8811ff2b64bSBram Moolenaar    let bufferName = substitute(bufferName, '\\', '/', 'g')
8821ff2b64bSBram Moolenaar    call assert_equal('test://quux.txt', bufferName)
8831ff2b64bSBram Moolenaar
8841ff2b64bSBram Moolenaar    wincmd n | only
8851ff2b64bSBram Moolenaar
8861ff2b64bSBram Moolenaar    augroup! testgroup
8872b946c9fSBram Moolenaarendfunc
8880899d698SBram Moolenaar
8892b946c9fSBram Moolenaarfunc Test_locationlist_curwin_was_closed()
8900899d698SBram Moolenaar    augroup testgroup
8910899d698SBram Moolenaar      au!
892d106e5baSBram Moolenaar      autocmd BufReadCmd test_curwin.txt call R(expand("<amatch>"))
8930899d698SBram Moolenaar    augroup END
8940899d698SBram Moolenaar
8952b946c9fSBram Moolenaar    func! R(n)
8960899d698SBram Moolenaar      quit
8970899d698SBram Moolenaar    endfunc
8980899d698SBram Moolenaar
8990899d698SBram Moolenaar    new
9000899d698SBram Moolenaar    let q = []
901d106e5baSBram Moolenaar    call add(q, {'filename': 'test_curwin.txt' })
9020899d698SBram Moolenaar    call setloclist(0, q)
9030899d698SBram Moolenaar    call assert_fails('lrewind', 'E924:')
9040899d698SBram Moolenaar
9050899d698SBram Moolenaar    augroup! testgroup
9062b946c9fSBram Moolenaarendfunc
9077eba3d2cSBram Moolenaar
9082b946c9fSBram Moolenaarfunc Test_locationlist_cross_tab_jump()
9090a9046fbSBram Moolenaar  call writefile(['loclistfoo'], 'loclistfoo')
9100a9046fbSBram Moolenaar  call writefile(['loclistbar'], 'loclistbar')
9110a9046fbSBram Moolenaar  set switchbuf=usetab
9120a9046fbSBram Moolenaar
9130a9046fbSBram Moolenaar  edit loclistfoo
9140a9046fbSBram Moolenaar  tabedit loclistbar
9150a9046fbSBram Moolenaar  silent lgrep loclistfoo loclist*
9160a9046fbSBram Moolenaar  call assert_equal(1, tabpagenr())
9170a9046fbSBram Moolenaar
9180a9046fbSBram Moolenaar  enew | only | tabonly
9190a9046fbSBram Moolenaar  set switchbuf&vim
9200a9046fbSBram Moolenaar  call delete('loclistfoo')
9210a9046fbSBram Moolenaar  call delete('loclistbar')
9222b946c9fSBram Moolenaarendfunc
9230a9046fbSBram Moolenaar
9247eba3d2cSBram Moolenaar" More tests for 'errorformat'
9252b946c9fSBram Moolenaarfunc Test_efm1()
9267eba3d2cSBram Moolenaar    if !has('unix')
9277eba3d2cSBram Moolenaar	" The 'errorformat' setting is different on non-Unix systems.
9287eba3d2cSBram Moolenaar	" This test works only on Unix-like systems.
9297eba3d2cSBram Moolenaar	return
9307eba3d2cSBram Moolenaar    endif
9317eba3d2cSBram Moolenaar
932c79745a8SBram Moolenaar    let l =<< trim [DATA]
933c79745a8SBram Moolenaar      "Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set.
934c79745a8SBram Moolenaar      "Xtestfile", line 6 col 19; this is an error
935c79745a8SBram Moolenaar      gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include  version.c
936c79745a8SBram Moolenaar      Xtestfile:9: parse error before `asd'
937c79745a8SBram Moolenaar      make: *** [vim] Error 1
938c79745a8SBram Moolenaar      in file "Xtestfile" linenr 10: there is an error
939c79745a8SBram Moolenaar
940c79745a8SBram Moolenaar      2 returned
941c79745a8SBram Moolenaar      "Xtestfile", line 11 col 1; this is an error
942c79745a8SBram Moolenaar      "Xtestfile", line 12 col 2; this is another error
943c79745a8SBram Moolenaar      "Xtestfile", line 14:10; this is an error in column 10
944c79745a8SBram Moolenaar      =Xtestfile=, line 15:10; this is another error, but in vcol 10 this time
945c79745a8SBram Moolenaar      "Xtestfile", linenr 16: yet another problem
946c79745a8SBram Moolenaar      Error in "Xtestfile" at line 17:
947c79745a8SBram Moolenaar      x should be a dot
948c79745a8SBram Moolenaar      	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 17
949c79745a8SBram Moolenaar                  ^
950c79745a8SBram Moolenaar      Error in "Xtestfile" at line 18:
951c79745a8SBram Moolenaar      x should be a dot
952c79745a8SBram Moolenaar      	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 18
953c79745a8SBram Moolenaar      .............^
954c79745a8SBram Moolenaar      Error in "Xtestfile" at line 19:
955c79745a8SBram Moolenaar      x should be a dot
956c79745a8SBram Moolenaar      	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 19
957c79745a8SBram Moolenaar      --------------^
958c79745a8SBram Moolenaar      Error in "Xtestfile" at line 20:
959c79745a8SBram Moolenaar      x should be a dot
960c79745a8SBram Moolenaar      	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 20
961c79745a8SBram Moolenaar      	       ^
962c79745a8SBram Moolenaar
963c79745a8SBram Moolenaar      Does anyone know what is the problem and how to correction it?
964c79745a8SBram Moolenaar      "Xtestfile", line 21 col 9: What is the title of the quickfix window?
965c79745a8SBram Moolenaar      "Xtestfile", line 22 col 9: What is the title of the quickfix window?
966c79745a8SBram Moolenaar    [DATA]
9677eba3d2cSBram Moolenaar
9687eba3d2cSBram Moolenaar    call writefile(l, 'Xerrorfile1')
9697eba3d2cSBram Moolenaar    call writefile(l[:-2], 'Xerrorfile2')
9707eba3d2cSBram Moolenaar
971e7eb9270SBram Moolenaar    let m =<< [DATA]
972c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  2
973c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  3
974c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  4
975c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  5
976c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  6
977c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  7
978c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  8
979c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  9
980c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 10
981c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 11
982c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 12
983c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 13
984c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 14
985c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 15
986c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 16
987c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 17
988c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 18
989c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 19
990c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 20
991c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 21
992c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 22
993c79745a8SBram Moolenaar[DATA]
9947eba3d2cSBram Moolenaar    call writefile(m, 'Xtestfile')
9957eba3d2cSBram Moolenaar
9967eba3d2cSBram Moolenaar    let save_efm = &efm
9977eba3d2cSBram Moolenaar    set efm+==%f=\\,\ line\ %l%*\\D%v%*[^\ ]\ %m
9987eba3d2cSBram Moolenaar    set efm^=%AError\ in\ \"%f\"\ at\ line\ %l:,%Z%p^,%C%m
9997eba3d2cSBram Moolenaar
10007eba3d2cSBram Moolenaar    exe 'cf Xerrorfile2'
10017eba3d2cSBram Moolenaar    clast
10027eba3d2cSBram Moolenaar    copen
10037eba3d2cSBram Moolenaar    call assert_equal(':cf Xerrorfile2', w:quickfix_title)
10047eba3d2cSBram Moolenaar    wincmd p
10057eba3d2cSBram Moolenaar
10067eba3d2cSBram Moolenaar    exe 'cf Xerrorfile1'
10077eba3d2cSBram Moolenaar    call assert_equal([4, 12], [line('.'), col('.')])
10087eba3d2cSBram Moolenaar    cn
10097eba3d2cSBram Moolenaar    call assert_equal([6, 19], [line('.'), col('.')])
10107eba3d2cSBram Moolenaar    cn
10117eba3d2cSBram Moolenaar    call assert_equal([9, 2], [line('.'), col('.')])
10127eba3d2cSBram Moolenaar    cn
10137eba3d2cSBram Moolenaar    call assert_equal([10, 2], [line('.'), col('.')])
10147eba3d2cSBram Moolenaar    cn
10157eba3d2cSBram Moolenaar    call assert_equal([11, 1], [line('.'), col('.')])
10167eba3d2cSBram Moolenaar    cn
10177eba3d2cSBram Moolenaar    call assert_equal([12, 2], [line('.'), col('.')])
10187eba3d2cSBram Moolenaar    cn
10197eba3d2cSBram Moolenaar    call assert_equal([14, 10], [line('.'), col('.')])
10207eba3d2cSBram Moolenaar    cn
10217eba3d2cSBram Moolenaar    call assert_equal([15, 3, 10], [line('.'), col('.'), virtcol('.')])
10227eba3d2cSBram Moolenaar    cn
10237eba3d2cSBram Moolenaar    call assert_equal([16, 2], [line('.'), col('.')])
10247eba3d2cSBram Moolenaar    cn
10257eba3d2cSBram Moolenaar    call assert_equal([17, 6], [line('.'), col('.')])
10267eba3d2cSBram Moolenaar    cn
10277eba3d2cSBram Moolenaar    call assert_equal([18, 7], [line('.'), col('.')])
10287eba3d2cSBram Moolenaar    cn
10297eba3d2cSBram Moolenaar    call assert_equal([19, 8], [line('.'), col('.')])
10307eba3d2cSBram Moolenaar    cn
10317eba3d2cSBram Moolenaar    call assert_equal([20, 9], [line('.'), col('.')])
10327eba3d2cSBram Moolenaar    clast
10337eba3d2cSBram Moolenaar    cprev
10347eba3d2cSBram Moolenaar    cprev
10357eba3d2cSBram Moolenaar    wincmd w
10367eba3d2cSBram Moolenaar    call assert_equal(':cf Xerrorfile1', w:quickfix_title)
10377eba3d2cSBram Moolenaar    wincmd p
10387eba3d2cSBram Moolenaar
10397eba3d2cSBram Moolenaar    let &efm = save_efm
10407eba3d2cSBram Moolenaar    call delete('Xerrorfile1')
10417eba3d2cSBram Moolenaar    call delete('Xerrorfile2')
10427eba3d2cSBram Moolenaar    call delete('Xtestfile')
10432b946c9fSBram Moolenaarendfunc
1044ffec3c53SBram Moolenaar
1045ab47c61fSBram Moolenaar" Test for quickfix directory stack support
10462b946c9fSBram Moolenaarfunc s:dir_stack_tests(cchar)
104738df43bdSBram Moolenaar  call s:setup_commands(a:cchar)
104838df43bdSBram Moolenaar
1049ab47c61fSBram Moolenaar  let save_efm=&efm
1050ab47c61fSBram Moolenaar  set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
1051ab47c61fSBram Moolenaar
1052361c8f0eSBram Moolenaar  let lines = ["Entering dir 'dir1/a'",
1053361c8f0eSBram Moolenaar		\ 'habits2.txt:1:Nine Healthy Habits',
1054361c8f0eSBram Moolenaar		\ "Entering dir 'b'",
1055361c8f0eSBram Moolenaar		\ 'habits3.txt:2:0 Hours of television',
1056361c8f0eSBram Moolenaar		\ 'habits2.txt:7:5 Small meals',
1057361c8f0eSBram Moolenaar		\ "Entering dir 'dir1/c'",
1058361c8f0eSBram Moolenaar		\ 'habits4.txt:3:1 Hour of exercise',
1059361c8f0eSBram Moolenaar		\ "Leaving dir 'dir1/c'",
1060361c8f0eSBram Moolenaar		\ "Leaving dir 'dir1/a'",
1061361c8f0eSBram Moolenaar		\ 'habits1.txt:4:2 Liters of water',
1062361c8f0eSBram Moolenaar		\ "Entering dir 'dir2'",
1063361c8f0eSBram Moolenaar		\ 'habits5.txt:5:3 Cups of hot green tea',
1064361c8f0eSBram Moolenaar		\ "Leaving dir 'dir2'"
1065361c8f0eSBram Moolenaar		\]
1066ab47c61fSBram Moolenaar
1067361c8f0eSBram Moolenaar  Xexpr ""
1068361c8f0eSBram Moolenaar  for l in lines
1069361c8f0eSBram Moolenaar      Xaddexpr l
1070361c8f0eSBram Moolenaar  endfor
1071ab47c61fSBram Moolenaar
10723ef5bf7dSBram Moolenaar  let qf = g:Xgetlist()
1073ab47c61fSBram Moolenaar
1074ab47c61fSBram Moolenaar  call assert_equal('dir1/a/habits2.txt', bufname(qf[1].bufnr))
1075ab47c61fSBram Moolenaar  call assert_equal(1, qf[1].lnum)
1076ab47c61fSBram Moolenaar  call assert_equal('dir1/a/b/habits3.txt', bufname(qf[3].bufnr))
1077ab47c61fSBram Moolenaar  call assert_equal(2, qf[3].lnum)
1078ab47c61fSBram Moolenaar  call assert_equal('dir1/a/habits2.txt', bufname(qf[4].bufnr))
1079ab47c61fSBram Moolenaar  call assert_equal(7, qf[4].lnum)
1080ab47c61fSBram Moolenaar  call assert_equal('dir1/c/habits4.txt', bufname(qf[6].bufnr))
1081ab47c61fSBram Moolenaar  call assert_equal(3, qf[6].lnum)
1082ab47c61fSBram Moolenaar  call assert_equal('habits1.txt', bufname(qf[9].bufnr))
1083ab47c61fSBram Moolenaar  call assert_equal(4, qf[9].lnum)
1084ab47c61fSBram Moolenaar  call assert_equal('dir2/habits5.txt', bufname(qf[11].bufnr))
1085ab47c61fSBram Moolenaar  call assert_equal(5, qf[11].lnum)
1086ab47c61fSBram Moolenaar
1087ab47c61fSBram Moolenaar  let &efm=save_efm
10882b946c9fSBram Moolenaarendfunc
1089ab47c61fSBram Moolenaar
1090ab47c61fSBram Moolenaar" Tests for %D and %X errorformat options
10912b946c9fSBram Moolenaarfunc Test_efm_dirstack()
1092ab47c61fSBram Moolenaar  " Create the directory stack and files
1093ab47c61fSBram Moolenaar  call mkdir('dir1')
1094ab47c61fSBram Moolenaar  call mkdir('dir1/a')
1095ab47c61fSBram Moolenaar  call mkdir('dir1/a/b')
1096ab47c61fSBram Moolenaar  call mkdir('dir1/c')
1097ab47c61fSBram Moolenaar  call mkdir('dir2')
1098ab47c61fSBram Moolenaar
1099ab47c61fSBram Moolenaar  let lines = ["Nine Healthy Habits",
1100ab47c61fSBram Moolenaar		\ "0 Hours of television",
1101ab47c61fSBram Moolenaar		\ "1 Hour of exercise",
1102ab47c61fSBram Moolenaar		\ "2 Liters of water",
1103ab47c61fSBram Moolenaar		\ "3 Cups of hot green tea",
1104ab47c61fSBram Moolenaar		\ "4 Short mental breaks",
1105ab47c61fSBram Moolenaar		\ "5 Small meals",
1106ab47c61fSBram Moolenaar		\ "6 AM wake up time",
1107ab47c61fSBram Moolenaar		\ "7 Minutes of laughter",
1108ab47c61fSBram Moolenaar		\ "8 Hours of sleep (at least)",
1109ab47c61fSBram Moolenaar		\ "9 PM end of the day and off to bed"
1110ab47c61fSBram Moolenaar		\ ]
1111ab47c61fSBram Moolenaar  call writefile(lines, 'habits1.txt')
1112ab47c61fSBram Moolenaar  call writefile(lines, 'dir1/a/habits2.txt')
1113ab47c61fSBram Moolenaar  call writefile(lines, 'dir1/a/b/habits3.txt')
1114ab47c61fSBram Moolenaar  call writefile(lines, 'dir1/c/habits4.txt')
1115ab47c61fSBram Moolenaar  call writefile(lines, 'dir2/habits5.txt')
1116ab47c61fSBram Moolenaar
1117ab47c61fSBram Moolenaar  call s:dir_stack_tests('c')
1118ab47c61fSBram Moolenaar  call s:dir_stack_tests('l')
1119ab47c61fSBram Moolenaar
1120ab47c61fSBram Moolenaar  call delete('dir1', 'rf')
1121ab47c61fSBram Moolenaar  call delete('dir2', 'rf')
1122ab47c61fSBram Moolenaar  call delete('habits1.txt')
11232b946c9fSBram Moolenaarendfunc
1124ab47c61fSBram Moolenaar
11259b457948SBram Moolenaar" Test for resync after continuing an ignored message
11262b946c9fSBram Moolenaarfunc Xefm_ignore_continuations(cchar)
11279b457948SBram Moolenaar  call s:setup_commands(a:cchar)
11289b457948SBram Moolenaar
11299b457948SBram Moolenaar  let save_efm = &efm
11309b457948SBram Moolenaar
11319b457948SBram Moolenaar  let &efm =
11329b457948SBram Moolenaar	\ '%Eerror %m %l,' .
11339b457948SBram Moolenaar	\ '%-Wignored %m %l,' .
11349b457948SBram Moolenaar	\ '%+Cmore ignored %m %l,' .
11359b457948SBram Moolenaar	\ '%Zignored end'
11369b457948SBram Moolenaar  Xgetexpr ['ignored warning 1', 'more ignored continuation 2', 'ignored end', 'error resync 4']
11379b457948SBram Moolenaar  let l = map(g:Xgetlist(), '[v:val.text, v:val.valid, v:val.lnum, v:val.type]')
11389b457948SBram Moolenaar  call assert_equal([['resync', 1, 4, 'E']], l)
11399b457948SBram Moolenaar
11409b457948SBram Moolenaar  let &efm = save_efm
11412b946c9fSBram Moolenaarendfunc
11429b457948SBram Moolenaar
11432b946c9fSBram Moolenaarfunc Test_efm_ignore_continuations()
11449b457948SBram Moolenaar  call Xefm_ignore_continuations('c')
11459b457948SBram Moolenaar  call Xefm_ignore_continuations('l')
11462b946c9fSBram Moolenaarendfunc
11479b457948SBram Moolenaar
11480fcc7c6dSBram Moolenaar" Tests for invalid error format specifies
11492b946c9fSBram Moolenaarfunc Xinvalid_efm_Tests(cchar)
11500fcc7c6dSBram Moolenaar  call s:setup_commands(a:cchar)
11510fcc7c6dSBram Moolenaar
1152049cba9eSBram Moolenaar  let save_efm = &efm
1153049cba9eSBram Moolenaar
11540fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%f:%l:%m
11550fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E372:')
11560fcc7c6dSBram Moolenaar
11570fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%l:%r:%m
11580fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
11590fcc7c6dSBram Moolenaar
11600fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%O:%f:%l:%m
11610fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
11620fcc7c6dSBram Moolenaar
11630fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%l:%*[^a-z
11640fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E374:')
11650fcc7c6dSBram Moolenaar
11660fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%l:%*c
11670fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E375:')
11680fcc7c6dSBram Moolenaar
11690fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%L%M%N
11700fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E376:')
11710fcc7c6dSBram Moolenaar
11720fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%l:%m:%R
11730fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E377:')
11740fcc7c6dSBram Moolenaar
117570077dd1SBram Moolenaar  " Invalid regular expression
117670077dd1SBram Moolenaar  set efm=%\\%%k
117770077dd1SBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E867:')
117870077dd1SBram Moolenaar
11790fcc7c6dSBram Moolenaar  set efm=
11800fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E378:')
11810fcc7c6dSBram Moolenaar
11820fcc7c6dSBram Moolenaar  set efm=%DEntering\ dir\ abc,%f:%l:%m
11830fcc7c6dSBram Moolenaar  call assert_fails('Xexpr ["Entering dir abc", "abc.txt:1:Hello world"]', 'E379:')
11840fcc7c6dSBram Moolenaar
11850fcc7c6dSBram Moolenaar  let &efm = save_efm
11862b946c9fSBram Moolenaarendfunc
11870fcc7c6dSBram Moolenaar
11882b946c9fSBram Moolenaarfunc Test_invalid_efm()
11890fcc7c6dSBram Moolenaar  call Xinvalid_efm_Tests('c')
11900fcc7c6dSBram Moolenaar  call Xinvalid_efm_Tests('l')
11912b946c9fSBram Moolenaarendfunc
11920fcc7c6dSBram Moolenaar
11930fcc7c6dSBram Moolenaar" TODO:
11940fcc7c6dSBram Moolenaar" Add tests for the following formats in 'errorformat'
11950fcc7c6dSBram Moolenaar"	%r  %O
11962b946c9fSBram Moolenaarfunc Test_efm2()
11970fcc7c6dSBram Moolenaar  let save_efm = &efm
1198049cba9eSBram Moolenaar
1199049cba9eSBram Moolenaar  " Test for %s format in efm
1200049cba9eSBram Moolenaar  set efm=%f:%s
1201049cba9eSBram Moolenaar  cexpr 'Xtestfile:Line search text'
1202049cba9eSBram Moolenaar  let l = getqflist()
120370077dd1SBram Moolenaar  call assert_equal('^\VLine search text\$', l[0].pattern)
120470077dd1SBram Moolenaar  call assert_equal(0, l[0].lnum)
1205049cba9eSBram Moolenaar
1206ee85df37SBram Moolenaar  let l = split(execute('clist', ''), "\n")
1207ee85df37SBram Moolenaar  call assert_equal([' 1 Xtestfile:^\VLine search text\$:  '], l)
1208ee85df37SBram Moolenaar
120970077dd1SBram Moolenaar  " Test for a long line
121070077dd1SBram Moolenaar  cexpr 'Xtestfile:' . repeat('a', 1026)
121170077dd1SBram Moolenaar  let l = getqflist()
121270077dd1SBram Moolenaar  call assert_equal('^\V' . repeat('a', 1019) . '\$', l[0].pattern)
121370077dd1SBram Moolenaar
12140fcc7c6dSBram Moolenaar  " Test for %P, %Q and %t format specifiers
1215c79745a8SBram Moolenaar  let lines =<< trim [DATA]
1216c79745a8SBram Moolenaar    [Xtestfile1]
1217c79745a8SBram Moolenaar    (1,17)  error: ';' missing
1218c79745a8SBram Moolenaar    (21,2)  warning: variable 'z' not defined
1219c79745a8SBram Moolenaar    (67,3)  error: end of file found before string ended
1220c79745a8SBram Moolenaar    --
1221c79745a8SBram Moolenaar
1222c79745a8SBram Moolenaar    [Xtestfile2]
1223c79745a8SBram Moolenaar    --
1224c79745a8SBram Moolenaar
1225c79745a8SBram Moolenaar    [Xtestfile3]
1226c79745a8SBram Moolenaar    NEW compiler v1.1
1227c79745a8SBram Moolenaar    (2,2)   warning: variable 'x' not defined
1228c79745a8SBram Moolenaar    (67,3)  warning: 's' already defined
1229c79745a8SBram Moolenaar    --
1230c79745a8SBram Moolenaar  [DATA]
1231c79745a8SBram Moolenaar
1232ee85df37SBram Moolenaar  set efm=%+P[%f]%r,(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%+Q--%r
1233391b1dd0SBram Moolenaar  " To exercise the push/pop file functionality in quickfix, the test files
1234391b1dd0SBram Moolenaar  " need to be created.
1235391b1dd0SBram Moolenaar  call writefile(['Line1'], 'Xtestfile1')
1236391b1dd0SBram Moolenaar  call writefile(['Line2'], 'Xtestfile2')
1237391b1dd0SBram Moolenaar  call writefile(['Line3'], 'Xtestfile3')
1238361c8f0eSBram Moolenaar  cexpr ""
1239361c8f0eSBram Moolenaar  for l in lines
1240361c8f0eSBram Moolenaar      caddexpr l
1241361c8f0eSBram Moolenaar  endfor
1242049cba9eSBram Moolenaar  let l = getqflist()
1243ee85df37SBram Moolenaar  call assert_equal(12, len(l))
1244049cba9eSBram Moolenaar  call assert_equal(21, l[2].lnum)
1245049cba9eSBram Moolenaar  call assert_equal(2, l[2].col)
12460fcc7c6dSBram Moolenaar  call assert_equal('w', l[2].type)
12470fcc7c6dSBram Moolenaar  call assert_equal('e', l[3].type)
1248391b1dd0SBram Moolenaar  call delete('Xtestfile1')
1249391b1dd0SBram Moolenaar  call delete('Xtestfile2')
1250391b1dd0SBram Moolenaar  call delete('Xtestfile3')
12510fcc7c6dSBram Moolenaar
125270077dd1SBram Moolenaar  " Test for %P, %Q with non-existing files
125370077dd1SBram Moolenaar  cexpr lines
125470077dd1SBram Moolenaar  let l = getqflist()
125570077dd1SBram Moolenaar  call assert_equal(14, len(l))
125670077dd1SBram Moolenaar  call assert_equal('[Xtestfile1]', l[0].text)
125770077dd1SBram Moolenaar  call assert_equal('[Xtestfile2]', l[6].text)
125870077dd1SBram Moolenaar  call assert_equal('[Xtestfile3]', l[9].text)
125970077dd1SBram Moolenaar
12600fcc7c6dSBram Moolenaar  " Tests for %E, %C and %Z format specifiers
1261c79745a8SBram Moolenaar  let lines =<< trim [DATA]
1262c79745a8SBram Moolenaar    Error 275
1263c79745a8SBram Moolenaar    line 42
1264c79745a8SBram Moolenaar    column 3
1265c79745a8SBram Moolenaar    ' ' expected after '--'
1266c79745a8SBram Moolenaar  [DATA]
1267c79745a8SBram Moolenaar
12680fcc7c6dSBram Moolenaar  set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m
12690fcc7c6dSBram Moolenaar  cgetexpr lines
12700fcc7c6dSBram Moolenaar  let l = getqflist()
12710fcc7c6dSBram Moolenaar  call assert_equal(275, l[0].nr)
12720fcc7c6dSBram Moolenaar  call assert_equal(42, l[0].lnum)
12730fcc7c6dSBram Moolenaar  call assert_equal(3, l[0].col)
12740fcc7c6dSBram Moolenaar  call assert_equal('E', l[0].type)
12750fcc7c6dSBram Moolenaar  call assert_equal("\n' ' expected after '--'", l[0].text)
12760fcc7c6dSBram Moolenaar
12770fcc7c6dSBram Moolenaar  " Test for %>
1278c79745a8SBram Moolenaar  let lines =<< trim [DATA]
1279c79745a8SBram Moolenaar    Error in line 147 of foo.c:
1280c79745a8SBram Moolenaar    unknown variable 'i'
1281c79745a8SBram Moolenaar  [DATA]
1282c79745a8SBram Moolenaar
12830fcc7c6dSBram Moolenaar  set efm=unknown\ variable\ %m,%E%>Error\ in\ line\ %l\ of\ %f:,%Z%m
12840fcc7c6dSBram Moolenaar  cgetexpr lines
12850fcc7c6dSBram Moolenaar  let l = getqflist()
12860fcc7c6dSBram Moolenaar  call assert_equal(147, l[0].lnum)
12870fcc7c6dSBram Moolenaar  call assert_equal('E', l[0].type)
12880fcc7c6dSBram Moolenaar  call assert_equal("\nunknown variable 'i'", l[0].text)
1289049cba9eSBram Moolenaar
1290e87e6dddSBram Moolenaar  " Test for %A, %C and other formats
1291c79745a8SBram Moolenaar  let lines =<< trim [DATA]
1292c79745a8SBram Moolenaar    ==============================================================
1293c79745a8SBram Moolenaar    FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest)
1294c79745a8SBram Moolenaar    --------------------------------------------------------------
1295c79745a8SBram Moolenaar    Traceback (most recent call last):
1296c79745a8SBram Moolenaar      File "unittests/dbfacadeTest.py", line 89, in testFoo
1297c79745a8SBram Moolenaar        self.assertEquals(34, dtid)
1298c79745a8SBram Moolenaar      File "/usr/lib/python2.2/unittest.py", line 286, in
1299c79745a8SBram Moolenaar     failUnlessEqual
1300c79745a8SBram Moolenaar        raise self.failureException, \\
130170077dd1SBram Moolenaar    W:AssertionError: 34 != 33
1302c79745a8SBram Moolenaar
1303c79745a8SBram Moolenaar    --------------------------------------------------------------
1304c79745a8SBram Moolenaar    Ran 27 tests in 0.063s
1305c79745a8SBram Moolenaar  [DATA]
1306c79745a8SBram Moolenaar
130770077dd1SBram Moolenaar  set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%t:%m
1308e87e6dddSBram Moolenaar  cgetexpr lines
1309e87e6dddSBram Moolenaar  let l = getqflist()
1310e87e6dddSBram Moolenaar  call assert_equal(8, len(l))
1311e87e6dddSBram Moolenaar  call assert_equal(89, l[4].lnum)
1312e87e6dddSBram Moolenaar  call assert_equal(1, l[4].valid)
1313e87e6dddSBram Moolenaar  call assert_equal('unittests/dbfacadeTest.py', bufname(l[4].bufnr))
131470077dd1SBram Moolenaar  call assert_equal('W', l[4].type)
1315e87e6dddSBram Moolenaar
1316d76ce852SBram Moolenaar  " Test for %o
1317d76ce852SBram Moolenaar  set efm=%f(%o):%l\ %m
1318bc7845daSBram Moolenaar  cgetexpr ['Xotestfile(Language.PureScript.Types):20 Error']
1319bc7845daSBram Moolenaar  call writefile(['Line1'], 'Xotestfile')
1320d76ce852SBram Moolenaar  let l = getqflist()
1321d76ce852SBram Moolenaar  call assert_equal(1, len(l), string(l))
1322d76ce852SBram Moolenaar  call assert_equal('Language.PureScript.Types', l[0].module)
1323d76ce852SBram Moolenaar  copen
1324d76ce852SBram Moolenaar  call assert_equal('Language.PureScript.Types|20| Error', getline(1))
1325d76ce852SBram Moolenaar  call feedkeys("\<CR>", 'xn')
1326bc7845daSBram Moolenaar  call assert_equal('Xotestfile', expand('%:t'))
1327d76ce852SBram Moolenaar  cclose
1328d76ce852SBram Moolenaar  bd
1329bc7845daSBram Moolenaar  call delete("Xotestfile")
1330d76ce852SBram Moolenaar
133170077dd1SBram Moolenaar  " Test for a long module name
133270077dd1SBram Moolenaar  cexpr 'Xtest(' . repeat('m', 1026) . '):15 message'
133370077dd1SBram Moolenaar  let l = getqflist()
133470077dd1SBram Moolenaar  call assert_equal(repeat('m', 1024), l[0].module)
133570077dd1SBram Moolenaar  call assert_equal(15, l[0].lnum)
133670077dd1SBram Moolenaar  call assert_equal('message', l[0].text)
133770077dd1SBram Moolenaar
133899895eacSBram Moolenaar  " The following sequence of commands used to crash Vim
133999895eacSBram Moolenaar  set efm=%W%m
134099895eacSBram Moolenaar  cgetexpr ['msg1']
134199895eacSBram Moolenaar  let l = getqflist()
134299895eacSBram Moolenaar  call assert_equal(1, len(l), string(l))
134399895eacSBram Moolenaar  call assert_equal('msg1', l[0].text)
134499895eacSBram Moolenaar  set efm=%C%m
134599895eacSBram Moolenaar  lexpr 'msg2'
134699895eacSBram Moolenaar  let l = getloclist(0)
134799895eacSBram Moolenaar  call assert_equal(1, len(l), string(l))
134899895eacSBram Moolenaar  call assert_equal('msg2', l[0].text)
134999895eacSBram Moolenaar  lopen
135099895eacSBram Moolenaar  call setqflist([], 'r')
135199895eacSBram Moolenaar  caddbuf
135299895eacSBram Moolenaar  let l = getqflist()
135399895eacSBram Moolenaar  call assert_equal(1, len(l), string(l))
135499895eacSBram Moolenaar  call assert_equal('|| msg2', l[0].text)
135599895eacSBram Moolenaar
135678ddc06bSBram Moolenaar  " When matching error lines, case should be ignored. Test for this.
135778ddc06bSBram Moolenaar  set noignorecase
135878ddc06bSBram Moolenaar  let l=getqflist({'lines' : ['Xtest:FOO10:Line 20'], 'efm':'%f:foo%l:%m'})
135978ddc06bSBram Moolenaar  call assert_equal(10, l.items[0].lnum)
136078ddc06bSBram Moolenaar  call assert_equal('Line 20', l.items[0].text)
136178ddc06bSBram Moolenaar  set ignorecase&
136278ddc06bSBram Moolenaar
136399895eacSBram Moolenaar  new | only
1364049cba9eSBram Moolenaar  let &efm = save_efm
13652b946c9fSBram Moolenaarendfunc
1366049cba9eSBram Moolenaar
1367e928366dSBram Moolenaar" Test for '%t' (error type) field in 'efm'
1368e928366dSBram Moolenaarfunc Test_efm_error_type()
1369e928366dSBram Moolenaar  let save_efm = &efm
1370e928366dSBram Moolenaar
1371e928366dSBram Moolenaar  " error type
1372e928366dSBram Moolenaar  set efm=%f:%l:%t:%m
1373e928366dSBram Moolenaar  cexpr ["Xfile1:10:E:msg1", "Xfile1:20:W:msg2", "Xfile1:30:I:msg3",
1374e928366dSBram Moolenaar        \ "Xfile1:40:N:msg4", "Xfile1:50:R:msg5"]
1375e928366dSBram Moolenaar  let output = split(execute('clist'), "\n")
1376e928366dSBram Moolenaar  call assert_equal([
1377e928366dSBram Moolenaar        \ ' 1 Xfile1:10 error: msg1',
1378e928366dSBram Moolenaar        \ ' 2 Xfile1:20 warning: msg2',
1379e928366dSBram Moolenaar        \ ' 3 Xfile1:30 info: msg3',
1380e928366dSBram Moolenaar        \ ' 4 Xfile1:40 note: msg4',
1381e928366dSBram Moolenaar        \ ' 5 Xfile1:50 R: msg5'], output)
1382e928366dSBram Moolenaar
1383e928366dSBram Moolenaar  " error type and a error number
1384e928366dSBram Moolenaar  set efm=%f:%l:%t:%n:%m
1385e928366dSBram Moolenaar  cexpr ["Xfile1:10:E:2:msg1", "Xfile1:20:W:4:msg2", "Xfile1:30:I:6:msg3",
1386e928366dSBram Moolenaar        \ "Xfile1:40:N:8:msg4", "Xfile1:50:R:3:msg5"]
1387e928366dSBram Moolenaar  let output = split(execute('clist'), "\n")
1388e928366dSBram Moolenaar  call assert_equal([
1389e928366dSBram Moolenaar        \ ' 1 Xfile1:10 error   2: msg1',
1390e928366dSBram Moolenaar        \ ' 2 Xfile1:20 warning   4: msg2',
1391e928366dSBram Moolenaar        \ ' 3 Xfile1:30 info   6: msg3',
1392e928366dSBram Moolenaar        \ ' 4 Xfile1:40 note   8: msg4',
1393e928366dSBram Moolenaar        \ ' 5 Xfile1:50 R   3: msg5'], output)
1394e928366dSBram Moolenaar  let &efm = save_efm
1395e928366dSBram Moolenaarendfunc
1396e928366dSBram Moolenaar
13972b946c9fSBram Moolenaarfunc XquickfixChangedByAutocmd(cchar)
13983ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
1399ffec3c53SBram Moolenaar  if a:cchar == 'c'
1400ffec3c53SBram Moolenaar    let ErrorNr = 'E925'
14012b946c9fSBram Moolenaar    func! ReadFunc()
1402ffec3c53SBram Moolenaar      colder
1403ffec3c53SBram Moolenaar      cgetexpr []
1404ffec3c53SBram Moolenaar    endfunc
1405ffec3c53SBram Moolenaar  else
1406ffec3c53SBram Moolenaar    let ErrorNr = 'E926'
14072b946c9fSBram Moolenaar    func! ReadFunc()
1408ffec3c53SBram Moolenaar      lolder
1409ffec3c53SBram Moolenaar      lgetexpr []
1410ffec3c53SBram Moolenaar    endfunc
1411ffec3c53SBram Moolenaar  endif
1412ffec3c53SBram Moolenaar
1413ffec3c53SBram Moolenaar  augroup testgroup
1414ffec3c53SBram Moolenaar    au!
1415d106e5baSBram Moolenaar    autocmd BufReadCmd test_changed.txt call ReadFunc()
1416ffec3c53SBram Moolenaar  augroup END
1417ffec3c53SBram Moolenaar
1418d106e5baSBram Moolenaar  new | only
1419ffec3c53SBram Moolenaar  let words = [ "a", "b" ]
1420ffec3c53SBram Moolenaar  let qflist = []
1421ffec3c53SBram Moolenaar  for word in words
1422d106e5baSBram Moolenaar    call add(qflist, {'filename': 'test_changed.txt'})
14233ef5bf7dSBram Moolenaar    call g:Xsetlist(qflist, ' ')
1424ffec3c53SBram Moolenaar  endfor
14253ef5bf7dSBram Moolenaar  call assert_fails('Xrewind', ErrorNr . ':')
1426ffec3c53SBram Moolenaar
1427ffec3c53SBram Moolenaar  augroup! testgroup
1428ffec3c53SBram Moolenaarendfunc
1429ffec3c53SBram Moolenaar
14302b946c9fSBram Moolenaarfunc Test_quickfix_was_changed_by_autocmd()
1431ffec3c53SBram Moolenaar  call XquickfixChangedByAutocmd('c')
1432ffec3c53SBram Moolenaar  call XquickfixChangedByAutocmd('l')
14332b946c9fSBram Moolenaarendfunc
14348b20179cSBram Moolenaar
14358b20179cSBram Moolenaarfunc Test_caddbuffer_to_empty()
14368b20179cSBram Moolenaar  helpgr quickfix
14378b20179cSBram Moolenaar  call setqflist([], 'r')
14388b20179cSBram Moolenaar  cad
1439f68f1d70SBram Moolenaar  try
1440f68f1d70SBram Moolenaar    cn
1441f68f1d70SBram Moolenaar  catch
1442f68f1d70SBram Moolenaar    " number of matches is unknown
1443f68f1d70SBram Moolenaar    call assert_true(v:exception =~ 'E553:')
1444f68f1d70SBram Moolenaar  endtry
14458b20179cSBram Moolenaar  quit!
14468b20179cSBram Moolenaarendfunc
144789c64d55SBram Moolenaar
144889c64d55SBram Moolenaarfunc Test_cgetexpr_works()
144989c64d55SBram Moolenaar  " this must not crash Vim
145089c64d55SBram Moolenaar  cgetexpr [$x]
14513ef5bf7dSBram Moolenaar  lgetexpr [$x]
145289c64d55SBram Moolenaarendfunc
1453c1808d58SBram Moolenaar
1454c1808d58SBram Moolenaar" Tests for the setqflist() and setloclist() functions
14552b946c9fSBram Moolenaarfunc SetXlistTests(cchar, bnum)
14563ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
1457c1808d58SBram Moolenaar
14583ef5bf7dSBram Moolenaar  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 1},
1459c1808d58SBram Moolenaar	      \  {'bufnr': a:bnum, 'lnum': 2}])
14603ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
1461c1808d58SBram Moolenaar  call assert_equal(2, len(l))
1462c1808d58SBram Moolenaar  call assert_equal(2, l[1].lnum)
1463c1808d58SBram Moolenaar
14643ef5bf7dSBram Moolenaar  Xnext
14653ef5bf7dSBram Moolenaar  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3}], 'a')
14663ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
1467c1808d58SBram Moolenaar  call assert_equal(3, len(l))
14683ef5bf7dSBram Moolenaar  Xnext
1469c1808d58SBram Moolenaar  call assert_equal(3, line('.'))
1470c1808d58SBram Moolenaar
14712b2b8ae5SBram Moolenaar  " Appending entries to the list should not change the cursor position
14722b2b8ae5SBram Moolenaar  " in the quickfix window
14733ef5bf7dSBram Moolenaar  Xwindow
14742b2b8ae5SBram Moolenaar  1
14753ef5bf7dSBram Moolenaar  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 4},
14762b2b8ae5SBram Moolenaar	      \  {'bufnr': a:bnum, 'lnum': 5}], 'a')
14772b2b8ae5SBram Moolenaar  call assert_equal(1, line('.'))
14782b2b8ae5SBram Moolenaar  close
14792b2b8ae5SBram Moolenaar
14803ef5bf7dSBram Moolenaar  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3},
1481c1808d58SBram Moolenaar	      \  {'bufnr': a:bnum, 'lnum': 4},
1482c1808d58SBram Moolenaar	      \  {'bufnr': a:bnum, 'lnum': 5}], 'r')
14833ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
1484c1808d58SBram Moolenaar  call assert_equal(3, len(l))
1485c1808d58SBram Moolenaar  call assert_equal(5, l[2].lnum)
1486c1808d58SBram Moolenaar
14873ef5bf7dSBram Moolenaar  call g:Xsetlist([])
14883ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
1489c1808d58SBram Moolenaar  call assert_equal(0, len(l))
1490ee85df37SBram Moolenaar
1491f1d21c8cSBram Moolenaar  " Tests for setting the 'valid' flag
1492f1d21c8cSBram Moolenaar  call g:Xsetlist([{'bufnr':a:bnum, 'lnum':4, 'valid':0}])
1493f1d21c8cSBram Moolenaar  Xwindow
1494f1d21c8cSBram Moolenaar  call assert_equal(1, winnr('$'))
1495f1d21c8cSBram Moolenaar  let l = g:Xgetlist()
1496f1d21c8cSBram Moolenaar  call g:Xsetlist(l)
1497f1d21c8cSBram Moolenaar  call assert_equal(0, g:Xgetlist()[0].valid)
14989752c72fSBram Moolenaar  " Adding a non-valid entry should not mark the list as having valid entries
14999752c72fSBram Moolenaar  call g:Xsetlist([{'bufnr':a:bnum, 'lnum':5, 'valid':0}], 'a')
15009752c72fSBram Moolenaar  Xwindow
15019752c72fSBram Moolenaar  call assert_equal(1, winnr('$'))
15029752c72fSBram Moolenaar
15039752c72fSBram Moolenaar  " :cnext/:cprev should still work even with invalid entries in the list
15049752c72fSBram Moolenaar  let l = [{'bufnr' : a:bnum, 'lnum' : 1, 'text' : '1', 'valid' : 0},
15059752c72fSBram Moolenaar	      \ {'bufnr' : a:bnum, 'lnum' : 2, 'text' : '2', 'valid' : 0}]
15069752c72fSBram Moolenaar  call g:Xsetlist(l)
15079752c72fSBram Moolenaar  Xnext
15089752c72fSBram Moolenaar  call assert_equal(2, g:Xgetlist({'idx' : 0}).idx)
15099752c72fSBram Moolenaar  Xprev
15109752c72fSBram Moolenaar  call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
15119752c72fSBram Moolenaar  " :cnext/:cprev should still work after appending invalid entries to an
15129752c72fSBram Moolenaar  " empty list
15139752c72fSBram Moolenaar  call g:Xsetlist([])
15149752c72fSBram Moolenaar  call g:Xsetlist(l, 'a')
15159752c72fSBram Moolenaar  Xnext
15169752c72fSBram Moolenaar  call assert_equal(2, g:Xgetlist({'idx' : 0}).idx)
15179752c72fSBram Moolenaar  Xprev
15189752c72fSBram Moolenaar  call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
15199752c72fSBram Moolenaar
1520f1d21c8cSBram Moolenaar  call g:Xsetlist([{'text':'Text1', 'valid':1}])
1521f1d21c8cSBram Moolenaar  Xwindow
1522f1d21c8cSBram Moolenaar  call assert_equal(2, winnr('$'))
1523f1d21c8cSBram Moolenaar  Xclose
1524f1d21c8cSBram Moolenaar  let save_efm = &efm
1525f1d21c8cSBram Moolenaar  set efm=%m
1526f1d21c8cSBram Moolenaar  Xgetexpr 'TestMessage'
1527f1d21c8cSBram Moolenaar  let l = g:Xgetlist()
1528f1d21c8cSBram Moolenaar  call g:Xsetlist(l)
1529f1d21c8cSBram Moolenaar  call assert_equal(1, g:Xgetlist()[0].valid)
1530f1d21c8cSBram Moolenaar  let &efm = save_efm
1531f1d21c8cSBram Moolenaar
1532ee85df37SBram Moolenaar  " Error cases:
1533ee85df37SBram Moolenaar  " Refer to a non-existing buffer and pass a non-dictionary type
1534ee85df37SBram Moolenaar  call assert_fails("call g:Xsetlist([{'bufnr':998, 'lnum':4}," .
1535ee85df37SBram Moolenaar	      \ " {'bufnr':999, 'lnum':5}])", 'E92:')
1536ee85df37SBram Moolenaar  call g:Xsetlist([[1, 2,3]])
1537ee85df37SBram Moolenaar  call assert_equal(0, len(g:Xgetlist()))
153899fa7219SBram Moolenaar  call assert_fails('call g:Xsetlist([], [])', 'E928:')
15392b946c9fSBram Moolenaarendfunc
1540c1808d58SBram Moolenaar
15412b946c9fSBram Moolenaarfunc Test_setqflist()
1542c1808d58SBram Moolenaar  new Xtestfile | only
1543c1808d58SBram Moolenaar  let bnum = bufnr('%')
1544c1808d58SBram Moolenaar  call setline(1, range(1,5))
1545c1808d58SBram Moolenaar
1546c1808d58SBram Moolenaar  call SetXlistTests('c', bnum)
1547c1808d58SBram Moolenaar  call SetXlistTests('l', bnum)
1548c1808d58SBram Moolenaar
15491cee693bSBram Moolenaar  enew!
1550c1808d58SBram Moolenaar  call delete('Xtestfile')
15512b946c9fSBram Moolenaarendfunc
1552d106e5baSBram Moolenaar
15532b946c9fSBram Moolenaarfunc Xlist_empty_middle(cchar)
15543ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
15553ef5bf7dSBram Moolenaar
15561cee693bSBram Moolenaar  " create three quickfix lists
1557ee85df37SBram Moolenaar  let @/ = 'Test_'
1558ee85df37SBram Moolenaar  Xvimgrep // test_quickfix.vim
15593ef5bf7dSBram Moolenaar  let testlen = len(g:Xgetlist())
15601cee693bSBram Moolenaar  call assert_true(testlen > 0)
15613ef5bf7dSBram Moolenaar  Xvimgrep empty test_quickfix.vim
15623ef5bf7dSBram Moolenaar  call assert_true(len(g:Xgetlist()) > 0)
15633ef5bf7dSBram Moolenaar  Xvimgrep matches test_quickfix.vim
15643ef5bf7dSBram Moolenaar  let matchlen = len(g:Xgetlist())
15651cee693bSBram Moolenaar  call assert_true(matchlen > 0)
15663ef5bf7dSBram Moolenaar  Xolder
15671cee693bSBram Moolenaar  " make the middle list empty
15683ef5bf7dSBram Moolenaar  call g:Xsetlist([], 'r')
15693ef5bf7dSBram Moolenaar  call assert_true(len(g:Xgetlist()) == 0)
15703ef5bf7dSBram Moolenaar  Xolder
15713ef5bf7dSBram Moolenaar  call assert_equal(testlen, len(g:Xgetlist()))
15723ef5bf7dSBram Moolenaar  Xnewer
15733ef5bf7dSBram Moolenaar  Xnewer
15743ef5bf7dSBram Moolenaar  call assert_equal(matchlen, len(g:Xgetlist()))
15751cee693bSBram Moolenaarendfunc
15761cee693bSBram Moolenaar
15772b946c9fSBram Moolenaarfunc Test_setqflist_empty_middle()
15783ef5bf7dSBram Moolenaar  call Xlist_empty_middle('c')
15793ef5bf7dSBram Moolenaar  call Xlist_empty_middle('l')
15802b946c9fSBram Moolenaarendfunc
15813ef5bf7dSBram Moolenaar
15822b946c9fSBram Moolenaarfunc Xlist_empty_older(cchar)
15833ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
15843ef5bf7dSBram Moolenaar
15851cee693bSBram Moolenaar  " create three quickfix lists
15863ef5bf7dSBram Moolenaar  Xvimgrep one test_quickfix.vim
15873ef5bf7dSBram Moolenaar  let onelen = len(g:Xgetlist())
15881cee693bSBram Moolenaar  call assert_true(onelen > 0)
15893ef5bf7dSBram Moolenaar  Xvimgrep two test_quickfix.vim
15903ef5bf7dSBram Moolenaar  let twolen = len(g:Xgetlist())
15911cee693bSBram Moolenaar  call assert_true(twolen > 0)
15923ef5bf7dSBram Moolenaar  Xvimgrep three test_quickfix.vim
15933ef5bf7dSBram Moolenaar  let threelen = len(g:Xgetlist())
15941cee693bSBram Moolenaar  call assert_true(threelen > 0)
15953ef5bf7dSBram Moolenaar  Xolder 2
15961cee693bSBram Moolenaar  " make the first list empty, check the others didn't change
15973ef5bf7dSBram Moolenaar  call g:Xsetlist([], 'r')
15983ef5bf7dSBram Moolenaar  call assert_true(len(g:Xgetlist()) == 0)
15993ef5bf7dSBram Moolenaar  Xnewer
16003ef5bf7dSBram Moolenaar  call assert_equal(twolen, len(g:Xgetlist()))
16013ef5bf7dSBram Moolenaar  Xnewer
16023ef5bf7dSBram Moolenaar  call assert_equal(threelen, len(g:Xgetlist()))
16032b946c9fSBram Moolenaarendfunc
16043ef5bf7dSBram Moolenaar
16052b946c9fSBram Moolenaarfunc Test_setqflist_empty_older()
16063ef5bf7dSBram Moolenaar  call Xlist_empty_older('c')
16073ef5bf7dSBram Moolenaar  call Xlist_empty_older('l')
16082b946c9fSBram Moolenaarendfunc
16091cee693bSBram Moolenaar
16102b946c9fSBram Moolenaarfunc XquickfixSetListWithAct(cchar)
16113ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
16123ef5bf7dSBram Moolenaar
1613d106e5baSBram Moolenaar  let list1 = [{'filename': 'fnameA', 'text': 'A'},
1614d106e5baSBram Moolenaar          \    {'filename': 'fnameB', 'text': 'B'}]
1615d106e5baSBram Moolenaar  let list2 = [{'filename': 'fnameC', 'text': 'C'},
1616d106e5baSBram Moolenaar          \    {'filename': 'fnameD', 'text': 'D'},
1617d106e5baSBram Moolenaar          \    {'filename': 'fnameE', 'text': 'E'}]
1618d106e5baSBram Moolenaar
1619eeb1b9c7SBram Moolenaar  " {action} is unspecified.  Same as specifying ' '.
1620d106e5baSBram Moolenaar  new | only
16213ef5bf7dSBram Moolenaar  silent! Xnewer 99
16223ef5bf7dSBram Moolenaar  call g:Xsetlist(list1)
16233ef5bf7dSBram Moolenaar  call g:Xsetlist(list2)
16243ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1625d106e5baSBram Moolenaar  call assert_equal(3, len(li))
1626d106e5baSBram Moolenaar  call assert_equal('C', li[0]['text'])
1627d106e5baSBram Moolenaar  call assert_equal('D', li[1]['text'])
1628d106e5baSBram Moolenaar  call assert_equal('E', li[2]['text'])
16293ef5bf7dSBram Moolenaar  silent! Xolder
16303ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1631d106e5baSBram Moolenaar  call assert_equal(2, len(li))
1632d106e5baSBram Moolenaar  call assert_equal('A', li[0]['text'])
1633d106e5baSBram Moolenaar  call assert_equal('B', li[1]['text'])
1634d106e5baSBram Moolenaar
1635d106e5baSBram Moolenaar  " {action} is specified ' '.
1636d106e5baSBram Moolenaar  new | only
16373ef5bf7dSBram Moolenaar  silent! Xnewer 99
16383ef5bf7dSBram Moolenaar  call g:Xsetlist(list1)
16393ef5bf7dSBram Moolenaar  call g:Xsetlist(list2, ' ')
16403ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1641d106e5baSBram Moolenaar  call assert_equal(3, len(li))
1642d106e5baSBram Moolenaar  call assert_equal('C', li[0]['text'])
1643d106e5baSBram Moolenaar  call assert_equal('D', li[1]['text'])
1644d106e5baSBram Moolenaar  call assert_equal('E', li[2]['text'])
16453ef5bf7dSBram Moolenaar  silent! Xolder
16463ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1647d106e5baSBram Moolenaar  call assert_equal(2, len(li))
1648d106e5baSBram Moolenaar  call assert_equal('A', li[0]['text'])
1649d106e5baSBram Moolenaar  call assert_equal('B', li[1]['text'])
1650d106e5baSBram Moolenaar
1651d106e5baSBram Moolenaar  " {action} is specified 'a'.
1652d106e5baSBram Moolenaar  new | only
16533ef5bf7dSBram Moolenaar  silent! Xnewer 99
16543ef5bf7dSBram Moolenaar  call g:Xsetlist(list1)
16553ef5bf7dSBram Moolenaar  call g:Xsetlist(list2, 'a')
16563ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1657d106e5baSBram Moolenaar  call assert_equal(5, len(li))
1658d106e5baSBram Moolenaar  call assert_equal('A', li[0]['text'])
1659d106e5baSBram Moolenaar  call assert_equal('B', li[1]['text'])
1660d106e5baSBram Moolenaar  call assert_equal('C', li[2]['text'])
1661d106e5baSBram Moolenaar  call assert_equal('D', li[3]['text'])
1662d106e5baSBram Moolenaar  call assert_equal('E', li[4]['text'])
1663d106e5baSBram Moolenaar
1664d106e5baSBram Moolenaar  " {action} is specified 'r'.
1665d106e5baSBram Moolenaar  new | only
16663ef5bf7dSBram Moolenaar  silent! Xnewer 99
16673ef5bf7dSBram Moolenaar  call g:Xsetlist(list1)
16683ef5bf7dSBram Moolenaar  call g:Xsetlist(list2, 'r')
16693ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1670d106e5baSBram Moolenaar  call assert_equal(3, len(li))
1671d106e5baSBram Moolenaar  call assert_equal('C', li[0]['text'])
1672d106e5baSBram Moolenaar  call assert_equal('D', li[1]['text'])
1673d106e5baSBram Moolenaar  call assert_equal('E', li[2]['text'])
1674d106e5baSBram Moolenaar
1675d106e5baSBram Moolenaar  " Test for wrong value.
1676d106e5baSBram Moolenaar  new | only
16773ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(0)", 'E714:')
16783ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(list1, '')", 'E927:')
16793ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(list1, 'aa')", 'E927:')
16803ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(list1, ' a')", 'E927:')
16813ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(list1, 0)", 'E928:')
1682d106e5baSBram Moolenaarendfunc
1683d106e5baSBram Moolenaar
1684a0ca7d00SBram Moolenaarfunc Test_setqflist_invalid_nr()
1685a0ca7d00SBram Moolenaar  " The following command used to crash Vim
1686aad222c9SBram Moolenaar  eval []->setqflist(' ', {'nr' : $XXX_DOES_NOT_EXIST})
1687a0ca7d00SBram Moolenaarendfunc
1688a0ca7d00SBram Moolenaar
168999234f29SBram Moolenaarfunc Test_setqflist_user_sets_buftype()
169099234f29SBram Moolenaar  call setqflist([{'text': 'foo'}, {'text': 'bar'}])
169199234f29SBram Moolenaar  set buftype=quickfix
169299234f29SBram Moolenaar  call setqflist([], 'a')
169399234f29SBram Moolenaar  enew
169499234f29SBram Moolenaarendfunc
169599234f29SBram Moolenaar
16962b946c9fSBram Moolenaarfunc Test_quickfix_set_list_with_act()
1697d106e5baSBram Moolenaar  call XquickfixSetListWithAct('c')
1698d106e5baSBram Moolenaar  call XquickfixSetListWithAct('l')
16992b946c9fSBram Moolenaarendfunc
17006be8c8e1SBram Moolenaar
17012b946c9fSBram Moolenaarfunc XLongLinesTests(cchar)
17023ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
17036be8c8e1SBram Moolenaar
1704049cba9eSBram Moolenaar  call assert_equal(4, len(l))
17056be8c8e1SBram Moolenaar  call assert_equal(1, l[0].lnum)
17066be8c8e1SBram Moolenaar  call assert_equal(1, l[0].col)
1707049cba9eSBram Moolenaar  call assert_equal(1975, len(l[0].text))
17086be8c8e1SBram Moolenaar  call assert_equal(2, l[1].lnum)
17096be8c8e1SBram Moolenaar  call assert_equal(1, l[1].col)
17106be8c8e1SBram Moolenaar  call assert_equal(4070, len(l[1].text))
17116be8c8e1SBram Moolenaar  call assert_equal(3, l[2].lnum)
17126be8c8e1SBram Moolenaar  call assert_equal(1, l[2].col)
1713049cba9eSBram Moolenaar  call assert_equal(4070, len(l[2].text))
1714049cba9eSBram Moolenaar  call assert_equal(4, l[3].lnum)
1715049cba9eSBram Moolenaar  call assert_equal(1, l[3].col)
1716049cba9eSBram Moolenaar  call assert_equal(10, len(l[3].text))
17176be8c8e1SBram Moolenaar
17183ef5bf7dSBram Moolenaar  call g:Xsetlist([], 'r')
17192b946c9fSBram Moolenaarendfunc
17206be8c8e1SBram Moolenaar
17212b946c9fSBram Moolenaarfunc s:long_lines_tests(cchar)
17223ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
17233ef5bf7dSBram Moolenaar
17246be8c8e1SBram Moolenaar  let testfile = 'samples/quickfix.txt'
17256be8c8e1SBram Moolenaar
17266be8c8e1SBram Moolenaar  " file
17273ef5bf7dSBram Moolenaar  exe 'Xgetfile' testfile
17283ef5bf7dSBram Moolenaar  call XLongLinesTests(a:cchar)
17296be8c8e1SBram Moolenaar
17306be8c8e1SBram Moolenaar  " list
17313ef5bf7dSBram Moolenaar  Xexpr readfile(testfile)
17323ef5bf7dSBram Moolenaar  call XLongLinesTests(a:cchar)
17336be8c8e1SBram Moolenaar
17346be8c8e1SBram Moolenaar  " string
17353ef5bf7dSBram Moolenaar  Xexpr join(readfile(testfile), "\n")
17363ef5bf7dSBram Moolenaar  call XLongLinesTests(a:cchar)
17376be8c8e1SBram Moolenaar
17386be8c8e1SBram Moolenaar  " buffer
17393ef5bf7dSBram Moolenaar  exe 'edit' testfile
17403ef5bf7dSBram Moolenaar  exe 'Xbuffer' bufnr('%')
1741f50df392SBram Moolenaar  call XLongLinesTests(a:cchar)
17422b946c9fSBram Moolenaarendfunc
17433ef5bf7dSBram Moolenaar
17442b946c9fSBram Moolenaarfunc Test_long_lines()
17453ef5bf7dSBram Moolenaar  call s:long_lines_tests('c')
17463ef5bf7dSBram Moolenaar  call s:long_lines_tests('l')
17472b946c9fSBram Moolenaarendfunc
1748049cba9eSBram Moolenaar
17492b946c9fSBram Moolenaarfunc s:create_test_file(filename)
1750049cba9eSBram Moolenaar  let l = []
1751049cba9eSBram Moolenaar  for i in range(1, 20)
1752049cba9eSBram Moolenaar      call add(l, 'Line' . i)
1753049cba9eSBram Moolenaar  endfor
1754049cba9eSBram Moolenaar  call writefile(l, a:filename)
17552b946c9fSBram Moolenaarendfunc
1756049cba9eSBram Moolenaar
17572b946c9fSBram Moolenaarfunc Test_switchbuf()
1758049cba9eSBram Moolenaar  call s:create_test_file('Xqftestfile1')
1759049cba9eSBram Moolenaar  call s:create_test_file('Xqftestfile2')
1760049cba9eSBram Moolenaar  call s:create_test_file('Xqftestfile3')
1761049cba9eSBram Moolenaar
1762049cba9eSBram Moolenaar  new | only
1763049cba9eSBram Moolenaar  edit Xqftestfile1
1764049cba9eSBram Moolenaar  let file1_winid = win_getid()
1765049cba9eSBram Moolenaar  new Xqftestfile2
1766049cba9eSBram Moolenaar  let file2_winid = win_getid()
1767049cba9eSBram Moolenaar  cgetexpr ['Xqftestfile1:5:Line5',
1768049cba9eSBram Moolenaar		\ 'Xqftestfile1:6:Line6',
1769049cba9eSBram Moolenaar		\ 'Xqftestfile2:10:Line10',
1770049cba9eSBram Moolenaar		\ 'Xqftestfile2:11:Line11',
1771049cba9eSBram Moolenaar		\ 'Xqftestfile3:15:Line15',
1772049cba9eSBram Moolenaar		\ 'Xqftestfile3:16:Line16']
1773049cba9eSBram Moolenaar
1774049cba9eSBram Moolenaar  new
1775049cba9eSBram Moolenaar  let winid = win_getid()
1776049cba9eSBram Moolenaar  cfirst | cnext
1777049cba9eSBram Moolenaar  call assert_equal(winid, win_getid())
177899895eacSBram Moolenaar  2cnext
1779049cba9eSBram Moolenaar  call assert_equal(winid, win_getid())
178099895eacSBram Moolenaar  2cnext
1781049cba9eSBram Moolenaar  call assert_equal(winid, win_getid())
1782049cba9eSBram Moolenaar
1783f9ae154cSBram Moolenaar  " Test for 'switchbuf' set to search for files in windows in the current
1784f9ae154cSBram Moolenaar  " tabpage and jump to an existing window (if present)
1785049cba9eSBram Moolenaar  set switchbuf=useopen
1786f9ae154cSBram Moolenaar  enew
1787049cba9eSBram Moolenaar  cfirst | cnext
1788049cba9eSBram Moolenaar  call assert_equal(file1_winid, win_getid())
178999895eacSBram Moolenaar  2cnext
1790049cba9eSBram Moolenaar  call assert_equal(file2_winid, win_getid())
179199895eacSBram Moolenaar  2cnext
1792049cba9eSBram Moolenaar  call assert_equal(file2_winid, win_getid())
1793049cba9eSBram Moolenaar
1794f9ae154cSBram Moolenaar  " Test for 'switchbuf' set to search for files in tabpages and jump to an
1795f9ae154cSBram Moolenaar  " existing tabpage (if present)
1796049cba9eSBram Moolenaar  enew | only
1797049cba9eSBram Moolenaar  set switchbuf=usetab
1798049cba9eSBram Moolenaar  tabedit Xqftestfile1
1799049cba9eSBram Moolenaar  tabedit Xqftestfile2
180074240d3fSBram Moolenaar  tabedit Xqftestfile3
1801049cba9eSBram Moolenaar  tabfirst
1802049cba9eSBram Moolenaar  cfirst | cnext
1803049cba9eSBram Moolenaar  call assert_equal(2, tabpagenr())
180499895eacSBram Moolenaar  2cnext
1805049cba9eSBram Moolenaar  call assert_equal(3, tabpagenr())
180674240d3fSBram Moolenaar  6cnext
180774240d3fSBram Moolenaar  call assert_equal(4, tabpagenr())
180874240d3fSBram Moolenaar  2cpfile
180974240d3fSBram Moolenaar  call assert_equal(2, tabpagenr())
181074240d3fSBram Moolenaar  2cnfile
181174240d3fSBram Moolenaar  call assert_equal(4, tabpagenr())
1812049cba9eSBram Moolenaar  tabfirst | tabonly | enew
1813049cba9eSBram Moolenaar
1814f9ae154cSBram Moolenaar  " Test for 'switchbuf' set to open a new window for every file
1815049cba9eSBram Moolenaar  set switchbuf=split
1816049cba9eSBram Moolenaar  cfirst | cnext
1817049cba9eSBram Moolenaar  call assert_equal(1, winnr('$'))
1818049cba9eSBram Moolenaar  cnext | cnext
1819049cba9eSBram Moolenaar  call assert_equal(2, winnr('$'))
1820049cba9eSBram Moolenaar  cnext | cnext
1821049cba9eSBram Moolenaar  call assert_equal(3, winnr('$'))
1822049cba9eSBram Moolenaar
1823f9ae154cSBram Moolenaar  " Test for 'switchbuf' set to open a new tabpage for every file
1824049cba9eSBram Moolenaar  set switchbuf=newtab
1825f9ae154cSBram Moolenaar  enew | only
1826049cba9eSBram Moolenaar  cfirst | cnext
1827049cba9eSBram Moolenaar  call assert_equal(1, tabpagenr('$'))
1828049cba9eSBram Moolenaar  cnext | cnext
1829049cba9eSBram Moolenaar  call assert_equal(2, tabpagenr('$'))
1830049cba9eSBram Moolenaar  cnext | cnext
1831049cba9eSBram Moolenaar  call assert_equal(3, tabpagenr('$'))
1832049cba9eSBram Moolenaar  tabfirst | enew | tabonly | only
1833049cba9eSBram Moolenaar
1834539aa6b2SBram Moolenaar  set switchbuf=uselast
1835539aa6b2SBram Moolenaar  split
1836539aa6b2SBram Moolenaar  let last_winid = win_getid()
1837539aa6b2SBram Moolenaar  copen
1838539aa6b2SBram Moolenaar  exe "normal 1G\<CR>"
1839539aa6b2SBram Moolenaar  call assert_equal(last_winid, win_getid())
1840539aa6b2SBram Moolenaar  enew | only
1841539aa6b2SBram Moolenaar
1842f9ae154cSBram Moolenaar  " With an empty 'switchbuf', jumping to a quickfix entry should open the
1843f9ae154cSBram Moolenaar  " file in an existing window (if present)
1844049cba9eSBram Moolenaar  set switchbuf=
1845049cba9eSBram Moolenaar  edit Xqftestfile1
1846049cba9eSBram Moolenaar  let file1_winid = win_getid()
1847049cba9eSBram Moolenaar  new Xqftestfile2
1848049cba9eSBram Moolenaar  let file2_winid = win_getid()
1849049cba9eSBram Moolenaar  copen
1850049cba9eSBram Moolenaar  exe "normal 1G\<CR>"
1851049cba9eSBram Moolenaar  call assert_equal(file1_winid, win_getid())
1852049cba9eSBram Moolenaar  copen
1853049cba9eSBram Moolenaar  exe "normal 3G\<CR>"
1854049cba9eSBram Moolenaar  call assert_equal(file2_winid, win_getid())
1855049cba9eSBram Moolenaar  copen | only
1856049cba9eSBram Moolenaar  exe "normal 5G\<CR>"
1857049cba9eSBram Moolenaar  call assert_equal(2, winnr('$'))
1858049cba9eSBram Moolenaar  call assert_equal(1, bufwinnr('Xqftestfile3'))
1859049cba9eSBram Moolenaar
1860391b1dd0SBram Moolenaar  " If only quickfix window is open in the current tabpage, jumping to an
18611bc353b6SBram Moolenaar  " entry with 'switchbuf' set to 'usetab' should search in other tabpages.
1862049cba9eSBram Moolenaar  enew | only
1863391b1dd0SBram Moolenaar  set switchbuf=usetab
1864391b1dd0SBram Moolenaar  tabedit Xqftestfile1
1865391b1dd0SBram Moolenaar  tabedit Xqftestfile2
1866391b1dd0SBram Moolenaar  tabedit Xqftestfile3
1867391b1dd0SBram Moolenaar  tabfirst
1868391b1dd0SBram Moolenaar  copen | only
1869391b1dd0SBram Moolenaar  clast
1870391b1dd0SBram Moolenaar  call assert_equal(4, tabpagenr())
1871391b1dd0SBram Moolenaar  tabfirst | tabonly | enew | only
1872049cba9eSBram Moolenaar
1873f9ae154cSBram Moolenaar  " Jumping to a file that is not present in any of the tabpages and the
1874f9ae154cSBram Moolenaar  " current tabpage doesn't have any usable windows, should open it in a new
1875f9ae154cSBram Moolenaar  " window in the current tabpage.
1876f9ae154cSBram Moolenaar  copen | only
1877f9ae154cSBram Moolenaar  cfirst
1878f9ae154cSBram Moolenaar  call assert_equal(1, tabpagenr())
1879bdd2c290SBram Moolenaar  call assert_equal('Xqftestfile1', @%)
1880f9ae154cSBram Moolenaar
1881f9ae154cSBram Moolenaar  " If opening a file changes 'switchbuf', then the new value should be
1882f9ae154cSBram Moolenaar  " retained.
188341d4299fSBram Moolenaar  set modeline&vim
1884f9ae154cSBram Moolenaar  call writefile(["vim: switchbuf=split"], 'Xqftestfile1')
1885f9ae154cSBram Moolenaar  enew | only
1886f9ae154cSBram Moolenaar  set switchbuf&vim
1887f9ae154cSBram Moolenaar  cexpr "Xqftestfile1:1:10"
1888f9ae154cSBram Moolenaar  call assert_equal('split', &switchbuf)
1889f9ae154cSBram Moolenaar  call writefile(["vim: switchbuf=usetab"], 'Xqftestfile1')
1890f9ae154cSBram Moolenaar  enew | only
1891f9ae154cSBram Moolenaar  set switchbuf=useopen
1892f9ae154cSBram Moolenaar  cexpr "Xqftestfile1:1:10"
1893f9ae154cSBram Moolenaar  call assert_equal('usetab', &switchbuf)
1894f9ae154cSBram Moolenaar  call writefile(["vim: switchbuf&vim"], 'Xqftestfile1')
1895f9ae154cSBram Moolenaar  enew | only
1896f9ae154cSBram Moolenaar  set switchbuf=useopen
1897f9ae154cSBram Moolenaar  cexpr "Xqftestfile1:1:10"
1898f9ae154cSBram Moolenaar  call assert_equal('', &switchbuf)
1899f9ae154cSBram Moolenaar
1900049cba9eSBram Moolenaar  call delete('Xqftestfile1')
1901049cba9eSBram Moolenaar  call delete('Xqftestfile2')
1902049cba9eSBram Moolenaar  call delete('Xqftestfile3')
1903391b1dd0SBram Moolenaar  set switchbuf&vim
1904391b1dd0SBram Moolenaar
1905391b1dd0SBram Moolenaar  enew | only
19062b946c9fSBram Moolenaarendfunc
1907049cba9eSBram Moolenaar
19082b946c9fSBram Moolenaarfunc Xadjust_qflnum(cchar)
1909049cba9eSBram Moolenaar  call s:setup_commands(a:cchar)
1910049cba9eSBram Moolenaar
1911049cba9eSBram Moolenaar  enew | only
1912049cba9eSBram Moolenaar
1913c1542744SBram Moolenaar  let fname = 'Xqftestfile' . a:cchar
1914c1542744SBram Moolenaar  call s:create_test_file(fname)
1915c1542744SBram Moolenaar  exe 'edit ' . fname
1916049cba9eSBram Moolenaar
1917c1542744SBram Moolenaar  Xgetexpr [fname . ':5:Line5',
1918c1542744SBram Moolenaar	      \ fname . ':10:Line10',
1919c1542744SBram Moolenaar	      \ fname . ':15:Line15',
1920c1542744SBram Moolenaar	      \ fname . ':20:Line20']
1921049cba9eSBram Moolenaar
1922049cba9eSBram Moolenaar  6,14delete
1923049cba9eSBram Moolenaar  call append(6, ['Buffer', 'Window'])
1924049cba9eSBram Moolenaar
1925049cba9eSBram Moolenaar  let l = g:Xgetlist()
1926049cba9eSBram Moolenaar  call assert_equal(5, l[0].lnum)
1927049cba9eSBram Moolenaar  call assert_equal(6, l[2].lnum)
1928049cba9eSBram Moolenaar  call assert_equal(13, l[3].lnum)
1929049cba9eSBram Moolenaar
1930f9ae154cSBram Moolenaar  " If a file doesn't have any quickfix entries, then deleting lines in the
1931f9ae154cSBram Moolenaar  " file should not update the quickfix list
1932f9ae154cSBram Moolenaar  call g:Xsetlist([], 'f')
1933f9ae154cSBram Moolenaar  1,2delete
1934f9ae154cSBram Moolenaar  call assert_equal([], g:Xgetlist())
1935f9ae154cSBram Moolenaar
1936049cba9eSBram Moolenaar  enew!
1937c1542744SBram Moolenaar  call delete(fname)
19382b946c9fSBram Moolenaarendfunc
1939049cba9eSBram Moolenaar
19402b946c9fSBram Moolenaarfunc Test_adjust_lnum()
1941c1542744SBram Moolenaar  call setloclist(0, [])
1942049cba9eSBram Moolenaar  call Xadjust_qflnum('c')
1943c1542744SBram Moolenaar  call setqflist([])
1944049cba9eSBram Moolenaar  call Xadjust_qflnum('l')
19452b946c9fSBram Moolenaarendfunc
1946049cba9eSBram Moolenaar
1947049cba9eSBram Moolenaar" Tests for the :grep/:lgrep and :grepadd/:lgrepadd commands
19482b946c9fSBram Moolenaarfunc s:test_xgrep(cchar)
1949049cba9eSBram Moolenaar  call s:setup_commands(a:cchar)
1950049cba9eSBram Moolenaar
1951049cba9eSBram Moolenaar  " The following lines are used for the grep test. Don't remove.
1952049cba9eSBram Moolenaar  " Grep_Test_Text: Match 1
1953049cba9eSBram Moolenaar  " Grep_Test_Text: Match 2
1954049cba9eSBram Moolenaar  " GrepAdd_Test_Text: Match 1
1955049cba9eSBram Moolenaar  " GrepAdd_Test_Text: Match 2
1956049cba9eSBram Moolenaar  enew! | only
1957049cba9eSBram Moolenaar  set makeef&vim
1958049cba9eSBram Moolenaar  silent Xgrep Grep_Test_Text: test_quickfix.vim
195915a7bdcbSBram Moolenaar  call assert_true(len(g:Xgetlist()) == 5)
1960049cba9eSBram Moolenaar  Xopen
1961049cba9eSBram Moolenaar  call assert_true(w:quickfix_title =~ '^:grep')
1962049cba9eSBram Moolenaar  Xclose
1963049cba9eSBram Moolenaar  enew
1964049cba9eSBram Moolenaar  set makeef=Temp_File_##
1965049cba9eSBram Moolenaar  silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
196615a7bdcbSBram Moolenaar  call assert_true(len(g:Xgetlist()) == 9)
196715a7bdcbSBram Moolenaar
196815a7bdcbSBram Moolenaar  " Try with 'grepprg' set to 'internal'
196915a7bdcbSBram Moolenaar  set grepprg=internal
197015a7bdcbSBram Moolenaar  silent Xgrep Grep_Test_Text: test_quickfix.vim
197115a7bdcbSBram Moolenaar  silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
197215a7bdcbSBram Moolenaar  call assert_true(len(g:Xgetlist()) == 9)
197315a7bdcbSBram Moolenaar  set grepprg&vim
1974f9ae154cSBram Moolenaar
1975f9ae154cSBram Moolenaar  call writefile(['Vim'], 'XtestTempFile')
1976f9ae154cSBram Moolenaar  set makeef=XtestTempFile
1977f9ae154cSBram Moolenaar  silent Xgrep Grep_Test_Text: test_quickfix.vim
197815a7bdcbSBram Moolenaar  call assert_equal(5, len(g:Xgetlist()))
1979f9ae154cSBram Moolenaar  call assert_false(filereadable('XtestTempFile'))
1980f9ae154cSBram Moolenaar  set makeef&vim
19812b946c9fSBram Moolenaarendfunc
1982049cba9eSBram Moolenaar
19832b946c9fSBram Moolenaarfunc Test_grep()
1984049cba9eSBram Moolenaar  if !has('unix')
1985049cba9eSBram Moolenaar    " The grepprg may not be set on non-Unix systems
1986049cba9eSBram Moolenaar    return
1987049cba9eSBram Moolenaar  endif
1988049cba9eSBram Moolenaar
1989049cba9eSBram Moolenaar  call s:test_xgrep('c')
1990049cba9eSBram Moolenaar  call s:test_xgrep('l')
19912b946c9fSBram Moolenaarendfunc
1992361c8f0eSBram Moolenaar
19932b946c9fSBram Moolenaarfunc Test_two_windows()
1994361c8f0eSBram Moolenaar  " Use one 'errorformat' for two windows.  Add an expression to each of them,
1995361c8f0eSBram Moolenaar  " make sure they each keep their own state.
1996361c8f0eSBram Moolenaar  set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
1997361c8f0eSBram Moolenaar  call mkdir('Xone/a', 'p')
1998361c8f0eSBram Moolenaar  call mkdir('Xtwo/a', 'p')
1999361c8f0eSBram Moolenaar  let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
2000361c8f0eSBram Moolenaar  call writefile(lines, 'Xone/a/one.txt')
2001361c8f0eSBram Moolenaar  call writefile(lines, 'Xtwo/a/two.txt')
2002361c8f0eSBram Moolenaar
2003361c8f0eSBram Moolenaar  new one
2004361c8f0eSBram Moolenaar  let one_id = win_getid()
2005361c8f0eSBram Moolenaar  lexpr ""
2006361c8f0eSBram Moolenaar  new two
2007361c8f0eSBram Moolenaar  let two_id = win_getid()
2008361c8f0eSBram Moolenaar  lexpr ""
2009361c8f0eSBram Moolenaar
2010361c8f0eSBram Moolenaar  laddexpr "Entering dir 'Xtwo/a'"
2011361c8f0eSBram Moolenaar  call win_gotoid(one_id)
2012361c8f0eSBram Moolenaar  laddexpr "Entering dir 'Xone/a'"
2013361c8f0eSBram Moolenaar  call win_gotoid(two_id)
2014361c8f0eSBram Moolenaar  laddexpr 'two.txt:5:two two two'
2015361c8f0eSBram Moolenaar  call win_gotoid(one_id)
2016361c8f0eSBram Moolenaar  laddexpr 'one.txt:3:one one one'
2017361c8f0eSBram Moolenaar
2018361c8f0eSBram Moolenaar  let loc_one = getloclist(one_id)
2019361c8f0eSBram Moolenaar  call assert_equal('Xone/a/one.txt', bufname(loc_one[1].bufnr))
2020361c8f0eSBram Moolenaar  call assert_equal(3, loc_one[1].lnum)
2021361c8f0eSBram Moolenaar
2022361c8f0eSBram Moolenaar  let loc_two = getloclist(two_id)
2023361c8f0eSBram Moolenaar  call assert_equal('Xtwo/a/two.txt', bufname(loc_two[1].bufnr))
2024361c8f0eSBram Moolenaar  call assert_equal(5, loc_two[1].lnum)
2025361c8f0eSBram Moolenaar
2026361c8f0eSBram Moolenaar  call win_gotoid(one_id)
2027361c8f0eSBram Moolenaar  bwipe!
2028361c8f0eSBram Moolenaar  call win_gotoid(two_id)
2029361c8f0eSBram Moolenaar  bwipe!
2030361c8f0eSBram Moolenaar  call delete('Xone', 'rf')
2031361c8f0eSBram Moolenaar  call delete('Xtwo', 'rf')
2032361c8f0eSBram Moolenaarendfunc
2033dcb17001SBram Moolenaar
20342b946c9fSBram Moolenaarfunc XbottomTests(cchar)
2035537ef084SBram Moolenaar  call s:setup_commands(a:cchar)
2036537ef084SBram Moolenaar
2037b6fa30ccSBram Moolenaar  " Calling lbottom without any errors should fail
2038b6fa30ccSBram Moolenaar  if a:cchar == 'l'
2039b6fa30ccSBram Moolenaar      call assert_fails('lbottom', 'E776:')
2040b6fa30ccSBram Moolenaar  endif
2041b6fa30ccSBram Moolenaar
2042537ef084SBram Moolenaar  call g:Xsetlist([{'filename': 'foo', 'lnum': 42}])
2043537ef084SBram Moolenaar  Xopen
2044dcb17001SBram Moolenaar  let wid = win_getid()
2045dcb17001SBram Moolenaar  call assert_equal(1, line('.'))
2046dcb17001SBram Moolenaar  wincmd w
2047537ef084SBram Moolenaar  call g:Xsetlist([{'filename': 'var', 'lnum': 24}], 'a')
2048537ef084SBram Moolenaar  Xbottom
2049dcb17001SBram Moolenaar  call win_gotoid(wid)
2050dcb17001SBram Moolenaar  call assert_equal(2, line('.'))
2051537ef084SBram Moolenaar  Xclose
2052dcb17001SBram Moolenaarendfunc
2053537ef084SBram Moolenaar
2054537ef084SBram Moolenaar" Tests for the :cbottom and :lbottom commands
20552b946c9fSBram Moolenaarfunc Test_cbottom()
2056537ef084SBram Moolenaar  call XbottomTests('c')
2057537ef084SBram Moolenaar  call XbottomTests('l')
20582b946c9fSBram Moolenaarendfunc
2059f6acffbeSBram Moolenaar
20602b946c9fSBram Moolenaarfunc HistoryTest(cchar)
2061f6acffbeSBram Moolenaar  call s:setup_commands(a:cchar)
2062f6acffbeSBram Moolenaar
2063f6acffbeSBram Moolenaar  " clear all lists after the first one, then replace the first one.
2064f6acffbeSBram Moolenaar  call g:Xsetlist([])
2065b6fa30ccSBram Moolenaar  call assert_fails('Xolder 99', 'E380:')
2066f6acffbeSBram Moolenaar  let entry = {'filename': 'foo', 'lnum': 42}
2067f6acffbeSBram Moolenaar  call g:Xsetlist([entry], 'r')
2068f6acffbeSBram Moolenaar  call g:Xsetlist([entry, entry])
2069f6acffbeSBram Moolenaar  call g:Xsetlist([entry, entry, entry])
2070f6acffbeSBram Moolenaar  let res = split(execute(a:cchar . 'hist'), "\n")
2071f6acffbeSBram Moolenaar  call assert_equal(3, len(res))
2072f6acffbeSBram Moolenaar  let common = 'errors     :set' . (a:cchar == 'c' ? 'qf' : 'loc') . 'list()'
2073f6acffbeSBram Moolenaar  call assert_equal('  error list 1 of 3; 1 ' . common, res[0])
2074f6acffbeSBram Moolenaar  call assert_equal('  error list 2 of 3; 2 ' . common, res[1])
2075f6acffbeSBram Moolenaar  call assert_equal('> error list 3 of 3; 3 ' . common, res[2])
2076b4d5fbabSBram Moolenaar
20778ffc7c8bSBram Moolenaar  " Test for changing the quickfix lists
20788ffc7c8bSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 0}).nr)
20798ffc7c8bSBram Moolenaar  exe '1' . a:cchar . 'hist'
20808ffc7c8bSBram Moolenaar  call assert_equal(1, g:Xgetlist({'nr' : 0}).nr)
20818ffc7c8bSBram Moolenaar  exe '3' . a:cchar . 'hist'
20828ffc7c8bSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 0}).nr)
20838ffc7c8bSBram Moolenaar  call assert_fails('-2' . a:cchar . 'hist', 'E16:')
20848ffc7c8bSBram Moolenaar  call assert_fails('4' . a:cchar . 'hist', 'E16:')
20858ffc7c8bSBram Moolenaar
2086b4d5fbabSBram Moolenaar  call g:Xsetlist([], 'f')
2087b4d5fbabSBram Moolenaar  let l = split(execute(a:cchar . 'hist'), "\n")
2088b4d5fbabSBram Moolenaar  call assert_equal('No entries', l[0])
20898ffc7c8bSBram Moolenaar  if a:cchar == 'c'
20908ffc7c8bSBram Moolenaar    call assert_fails('4chist', 'E16:')
20918ffc7c8bSBram Moolenaar  else
20928ffc7c8bSBram Moolenaar    call assert_fails('4lhist', 'E776:')
20938ffc7c8bSBram Moolenaar  endif
20945b69c22fSBram Moolenaar
20955b69c22fSBram Moolenaar  " An empty list should still show the stack history
20965b69c22fSBram Moolenaar  call g:Xsetlist([])
20975b69c22fSBram Moolenaar  let res = split(execute(a:cchar . 'hist'), "\n")
20985b69c22fSBram Moolenaar  call assert_equal('> error list 1 of 1; 0 ' . common, res[0])
20995b69c22fSBram Moolenaar
21005b69c22fSBram Moolenaar  call g:Xsetlist([], 'f')
2101f6acffbeSBram Moolenaarendfunc
2102f6acffbeSBram Moolenaar
2103f6acffbeSBram Moolenaarfunc Test_history()
2104f6acffbeSBram Moolenaar  call HistoryTest('c')
2105f6acffbeSBram Moolenaar  call HistoryTest('l')
2106f6acffbeSBram Moolenaarendfunc
2107015102e9SBram Moolenaar
2108015102e9SBram Moolenaarfunc Test_duplicate_buf()
2109015102e9SBram Moolenaar  " make sure we can get the highest buffer number
2110015102e9SBram Moolenaar  edit DoesNotExist
2111015102e9SBram Moolenaar  edit DoesNotExist2
2112015102e9SBram Moolenaar  let last_buffer = bufnr("$")
2113015102e9SBram Moolenaar
2114015102e9SBram Moolenaar  " make sure only one buffer is created
2115015102e9SBram Moolenaar  call writefile(['this one', 'that one'], 'Xgrepthis')
2116015102e9SBram Moolenaar  vimgrep one Xgrepthis
2117015102e9SBram Moolenaar  vimgrep one Xgrepthis
2118015102e9SBram Moolenaar  call assert_equal(last_buffer + 1, bufnr("$"))
2119015102e9SBram Moolenaar
2120015102e9SBram Moolenaar  call delete('Xgrepthis')
2121015102e9SBram Moolenaarendfunc
2122d823fa91SBram Moolenaar
2123d823fa91SBram Moolenaar" Quickfix/Location list set/get properties tests
21242b946c9fSBram Moolenaarfunc Xproperty_tests(cchar)
2125d823fa91SBram Moolenaar    call s:setup_commands(a:cchar)
2126d823fa91SBram Moolenaar
2127d823fa91SBram Moolenaar    " Error cases
2128d823fa91SBram Moolenaar    call assert_fails('call g:Xgetlist(99)', 'E715:')
2129d823fa91SBram Moolenaar    call assert_fails('call g:Xsetlist(99)', 'E714:')
2130d823fa91SBram Moolenaar    call assert_fails('call g:Xsetlist([], "a", [])', 'E715:')
2131d823fa91SBram Moolenaar
2132d823fa91SBram Moolenaar    " Set and get the title
2133b6fa30ccSBram Moolenaar    call g:Xsetlist([])
2134d823fa91SBram Moolenaar    Xopen
2135d823fa91SBram Moolenaar    wincmd p
2136d823fa91SBram Moolenaar    call g:Xsetlist([{'filename':'foo', 'lnum':27}])
213786f100dcSBram Moolenaar    let s = g:Xsetlist([], 'a', {'title' : 'Sample'})
213886f100dcSBram Moolenaar    call assert_equal(0, s)
2139d823fa91SBram Moolenaar    let d = g:Xgetlist({"title":1})
2140d823fa91SBram Moolenaar    call assert_equal('Sample', d.title)
2141a2aa8a2bSBram Moolenaar    " Try setting title to a non-string value
2142a2aa8a2bSBram Moolenaar    call assert_equal(-1, g:Xsetlist([], 'a', {'title' : ['Test']}))
2143a2aa8a2bSBram Moolenaar    call assert_equal('Sample', g:Xgetlist({"title":1}).title)
2144d823fa91SBram Moolenaar
2145d823fa91SBram Moolenaar    Xopen
2146d823fa91SBram Moolenaar    call assert_equal('Sample', w:quickfix_title)
2147d823fa91SBram Moolenaar    Xclose
2148d823fa91SBram Moolenaar
21492b529bb6SBram Moolenaar    " Tests for action argument
21502b529bb6SBram Moolenaar    silent! Xolder 999
21512b529bb6SBram Moolenaar    let qfnr = g:Xgetlist({'all':1}).nr
21522b529bb6SBram Moolenaar    call g:Xsetlist([], 'r', {'title' : 'N1'})
21532b529bb6SBram Moolenaar    call assert_equal('N1', g:Xgetlist({'all':1}).title)
21542b529bb6SBram Moolenaar    call g:Xsetlist([], ' ', {'title' : 'N2'})
21552b529bb6SBram Moolenaar    call assert_equal(qfnr + 1, g:Xgetlist({'all':1}).nr)
2156890680caSBram Moolenaar
2157890680caSBram Moolenaar    let res = g:Xgetlist({'nr': 0})
2158890680caSBram Moolenaar    call assert_equal(qfnr + 1, res.nr)
2159890680caSBram Moolenaar    call assert_equal(['nr'], keys(res))
2160890680caSBram Moolenaar
21612b529bb6SBram Moolenaar    call g:Xsetlist([], ' ', {'title' : 'N3'})
21622b529bb6SBram Moolenaar    call assert_equal('N2', g:Xgetlist({'nr':2, 'title':1}).title)
21632b529bb6SBram Moolenaar
2164ee85df37SBram Moolenaar    " Changing the title of an earlier quickfix list
216555b69264SBram Moolenaar    call g:Xsetlist([], 'r', {'title' : 'NewTitle', 'nr' : 2})
2166ee85df37SBram Moolenaar    call assert_equal('NewTitle', g:Xgetlist({'nr':2, 'title':1}).title)
2167ee85df37SBram Moolenaar
2168ee85df37SBram Moolenaar    " Changing the title of an invalid quickfix list
2169ee85df37SBram Moolenaar    call assert_equal(-1, g:Xsetlist([], ' ',
2170ee85df37SBram Moolenaar		\ {'title' : 'SomeTitle', 'nr' : 99}))
2171ee85df37SBram Moolenaar    call assert_equal(-1, g:Xsetlist([], ' ',
2172ee85df37SBram Moolenaar		\ {'title' : 'SomeTitle', 'nr' : 'abc'}))
2173ee85df37SBram Moolenaar
2174ee85df37SBram Moolenaar    if a:cchar == 'c'
2175ee85df37SBram Moolenaar	copen
2176ee85df37SBram Moolenaar	call assert_equal({'winid':win_getid()}, getqflist({'winid':1}))
2177ee85df37SBram Moolenaar	cclose
2178ee85df37SBram Moolenaar    endif
2179ee85df37SBram Moolenaar
2180d823fa91SBram Moolenaar    " Invalid arguments
2181d823fa91SBram Moolenaar    call assert_fails('call g:Xgetlist([])', 'E715')
2182d823fa91SBram Moolenaar    call assert_fails('call g:Xsetlist([], "a", [])', 'E715')
2183d823fa91SBram Moolenaar    let s = g:Xsetlist([], 'a', {'abc':1})
2184d823fa91SBram Moolenaar    call assert_equal(-1, s)
2185d823fa91SBram Moolenaar
2186d823fa91SBram Moolenaar    call assert_equal({}, g:Xgetlist({'abc':1}))
2187a6d4849cSBram Moolenaar    call assert_equal('', g:Xgetlist({'nr':99, 'title':1}).title)
2188a6d4849cSBram Moolenaar    call assert_equal('', g:Xgetlist({'nr':[], 'title':1}).title)
2189d823fa91SBram Moolenaar
2190d823fa91SBram Moolenaar    if a:cchar == 'l'
2191890680caSBram Moolenaar	call assert_equal({}, getloclist(99, {'title': 1}))
2192d823fa91SBram Moolenaar    endif
21938f77c5a4SBram Moolenaar
21948f77c5a4SBram Moolenaar    " Context related tests
219586f100dcSBram Moolenaar    let s = g:Xsetlist([], 'a', {'context':[1,2,3]})
219686f100dcSBram Moolenaar    call assert_equal(0, s)
21978f77c5a4SBram Moolenaar    call test_garbagecollect_now()
21988f77c5a4SBram Moolenaar    let d = g:Xgetlist({'context':1})
21998f77c5a4SBram Moolenaar    call assert_equal([1,2,3], d.context)
22008f77c5a4SBram Moolenaar    call g:Xsetlist([], 'a', {'context':{'color':'green'}})
22018f77c5a4SBram Moolenaar    let d = g:Xgetlist({'context':1})
22028f77c5a4SBram Moolenaar    call assert_equal({'color':'green'}, d.context)
22038f77c5a4SBram Moolenaar    call g:Xsetlist([], 'a', {'context':"Context info"})
22048f77c5a4SBram Moolenaar    let d = g:Xgetlist({'context':1})
22058f77c5a4SBram Moolenaar    call assert_equal("Context info", d.context)
22068f77c5a4SBram Moolenaar    call g:Xsetlist([], 'a', {'context':246})
22078f77c5a4SBram Moolenaar    let d = g:Xgetlist({'context':1})
22088f77c5a4SBram Moolenaar    call assert_equal(246, d.context)
220992b83ccfSBram Moolenaar    " set other Vim data types as context
221092b83ccfSBram Moolenaar    call g:Xsetlist([], 'a', {'context' : test_null_blob()})
221192b83ccfSBram Moolenaar    if has('channel')
221292b83ccfSBram Moolenaar      call g:Xsetlist([], 'a', {'context' : test_null_channel()})
221392b83ccfSBram Moolenaar    endif
221492b83ccfSBram Moolenaar    if has('job')
221592b83ccfSBram Moolenaar      call g:Xsetlist([], 'a', {'context' : test_null_job()})
221692b83ccfSBram Moolenaar    endif
221792b83ccfSBram Moolenaar    call g:Xsetlist([], 'a', {'context' : test_null_function()})
221892b83ccfSBram Moolenaar    call g:Xsetlist([], 'a', {'context' : test_null_partial()})
221992b83ccfSBram Moolenaar    call g:Xsetlist([], 'a', {'context' : ''})
222092b83ccfSBram Moolenaar    call test_garbagecollect_now()
22218f77c5a4SBram Moolenaar    if a:cchar == 'l'
22228f77c5a4SBram Moolenaar	" Test for copying context across two different location lists
22238f77c5a4SBram Moolenaar	new | only
22248f77c5a4SBram Moolenaar	let w1_id = win_getid()
22258f77c5a4SBram Moolenaar	let l = [1]
22268f77c5a4SBram Moolenaar	call setloclist(0, [], 'a', {'context':l})
22278f77c5a4SBram Moolenaar	new
22288f77c5a4SBram Moolenaar	let w2_id = win_getid()
22298f77c5a4SBram Moolenaar	call add(l, 2)
22308f77c5a4SBram Moolenaar	call assert_equal([1, 2], getloclist(w1_id, {'context':1}).context)
22318f77c5a4SBram Moolenaar	call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
22328f77c5a4SBram Moolenaar	unlet! l
22338f77c5a4SBram Moolenaar	call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
22348f77c5a4SBram Moolenaar	only
22358f77c5a4SBram Moolenaar	call setloclist(0, [], 'f')
2236a6d4849cSBram Moolenaar	call assert_equal('', getloclist(0, {'context':1}).context)
22378f77c5a4SBram Moolenaar    endif
22386e62da3eSBram Moolenaar
22396e62da3eSBram Moolenaar    " Test for changing the context of previous quickfix lists
22406e62da3eSBram Moolenaar    call g:Xsetlist([], 'f')
22416e62da3eSBram Moolenaar    Xexpr "One"
22426e62da3eSBram Moolenaar    Xexpr "Two"
22436e62da3eSBram Moolenaar    Xexpr "Three"
224455b69264SBram Moolenaar    call g:Xsetlist([], 'r', {'context' : [1], 'nr' : 1})
224555b69264SBram Moolenaar    call g:Xsetlist([], 'a', {'context' : [2], 'nr' : 2})
22466e62da3eSBram Moolenaar    " Also, check for setting the context using quickfix list number zero.
224755b69264SBram Moolenaar    call g:Xsetlist([], 'r', {'context' : [3], 'nr' : 0})
22486e62da3eSBram Moolenaar    call test_garbagecollect_now()
22496e62da3eSBram Moolenaar    let l = g:Xgetlist({'nr' : 1, 'context' : 1})
22506e62da3eSBram Moolenaar    call assert_equal([1], l.context)
22516e62da3eSBram Moolenaar    let l = g:Xgetlist({'nr' : 2, 'context' : 1})
22526e62da3eSBram Moolenaar    call assert_equal([2], l.context)
22536e62da3eSBram Moolenaar    let l = g:Xgetlist({'nr' : 3, 'context' : 1})
22546e62da3eSBram Moolenaar    call assert_equal([3], l.context)
22556e62da3eSBram Moolenaar
22566e62da3eSBram Moolenaar    " Test for changing the context through reference and for garbage
22576e62da3eSBram Moolenaar    " collection of quickfix context
22586e62da3eSBram Moolenaar    let l = ["red"]
22596e62da3eSBram Moolenaar    call g:Xsetlist([], ' ', {'context' : l})
22606e62da3eSBram Moolenaar    call add(l, "blue")
22616e62da3eSBram Moolenaar    let x = g:Xgetlist({'context' : 1})
22626e62da3eSBram Moolenaar    call add(x.context, "green")
22636e62da3eSBram Moolenaar    call assert_equal(["red", "blue", "green"], l)
22646e62da3eSBram Moolenaar    call assert_equal(["red", "blue", "green"], x.context)
22656e62da3eSBram Moolenaar    unlet l
22666e62da3eSBram Moolenaar    call test_garbagecollect_now()
22676e62da3eSBram Moolenaar    let m = g:Xgetlist({'context' : 1})
22686e62da3eSBram Moolenaar    call assert_equal(["red", "blue", "green"], m.context)
22696a8958dbSBram Moolenaar
22706a8958dbSBram Moolenaar    " Test for setting/getting items
22716a8958dbSBram Moolenaar    Xexpr ""
22726a8958dbSBram Moolenaar    let qfprev = g:Xgetlist({'nr':0})
227386f100dcSBram Moolenaar    let s = g:Xsetlist([], ' ', {'title':'Green',
22746a8958dbSBram Moolenaar		\ 'items' : [{'filename':'F1', 'lnum':10}]})
227586f100dcSBram Moolenaar    call assert_equal(0, s)
22766a8958dbSBram Moolenaar    let qfcur = g:Xgetlist({'nr':0})
22776a8958dbSBram Moolenaar    call assert_true(qfcur.nr == qfprev.nr + 1)
22786a8958dbSBram Moolenaar    let l = g:Xgetlist({'items':1})
22796a8958dbSBram Moolenaar    call assert_equal('F1', bufname(l.items[0].bufnr))
22806a8958dbSBram Moolenaar    call assert_equal(10, l.items[0].lnum)
22816a8958dbSBram Moolenaar    call g:Xsetlist([], 'a', {'items' : [{'filename':'F2', 'lnum':20},
22826a8958dbSBram Moolenaar		\  {'filename':'F2', 'lnum':30}]})
22836a8958dbSBram Moolenaar    let l = g:Xgetlist({'items':1})
22846a8958dbSBram Moolenaar    call assert_equal('F2', bufname(l.items[2].bufnr))
22856a8958dbSBram Moolenaar    call assert_equal(30, l.items[2].lnum)
22866a8958dbSBram Moolenaar    call g:Xsetlist([], 'r', {'items' : [{'filename':'F3', 'lnum':40}]})
22876a8958dbSBram Moolenaar    let l = g:Xgetlist({'items':1})
22886a8958dbSBram Moolenaar    call assert_equal('F3', bufname(l.items[0].bufnr))
22896a8958dbSBram Moolenaar    call assert_equal(40, l.items[0].lnum)
22906a8958dbSBram Moolenaar    call g:Xsetlist([], 'r', {'items' : []})
22916a8958dbSBram Moolenaar    let l = g:Xgetlist({'items':1})
22926a8958dbSBram Moolenaar    call assert_equal(0, len(l.items))
22936a8958dbSBram Moolenaar
2294b4d5fbabSBram Moolenaar    call g:Xsetlist([], 'r', {'title' : 'TestTitle'})
2295b4d5fbabSBram Moolenaar    call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]})
2296b4d5fbabSBram Moolenaar    call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]})
2297b4d5fbabSBram Moolenaar    call assert_equal('TestTitle', g:Xgetlist({'title' : 1}).title)
2298b4d5fbabSBram Moolenaar
2299c9cc9c78SBram Moolenaar    " Test for getting id of window associated with a location list window
2300c9cc9c78SBram Moolenaar    if a:cchar == 'l'
2301c9cc9c78SBram Moolenaar      only
2302c9cc9c78SBram Moolenaar      call assert_equal(0, g:Xgetlist({'all' : 1}).filewinid)
2303c9cc9c78SBram Moolenaar      let wid = win_getid()
2304c9cc9c78SBram Moolenaar      Xopen
2305c9cc9c78SBram Moolenaar      call assert_equal(wid, g:Xgetlist({'filewinid' : 1}).filewinid)
2306c9cc9c78SBram Moolenaar      wincmd w
2307c9cc9c78SBram Moolenaar      call assert_equal(0, g:Xgetlist({'filewinid' : 1}).filewinid)
2308c9cc9c78SBram Moolenaar      only
2309c9cc9c78SBram Moolenaar    endif
2310c9cc9c78SBram Moolenaar
2311ae338338SBram Moolenaar    " The following used to crash Vim with address sanitizer
2312ae338338SBram Moolenaar    call g:Xsetlist([], 'f')
2313ae338338SBram Moolenaar    call g:Xsetlist([], 'a', {'items' : [{'filename':'F1', 'lnum':10}]})
2314ae338338SBram Moolenaar    call assert_equal(10, g:Xgetlist({'items':1}).items[0].lnum)
2315ae338338SBram Moolenaar
2316a2aa8a2bSBram Moolenaar    " Try setting the items using a string
2317a2aa8a2bSBram Moolenaar    call assert_equal(-1, g:Xsetlist([], ' ', {'items' : 'Test'}))
2318a2aa8a2bSBram Moolenaar
23196a8958dbSBram Moolenaar    " Save and restore the quickfix stack
23206a8958dbSBram Moolenaar    call g:Xsetlist([], 'f')
23216a8958dbSBram Moolenaar    call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
23226a8958dbSBram Moolenaar    Xexpr "File1:10:Line1"
23236a8958dbSBram Moolenaar    Xexpr "File2:20:Line2"
23246a8958dbSBram Moolenaar    Xexpr "File3:30:Line3"
23256a8958dbSBram Moolenaar    let last_qf = g:Xgetlist({'nr':'$'}).nr
23266a8958dbSBram Moolenaar    call assert_equal(3, last_qf)
23276a8958dbSBram Moolenaar    let qstack = []
23286a8958dbSBram Moolenaar    for i in range(1, last_qf)
23296a8958dbSBram Moolenaar	let qstack = add(qstack, g:Xgetlist({'nr':i, 'all':1}))
23306a8958dbSBram Moolenaar    endfor
23316a8958dbSBram Moolenaar    call g:Xsetlist([], 'f')
23326a8958dbSBram Moolenaar    for i in range(len(qstack))
23336a8958dbSBram Moolenaar	call g:Xsetlist([], ' ', qstack[i])
23346a8958dbSBram Moolenaar    endfor
23356a8958dbSBram Moolenaar    call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
23366a8958dbSBram Moolenaar    call assert_equal(10, g:Xgetlist({'nr':1, 'items':1}).items[0].lnum)
23376a8958dbSBram Moolenaar    call assert_equal(20, g:Xgetlist({'nr':2, 'items':1}).items[0].lnum)
23386a8958dbSBram Moolenaar    call assert_equal(30, g:Xgetlist({'nr':3, 'items':1}).items[0].lnum)
23396a8958dbSBram Moolenaar    call g:Xsetlist([], 'f')
23406a8958dbSBram Moolenaar
23416a8958dbSBram Moolenaar    " Swap two quickfix lists
23426a8958dbSBram Moolenaar    Xexpr "File1:10:Line10"
23436a8958dbSBram Moolenaar    Xexpr "File2:20:Line20"
23446a8958dbSBram Moolenaar    Xexpr "File3:30:Line30"
23456a8958dbSBram Moolenaar    call g:Xsetlist([], 'r', {'nr':1,'title':'Colors','context':['Colors']})
23466a8958dbSBram Moolenaar    call g:Xsetlist([], 'r', {'nr':2,'title':'Fruits','context':['Fruits']})
23476a8958dbSBram Moolenaar    let l1=g:Xgetlist({'nr':1,'all':1})
23486a8958dbSBram Moolenaar    let l2=g:Xgetlist({'nr':2,'all':1})
2349a539f4f1SBram Moolenaar    let save_id = l1.id
2350a539f4f1SBram Moolenaar    let l1.id=l2.id
2351a539f4f1SBram Moolenaar    let l2.id=save_id
23526a8958dbSBram Moolenaar    call g:Xsetlist([], 'r', l1)
23536a8958dbSBram Moolenaar    call g:Xsetlist([], 'r', l2)
23546a8958dbSBram Moolenaar    let newl1=g:Xgetlist({'nr':1,'all':1})
23556a8958dbSBram Moolenaar    let newl2=g:Xgetlist({'nr':2,'all':1})
2356b4d5fbabSBram Moolenaar    call assert_equal('Fruits', newl1.title)
23576a8958dbSBram Moolenaar    call assert_equal(['Fruits'], newl1.context)
23586a8958dbSBram Moolenaar    call assert_equal('Line20', newl1.items[0].text)
2359b4d5fbabSBram Moolenaar    call assert_equal('Colors', newl2.title)
23606a8958dbSBram Moolenaar    call assert_equal(['Colors'], newl2.context)
23616a8958dbSBram Moolenaar    call assert_equal('Line10', newl2.items[0].text)
23626a8958dbSBram Moolenaar    call g:Xsetlist([], 'f')
2363be7a50c2SBram Moolenaar
2364be7a50c2SBram Moolenaar    " Cannot specify both a non-empty list argument and a dict argument
2365be7a50c2SBram Moolenaar    call assert_fails("call g:Xsetlist([{}], ' ', {})", 'E475:')
23662b946c9fSBram Moolenaarendfunc
2367d823fa91SBram Moolenaar
23682b946c9fSBram Moolenaarfunc Test_qf_property()
2369d823fa91SBram Moolenaar    call Xproperty_tests('c')
2370d823fa91SBram Moolenaar    call Xproperty_tests('l')
23712b946c9fSBram Moolenaarendfunc
237204c4ce65SBram Moolenaar
23735b69c22fSBram Moolenaar" Test for setting the current index in the location/quickfix list
23745b69c22fSBram Moolenaarfunc Xtest_setqfidx(cchar)
23755b69c22fSBram Moolenaar  call s:setup_commands(a:cchar)
23765b69c22fSBram Moolenaar
23775b69c22fSBram Moolenaar  Xgetexpr "F1:10:1:Line1\nF2:20:2:Line2\nF3:30:3:Line3"
23785b69c22fSBram Moolenaar  Xgetexpr "F4:10:1:Line1\nF5:20:2:Line2\nF6:30:3:Line3"
23795b69c22fSBram Moolenaar  Xgetexpr "F7:10:1:Line1\nF8:20:2:Line2\nF9:30:3:Line3"
23805b69c22fSBram Moolenaar
23815b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 3, 'idx' : 2})
23825b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'idx' : 2})
23835b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 3})
23845b69c22fSBram Moolenaar  Xolder 2
23855b69c22fSBram Moolenaar  Xopen
23865b69c22fSBram Moolenaar  call assert_equal(3, line('.'))
23875b69c22fSBram Moolenaar  Xnewer
23885b69c22fSBram Moolenaar  call assert_equal(2, line('.'))
23895b69c22fSBram Moolenaar  Xnewer
23905b69c22fSBram Moolenaar  call assert_equal(2, line('.'))
23915b69c22fSBram Moolenaar  " Update the current index with the quickfix window open
23925b69c22fSBram Moolenaar  wincmd w
23935b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 3, 'idx' : 3})
23945b69c22fSBram Moolenaar  Xopen
23955b69c22fSBram Moolenaar  call assert_equal(3, line('.'))
23965b69c22fSBram Moolenaar  Xclose
23975b69c22fSBram Moolenaar
23985b69c22fSBram Moolenaar  " Set the current index to the last entry
23995b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : '$'})
24005b69c22fSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
24015b69c22fSBram Moolenaar  " A large value should set the index to the last index
24025b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 1})
24035b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 999})
24045b69c22fSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
24055b69c22fSBram Moolenaar  " Invalid index values
24065b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : -1})
24075b69c22fSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
24085b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 0})
24095b69c22fSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
24105b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 'xx'})
24115b69c22fSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
24125b69c22fSBram Moolenaar  call assert_fails("call g:Xsetlist([], 'a', {'nr':1, 'idx':[]})", 'E745:')
24135b69c22fSBram Moolenaar
24145b69c22fSBram Moolenaar  call g:Xsetlist([], 'f')
24155b69c22fSBram Moolenaar  new | only
24165b69c22fSBram Moolenaarendfunc
24175b69c22fSBram Moolenaar
24185b69c22fSBram Moolenaarfunc Test_setqfidx()
24195b69c22fSBram Moolenaar  call Xtest_setqfidx('c')
24205b69c22fSBram Moolenaar  call Xtest_setqfidx('l')
24215b69c22fSBram Moolenaarendfunc
24225b69c22fSBram Moolenaar
242304c4ce65SBram Moolenaar" Tests for the QuickFixCmdPre/QuickFixCmdPost autocommands
24242b946c9fSBram Moolenaarfunc QfAutoCmdHandler(loc, cmd)
242504c4ce65SBram Moolenaar  call add(g:acmds, a:loc . a:cmd)
24262b946c9fSBram Moolenaarendfunc
242704c4ce65SBram Moolenaar
24282b946c9fSBram Moolenaarfunc Test_Autocmd()
242904c4ce65SBram Moolenaar  autocmd QuickFixCmdPre * call QfAutoCmdHandler('pre', expand('<amatch>'))
243004c4ce65SBram Moolenaar  autocmd QuickFixCmdPost * call QfAutoCmdHandler('post', expand('<amatch>'))
243104c4ce65SBram Moolenaar
243204c4ce65SBram Moolenaar  let g:acmds = []
243304c4ce65SBram Moolenaar  cexpr "F1:10:Line 10"
243404c4ce65SBram Moolenaar  caddexpr "F1:20:Line 20"
243504c4ce65SBram Moolenaar  cgetexpr "F1:30:Line 30"
24361ed2276fSBram Moolenaar  cexpr ""
24371ed2276fSBram Moolenaar  caddexpr ""
24381ed2276fSBram Moolenaar  cgetexpr ""
24391ed2276fSBram Moolenaar  silent! cexpr non_existing_func()
24401ed2276fSBram Moolenaar  silent! caddexpr non_existing_func()
24411ed2276fSBram Moolenaar  silent! cgetexpr non_existing_func()
244204c4ce65SBram Moolenaar  let l = ['precexpr',
244304c4ce65SBram Moolenaar	      \ 'postcexpr',
244404c4ce65SBram Moolenaar	      \ 'precaddexpr',
244504c4ce65SBram Moolenaar	      \ 'postcaddexpr',
244604c4ce65SBram Moolenaar	      \ 'precgetexpr',
244704c4ce65SBram Moolenaar	      \ 'postcgetexpr',
24481ed2276fSBram Moolenaar	      \ 'precexpr',
24491ed2276fSBram Moolenaar	      \ 'postcexpr',
24501ed2276fSBram Moolenaar	      \ 'precaddexpr',
24511ed2276fSBram Moolenaar	      \ 'postcaddexpr',
24521ed2276fSBram Moolenaar	      \ 'precgetexpr',
24531ed2276fSBram Moolenaar	      \ 'postcgetexpr',
24541ed2276fSBram Moolenaar	      \ 'precexpr',
24551ed2276fSBram Moolenaar	      \ 'precaddexpr',
24561ed2276fSBram Moolenaar	      \ 'precgetexpr']
24571ed2276fSBram Moolenaar  call assert_equal(l, g:acmds)
24581ed2276fSBram Moolenaar
24591ed2276fSBram Moolenaar  let g:acmds = []
24601ed2276fSBram Moolenaar  enew! | call append(0, "F2:10:Line 10")
24611ed2276fSBram Moolenaar  cbuffer!
24621ed2276fSBram Moolenaar  enew! | call append(0, "F2:20:Line 20")
24631ed2276fSBram Moolenaar  cgetbuffer
24641ed2276fSBram Moolenaar  enew! | call append(0, "F2:30:Line 30")
24651ed2276fSBram Moolenaar  caddbuffer
24661ed2276fSBram Moolenaar  new
24671ed2276fSBram Moolenaar  let bnum = bufnr('%')
24681ed2276fSBram Moolenaar  bunload
24691ed2276fSBram Moolenaar  exe 'silent! cbuffer! ' . bnum
24701ed2276fSBram Moolenaar  exe 'silent! cgetbuffer ' . bnum
24711ed2276fSBram Moolenaar  exe 'silent! caddbuffer ' . bnum
24721ed2276fSBram Moolenaar  enew!
24731ed2276fSBram Moolenaar  let l = ['precbuffer',
247404c4ce65SBram Moolenaar	      \ 'postcbuffer',
247504c4ce65SBram Moolenaar	      \ 'precgetbuffer',
247604c4ce65SBram Moolenaar	      \ 'postcgetbuffer',
247704c4ce65SBram Moolenaar	      \ 'precaddbuffer',
24781ed2276fSBram Moolenaar	      \ 'postcaddbuffer',
24791ed2276fSBram Moolenaar	      \ 'precbuffer',
24801ed2276fSBram Moolenaar	      \ 'precgetbuffer',
24811ed2276fSBram Moolenaar	      \ 'precaddbuffer']
248204c4ce65SBram Moolenaar  call assert_equal(l, g:acmds)
24831ed2276fSBram Moolenaar
24841ed2276fSBram Moolenaar  call writefile(['Xtest:1:Line1'], 'Xtest')
24851ed2276fSBram Moolenaar  call writefile([], 'Xempty')
24861ed2276fSBram Moolenaar  let g:acmds = []
24871ed2276fSBram Moolenaar  cfile Xtest
24881ed2276fSBram Moolenaar  caddfile Xtest
24891ed2276fSBram Moolenaar  cgetfile Xtest
24901ed2276fSBram Moolenaar  cfile Xempty
24911ed2276fSBram Moolenaar  caddfile Xempty
24921ed2276fSBram Moolenaar  cgetfile Xempty
24931ed2276fSBram Moolenaar  silent! cfile do_not_exist
24941ed2276fSBram Moolenaar  silent! caddfile do_not_exist
24951ed2276fSBram Moolenaar  silent! cgetfile do_not_exist
24961ed2276fSBram Moolenaar  let l = ['precfile',
24971ed2276fSBram Moolenaar	      \ 'postcfile',
24981ed2276fSBram Moolenaar	      \ 'precaddfile',
24991ed2276fSBram Moolenaar	      \ 'postcaddfile',
25001ed2276fSBram Moolenaar	      \ 'precgetfile',
25011ed2276fSBram Moolenaar	      \ 'postcgetfile',
25021ed2276fSBram Moolenaar	      \ 'precfile',
25031ed2276fSBram Moolenaar	      \ 'postcfile',
25041ed2276fSBram Moolenaar	      \ 'precaddfile',
25051ed2276fSBram Moolenaar	      \ 'postcaddfile',
25061ed2276fSBram Moolenaar	      \ 'precgetfile',
25071ed2276fSBram Moolenaar	      \ 'postcgetfile',
25081ed2276fSBram Moolenaar	      \ 'precfile',
25091ed2276fSBram Moolenaar	      \ 'postcfile',
25101ed2276fSBram Moolenaar	      \ 'precaddfile',
25111ed2276fSBram Moolenaar	      \ 'postcaddfile',
25121ed2276fSBram Moolenaar	      \ 'precgetfile',
25131ed2276fSBram Moolenaar	      \ 'postcgetfile']
25141ed2276fSBram Moolenaar  call assert_equal(l, g:acmds)
25151ed2276fSBram Moolenaar
25161ed2276fSBram Moolenaar  let g:acmds = []
25171ed2276fSBram Moolenaar  helpgrep quickfix
25181ed2276fSBram Moolenaar  silent! helpgrep non_existing_help_topic
25191ed2276fSBram Moolenaar  vimgrep test Xtest
25201ed2276fSBram Moolenaar  vimgrepadd test Xtest
25211ed2276fSBram Moolenaar  silent! vimgrep non_existing_test Xtest
25221ed2276fSBram Moolenaar  silent! vimgrepadd non_existing_test Xtest
25231ed2276fSBram Moolenaar  set makeprg=
25241ed2276fSBram Moolenaar  silent! make
25251ed2276fSBram Moolenaar  set makeprg&
25261ed2276fSBram Moolenaar  let l = ['prehelpgrep',
25271ed2276fSBram Moolenaar	      \ 'posthelpgrep',
25281ed2276fSBram Moolenaar	      \ 'prehelpgrep',
25291ed2276fSBram Moolenaar	      \ 'posthelpgrep',
25301ed2276fSBram Moolenaar	      \ 'previmgrep',
25311ed2276fSBram Moolenaar	      \ 'postvimgrep',
25321ed2276fSBram Moolenaar	      \ 'previmgrepadd',
25331ed2276fSBram Moolenaar	      \ 'postvimgrepadd',
25341ed2276fSBram Moolenaar	      \ 'previmgrep',
25351ed2276fSBram Moolenaar	      \ 'postvimgrep',
25361ed2276fSBram Moolenaar	      \ 'previmgrepadd',
25371ed2276fSBram Moolenaar	      \ 'postvimgrepadd',
25381ed2276fSBram Moolenaar	      \ 'premake',
25391ed2276fSBram Moolenaar	      \ 'postmake']
25401ed2276fSBram Moolenaar  call assert_equal(l, g:acmds)
25411ed2276fSBram Moolenaar
25421ed2276fSBram Moolenaar  if has('unix')
25431ed2276fSBram Moolenaar    " Run this test only on Unix-like systems. The grepprg may not be set on
25441ed2276fSBram Moolenaar    " non-Unix systems.
25451ed2276fSBram Moolenaar    " The following lines are used for the grep test. Don't remove.
25461ed2276fSBram Moolenaar    " Grep_Autocmd_Text: Match 1
25471ed2276fSBram Moolenaar    " GrepAdd_Autocmd_Text: Match 2
25481ed2276fSBram Moolenaar    let g:acmds = []
25491ed2276fSBram Moolenaar    silent grep Grep_Autocmd_Text test_quickfix.vim
25501ed2276fSBram Moolenaar    silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim
25511ed2276fSBram Moolenaar    silent grep abc123def Xtest
25521ed2276fSBram Moolenaar    silent grepadd abc123def Xtest
255315a7bdcbSBram Moolenaar    set grepprg=internal
255415a7bdcbSBram Moolenaar    silent grep Grep_Autocmd_Text test_quickfix.vim
255515a7bdcbSBram Moolenaar    silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim
255615a7bdcbSBram Moolenaar    silent lgrep Grep_Autocmd_Text test_quickfix.vim
255715a7bdcbSBram Moolenaar    silent lgrepadd GrepAdd_Autocmd_Text test_quickfix.vim
255815a7bdcbSBram Moolenaar    set grepprg&vim
25591ed2276fSBram Moolenaar    let l = ['pregrep',
25601ed2276fSBram Moolenaar		\ 'postgrep',
25611ed2276fSBram Moolenaar		\ 'pregrepadd',
25621ed2276fSBram Moolenaar		\ 'postgrepadd',
25631ed2276fSBram Moolenaar		\ 'pregrep',
25641ed2276fSBram Moolenaar		\ 'postgrep',
25651ed2276fSBram Moolenaar		\ 'pregrepadd',
256615a7bdcbSBram Moolenaar		\ 'postgrepadd',
256715a7bdcbSBram Moolenaar		\ 'pregrep',
256815a7bdcbSBram Moolenaar		\ 'postgrep',
256915a7bdcbSBram Moolenaar		\ 'pregrepadd',
257015a7bdcbSBram Moolenaar		\ 'postgrepadd',
257115a7bdcbSBram Moolenaar		\ 'prelgrep',
257215a7bdcbSBram Moolenaar		\ 'postlgrep',
257315a7bdcbSBram Moolenaar		\ 'prelgrepadd',
257415a7bdcbSBram Moolenaar		\ 'postlgrepadd']
25751ed2276fSBram Moolenaar    call assert_equal(l, g:acmds)
25761ed2276fSBram Moolenaar  endif
25771ed2276fSBram Moolenaar
25781ed2276fSBram Moolenaar  call delete('Xtest')
25791ed2276fSBram Moolenaar  call delete('Xempty')
2580b254af31SBram Moolenaar  au! QuickFixCmdPre
2581b254af31SBram Moolenaar  au! QuickFixCmdPost
25822b946c9fSBram Moolenaarendfunc
258321662be2SBram Moolenaar
25842b946c9fSBram Moolenaarfunc Test_Autocmd_Exception()
258521662be2SBram Moolenaar  set efm=%m
258621662be2SBram Moolenaar  lgetexpr '?'
258721662be2SBram Moolenaar
258821662be2SBram Moolenaar  try
258921662be2SBram Moolenaar    call DoesNotExit()
259021662be2SBram Moolenaar  catch
259121662be2SBram Moolenaar    lgetexpr '1'
259221662be2SBram Moolenaar  finally
259321662be2SBram Moolenaar    lgetexpr '1'
259421662be2SBram Moolenaar  endtry
259521662be2SBram Moolenaar
259621662be2SBram Moolenaar  call assert_equal('1', getloclist(0)[0].text)
259721662be2SBram Moolenaar
259821662be2SBram Moolenaar  set efm&vim
25992b946c9fSBram Moolenaarendfunc
260063bed3d3SBram Moolenaar
26012b946c9fSBram Moolenaarfunc Test_caddbuffer_wrong()
26022b946c9fSBram Moolenaar  " This used to cause a memory access in freed memory.
260363bed3d3SBram Moolenaar  let save_efm = &efm
260463bed3d3SBram Moolenaar  set efm=%EEEE%m,%WWWW,%+CCCC%>%#,%GGGG%.#
260563bed3d3SBram Moolenaar  cgetexpr ['WWWW', 'EEEE', 'CCCC']
260663bed3d3SBram Moolenaar  let &efm = save_efm
26072b946c9fSBram Moolenaar  caddbuffer
260863bed3d3SBram Moolenaar  bwipe!
260963bed3d3SBram Moolenaarendfunc
26102b946c9fSBram Moolenaar
26112b946c9fSBram Moolenaarfunc Test_caddexpr_wrong()
26122b946c9fSBram Moolenaar  " This used to cause a memory access in freed memory.
26132b946c9fSBram Moolenaar  cbuffer
26142b946c9fSBram Moolenaar  cbuffer
26152b946c9fSBram Moolenaar  copen
26162b946c9fSBram Moolenaar  let save_efm = &efm
26172b946c9fSBram Moolenaar  set efm=%
26182b946c9fSBram Moolenaar  call assert_fails('caddexpr ""', 'E376:')
26192b946c9fSBram Moolenaar  let &efm = save_efm
26202b946c9fSBram Moolenaarendfunc
26217618e00dSBram Moolenaar
26227618e00dSBram Moolenaarfunc Test_dirstack_cleanup()
26237618e00dSBram Moolenaar  " This used to cause a memory access in freed memory.
26247618e00dSBram Moolenaar  let save_efm = &efm
26257618e00dSBram Moolenaar  lexpr '0'
26267618e00dSBram Moolenaar  lopen
26277618e00dSBram Moolenaar  fun X(c)
26287618e00dSBram Moolenaar    let save_efm=&efm
26297618e00dSBram Moolenaar    set efm=%D%f
26307618e00dSBram Moolenaar    if a:c == 'c'
26317618e00dSBram Moolenaar      caddexpr '::'
26327618e00dSBram Moolenaar    else
26337618e00dSBram Moolenaar      laddexpr ':0:0'
26347618e00dSBram Moolenaar    endif
26357618e00dSBram Moolenaar    let &efm=save_efm
26367618e00dSBram Moolenaar  endfun
26377618e00dSBram Moolenaar  call X('c')
26387618e00dSBram Moolenaar  call X('l')
26397618e00dSBram Moolenaar  call setqflist([], 'r')
26407618e00dSBram Moolenaar  caddbuffer
26417618e00dSBram Moolenaar  let &efm = save_efm
26427618e00dSBram Moolenaarendfunc
2643391b1dd0SBram Moolenaar
2644391b1dd0SBram Moolenaar" Tests for jumping to entries from the location list window and quickfix
2645391b1dd0SBram Moolenaar" window
2646391b1dd0SBram Moolenaarfunc Test_cwindow_jump()
2647391b1dd0SBram Moolenaar  set efm=%f%%%l%%%m
2648391b1dd0SBram Moolenaar  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2649391b1dd0SBram Moolenaar  lopen | only
2650391b1dd0SBram Moolenaar  lfirst
2651391b1dd0SBram Moolenaar  call assert_true(winnr('$') == 2)
2652391b1dd0SBram Moolenaar  call assert_true(winnr() == 1)
2653391b1dd0SBram Moolenaar  " Location list for the new window should be set
2654391b1dd0SBram Moolenaar  call assert_true(getloclist(0)[2].text == 'Line 30')
2655391b1dd0SBram Moolenaar
2656391b1dd0SBram Moolenaar  " Open a scratch buffer
2657391b1dd0SBram Moolenaar  " Open a new window and create a location list
2658391b1dd0SBram Moolenaar  " Open the location list window and close the other window
2659391b1dd0SBram Moolenaar  " Jump to an entry.
2660eeb1b9c7SBram Moolenaar  " Should create a new window and jump to the entry. The scratch buffer
2661391b1dd0SBram Moolenaar  " should not be used.
2662391b1dd0SBram Moolenaar  enew | only
2663391b1dd0SBram Moolenaar  set buftype=nofile
2664391b1dd0SBram Moolenaar  below new
2665391b1dd0SBram Moolenaar  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2666391b1dd0SBram Moolenaar  lopen
2667391b1dd0SBram Moolenaar  2wincmd c
2668391b1dd0SBram Moolenaar  lnext
2669391b1dd0SBram Moolenaar  call assert_true(winnr('$') == 3)
2670391b1dd0SBram Moolenaar  call assert_true(winnr() == 2)
2671391b1dd0SBram Moolenaar
2672391b1dd0SBram Moolenaar  " Open two windows with two different location lists
2673391b1dd0SBram Moolenaar  " Open the location list window and close the previous window
2674391b1dd0SBram Moolenaar  " Jump to an entry in the location list window
2675391b1dd0SBram Moolenaar  " Should open the file in the first window and not set the location list.
2676391b1dd0SBram Moolenaar  enew | only
2677391b1dd0SBram Moolenaar  lgetexpr ["F1%5%Line 5"]
2678391b1dd0SBram Moolenaar  below new
2679391b1dd0SBram Moolenaar  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2680391b1dd0SBram Moolenaar  lopen
2681391b1dd0SBram Moolenaar  2wincmd c
2682391b1dd0SBram Moolenaar  lnext
2683391b1dd0SBram Moolenaar  call assert_true(winnr() == 1)
2684391b1dd0SBram Moolenaar  call assert_true(getloclist(0)[0].text == 'Line 5')
2685391b1dd0SBram Moolenaar
2686391b1dd0SBram Moolenaar  enew | only
2687391b1dd0SBram Moolenaar  cgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2688391b1dd0SBram Moolenaar  copen
2689391b1dd0SBram Moolenaar  cnext
2690391b1dd0SBram Moolenaar  call assert_true(winnr('$') == 2)
2691391b1dd0SBram Moolenaar  call assert_true(winnr() == 1)
2692391b1dd0SBram Moolenaar
2693f9ae154cSBram Moolenaar  " open the quickfix buffer in two windows and jump to an entry. Should open
2694f9ae154cSBram Moolenaar  " the file in the first quickfix window.
2695f9ae154cSBram Moolenaar  enew | only
2696f9ae154cSBram Moolenaar  copen
2697f9ae154cSBram Moolenaar  let bnum = bufnr('')
2698f9ae154cSBram Moolenaar  exe 'sbuffer ' . bnum
2699f9ae154cSBram Moolenaar  wincmd b
2700f9ae154cSBram Moolenaar  cfirst
2701f9ae154cSBram Moolenaar  call assert_equal(2, winnr())
2702bdd2c290SBram Moolenaar  call assert_equal('F1', @%)
2703f9ae154cSBram Moolenaar  enew | only
2704f9ae154cSBram Moolenaar  exe 'sb' bnum
2705f9ae154cSBram Moolenaar  exe 'botright sb' bnum
2706f9ae154cSBram Moolenaar  wincmd t
2707f9ae154cSBram Moolenaar  clast
2708f9ae154cSBram Moolenaar  call assert_equal(2, winnr())
2709f9ae154cSBram Moolenaar  call assert_equal('quickfix', getwinvar(1, '&buftype'))
2710f9ae154cSBram Moolenaar  call assert_equal('quickfix', getwinvar(3, '&buftype'))
2711f9ae154cSBram Moolenaar
27124b96df5aSBram Moolenaar  " Jumping to a file from the location list window should find a usable
271315a7bdcbSBram Moolenaar  " window by wrapping around the window list.
271415a7bdcbSBram Moolenaar  enew | only
271515a7bdcbSBram Moolenaar  call setloclist(0, [], 'f')
271615a7bdcbSBram Moolenaar  new | new
271715a7bdcbSBram Moolenaar  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
271815a7bdcbSBram Moolenaar  lopen
271915a7bdcbSBram Moolenaar  1close
272015a7bdcbSBram Moolenaar  call assert_equal(0, getloclist(3, {'id' : 0}).id)
272115a7bdcbSBram Moolenaar  lnext
272215a7bdcbSBram Moolenaar  call assert_equal(3, winnr())
272315a7bdcbSBram Moolenaar  call assert_equal(getloclist(1, {'id' : 0}).id, getloclist(3, {'id' : 0}).id)
272415a7bdcbSBram Moolenaar
2725391b1dd0SBram Moolenaar  enew | only
2726391b1dd0SBram Moolenaar  set efm&vim
2727391b1dd0SBram Moolenaarendfunc
2728ee85df37SBram Moolenaar
2729e00fdf35SBram Moolenaarfunc Test_cwindow_highlight()
2730e00fdf35SBram Moolenaar  CheckScreendump
2731e00fdf35SBram Moolenaar
2732e00fdf35SBram Moolenaar  let lines =<< trim END
2733e00fdf35SBram Moolenaar	call setline(1, ['some', 'text', 'with', 'matches'])
2734e00fdf35SBram Moolenaar	write XCwindow
2735e00fdf35SBram Moolenaar	vimgrep e XCwindow
2736e00fdf35SBram Moolenaar	redraw
2737e00fdf35SBram Moolenaar	cwindow 4
2738e00fdf35SBram Moolenaar  END
2739e00fdf35SBram Moolenaar  call writefile(lines, 'XtestCwindow')
2740e00fdf35SBram Moolenaar  let buf = RunVimInTerminal('-S XtestCwindow', #{rows: 12})
2741e00fdf35SBram Moolenaar  call VerifyScreenDump(buf, 'Test_quickfix_cwindow_1', {})
2742e00fdf35SBram Moolenaar
2743e00fdf35SBram Moolenaar  call term_sendkeys(buf, ":cnext\<CR>")
2744e00fdf35SBram Moolenaar  call VerifyScreenDump(buf, 'Test_quickfix_cwindow_2', {})
2745e00fdf35SBram Moolenaar
2746e00fdf35SBram Moolenaar  " clean up
2747e00fdf35SBram Moolenaar  call StopVimInTerminal(buf)
2748e00fdf35SBram Moolenaar  call delete('XtestCwindow')
2749e00fdf35SBram Moolenaar  call delete('XCwindow')
2750e00fdf35SBram Moolenaarendfunc
2751e00fdf35SBram Moolenaar
2752ee85df37SBram Moolenaarfunc XvimgrepTests(cchar)
2753ee85df37SBram Moolenaar  call s:setup_commands(a:cchar)
2754ee85df37SBram Moolenaar
2755ee85df37SBram Moolenaar  call writefile(['Editor:VIM vim',
2756ee85df37SBram Moolenaar	      \ 'Editor:Emacs EmAcS',
2757ee85df37SBram Moolenaar	      \ 'Editor:Notepad NOTEPAD'], 'Xtestfile1')
2758ee85df37SBram Moolenaar  call writefile(['Linux', 'MacOS', 'MS-Windows'], 'Xtestfile2')
2759ee85df37SBram Moolenaar
2760ee85df37SBram Moolenaar  " Error cases
2761ee85df37SBram Moolenaar  call assert_fails('Xvimgrep /abc *', 'E682:')
2762ee85df37SBram Moolenaar
2763ee85df37SBram Moolenaar  let @/=''
2764ee85df37SBram Moolenaar  call assert_fails('Xvimgrep // *', 'E35:')
2765ee85df37SBram Moolenaar
2766ee85df37SBram Moolenaar  call assert_fails('Xvimgrep abc', 'E683:')
2767ee85df37SBram Moolenaar  call assert_fails('Xvimgrep a1b2c3 Xtestfile1', 'E480:')
2768ee85df37SBram Moolenaar  call assert_fails('Xvimgrep pat Xa1b2c3', 'E480:')
2769ee85df37SBram Moolenaar
2770ee85df37SBram Moolenaar  Xexpr ""
2771ee85df37SBram Moolenaar  Xvimgrepadd Notepad Xtestfile1
2772ee85df37SBram Moolenaar  Xvimgrepadd MacOS Xtestfile2
2773ee85df37SBram Moolenaar  let l = g:Xgetlist()
2774ee85df37SBram Moolenaar  call assert_equal(2, len(l))
2775ee85df37SBram Moolenaar  call assert_equal('Editor:Notepad NOTEPAD', l[0].text)
2776ee85df37SBram Moolenaar
2777f9ae154cSBram Moolenaar  10Xvimgrep #\cvim#g Xtestfile?
2778ee85df37SBram Moolenaar  let l = g:Xgetlist()
2779ee85df37SBram Moolenaar  call assert_equal(2, len(l))
2780ee85df37SBram Moolenaar  call assert_equal(8, l[0].col)
2781ee85df37SBram Moolenaar  call assert_equal(12, l[1].col)
2782ee85df37SBram Moolenaar
2783ee85df37SBram Moolenaar  1Xvimgrep ?Editor? Xtestfile*
2784ee85df37SBram Moolenaar  let l = g:Xgetlist()
2785ee85df37SBram Moolenaar  call assert_equal(1, len(l))
2786ee85df37SBram Moolenaar  call assert_equal('Editor:VIM vim', l[0].text)
2787ee85df37SBram Moolenaar
2788ee85df37SBram Moolenaar  edit +3 Xtestfile2
2789ee85df37SBram Moolenaar  Xvimgrep +\cemacs+j Xtestfile1
2790ee85df37SBram Moolenaar  let l = g:Xgetlist()
2791bdd2c290SBram Moolenaar  call assert_equal('Xtestfile2', @%)
2792ee85df37SBram Moolenaar  call assert_equal('Editor:Emacs EmAcS', l[0].text)
2793ee85df37SBram Moolenaar
27942225ebb4SBram Moolenaar  " Test for unloading a buffer after vimgrep searched the buffer
27952225ebb4SBram Moolenaar  %bwipe
27962225ebb4SBram Moolenaar  Xvimgrep /Editor/j Xtestfile*
27972225ebb4SBram Moolenaar  call assert_equal(0, getbufinfo('Xtestfile1')[0].loaded)
27982225ebb4SBram Moolenaar  call assert_equal([], getbufinfo('Xtestfile2'))
27992225ebb4SBram Moolenaar
2800ee85df37SBram Moolenaar  call delete('Xtestfile1')
2801ee85df37SBram Moolenaar  call delete('Xtestfile2')
2802ee85df37SBram Moolenaarendfunc
2803ee85df37SBram Moolenaar
2804ee85df37SBram Moolenaar" Tests for the :vimgrep command
2805ee85df37SBram Moolenaarfunc Test_vimgrep()
2806ee85df37SBram Moolenaar  call XvimgrepTests('c')
2807ee85df37SBram Moolenaar  call XvimgrepTests('l')
2808ee85df37SBram Moolenaarendfunc
280969f40be6SBram Moolenaar
28101c299434SBram Moolenaar" Test for incsearch highlighting of the :vimgrep pattern
28111c299434SBram Moolenaar" This test used to cause "E315: ml_get: invalid lnum" errors.
28121c299434SBram Moolenaarfunc Test_vimgrep_incsearch()
28131c299434SBram Moolenaar  enew
28141c299434SBram Moolenaar  set incsearch
28151c299434SBram Moolenaar  call test_override("char_avail", 1)
28161c299434SBram Moolenaar
28171c299434SBram Moolenaar  call feedkeys(":2vimgrep assert test_quickfix.vim test_cdo.vim\<CR>", "ntx")
28181c299434SBram Moolenaar  let l = getqflist()
28191c299434SBram Moolenaar  call assert_equal(2, len(l))
28201c299434SBram Moolenaar
28211c299434SBram Moolenaar  call test_override("ALL", 0)
28221c299434SBram Moolenaar  set noincsearch
28231c299434SBram Moolenaarendfunc
28241c299434SBram Moolenaar
28259f6277bdSBram Moolenaar" Test vimgrep with the last search pattern not set
28269f6277bdSBram Moolenaarfunc Test_vimgrep_with_no_last_search_pat()
28279f6277bdSBram Moolenaar  let lines =<< trim [SCRIPT]
28289f6277bdSBram Moolenaar    call assert_fails('vimgrep // *', 'E35:')
28299f6277bdSBram Moolenaar    call writefile(v:errors, 'Xresult')
28309f6277bdSBram Moolenaar    qall!
28319f6277bdSBram Moolenaar  [SCRIPT]
28329f6277bdSBram Moolenaar  call writefile(lines, 'Xscript')
28339f6277bdSBram Moolenaar  if RunVim([], [], '--clean -S Xscript')
28349f6277bdSBram Moolenaar    call assert_equal([], readfile('Xresult'))
28359f6277bdSBram Moolenaar  endif
28369f6277bdSBram Moolenaar  call delete('Xscript')
28379f6277bdSBram Moolenaar  call delete('Xresult')
28389f6277bdSBram Moolenaarendfunc
28399f6277bdSBram Moolenaar
284069f40be6SBram Moolenaarfunc XfreeTests(cchar)
284169f40be6SBram Moolenaar  call s:setup_commands(a:cchar)
284269f40be6SBram Moolenaar
284369f40be6SBram Moolenaar  enew | only
284469f40be6SBram Moolenaar
284569f40be6SBram Moolenaar  " Deleting the quickfix stack should work even When the current list is
284669f40be6SBram Moolenaar  " somewhere in the middle of the stack
284769f40be6SBram Moolenaar  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
284869f40be6SBram Moolenaar  Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
284969f40be6SBram Moolenaar  Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
285069f40be6SBram Moolenaar  Xolder
285169f40be6SBram Moolenaar  call g:Xsetlist([], 'f')
285269f40be6SBram Moolenaar  call assert_equal(0, len(g:Xgetlist()))
285369f40be6SBram Moolenaar
285469f40be6SBram Moolenaar  " After deleting the stack, adding a new list should create a stack with a
285569f40be6SBram Moolenaar  " single list.
285669f40be6SBram Moolenaar  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
285769f40be6SBram Moolenaar  call assert_equal(1, g:Xgetlist({'all':1}).nr)
285869f40be6SBram Moolenaar
285969f40be6SBram Moolenaar  " Deleting the stack from a quickfix window should update/clear the
286069f40be6SBram Moolenaar  " quickfix/location list window.
286169f40be6SBram Moolenaar  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
286269f40be6SBram Moolenaar  Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
286369f40be6SBram Moolenaar  Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
286469f40be6SBram Moolenaar  Xolder
286569f40be6SBram Moolenaar  Xwindow
286669f40be6SBram Moolenaar  call g:Xsetlist([], 'f')
286769f40be6SBram Moolenaar  call assert_equal(2, winnr('$'))
286869f40be6SBram Moolenaar  call assert_equal(1, line('$'))
286969f40be6SBram Moolenaar  Xclose
287069f40be6SBram Moolenaar
287169f40be6SBram Moolenaar  " Deleting the stack from a non-quickfix window should update/clear the
287269f40be6SBram Moolenaar  " quickfix/location list window.
287369f40be6SBram Moolenaar  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
287469f40be6SBram Moolenaar  Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
287569f40be6SBram Moolenaar  Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
287669f40be6SBram Moolenaar  Xolder
287769f40be6SBram Moolenaar  Xwindow
287869f40be6SBram Moolenaar  wincmd p
287969f40be6SBram Moolenaar  call g:Xsetlist([], 'f')
288069f40be6SBram Moolenaar  call assert_equal(0, len(g:Xgetlist()))
288169f40be6SBram Moolenaar  wincmd p
288269f40be6SBram Moolenaar  call assert_equal(2, winnr('$'))
288369f40be6SBram Moolenaar  call assert_equal(1, line('$'))
288469f40be6SBram Moolenaar
288569f40be6SBram Moolenaar  " After deleting the location list stack, if the location list window is
288669f40be6SBram Moolenaar  " opened, then a new location list should be created. So opening the
288769f40be6SBram Moolenaar  " location list window again should not create a new window.
288869f40be6SBram Moolenaar  if a:cchar == 'l'
288969f40be6SBram Moolenaar      lexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
289069f40be6SBram Moolenaar      wincmd p
289169f40be6SBram Moolenaar      lopen
289269f40be6SBram Moolenaar      call assert_equal(2, winnr('$'))
289369f40be6SBram Moolenaar  endif
289469f40be6SBram Moolenaar  Xclose
289569f40be6SBram Moolenaarendfunc
289669f40be6SBram Moolenaar
289774240d3fSBram Moolenaar" Tests for the quickfix free functionality
289869f40be6SBram Moolenaarfunc Test_qf_free()
289969f40be6SBram Moolenaar  call XfreeTests('c')
290069f40be6SBram Moolenaar  call XfreeTests('l')
290169f40be6SBram Moolenaarendfunc
29026e62da3eSBram Moolenaar
29036e62da3eSBram Moolenaar" Test for buffer overflow when parsing lines and adding new entries to
29046e62da3eSBram Moolenaar" the quickfix list.
29056e62da3eSBram Moolenaarfunc Test_bufoverflow()
29066e62da3eSBram Moolenaar  set efm=%f:%l:%m
29076e62da3eSBram Moolenaar  cgetexpr ['File1:100:' . repeat('x', 1025)]
29086e62da3eSBram Moolenaar
29096e62da3eSBram Moolenaar  set efm=%+GCompiler:\ %.%#,%f:%l:%m
29106e62da3eSBram Moolenaar  cgetexpr ['Compiler: ' . repeat('a', 1015), 'File1:10:Hello World']
29116e62da3eSBram Moolenaar
29126e62da3eSBram Moolenaar  set efm=%DEntering\ directory\ %f,%f:%l:%m
29136e62da3eSBram Moolenaar  cgetexpr ['Entering directory ' . repeat('a', 1006),
29146e62da3eSBram Moolenaar	      \ 'File1:10:Hello World']
29156e62da3eSBram Moolenaar  set efm&vim
29166e62da3eSBram Moolenaarendfunc
29176e62da3eSBram Moolenaar
2918875feea6SBram Moolenaar" Tests for getting the quickfix stack size
2919875feea6SBram Moolenaarfunc XsizeTests(cchar)
2920875feea6SBram Moolenaar  call s:setup_commands(a:cchar)
2921875feea6SBram Moolenaar
2922875feea6SBram Moolenaar  call g:Xsetlist([], 'f')
2923875feea6SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
2924a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'nr':'$', 'all':1}).title)
2925a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr':0}).nr)
2926875feea6SBram Moolenaar
2927875feea6SBram Moolenaar  Xexpr "File1:10:Line1"
2928875feea6SBram Moolenaar  Xexpr "File2:20:Line2"
2929875feea6SBram Moolenaar  Xexpr "File3:30:Line3"
2930875feea6SBram Moolenaar  Xolder | Xolder
2931875feea6SBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
2932875feea6SBram Moolenaar  call g:Xsetlist([], 'f')
2933875feea6SBram Moolenaar
2934875feea6SBram Moolenaar  Xexpr "File1:10:Line1"
2935875feea6SBram Moolenaar  Xexpr "File2:20:Line2"
2936875feea6SBram Moolenaar  Xexpr "File3:30:Line3"
2937875feea6SBram Moolenaar  Xolder | Xolder
2938875feea6SBram Moolenaar  call g:Xsetlist([], 'a', {'nr':'$', 'title':'Compiler'})
2939875feea6SBram Moolenaar  call assert_equal('Compiler', g:Xgetlist({'nr':3, 'all':1}).title)
2940875feea6SBram Moolenaarendfunc
2941875feea6SBram Moolenaar
2942875feea6SBram Moolenaarfunc Test_Qf_Size()
2943875feea6SBram Moolenaar  call XsizeTests('c')
2944875feea6SBram Moolenaar  call XsizeTests('l')
2945875feea6SBram Moolenaarendfunc
29461814183bSBram Moolenaar
29479c4fefffSBram Moolenaarfunc Test_cclose_from_copen()
29489c4fefffSBram Moolenaar    augroup QF_Test
29499c4fefffSBram Moolenaar	au!
29509c4fefffSBram Moolenaar        au FileType qf :call assert_fails(':cclose', 'E788')
29519c4fefffSBram Moolenaar    augroup END
29529c4fefffSBram Moolenaar    copen
29539c4fefffSBram Moolenaar    augroup QF_Test
29549c4fefffSBram Moolenaar	au!
29559c4fefffSBram Moolenaar    augroup END
29569c4fefffSBram Moolenaar    augroup! QF_Test
29579c4fefffSBram Moolenaarendfunc
29589c4fefffSBram Moolenaar
29591814183bSBram Moolenaarfunc Test_cclose_in_autocmd()
29601814183bSBram Moolenaar  " Problem is only triggered if "starting" is zero, so that the OptionsSet
29611814183bSBram Moolenaar  " event will be triggered.
29621814183bSBram Moolenaar  call test_override('starting', 1)
29631814183bSBram Moolenaar  augroup QF_Test
29641814183bSBram Moolenaar    au!
29651814183bSBram Moolenaar    au FileType qf :call assert_fails(':cclose', 'E788')
29661814183bSBram Moolenaar  augroup END
29671814183bSBram Moolenaar  copen
29681814183bSBram Moolenaar  augroup QF_Test
29691814183bSBram Moolenaar    au!
29701814183bSBram Moolenaar  augroup END
29711814183bSBram Moolenaar  augroup! QF_Test
29721814183bSBram Moolenaar  call test_override('starting', 0)
29731814183bSBram Moolenaarendfunc
29749c4fefffSBram Moolenaar
2975379fb76bSBram Moolenaar" Check that ":file" without an argument is possible even when "curbuf_lock"
2976379fb76bSBram Moolenaar" is set.
2977379fb76bSBram Moolenaarfunc Test_file_from_copen()
2978379fb76bSBram Moolenaar  " Works without argument.
2979379fb76bSBram Moolenaar  augroup QF_Test
2980379fb76bSBram Moolenaar    au!
2981379fb76bSBram Moolenaar    au FileType qf file
2982379fb76bSBram Moolenaar  augroup END
2983379fb76bSBram Moolenaar  copen
2984379fb76bSBram Moolenaar
2985379fb76bSBram Moolenaar  augroup QF_Test
2986379fb76bSBram Moolenaar    au!
2987379fb76bSBram Moolenaar  augroup END
2988379fb76bSBram Moolenaar  cclose
2989379fb76bSBram Moolenaar
2990379fb76bSBram Moolenaar  " Fails with argument.
2991379fb76bSBram Moolenaar  augroup QF_Test
2992379fb76bSBram Moolenaar    au!
2993379fb76bSBram Moolenaar    au FileType qf call assert_fails(':file foo', 'E788')
2994379fb76bSBram Moolenaar  augroup END
2995379fb76bSBram Moolenaar  copen
2996379fb76bSBram Moolenaar  augroup QF_Test
2997379fb76bSBram Moolenaar    au!
2998379fb76bSBram Moolenaar  augroup END
2999379fb76bSBram Moolenaar  cclose
3000379fb76bSBram Moolenaar
3001379fb76bSBram Moolenaar  augroup! QF_Test
30026a0cc916SBram Moolenaarendfunc
3003379fb76bSBram Moolenaar
30049c4fefffSBram Moolenaarfunc Test_resize_from_copen()
30059c4fefffSBram Moolenaar    augroup QF_Test
30069c4fefffSBram Moolenaar	au!
30079c4fefffSBram Moolenaar        au FileType qf resize 5
30089c4fefffSBram Moolenaar    augroup END
30099c4fefffSBram Moolenaar    try
30109c4fefffSBram Moolenaar	" This should succeed without any exception.  No other buffers are
30119c4fefffSBram Moolenaar	" involved in the autocmd.
30129c4fefffSBram Moolenaar	copen
30139c4fefffSBram Moolenaar    finally
30149c4fefffSBram Moolenaar	augroup QF_Test
30159c4fefffSBram Moolenaar	    au!
30169c4fefffSBram Moolenaar	augroup END
30179c4fefffSBram Moolenaar	augroup! QF_Test
30189c4fefffSBram Moolenaar    endtry
30199c4fefffSBram Moolenaarendfunc
3020a8788f4dSBram Moolenaar
3021a8788f4dSBram Moolenaar" Tests for the quickfix buffer b:changedtick variable
3022a8788f4dSBram Moolenaarfunc Xchangedtick_tests(cchar)
3023a8788f4dSBram Moolenaar  call s:setup_commands(a:cchar)
3024a8788f4dSBram Moolenaar
3025a8788f4dSBram Moolenaar  new | only
3026a8788f4dSBram Moolenaar
3027a8788f4dSBram Moolenaar  Xexpr "" | Xexpr "" | Xexpr ""
3028a8788f4dSBram Moolenaar
3029a8788f4dSBram Moolenaar  Xopen
3030a8788f4dSBram Moolenaar  Xolder
3031a8788f4dSBram Moolenaar  Xolder
3032a8788f4dSBram Moolenaar  Xaddexpr "F1:10:Line10"
3033a8788f4dSBram Moolenaar  Xaddexpr "F2:20:Line20"
3034a8788f4dSBram Moolenaar  call g:Xsetlist([{"filename":"F3", "lnum":30, "text":"Line30"}], 'a')
3035a8788f4dSBram Moolenaar  call g:Xsetlist([], 'f')
3036a8788f4dSBram Moolenaar  call assert_equal(8, getbufvar('%', 'changedtick'))
3037a8788f4dSBram Moolenaar  Xclose
3038a8788f4dSBram Moolenaarendfunc
3039a8788f4dSBram Moolenaar
3040a8788f4dSBram Moolenaarfunc Test_changedtick()
3041a8788f4dSBram Moolenaar  call Xchangedtick_tests('c')
3042a8788f4dSBram Moolenaar  call Xchangedtick_tests('l')
3043a8788f4dSBram Moolenaarendfunc
3044d28cc3f5SBram Moolenaar
3045ae338338SBram Moolenaar" Tests for parsing an expression using setqflist()
3046ae338338SBram Moolenaarfunc Xsetexpr_tests(cchar)
3047ae338338SBram Moolenaar  call s:setup_commands(a:cchar)
3048ae338338SBram Moolenaar
3049ae338338SBram Moolenaar  let t = ["File1:10:Line10", "File1:20:Line20"]
30502c809b7cSBram Moolenaar  call g:Xsetlist([], ' ', {'lines' : t})
30512c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'lines' : ["File1:30:Line30"]})
3052ae338338SBram Moolenaar
3053ae338338SBram Moolenaar  let l = g:Xgetlist()
3054ae338338SBram Moolenaar  call assert_equal(3, len(l))
3055ae338338SBram Moolenaar  call assert_equal(20, l[1].lnum)
3056ae338338SBram Moolenaar  call assert_equal('Line30', l[2].text)
30572c809b7cSBram Moolenaar  call g:Xsetlist([], 'r', {'lines' : ["File2:5:Line5"]})
3058ae338338SBram Moolenaar  let l = g:Xgetlist()
3059ae338338SBram Moolenaar  call assert_equal(1, len(l))
3060ae338338SBram Moolenaar  call assert_equal('Line5', l[0].text)
30612c809b7cSBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : 10}))
30622c809b7cSBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : "F1:10:L10"}))
3063ae338338SBram Moolenaar
3064ae338338SBram Moolenaar  call g:Xsetlist([], 'f')
3065ae338338SBram Moolenaar  " Add entries to multiple lists
30662c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:10:Line10"]})
30672c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:20:Line20"]})
30682c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:15:Line15"]})
30692c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:25:Line25"]})
3070ae338338SBram Moolenaar  call assert_equal('Line15', g:Xgetlist({'nr':1, 'items':1}).items[1].text)
3071ae338338SBram Moolenaar  call assert_equal('Line25', g:Xgetlist({'nr':2, 'items':1}).items[1].text)
307236538225SBram Moolenaar
307336538225SBram Moolenaar  " Adding entries using a custom efm
307436538225SBram Moolenaar  set efm&
307536538225SBram Moolenaar  call g:Xsetlist([], ' ', {'efm' : '%f#%l#%m',
307636538225SBram Moolenaar				\ 'lines' : ["F1#10#L10", "F2#20#L20"]})
307736538225SBram Moolenaar  call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
307836538225SBram Moolenaar  call g:Xsetlist([], 'a', {'efm' : '%f#%l#%m', 'lines' : ["F3:30:L30"]})
307936538225SBram Moolenaar  call assert_equal('F3:30:L30', g:Xgetlist({'items':1}).items[2].text)
308036538225SBram Moolenaar  call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
308136538225SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'efm' : [],
308236538225SBram Moolenaar				\ 'lines' : ['F1:10:L10']}))
3083ae338338SBram Moolenaarendfunc
3084ae338338SBram Moolenaar
3085ae338338SBram Moolenaarfunc Test_setexpr()
3086ae338338SBram Moolenaar  call Xsetexpr_tests('c')
3087ae338338SBram Moolenaar  call Xsetexpr_tests('l')
3088ae338338SBram Moolenaarendfunc
3089ae338338SBram Moolenaar
3090ae338338SBram Moolenaar" Tests for per quickfix/location list directory stack
3091ae338338SBram Moolenaarfunc Xmultidirstack_tests(cchar)
3092ae338338SBram Moolenaar  call s:setup_commands(a:cchar)
3093ae338338SBram Moolenaar
3094ae338338SBram Moolenaar  call g:Xsetlist([], 'f')
3095ae338338SBram Moolenaar  Xexpr "" | Xexpr ""
3096ae338338SBram Moolenaar
30972c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["Entering dir 'Xone/a'"]})
30982c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["Entering dir 'Xtwo/a'"]})
30992c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["one.txt:3:one one one"]})
31002c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["two.txt:5:two two two"]})
3101ae338338SBram Moolenaar
3102ae338338SBram Moolenaar  let l1 = g:Xgetlist({'nr':1, 'items':1})
3103ae338338SBram Moolenaar  let l2 = g:Xgetlist({'nr':2, 'items':1})
3104ae338338SBram Moolenaar  call assert_equal('Xone/a/one.txt', bufname(l1.items[1].bufnr))
3105ae338338SBram Moolenaar  call assert_equal(3, l1.items[1].lnum)
3106ae338338SBram Moolenaar  call assert_equal('Xtwo/a/two.txt', bufname(l2.items[1].bufnr))
3107ae338338SBram Moolenaar  call assert_equal(5, l2.items[1].lnum)
3108ae338338SBram Moolenaarendfunc
3109ae338338SBram Moolenaar
3110ae338338SBram Moolenaarfunc Test_multidirstack()
3111ae338338SBram Moolenaar  call mkdir('Xone/a', 'p')
3112ae338338SBram Moolenaar  call mkdir('Xtwo/a', 'p')
3113ae338338SBram Moolenaar  let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
3114ae338338SBram Moolenaar  call writefile(lines, 'Xone/a/one.txt')
3115ae338338SBram Moolenaar  call writefile(lines, 'Xtwo/a/two.txt')
3116ae338338SBram Moolenaar  let save_efm = &efm
3117ae338338SBram Moolenaar  set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
3118ae338338SBram Moolenaar
3119ae338338SBram Moolenaar  call Xmultidirstack_tests('c')
3120ae338338SBram Moolenaar  call Xmultidirstack_tests('l')
3121ae338338SBram Moolenaar
3122ae338338SBram Moolenaar  let &efm = save_efm
3123ae338338SBram Moolenaar  call delete('Xone', 'rf')
3124ae338338SBram Moolenaar  call delete('Xtwo', 'rf')
3125ae338338SBram Moolenaarendfunc
3126ae338338SBram Moolenaar
3127ae338338SBram Moolenaar" Tests for per quickfix/location list file stack
3128ae338338SBram Moolenaarfunc Xmultifilestack_tests(cchar)
3129ae338338SBram Moolenaar  call s:setup_commands(a:cchar)
3130ae338338SBram Moolenaar
3131ae338338SBram Moolenaar  call g:Xsetlist([], 'f')
3132ae338338SBram Moolenaar  Xexpr "" | Xexpr ""
3133ae338338SBram Moolenaar
31342c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["[one.txt]"]})
31352c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["[two.txt]"]})
31362c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["(3,5) one one one"]})
31372c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["(5,9) two two two"]})
3138ae338338SBram Moolenaar
3139ae338338SBram Moolenaar  let l1 = g:Xgetlist({'nr':1, 'items':1})
3140ae338338SBram Moolenaar  let l2 = g:Xgetlist({'nr':2, 'items':1})
3141ae338338SBram Moolenaar  call assert_equal('one.txt', bufname(l1.items[1].bufnr))
3142ae338338SBram Moolenaar  call assert_equal(3, l1.items[1].lnum)
3143ae338338SBram Moolenaar  call assert_equal('two.txt', bufname(l2.items[1].bufnr))
3144ae338338SBram Moolenaar  call assert_equal(5, l2.items[1].lnum)
3145e333e79fSBram Moolenaar
3146e333e79fSBram Moolenaar  " Test for start of a new error line in the same line where a previous
3147e333e79fSBram Moolenaar  " error line ends with a file stack.
3148e333e79fSBram Moolenaar  let efm_val = 'Error\ l%l\ in\ %f,'
3149e333e79fSBram Moolenaar  let efm_val .= '%-P%>(%f%r,Error\ l%l\ in\ %m,%-Q)%r'
3150e333e79fSBram Moolenaar  let l = g:Xgetlist({'lines' : [
3151e333e79fSBram Moolenaar	      \ '(one.txt',
3152e333e79fSBram Moolenaar	      \ 'Error l4 in one.txt',
3153e333e79fSBram Moolenaar	      \ ') (two.txt',
3154e333e79fSBram Moolenaar	      \ 'Error l6 in two.txt',
3155e333e79fSBram Moolenaar	      \ ')',
3156e333e79fSBram Moolenaar	      \ 'Error l8 in one.txt'
3157e333e79fSBram Moolenaar	      \ ], 'efm' : efm_val})
3158e333e79fSBram Moolenaar  call assert_equal(3, len(l.items))
3159e333e79fSBram Moolenaar  call assert_equal('one.txt', bufname(l.items[0].bufnr))
3160e333e79fSBram Moolenaar  call assert_equal(4, l.items[0].lnum)
3161e333e79fSBram Moolenaar  call assert_equal('one.txt', l.items[0].text)
3162e333e79fSBram Moolenaar  call assert_equal('two.txt', bufname(l.items[1].bufnr))
3163e333e79fSBram Moolenaar  call assert_equal(6, l.items[1].lnum)
3164e333e79fSBram Moolenaar  call assert_equal('two.txt', l.items[1].text)
3165e333e79fSBram Moolenaar  call assert_equal('one.txt', bufname(l.items[2].bufnr))
3166e333e79fSBram Moolenaar  call assert_equal(8, l.items[2].lnum)
3167e333e79fSBram Moolenaar  call assert_equal('', l.items[2].text)
3168ae338338SBram Moolenaarendfunc
3169ae338338SBram Moolenaar
3170ae338338SBram Moolenaarfunc Test_multifilestack()
3171ae338338SBram Moolenaar  let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
3172ae338338SBram Moolenaar  call writefile(lines, 'one.txt')
3173ae338338SBram Moolenaar  call writefile(lines, 'two.txt')
3174ae338338SBram Moolenaar  let save_efm = &efm
3175ae338338SBram Moolenaar  set efm=%+P[%f],(%l\\,%c)\ %m,%-Q
3176ae338338SBram Moolenaar
3177ae338338SBram Moolenaar  call Xmultifilestack_tests('c')
3178ae338338SBram Moolenaar  call Xmultifilestack_tests('l')
3179ae338338SBram Moolenaar
3180ae338338SBram Moolenaar  let &efm = save_efm
3181ae338338SBram Moolenaar  call delete('one.txt')
3182ae338338SBram Moolenaar  call delete('two.txt')
3183ae338338SBram Moolenaarendfunc
3184ae338338SBram Moolenaar
3185ae338338SBram Moolenaar" Tests for per buffer 'efm' setting
3186ae338338SBram Moolenaarfunc Test_perbuf_efm()
3187ae338338SBram Moolenaar  call writefile(["File1-10-Line10"], 'one.txt')
3188ae338338SBram Moolenaar  call writefile(["File2#20#Line20"], 'two.txt')
3189ae338338SBram Moolenaar  set efm=%f#%l#%m
3190ae338338SBram Moolenaar  new | only
3191ae338338SBram Moolenaar  new
3192ae338338SBram Moolenaar  setlocal efm=%f-%l-%m
3193ae338338SBram Moolenaar  cfile one.txt
3194ae338338SBram Moolenaar  wincmd w
3195ae338338SBram Moolenaar  caddfile two.txt
3196ae338338SBram Moolenaar
3197ae338338SBram Moolenaar  let l = getqflist()
3198ae338338SBram Moolenaar  call assert_equal(10, l[0].lnum)
3199ae338338SBram Moolenaar  call assert_equal('Line20', l[1].text)
3200ae338338SBram Moolenaar
3201ae338338SBram Moolenaar  set efm&
3202ae338338SBram Moolenaar  new | only
3203ae338338SBram Moolenaar  call delete('one.txt')
3204ae338338SBram Moolenaar  call delete('two.txt')
3205ae338338SBram Moolenaarendfunc
3206ae338338SBram Moolenaar
3207d28cc3f5SBram Moolenaar" Open multiple help windows using ":lhelpgrep
3208d28cc3f5SBram Moolenaar" This test used to crash Vim
3209d28cc3f5SBram Moolenaarfunc Test_Multi_LL_Help()
3210d28cc3f5SBram Moolenaar    new | only
3211d28cc3f5SBram Moolenaar    lhelpgrep window
3212d28cc3f5SBram Moolenaar    lopen
3213d28cc3f5SBram Moolenaar    e#
3214d28cc3f5SBram Moolenaar    lhelpgrep buffer
3215d28cc3f5SBram Moolenaar    call assert_equal(3, winnr('$'))
3216d28cc3f5SBram Moolenaar    call assert_true(len(getloclist(1)) != 0)
3217d28cc3f5SBram Moolenaar    call assert_true(len(getloclist(2)) != 0)
3218d28cc3f5SBram Moolenaar    new | only
3219d28cc3f5SBram Moolenaarendfunc
322055b69264SBram Moolenaar
322155b69264SBram Moolenaar" Tests for adding new quickfix lists using setqflist()
322255b69264SBram Moolenaarfunc XaddQf_tests(cchar)
322355b69264SBram Moolenaar  call s:setup_commands(a:cchar)
322455b69264SBram Moolenaar
322555b69264SBram Moolenaar  " Create a new list using ' ' for action
322655b69264SBram Moolenaar  call g:Xsetlist([], 'f')
322755b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'title' : 'Test1'})
322855b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
322955b69264SBram Moolenaar  call assert_equal(1, l.nr)
323055b69264SBram Moolenaar  call assert_equal('Test1', l.title)
323155b69264SBram Moolenaar
323255b69264SBram Moolenaar  " Create a new list using ' ' for action and '$' for 'nr'
323355b69264SBram Moolenaar  call g:Xsetlist([], 'f')
323455b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'title' : 'Test2', 'nr' : '$'})
323555b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
323655b69264SBram Moolenaar  call assert_equal(1, l.nr)
323755b69264SBram Moolenaar  call assert_equal('Test2', l.title)
323855b69264SBram Moolenaar
323955b69264SBram Moolenaar  " Create a new list using 'a' for action
324055b69264SBram Moolenaar  call g:Xsetlist([], 'f')
324155b69264SBram Moolenaar  call g:Xsetlist([], 'a', {'title' : 'Test3'})
324255b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
324355b69264SBram Moolenaar  call assert_equal(1, l.nr)
324455b69264SBram Moolenaar  call assert_equal('Test3', l.title)
324555b69264SBram Moolenaar
324655b69264SBram Moolenaar  " Create a new list using 'a' for action and '$' for 'nr'
324755b69264SBram Moolenaar  call g:Xsetlist([], 'f')
324855b69264SBram Moolenaar  call g:Xsetlist([], 'a', {'title' : 'Test3', 'nr' : '$'})
324955b69264SBram Moolenaar  call g:Xsetlist([], 'a', {'title' : 'Test4'})
325055b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
325155b69264SBram Moolenaar  call assert_equal(1, l.nr)
325255b69264SBram Moolenaar  call assert_equal('Test4', l.title)
325355b69264SBram Moolenaar
325455b69264SBram Moolenaar  " Adding a quickfix list should remove all the lists following the current
325555b69264SBram Moolenaar  " list.
325655b69264SBram Moolenaar  Xexpr "" | Xexpr "" | Xexpr ""
325755b69264SBram Moolenaar  silent! 10Xolder
325855b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'title' : 'Test5'})
325955b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
326055b69264SBram Moolenaar  call assert_equal(2, l.nr)
326155b69264SBram Moolenaar  call assert_equal('Test5', l.title)
326255b69264SBram Moolenaar
326355b69264SBram Moolenaar  " Add a quickfix list using '$' as the list number.
326455b69264SBram Moolenaar  let lastqf = g:Xgetlist({'nr':'$'}).nr
326555b69264SBram Moolenaar  silent! 99Xolder
326655b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test6'})
326755b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
326855b69264SBram Moolenaar  call assert_equal(lastqf + 1, l.nr)
326955b69264SBram Moolenaar  call assert_equal('Test6', l.title)
327055b69264SBram Moolenaar
327155b69264SBram Moolenaar  " Add a quickfix list using 'nr' set to one more than the quickfix
327255b69264SBram Moolenaar  " list size.
327355b69264SBram Moolenaar  let lastqf = g:Xgetlist({'nr':'$'}).nr
327455b69264SBram Moolenaar  silent! 99Xolder
327555b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'nr' : lastqf + 1, 'title' : 'Test7'})
327655b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
327755b69264SBram Moolenaar  call assert_equal(lastqf + 1, l.nr)
327855b69264SBram Moolenaar  call assert_equal('Test7', l.title)
327955b69264SBram Moolenaar
328055b69264SBram Moolenaar  " Add a quickfix list to a stack with 10 lists using 'nr' set to '$'
328155b69264SBram Moolenaar  exe repeat('Xexpr "" |', 9) . 'Xexpr ""'
328255b69264SBram Moolenaar  silent! 99Xolder
328355b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test8'})
328455b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
328555b69264SBram Moolenaar  call assert_equal(10, l.nr)
328655b69264SBram Moolenaar  call assert_equal('Test8', l.title)
328755b69264SBram Moolenaar
328855b69264SBram Moolenaar  " Add a quickfix list using 'nr' set to a value greater than 10
328955b69264SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 12, 'title' : 'Test9'}))
329055b69264SBram Moolenaar
329155b69264SBram Moolenaar  " Try adding a quickfix list with 'nr' set to a value greater than the
329255b69264SBram Moolenaar  " quickfix list size but less than 10.
329355b69264SBram Moolenaar  call g:Xsetlist([], 'f')
329455b69264SBram Moolenaar  Xexpr "" | Xexpr "" | Xexpr ""
329555b69264SBram Moolenaar  silent! 99Xolder
329655b69264SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 8, 'title' : 'Test10'}))
329755b69264SBram Moolenaar
329855b69264SBram Moolenaar  " Add a quickfix list using 'nr' set to a some string or list
329955b69264SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : [1,2], 'title' : 'Test11'}))
330055b69264SBram Moolenaarendfunc
330155b69264SBram Moolenaar
330255b69264SBram Moolenaarfunc Test_add_qf()
330355b69264SBram Moolenaar  call XaddQf_tests('c')
330455b69264SBram Moolenaar  call XaddQf_tests('l')
330555b69264SBram Moolenaarendfunc
33067adf06f4SBram Moolenaar
33077adf06f4SBram Moolenaar" Test for getting the quickfix list items from some text without modifying
33087adf06f4SBram Moolenaar" the quickfix stack
33092c809b7cSBram Moolenaarfunc XgetListFromLines(cchar)
33107adf06f4SBram Moolenaar  call s:setup_commands(a:cchar)
33117adf06f4SBram Moolenaar  call g:Xsetlist([], 'f')
33127adf06f4SBram Moolenaar
33132c809b7cSBram Moolenaar  let l = g:Xgetlist({'lines' : ["File2:20:Line20", "File2:30:Line30"]}).items
33147adf06f4SBram Moolenaar  call assert_equal(2, len(l))
33157adf06f4SBram Moolenaar  call assert_equal(30, l[1].lnum)
33167adf06f4SBram Moolenaar
33172c809b7cSBram Moolenaar  call assert_equal({}, g:Xgetlist({'lines' : 10}))
33182c809b7cSBram Moolenaar  call assert_equal({}, g:Xgetlist({'lines' : 'File1:10:Line10'}))
33192c809b7cSBram Moolenaar  call assert_equal([], g:Xgetlist({'lines' : []}).items)
33202c809b7cSBram Moolenaar  call assert_equal([], g:Xgetlist({'lines' : [10, 20]}).items)
33217adf06f4SBram Moolenaar
332236538225SBram Moolenaar  " Parse text using a custom efm
332336538225SBram Moolenaar  set efm&
332436538225SBram Moolenaar  let l = g:Xgetlist({'lines':['File3#30#Line30'], 'efm' : '%f#%l#%m'}).items
332536538225SBram Moolenaar  call assert_equal('Line30', l[0].text)
332636538225SBram Moolenaar  let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : '%f-%l-%m'}).items
332736538225SBram Moolenaar  call assert_equal('File3:30:Line30', l[0].text)
332836538225SBram Moolenaar  let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : [1,2]})
332936538225SBram Moolenaar  call assert_equal({}, l)
333036538225SBram Moolenaar  call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':'%2'})", 'E376:')
333136538225SBram Moolenaar  call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':''})", 'E378:')
333236538225SBram Moolenaar
33337adf06f4SBram Moolenaar  " Make sure that the quickfix stack is not modified
33347adf06f4SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
33357adf06f4SBram Moolenaarendfunc
33367adf06f4SBram Moolenaar
33372c809b7cSBram Moolenaarfunc Test_get_list_from_lines()
33382c809b7cSBram Moolenaar  call XgetListFromLines('c')
33392c809b7cSBram Moolenaar  call XgetListFromLines('l')
33407adf06f4SBram Moolenaarendfunc
3341a539f4f1SBram Moolenaar
3342a539f4f1SBram Moolenaar" Tests for the quickfix list id
3343a539f4f1SBram Moolenaarfunc Xqfid_tests(cchar)
3344a539f4f1SBram Moolenaar  call s:setup_commands(a:cchar)
3345a539f4f1SBram Moolenaar
3346a539f4f1SBram Moolenaar  call g:Xsetlist([], 'f')
3347a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':0}).id)
3348a539f4f1SBram Moolenaar  Xexpr ''
3349a539f4f1SBram Moolenaar  let start_id = g:Xgetlist({'id' : 0}).id
3350a539f4f1SBram Moolenaar  Xexpr '' | Xexpr ''
3351a539f4f1SBram Moolenaar  Xolder
3352a539f4f1SBram Moolenaar  call assert_equal(start_id, g:Xgetlist({'id':0, 'nr':1}).id)
3353a539f4f1SBram Moolenaar  call assert_equal(start_id + 1, g:Xgetlist({'id':0, 'nr':0}).id)
3354a539f4f1SBram Moolenaar  call assert_equal(start_id + 2, g:Xgetlist({'id':0, 'nr':'$'}).id)
3355a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':0, 'nr':99}).id)
3356a539f4f1SBram Moolenaar  call assert_equal(2, g:Xgetlist({'id':start_id + 1, 'nr':0}).nr)
3357a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':99, 'nr':0}).id)
3358a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':"abc", 'nr':0}).id)
3359a539f4f1SBram Moolenaar
3360a539f4f1SBram Moolenaar  call g:Xsetlist([], 'a', {'id':start_id, 'context':[1,2]})
3361a539f4f1SBram Moolenaar  call assert_equal([1,2], g:Xgetlist({'nr':1, 'context':1}).context)
33622c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'id':start_id+1, 'lines':['F1:10:L10']})
3363a539f4f1SBram Moolenaar  call assert_equal('L10', g:Xgetlist({'nr':2, 'items':1}).items[0].text)
3364a539f4f1SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'id':999, 'title':'Vim'}))
3365a539f4f1SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'id':'abc', 'title':'Vim'}))
3366a539f4f1SBram Moolenaar
3367a539f4f1SBram Moolenaar  let qfid = g:Xgetlist({'id':0, 'nr':0})
3368a539f4f1SBram Moolenaar  call g:Xsetlist([], 'f')
3369a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':qfid, 'nr':0}).id)
3370a539f4f1SBram Moolenaarendfunc
3371a539f4f1SBram Moolenaar
3372a539f4f1SBram Moolenaarfunc Test_qf_id()
3373a539f4f1SBram Moolenaar  call Xqfid_tests('c')
3374a539f4f1SBram Moolenaar  call Xqfid_tests('l')
3375a539f4f1SBram Moolenaarendfunc
337674240d3fSBram Moolenaar
337774240d3fSBram Moolenaarfunc Xqfjump_tests(cchar)
337874240d3fSBram Moolenaar  call s:setup_commands(a:cchar)
337974240d3fSBram Moolenaar
338074240d3fSBram Moolenaar  call writefile(["Line1\tFoo", "Line2"], 'F1')
338174240d3fSBram Moolenaar  call writefile(["Line1\tBar", "Line2"], 'F2')
338274240d3fSBram Moolenaar  call writefile(["Line1\tBaz", "Line2"], 'F3')
338374240d3fSBram Moolenaar
338474240d3fSBram Moolenaar  call g:Xsetlist([], 'f')
338574240d3fSBram Moolenaar
338674240d3fSBram Moolenaar  " Tests for
338774240d3fSBram Moolenaar  "   Jumping to a line using a pattern
338874240d3fSBram Moolenaar  "   Jumping to a column greater than the last column in a line
338974240d3fSBram Moolenaar  "   Jumping to a line greater than the last line in the file
339074240d3fSBram Moolenaar  let l = []
339174240d3fSBram Moolenaar  for i in range(1, 7)
339274240d3fSBram Moolenaar    call add(l, {})
339374240d3fSBram Moolenaar  endfor
339474240d3fSBram Moolenaar  let l[0].filename='F1'
339574240d3fSBram Moolenaar  let l[0].pattern='Line1'
339674240d3fSBram Moolenaar  let l[1].filename='F2'
339774240d3fSBram Moolenaar  let l[1].pattern='Line1'
339874240d3fSBram Moolenaar  let l[2].filename='F3'
339974240d3fSBram Moolenaar  let l[2].pattern='Line1'
340074240d3fSBram Moolenaar  let l[3].filename='F3'
340174240d3fSBram Moolenaar  let l[3].lnum=1
340274240d3fSBram Moolenaar  let l[3].col=9
340374240d3fSBram Moolenaar  let l[3].vcol=1
340474240d3fSBram Moolenaar  let l[4].filename='F3'
340574240d3fSBram Moolenaar  let l[4].lnum=99
340674240d3fSBram Moolenaar  let l[5].filename='F3'
340774240d3fSBram Moolenaar  let l[5].lnum=1
340874240d3fSBram Moolenaar  let l[5].col=99
340974240d3fSBram Moolenaar  let l[5].vcol=1
341074240d3fSBram Moolenaar  let l[6].filename='F3'
341174240d3fSBram Moolenaar  let l[6].pattern='abcxyz'
341274240d3fSBram Moolenaar
341374240d3fSBram Moolenaar  call g:Xsetlist([], ' ', {'items' : l})
341474240d3fSBram Moolenaar  Xopen | only
341574240d3fSBram Moolenaar  2Xnext
341674240d3fSBram Moolenaar  call assert_equal(3, g:Xgetlist({'idx' : 0}).idx)
3417bdd2c290SBram Moolenaar  call assert_equal('F3', @%)
341874240d3fSBram Moolenaar  Xnext
341974240d3fSBram Moolenaar  call assert_equal(7, col('.'))
342074240d3fSBram Moolenaar  Xnext
342174240d3fSBram Moolenaar  call assert_equal(2, line('.'))
342274240d3fSBram Moolenaar  Xnext
342374240d3fSBram Moolenaar  call assert_equal(9, col('.'))
342474240d3fSBram Moolenaar  2
342574240d3fSBram Moolenaar  Xnext
342674240d3fSBram Moolenaar  call assert_equal(2, line('.'))
342774240d3fSBram Moolenaar
342874240d3fSBram Moolenaar  if a:cchar == 'l'
342974240d3fSBram Moolenaar    " When jumping to a location list entry in the location list window and
343074240d3fSBram Moolenaar    " no usable windows are available, then a new window should be opened.
343174240d3fSBram Moolenaar    enew! | new | only
343274240d3fSBram Moolenaar    call g:Xsetlist([], 'f')
343374240d3fSBram Moolenaar    setlocal buftype=nofile
343474240d3fSBram Moolenaar    new
343574240d3fSBram 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']})
343674240d3fSBram Moolenaar    Xopen
343774240d3fSBram Moolenaar    let winid = win_getid()
343874240d3fSBram Moolenaar    wincmd p
343974240d3fSBram Moolenaar    close
344074240d3fSBram Moolenaar    call win_gotoid(winid)
344174240d3fSBram Moolenaar    Xnext
344274240d3fSBram Moolenaar    call assert_equal(3, winnr('$'))
344374240d3fSBram Moolenaar    call assert_equal(1, winnr())
344474240d3fSBram Moolenaar    call assert_equal(2, line('.'))
344574240d3fSBram Moolenaar
344674240d3fSBram Moolenaar    " When jumping to an entry in the location list window and the window
344774240d3fSBram Moolenaar    " associated with the location list is not present and a window containing
344874240d3fSBram Moolenaar    " the file is already present, then that window should be used.
344974240d3fSBram Moolenaar    close
345074240d3fSBram Moolenaar    belowright new
345174240d3fSBram Moolenaar    call g:Xsetlist([], 'f')
345274240d3fSBram Moolenaar    edit F3
345374240d3fSBram Moolenaar    call win_gotoid(winid)
345474240d3fSBram Moolenaar    Xlast
345574240d3fSBram Moolenaar    call assert_equal(3, winnr())
345674240d3fSBram Moolenaar    call assert_equal(6, g:Xgetlist({'size' : 1}).size)
345774240d3fSBram Moolenaar    call assert_equal(winid, g:Xgetlist({'winid' : 1}).winid)
345874240d3fSBram Moolenaar  endif
345974240d3fSBram Moolenaar
346074240d3fSBram Moolenaar  " Cleanup
346174240d3fSBram Moolenaar  enew!
346274240d3fSBram Moolenaar  new | only
346374240d3fSBram Moolenaar
346474240d3fSBram Moolenaar  call delete('F1')
346574240d3fSBram Moolenaar  call delete('F2')
346674240d3fSBram Moolenaar  call delete('F3')
346774240d3fSBram Moolenaarendfunc
346874240d3fSBram Moolenaar
346974240d3fSBram Moolenaarfunc Test_qfjump()
347074240d3fSBram Moolenaar  call Xqfjump_tests('c')
347174240d3fSBram Moolenaar  call Xqfjump_tests('l')
347274240d3fSBram Moolenaarendfunc
3473a6d4849cSBram Moolenaar
3474a6d4849cSBram Moolenaar" Tests for the getqflist() and getloclist() functions when the list is not
3475a6d4849cSBram Moolenaar" present or is empty
3476a6d4849cSBram Moolenaarfunc Xgetlist_empty_tests(cchar)
3477a6d4849cSBram Moolenaar  call s:setup_commands(a:cchar)
3478a6d4849cSBram Moolenaar
3479a6d4849cSBram Moolenaar  " Empty quickfix stack
3480a6d4849cSBram Moolenaar  call g:Xsetlist([], 'f')
3481a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'context' : 0}).context)
3482a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : 0}).id)
3483a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
3484a6d4849cSBram Moolenaar  call assert_equal([], g:Xgetlist({'items' : 0}).items)
3485a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 0}).nr)
3486a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'size' : 0}).size)
3487a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'title' : 0}).title)
3488a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
3489b254af31SBram Moolenaar  call assert_equal(0, g:Xgetlist({'changedtick' : 0}).changedtick)
3490c9cc9c78SBram Moolenaar  if a:cchar == 'c'
3491c9cc9c78SBram Moolenaar    call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
3492647e24baSBram Moolenaar		  \ 'items' : [], 'nr' : 0, 'size' : 0, 'qfbufnr' : 0,
3493*d43906d2SBram Moolenaar		  \ 'title' : '', 'winid' : 0, 'changedtick': 0,
3494*d43906d2SBram Moolenaar                  \ 'quickfixtextfunc' : ''}, g:Xgetlist({'all' : 0}))
3495c9cc9c78SBram Moolenaar  else
3496c9cc9c78SBram Moolenaar    call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
3497c9cc9c78SBram Moolenaar		\ 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '',
3498647e24baSBram Moolenaar		\ 'winid' : 0, 'changedtick': 0, 'filewinid' : 0,
3499*d43906d2SBram Moolenaar		\ 'qfbufnr' : 0, 'quickfixtextfunc' : ''},
3500c9cc9c78SBram Moolenaar		\ g:Xgetlist({'all' : 0}))
3501c9cc9c78SBram Moolenaar  endif
3502a6d4849cSBram Moolenaar
35032ec364e9SBram Moolenaar  " Quickfix window with empty stack
35042ec364e9SBram Moolenaar  silent! Xopen
35052ec364e9SBram Moolenaar  let qfwinid = (a:cchar == 'c') ? win_getid() : 0
3506647e24baSBram Moolenaar  let qfbufnr = (a:cchar == 'c') ? bufnr('') : 0
35072ec364e9SBram Moolenaar  call assert_equal(qfwinid, g:Xgetlist({'winid' : 0}).winid)
35082ec364e9SBram Moolenaar  Xclose
35092ec364e9SBram Moolenaar
3510a6d4849cSBram Moolenaar  " Empty quickfix list
3511a6d4849cSBram Moolenaar  Xexpr ""
3512a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'context' : 0}).context)
3513a6d4849cSBram Moolenaar  call assert_notequal(0, g:Xgetlist({'id' : 0}).id)
3514a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
3515a6d4849cSBram Moolenaar  call assert_equal([], g:Xgetlist({'items' : 0}).items)
3516a6d4849cSBram Moolenaar  call assert_notequal(0, g:Xgetlist({'nr' : 0}).nr)
3517a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'size' : 0}).size)
3518a6d4849cSBram Moolenaar  call assert_notequal('', g:Xgetlist({'title' : 0}).title)
3519a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
3520b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3521a6d4849cSBram Moolenaar
3522a6d4849cSBram Moolenaar  let qfid = g:Xgetlist({'id' : 0}).id
3523a6d4849cSBram Moolenaar  call g:Xsetlist([], 'f')
3524a6d4849cSBram Moolenaar
3525a6d4849cSBram Moolenaar  " Non-existing quickfix identifier
3526a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'id' : qfid, 'context' : 0}).context)
3527a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid}).id)
3528a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'idx' : 0}).idx)
3529a6d4849cSBram Moolenaar  call assert_equal([], g:Xgetlist({'id' : qfid, 'items' : 0}).items)
3530a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'nr' : 0}).nr)
3531a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'size' : 0}).size)
3532a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'id' : qfid, 'title' : 0}).title)
3533a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'winid' : 0}).winid)
3534b254af31SBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'changedtick' : 0}).changedtick)
3535c9cc9c78SBram Moolenaar  if a:cchar == 'c'
3536c9cc9c78SBram Moolenaar    call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3537c9cc9c78SBram Moolenaar		\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
3538*d43906d2SBram Moolenaar		\ 'qfbufnr' : qfbufnr, 'quickfixtextfunc' : '',
3539c9cc9c78SBram Moolenaar		\ 'changedtick' : 0}, g:Xgetlist({'id' : qfid, 'all' : 0}))
3540c9cc9c78SBram Moolenaar  else
3541c9cc9c78SBram Moolenaar    call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3542c9cc9c78SBram Moolenaar		\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
3543*d43906d2SBram Moolenaar		\ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0,
3544*d43906d2SBram Moolenaar                \ 'quickfixtextfunc' : ''},
3545c9cc9c78SBram Moolenaar		\ g:Xgetlist({'id' : qfid, 'all' : 0}))
3546c9cc9c78SBram Moolenaar  endif
3547a6d4849cSBram Moolenaar
3548a6d4849cSBram Moolenaar  " Non-existing quickfix list number
3549a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'nr' : 5, 'context' : 0}).context)
3550a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5}).nr)
3551a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'idx' : 0}).idx)
3552a6d4849cSBram Moolenaar  call assert_equal([], g:Xgetlist({'nr' : 5, 'items' : 0}).items)
3553a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'id' : 0}).id)
3554a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'size' : 0}).size)
3555a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'nr' : 5, 'title' : 0}).title)
3556a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'winid' : 0}).winid)
3557b254af31SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'changedtick' : 0}).changedtick)
3558c9cc9c78SBram Moolenaar  if a:cchar == 'c'
3559c9cc9c78SBram Moolenaar    call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3560c9cc9c78SBram Moolenaar		\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
3561*d43906d2SBram Moolenaar		\ 'changedtick' : 0, 'qfbufnr' : qfbufnr,
3562*d43906d2SBram Moolenaar                \ 'quickfixtextfunc' : ''}, g:Xgetlist({'nr' : 5, 'all' : 0}))
3563c9cc9c78SBram Moolenaar  else
3564c9cc9c78SBram Moolenaar    call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3565c9cc9c78SBram Moolenaar		\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
3566*d43906d2SBram Moolenaar		\ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0,
3567*d43906d2SBram Moolenaar                \ 'quickfixtextfunc' : ''}, g:Xgetlist({'nr' : 5, 'all' : 0}))
3568c9cc9c78SBram Moolenaar  endif
3569a6d4849cSBram Moolenaarendfunc
3570a6d4849cSBram Moolenaar
3571a6d4849cSBram Moolenaarfunc Test_getqflist()
3572a6d4849cSBram Moolenaar  call Xgetlist_empty_tests('c')
3573a6d4849cSBram Moolenaar  call Xgetlist_empty_tests('l')
3574a6d4849cSBram Moolenaarendfunc
3575b254af31SBram Moolenaar
3576a0ca7d00SBram Moolenaarfunc Test_getqflist_invalid_nr()
3577a0ca7d00SBram Moolenaar  " The following commands used to crash Vim
3578a0ca7d00SBram Moolenaar  cexpr ""
3579a0ca7d00SBram Moolenaar  call getqflist({'nr' : $XXX_DOES_NOT_EXIST_XXX})
3580a0ca7d00SBram Moolenaar
3581a0ca7d00SBram Moolenaar  " Cleanup
3582a0ca7d00SBram Moolenaar  call setqflist([], 'r')
3583a0ca7d00SBram Moolenaarendfunc
3584a0ca7d00SBram Moolenaar
3585b254af31SBram Moolenaar" Tests for the quickfix/location list changedtick
3586b254af31SBram Moolenaarfunc Xqftick_tests(cchar)
3587b254af31SBram Moolenaar  call s:setup_commands(a:cchar)
3588b254af31SBram Moolenaar
3589b254af31SBram Moolenaar  call g:Xsetlist([], 'f')
3590b254af31SBram Moolenaar
3591b254af31SBram Moolenaar  Xexpr "F1:10:Line10"
3592b254af31SBram Moolenaar  let qfid = g:Xgetlist({'id' : 0}).id
3593b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3594b254af31SBram Moolenaar  Xaddexpr "F2:20:Line20\nF2:21:Line21"
3595b254af31SBram Moolenaar  call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3596b254af31SBram Moolenaar  call g:Xsetlist([], 'a', {'lines' : ["F3:30:Line30", "F3:31:Line31"]})
3597b254af31SBram Moolenaar  call assert_equal(3, g:Xgetlist({'changedtick' : 0}).changedtick)
3598b254af31SBram Moolenaar  call g:Xsetlist([], 'r', {'lines' : ["F4:40:Line40"]})
3599b254af31SBram Moolenaar  call assert_equal(4, g:Xgetlist({'changedtick' : 0}).changedtick)
3600b254af31SBram Moolenaar  call g:Xsetlist([], 'a', {'title' : 'New Title'})
3601b254af31SBram Moolenaar  call assert_equal(5, g:Xgetlist({'changedtick' : 0}).changedtick)
3602b254af31SBram Moolenaar
3603b254af31SBram Moolenaar  enew!
3604b254af31SBram Moolenaar  call append(0, ["F5:50:L50", "F6:60:L60"])
3605b254af31SBram Moolenaar  Xaddbuffer
3606b254af31SBram Moolenaar  call assert_equal(6, g:Xgetlist({'changedtick' : 0}).changedtick)
3607b254af31SBram Moolenaar  enew!
3608b254af31SBram Moolenaar
3609b254af31SBram Moolenaar  call g:Xsetlist([], 'a', {'context' : {'bus' : 'pci'}})
3610b254af31SBram Moolenaar  call assert_equal(7, g:Xgetlist({'changedtick' : 0}).changedtick)
3611b254af31SBram Moolenaar  call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3612b254af31SBram Moolenaar	      \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'a')
3613b254af31SBram Moolenaar  call assert_equal(8, g:Xgetlist({'changedtick' : 0}).changedtick)
3614b254af31SBram Moolenaar  call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3615b254af31SBram Moolenaar	      \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], ' ')
3616b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3617b254af31SBram Moolenaar  call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3618b254af31SBram Moolenaar	      \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'r')
3619b254af31SBram Moolenaar  call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3620b254af31SBram Moolenaar
3621b254af31SBram Moolenaar  call writefile(["F8:80:L80", "F8:81:L81"], "Xone")
3622b254af31SBram Moolenaar  Xfile Xone
3623b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3624b254af31SBram Moolenaar  Xaddfile Xone
3625b254af31SBram Moolenaar  call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3626b254af31SBram Moolenaar
3627b254af31SBram Moolenaar  " Test case for updating a non-current quickfix list
3628b254af31SBram Moolenaar  call g:Xsetlist([], 'f')
3629b254af31SBram Moolenaar  Xexpr "F1:1:L1"
3630b254af31SBram Moolenaar  Xexpr "F2:2:L2"
3631b254af31SBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, "lines" : ["F10:10:L10"]})
3632b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3633b254af31SBram Moolenaar  call assert_equal(2, g:Xgetlist({'nr' : 1, 'changedtick' : 0}).changedtick)
3634b254af31SBram Moolenaar
3635b254af31SBram Moolenaar  call delete("Xone")
3636b254af31SBram Moolenaarendfunc
3637b254af31SBram Moolenaar
3638b254af31SBram Moolenaarfunc Test_qf_tick()
3639b254af31SBram Moolenaar  call Xqftick_tests('c')
3640b254af31SBram Moolenaar  call Xqftick_tests('l')
3641b254af31SBram Moolenaarendfunc
364212237448SBram Moolenaar
3643c631f2dfSBram Moolenaar" Test helpgrep with lang specifier
3644c631f2dfSBram Moolenaarfunc Xtest_helpgrep_with_lang_specifier(cchar)
3645c631f2dfSBram Moolenaar  call s:setup_commands(a:cchar)
3646c631f2dfSBram Moolenaar  Xhelpgrep Vim@en
3647c631f2dfSBram Moolenaar  call assert_equal('help', &filetype)
3648c631f2dfSBram Moolenaar  call assert_notequal(0, g:Xgetlist({'nr' : '$'}).nr)
3649c631f2dfSBram Moolenaar  new | only
3650c631f2dfSBram Moolenaarendfunc
3651c631f2dfSBram Moolenaar
3652c631f2dfSBram Moolenaarfunc Test_helpgrep_with_lang_specifier()
3653c631f2dfSBram Moolenaar  call Xtest_helpgrep_with_lang_specifier('c')
3654c631f2dfSBram Moolenaar  call Xtest_helpgrep_with_lang_specifier('l')
3655c631f2dfSBram Moolenaarendfunc
3656c631f2dfSBram Moolenaar
365712237448SBram Moolenaar" The following test used to crash Vim.
365812237448SBram Moolenaar" Open the location list window and close the regular window associated with
365912237448SBram Moolenaar" the location list. When the garbage collection runs now, it incorrectly
366012237448SBram Moolenaar" marks the location list context as not in use and frees the context.
366112237448SBram Moolenaarfunc Test_ll_window_ctx()
366212237448SBram Moolenaar  call setloclist(0, [], 'f')
366312237448SBram Moolenaar  call setloclist(0, [], 'a', {'context' : []})
366412237448SBram Moolenaar  lopen | only
366512237448SBram Moolenaar  call test_garbagecollect_now()
366612237448SBram Moolenaar  echo getloclist(0, {'context' : 1}).context
366712237448SBram Moolenaar  enew | only
366812237448SBram Moolenaarendfunc
366912237448SBram Moolenaar
367014a4deb0SBram Moolenaar" The following test used to crash vim
367114a4deb0SBram Moolenaarfunc Test_lfile_crash()
367214a4deb0SBram Moolenaar  sp Xtest
367314a4deb0SBram Moolenaar  au QuickFixCmdPre * bw
367414a4deb0SBram Moolenaar  call assert_fails('lfile', 'E40')
367514a4deb0SBram Moolenaar  au! QuickFixCmdPre
367614a4deb0SBram Moolenaarendfunc
36773c097226SBram Moolenaar
36783c097226SBram Moolenaar" The following test used to crash vim
36793c097226SBram Moolenaarfunc Test_lbuffer_crash()
36803c097226SBram Moolenaar  sv Xtest
36813c097226SBram Moolenaar  augroup QF_Test
36823c097226SBram Moolenaar    au!
36833c097226SBram Moolenaar    au * * bw
36843c097226SBram Moolenaar  augroup END
36853c097226SBram Moolenaar  lbuffer
36863c097226SBram Moolenaar  augroup QF_Test
36873c097226SBram Moolenaar    au!
36883c097226SBram Moolenaar  augroup END
36893c097226SBram Moolenaarendfunc
36903c097226SBram Moolenaar
36913c097226SBram Moolenaar" The following test used to crash vim
36923c097226SBram Moolenaarfunc Test_lexpr_crash()
36933c097226SBram Moolenaar  augroup QF_Test
36943c097226SBram Moolenaar    au!
36953c097226SBram Moolenaar    au * * call setloclist(0, [], 'f')
36963c097226SBram Moolenaar  augroup END
36973c097226SBram Moolenaar  lexpr ""
36983c097226SBram Moolenaar  augroup QF_Test
36993c097226SBram Moolenaar    au!
37003c097226SBram Moolenaar  augroup END
37019f84ded3SBram Moolenaar
37023c097226SBram Moolenaar  enew | only
37039f84ded3SBram Moolenaar  augroup QF_Test
37049f84ded3SBram Moolenaar    au!
37059f84ded3SBram Moolenaar    au BufNew * call setloclist(0, [], 'f')
37069f84ded3SBram Moolenaar  augroup END
37079f84ded3SBram Moolenaar  lexpr 'x:1:x'
37089f84ded3SBram Moolenaar  augroup QF_Test
37099f84ded3SBram Moolenaar    au!
37109f84ded3SBram Moolenaar  augroup END
37119f84ded3SBram Moolenaar
37129f84ded3SBram Moolenaar  enew | only
37139f84ded3SBram Moolenaar  lexpr ''
37149f84ded3SBram Moolenaar  lopen
37159f84ded3SBram Moolenaar  augroup QF_Test
37169f84ded3SBram Moolenaar    au!
37179f84ded3SBram Moolenaar    au FileType * call setloclist(0, [], 'f')
37189f84ded3SBram Moolenaar  augroup END
37199f84ded3SBram Moolenaar  lexpr ''
37209f84ded3SBram Moolenaar  augroup QF_Test
37219f84ded3SBram Moolenaar    au!
37229f84ded3SBram Moolenaar  augroup END
37233c097226SBram Moolenaarendfunc
37243c097226SBram Moolenaar
37253c097226SBram Moolenaar" The following test used to crash Vim
37263c097226SBram Moolenaarfunc Test_lvimgrep_crash()
37273c097226SBram Moolenaar  sv Xtest
37283c097226SBram Moolenaar  augroup QF_Test
37293c097226SBram Moolenaar    au!
37303c097226SBram Moolenaar    au * * call setloclist(0, [], 'f')
37313c097226SBram Moolenaar  augroup END
37323c097226SBram Moolenaar  lvimgrep quickfix test_quickfix.vim
37333c097226SBram Moolenaar  augroup QF_Test
37343c097226SBram Moolenaar    au!
37353c097226SBram Moolenaar  augroup END
3736b6f1480aSBram Moolenaar
3737b6f1480aSBram Moolenaar  new | only
3738b6f1480aSBram Moolenaar  augroup QF_Test
3739b6f1480aSBram Moolenaar    au!
3740b6f1480aSBram Moolenaar    au BufEnter * call setloclist(0, [], 'r')
3741b6f1480aSBram Moolenaar  augroup END
3742b6f1480aSBram Moolenaar  call assert_fails('lvimgrep Test_lvimgrep_crash *', 'E926:')
3743b6f1480aSBram Moolenaar  augroup QF_Test
3744b6f1480aSBram Moolenaar    au!
3745b6f1480aSBram Moolenaar  augroup END
3746b6f1480aSBram Moolenaar
37473c097226SBram Moolenaar  enew | only
37483c097226SBram Moolenaarendfunc
3749de04654dSBram Moolenaar
37502573af35SBram Moolenaarfunc Test_lvimgrep_crash2()
37512573af35SBram Moolenaar  au BufNewFile x sfind
37529b7bf9e9SBram Moolenaar  call assert_fails('lvimgrep x x', 'E471:')
37539b7bf9e9SBram Moolenaar  call assert_fails('lvimgrep x x x', 'E471:')
37542573af35SBram Moolenaar
37552573af35SBram Moolenaar  au! BufNewFile
37562573af35SBram Moolenaarendfunc
37572573af35SBram Moolenaar
3758de04654dSBram Moolenaar" Test for the position of the quickfix and location list window
3759de04654dSBram Moolenaarfunc Test_qfwin_pos()
3760de04654dSBram Moolenaar  " Open two windows
3761de04654dSBram Moolenaar  new | only
3762de04654dSBram Moolenaar  new
3763de04654dSBram Moolenaar  cexpr ['F1:10:L10']
3764de04654dSBram Moolenaar  copen
3765de04654dSBram Moolenaar  " Quickfix window should be the bottom most window
3766de04654dSBram Moolenaar  call assert_equal(3, winnr())
3767de04654dSBram Moolenaar  close
3768de04654dSBram Moolenaar  " Open at the very top
3769de04654dSBram Moolenaar  wincmd t
3770de04654dSBram Moolenaar  topleft copen
3771de04654dSBram Moolenaar  call assert_equal(1, winnr())
3772de04654dSBram Moolenaar  close
3773de04654dSBram Moolenaar  " open left of the current window
3774de04654dSBram Moolenaar  wincmd t
3775de04654dSBram Moolenaar  below new
3776de04654dSBram Moolenaar  leftabove copen
3777de04654dSBram Moolenaar  call assert_equal(2, winnr())
3778de04654dSBram Moolenaar  close
3779de04654dSBram Moolenaar  " open right of the current window
3780de04654dSBram Moolenaar  rightbelow copen
3781de04654dSBram Moolenaar  call assert_equal(3, winnr())
3782de04654dSBram Moolenaar  close
3783de04654dSBram Moolenaarendfunc
3784e1bb879fSBram Moolenaar
3785e1bb879fSBram Moolenaar" Tests for quickfix/location lists changed by autocommands when
3786e1bb879fSBram Moolenaar" :vimgrep/:lvimgrep commands are running.
3787e1bb879fSBram Moolenaarfunc Test_vimgrep_autocmd()
3788e1bb879fSBram Moolenaar  call setqflist([], 'f')
3789e1bb879fSBram Moolenaar  call writefile(['stars'], 'Xtest1.txt')
3790e1bb879fSBram Moolenaar  call writefile(['stars'], 'Xtest2.txt')
3791e1bb879fSBram Moolenaar
3792e1bb879fSBram Moolenaar  " Test 1:
3793e1bb879fSBram Moolenaar  " When searching for a pattern using :vimgrep, if the quickfix list is
3794e1bb879fSBram Moolenaar  " changed by an autocmd, the results should be added to the correct quickfix
3795e1bb879fSBram Moolenaar  " list.
3796e1bb879fSBram Moolenaar  autocmd BufRead Xtest2.txt cexpr '' | cexpr ''
3797e1bb879fSBram Moolenaar  silent vimgrep stars Xtest*.txt
3798e1bb879fSBram Moolenaar  call assert_equal(1, getqflist({'nr' : 0}).nr)
3799e1bb879fSBram Moolenaar  call assert_equal(3, getqflist({'nr' : '$'}).nr)
3800e1bb879fSBram Moolenaar  call assert_equal('Xtest2.txt', bufname(getqflist()[1].bufnr))
3801e1bb879fSBram Moolenaar  au! BufRead Xtest2.txt
3802e1bb879fSBram Moolenaar
3803e1bb879fSBram Moolenaar  " Test 2:
3804e1bb879fSBram Moolenaar  " When searching for a pattern using :vimgrep, if the quickfix list is
3805e1bb879fSBram Moolenaar  " freed, then a error should be given.
3806e1bb879fSBram Moolenaar  silent! %bwipe!
3807e1bb879fSBram Moolenaar  call setqflist([], 'f')
3808e1bb879fSBram Moolenaar  autocmd BufRead Xtest2.txt for i in range(10) | cexpr '' | endfor
3809e1bb879fSBram Moolenaar  call assert_fails('vimgrep stars Xtest*.txt', 'E925:')
3810e1bb879fSBram Moolenaar  au! BufRead Xtest2.txt
3811e1bb879fSBram Moolenaar
3812e1bb879fSBram Moolenaar  " Test 3:
3813e1bb879fSBram Moolenaar  " When searching for a pattern using :lvimgrep, if the location list is
3814e1bb879fSBram Moolenaar  " freed, then the command should error out.
3815e1bb879fSBram Moolenaar  silent! %bwipe!
3816e1bb879fSBram Moolenaar  let g:save_winid = win_getid()
3817e1bb879fSBram Moolenaar  autocmd BufRead Xtest2.txt call setloclist(g:save_winid, [], 'f')
3818e1bb879fSBram Moolenaar  call assert_fails('lvimgrep stars Xtest*.txt', 'E926:')
3819e1bb879fSBram Moolenaar  au! BufRead Xtest2.txt
3820e1bb879fSBram Moolenaar
3821e1bb879fSBram Moolenaar  call delete('Xtest1.txt')
3822e1bb879fSBram Moolenaar  call delete('Xtest2.txt')
3823e1bb879fSBram Moolenaar  call setqflist([], 'f')
3824e1bb879fSBram Moolenaarendfunc
38253b9474b4SBram Moolenaar
3826f9ae154cSBram Moolenaar" Test for an autocmd changing the current directory when running vimgrep
3827f9ae154cSBram Moolenaarfunc Xvimgrep_autocmd_cd(cchar)
3828f9ae154cSBram Moolenaar  call s:setup_commands(a:cchar)
3829f9ae154cSBram Moolenaar
3830f9ae154cSBram Moolenaar  %bwipe
3831f9ae154cSBram Moolenaar  let save_cwd = getcwd()
3832f9ae154cSBram Moolenaar
3833f9ae154cSBram Moolenaar  augroup QF_Test
3834f9ae154cSBram Moolenaar    au!
3835f9ae154cSBram Moolenaar    autocmd BufRead * silent cd %:p:h
3836f9ae154cSBram Moolenaar  augroup END
3837f9ae154cSBram Moolenaar
3838f9ae154cSBram Moolenaar  10Xvimgrep /vim/ Xdir/**
3839f9ae154cSBram Moolenaar  let l = g:Xgetlist()
3840f9ae154cSBram Moolenaar  call assert_equal('f1.txt', bufname(l[0].bufnr))
3841f9ae154cSBram Moolenaar  call assert_equal('f2.txt', fnamemodify(bufname(l[2].bufnr), ':t'))
3842f9ae154cSBram Moolenaar
3843f9ae154cSBram Moolenaar  augroup QF_Test
3844f9ae154cSBram Moolenaar    au!
3845f9ae154cSBram Moolenaar  augroup END
3846f9ae154cSBram Moolenaar
3847f9ae154cSBram Moolenaar  exe 'cd ' . save_cwd
3848f9ae154cSBram Moolenaarendfunc
3849f9ae154cSBram Moolenaar
3850f9ae154cSBram Moolenaarfunc Test_vimgrep_autocmd_cd()
3851f9ae154cSBram Moolenaar  call mkdir('Xdir/a', 'p')
3852f9ae154cSBram Moolenaar  call mkdir('Xdir/b', 'p')
3853f9ae154cSBram Moolenaar  call writefile(['a_L1_vim', 'a_L2_vim'], 'Xdir/a/f1.txt')
3854f9ae154cSBram Moolenaar  call writefile(['b_L1_vim', 'b_L2_vim'], 'Xdir/b/f2.txt')
3855f9ae154cSBram Moolenaar  call Xvimgrep_autocmd_cd('c')
3856f9ae154cSBram Moolenaar  call Xvimgrep_autocmd_cd('l')
3857f9ae154cSBram Moolenaar  %bwipe
3858f9ae154cSBram Moolenaar  call delete('Xdir', 'rf')
3859f9ae154cSBram Moolenaarendfunc
3860f9ae154cSBram Moolenaar
38613b9474b4SBram Moolenaar" The following test used to crash Vim
38623b9474b4SBram Moolenaarfunc Test_lhelpgrep_autocmd()
38633b9474b4SBram Moolenaar  lhelpgrep quickfix
38643b9474b4SBram Moolenaar  autocmd QuickFixCmdPost * call setloclist(0, [], 'f')
38653b9474b4SBram Moolenaar  lhelpgrep buffer
38663b9474b4SBram Moolenaar  call assert_equal('help', &filetype)
38673b9474b4SBram Moolenaar  call assert_equal(0, getloclist(0, {'nr' : '$'}).nr)
38683b9474b4SBram Moolenaar  lhelpgrep tabpage
38693b9474b4SBram Moolenaar  call assert_equal('help', &filetype)
38703b9474b4SBram Moolenaar  call assert_equal(1, getloclist(0, {'nr' : '$'}).nr)
38713b9474b4SBram Moolenaar  au! QuickFixCmdPost
3872b6f1480aSBram Moolenaar
3873b6f1480aSBram Moolenaar  new | only
3874b6f1480aSBram Moolenaar  augroup QF_Test
3875b6f1480aSBram Moolenaar    au!
3876b6f1480aSBram Moolenaar    au BufEnter * call setqflist([], 'f')
3877b6f1480aSBram Moolenaar  augroup END
3878b6f1480aSBram Moolenaar  call assert_fails('helpgrep quickfix', 'E925:')
3879b6f1480aSBram Moolenaar  augroup QF_Test
3880b6f1480aSBram Moolenaar    au! BufEnter
3881b6f1480aSBram Moolenaar  augroup END
3882b6f1480aSBram Moolenaar
3883b6f1480aSBram Moolenaar  new | only
3884b6f1480aSBram Moolenaar  augroup QF_Test
3885b6f1480aSBram Moolenaar    au!
3886b6f1480aSBram Moolenaar    au BufEnter * call setqflist([], 'r')
3887b6f1480aSBram Moolenaar  augroup END
3888b6f1480aSBram Moolenaar  call assert_fails('helpgrep quickfix', 'E925:')
3889b6f1480aSBram Moolenaar  augroup QF_Test
3890b6f1480aSBram Moolenaar    au! BufEnter
3891b6f1480aSBram Moolenaar  augroup END
3892b6f1480aSBram Moolenaar
3893b6f1480aSBram Moolenaar  new | only
3894b6f1480aSBram Moolenaar  augroup QF_Test
3895b6f1480aSBram Moolenaar    au!
3896b6f1480aSBram Moolenaar    au BufEnter * call setloclist(0, [], 'r')
3897b6f1480aSBram Moolenaar  augroup END
3898b6f1480aSBram Moolenaar  call assert_fails('lhelpgrep quickfix', 'E926:')
3899b6f1480aSBram Moolenaar  augroup QF_Test
3900b6f1480aSBram Moolenaar    au! BufEnter
3901b6f1480aSBram Moolenaar  augroup END
3902b6f1480aSBram Moolenaar
39033b9474b4SBram Moolenaar  new | only
39043b9474b4SBram Moolenaarendfunc
3905a796d46fSBram Moolenaar
3906a796d46fSBram Moolenaar" Test for shortening/simplifying the file name when opening the
3907a796d46fSBram Moolenaar" quickfix window or when displaying the quickfix list
3908a796d46fSBram Moolenaarfunc Test_shorten_fname()
3909a796d46fSBram Moolenaar  if !has('unix')
3910a796d46fSBram Moolenaar    return
3911a796d46fSBram Moolenaar  endif
3912a796d46fSBram Moolenaar  %bwipe
3913a796d46fSBram Moolenaar  " Create a quickfix list with a absolute path filename
3914a796d46fSBram Moolenaar  let fname = getcwd() . '/test_quickfix.vim'
3915a796d46fSBram Moolenaar  call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'})
3916a796d46fSBram Moolenaar  call assert_equal(fname, bufname('test_quickfix.vim'))
3917a796d46fSBram Moolenaar  " Opening the quickfix window should simplify the file path
3918a796d46fSBram Moolenaar  cwindow
3919a796d46fSBram Moolenaar  call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
3920a796d46fSBram Moolenaar  cclose
3921a796d46fSBram Moolenaar  %bwipe
3922a796d46fSBram Moolenaar  " Create a quickfix list with a absolute path filename
3923a796d46fSBram Moolenaar  call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'})
3924a796d46fSBram Moolenaar  call assert_equal(fname, bufname('test_quickfix.vim'))
3925a796d46fSBram Moolenaar  " Displaying the quickfix list should simplify the file path
3926a796d46fSBram Moolenaar  silent! clist
3927a796d46fSBram Moolenaar  call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
3928a796d46fSBram Moolenaarendfunc
39298b62e310SBram Moolenaar
39308b62e310SBram Moolenaar" Quickfix title tests
39318b62e310SBram Moolenaar" In the below tests, 'exe "cmd"' is used to invoke the quickfix commands.
39328b62e310SBram Moolenaar" Otherwise due to indentation, the title is set with spaces at the beginning
39338b62e310SBram Moolenaar" of the command.
39348b62e310SBram Moolenaarfunc Test_qftitle()
39358b62e310SBram Moolenaar  call writefile(["F1:1:Line1"], 'Xerr')
39368b62e310SBram Moolenaar
39378b62e310SBram Moolenaar  " :cexpr
39388b62e310SBram Moolenaar  exe "cexpr readfile('Xerr')"
39398b62e310SBram Moolenaar  call assert_equal(":cexpr readfile('Xerr')", getqflist({'title' : 1}).title)
39408b62e310SBram Moolenaar
39418b62e310SBram Moolenaar  " :cgetexpr
39428b62e310SBram Moolenaar  exe "cgetexpr readfile('Xerr')"
39438b62e310SBram Moolenaar  call assert_equal(":cgetexpr readfile('Xerr')",
39448b62e310SBram Moolenaar					\ getqflist({'title' : 1}).title)
39458b62e310SBram Moolenaar
39468b62e310SBram Moolenaar  " :caddexpr
39478b62e310SBram Moolenaar  call setqflist([], 'f')
39488b62e310SBram Moolenaar  exe "caddexpr readfile('Xerr')"
39498b62e310SBram Moolenaar  call assert_equal(":caddexpr readfile('Xerr')",
39508b62e310SBram Moolenaar					\ getqflist({'title' : 1}).title)
39518b62e310SBram Moolenaar
39528b62e310SBram Moolenaar  " :cbuffer
39538b62e310SBram Moolenaar  new Xerr
39548b62e310SBram Moolenaar  exe "cbuffer"
39558b62e310SBram Moolenaar  call assert_equal(':cbuffer (Xerr)', getqflist({'title' : 1}).title)
39568b62e310SBram Moolenaar
39578b62e310SBram Moolenaar  " :cgetbuffer
39588b62e310SBram Moolenaar  edit Xerr
39598b62e310SBram Moolenaar  exe "cgetbuffer"
39608b62e310SBram Moolenaar  call assert_equal(':cgetbuffer (Xerr)', getqflist({'title' : 1}).title)
39618b62e310SBram Moolenaar
39628b62e310SBram Moolenaar  " :caddbuffer
39638b62e310SBram Moolenaar  call setqflist([], 'f')
39648b62e310SBram Moolenaar  edit Xerr
39658b62e310SBram Moolenaar  exe "caddbuffer"
39668b62e310SBram Moolenaar  call assert_equal(':caddbuffer (Xerr)', getqflist({'title' : 1}).title)
39678b62e310SBram Moolenaar
39688b62e310SBram Moolenaar  " :cfile
39698b62e310SBram Moolenaar  exe "cfile Xerr"
39708b62e310SBram Moolenaar  call assert_equal(':cfile Xerr', getqflist({'title' : 1}).title)
39718b62e310SBram Moolenaar
39728b62e310SBram Moolenaar  " :cgetfile
39738b62e310SBram Moolenaar  exe "cgetfile Xerr"
39748b62e310SBram Moolenaar  call assert_equal(':cgetfile Xerr', getqflist({'title' : 1}).title)
39758b62e310SBram Moolenaar
39768b62e310SBram Moolenaar  " :caddfile
39778b62e310SBram Moolenaar  call setqflist([], 'f')
39788b62e310SBram Moolenaar  exe "caddfile Xerr"
39798b62e310SBram Moolenaar  call assert_equal(':caddfile Xerr', getqflist({'title' : 1}).title)
39808b62e310SBram Moolenaar
39818b62e310SBram Moolenaar  " :grep
39828b62e310SBram Moolenaar  set grepprg=internal
39838b62e310SBram Moolenaar  exe "grep F1 Xerr"
39848b62e310SBram Moolenaar  call assert_equal(':grep F1 Xerr', getqflist({'title' : 1}).title)
39858b62e310SBram Moolenaar
39868b62e310SBram Moolenaar  " :grepadd
39878b62e310SBram Moolenaar  call setqflist([], 'f')
39888b62e310SBram Moolenaar  exe "grepadd F1 Xerr"
39898b62e310SBram Moolenaar  call assert_equal(':grepadd F1 Xerr', getqflist({'title' : 1}).title)
39908b62e310SBram Moolenaar  set grepprg&vim
39918b62e310SBram Moolenaar
39928b62e310SBram Moolenaar  " :vimgrep
39938b62e310SBram Moolenaar  exe "vimgrep F1 Xerr"
39948b62e310SBram Moolenaar  call assert_equal(':vimgrep F1 Xerr', getqflist({'title' : 1}).title)
39958b62e310SBram Moolenaar
39968b62e310SBram Moolenaar  " :vimgrepadd
39978b62e310SBram Moolenaar  call setqflist([], 'f')
39988b62e310SBram Moolenaar  exe "vimgrepadd F1 Xerr"
39998b62e310SBram Moolenaar  call assert_equal(':vimgrepadd F1 Xerr', getqflist({'title' : 1}).title)
40008b62e310SBram Moolenaar
40018b62e310SBram Moolenaar  call setqflist(['F1:10:L10'], ' ')
40028b62e310SBram Moolenaar  call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
40038b62e310SBram Moolenaar
40048b62e310SBram Moolenaar  call setqflist([], 'f')
40058b62e310SBram Moolenaar  call setqflist(['F1:10:L10'], 'a')
40068b62e310SBram Moolenaar  call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
40078b62e310SBram Moolenaar
40088b62e310SBram Moolenaar  call setqflist([], 'f')
40098b62e310SBram Moolenaar  call setqflist(['F1:10:L10'], 'r')
40108b62e310SBram Moolenaar  call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
40118b62e310SBram Moolenaar
40128b62e310SBram Moolenaar  close
40138b62e310SBram Moolenaar  call delete('Xerr')
40148b62e310SBram Moolenaar
40158b62e310SBram Moolenaar  call setqflist([], ' ', {'title' : 'Errors'})
40168b62e310SBram Moolenaar  copen
40178b62e310SBram Moolenaar  call assert_equal('Errors', w:quickfix_title)
40188b62e310SBram Moolenaar  call setqflist([], 'r', {'items' : [{'filename' : 'a.c', 'lnum' : 10}]})
40198b62e310SBram Moolenaar  call assert_equal('Errors', w:quickfix_title)
40208b62e310SBram Moolenaar  cclose
40218b62e310SBram Moolenaarendfunc
4022600323b4SBram Moolenaar
4023600323b4SBram Moolenaarfunc Test_lbuffer_with_bwipe()
4024600323b4SBram Moolenaar  new
4025600323b4SBram Moolenaar  new
4026600323b4SBram Moolenaar  augroup nasty
4027600323b4SBram Moolenaar    au * * bwipe
4028600323b4SBram Moolenaar  augroup END
4029600323b4SBram Moolenaar  lbuffer
4030600323b4SBram Moolenaar  augroup nasty
4031600323b4SBram Moolenaar    au!
4032600323b4SBram Moolenaar  augroup END
4033600323b4SBram Moolenaarendfunc
40340366c016SBram Moolenaar
4035531b9a3aSBram Moolenaar" Test for an autocmd freeing the quickfix/location list when cexpr/lexpr is
4036531b9a3aSBram Moolenaar" running
4037531b9a3aSBram Moolenaarfunc Xexpr_acmd_freelist(cchar)
4038531b9a3aSBram Moolenaar  call s:setup_commands(a:cchar)
4039531b9a3aSBram Moolenaar
40400366c016SBram Moolenaar  " This was using freed memory.
40410366c016SBram Moolenaar  augroup nasty
4042531b9a3aSBram Moolenaar    au * * call g:Xsetlist([], 'f')
40430366c016SBram Moolenaar  augroup END
4044531b9a3aSBram Moolenaar  Xexpr "x"
40450366c016SBram Moolenaar  augroup nasty
40460366c016SBram Moolenaar    au!
40470366c016SBram Moolenaar  augroup END
40480366c016SBram Moolenaarendfunc
4049531b9a3aSBram Moolenaar
4050531b9a3aSBram Moolenaarfunc Test_cexpr_acmd_freelist()
4051531b9a3aSBram Moolenaar  call Xexpr_acmd_freelist('c')
4052531b9a3aSBram Moolenaar  call Xexpr_acmd_freelist('l')
4053531b9a3aSBram Moolenaarendfunc
4054531b9a3aSBram Moolenaar
4055531b9a3aSBram Moolenaar" Test for commands that create a new quickfix/location list and jump to the
4056531b9a3aSBram Moolenaar" first error automatically.
4057531b9a3aSBram Moolenaarfunc Xjumpto_first_error_test(cchar)
4058531b9a3aSBram Moolenaar  call s:setup_commands(a:cchar)
4059531b9a3aSBram Moolenaar
4060531b9a3aSBram Moolenaar  call s:create_test_file('Xtestfile1')
4061531b9a3aSBram Moolenaar  call s:create_test_file('Xtestfile2')
4062531b9a3aSBram Moolenaar  let l = ['Xtestfile1:2:Line2', 'Xtestfile2:4:Line4']
4063531b9a3aSBram Moolenaar
4064531b9a3aSBram Moolenaar  " Test for cexpr/lexpr
4065531b9a3aSBram Moolenaar  enew
4066531b9a3aSBram Moolenaar  Xexpr l
4067bdd2c290SBram Moolenaar  call assert_equal('Xtestfile1', @%)
4068531b9a3aSBram Moolenaar  call assert_equal(2, line('.'))
4069531b9a3aSBram Moolenaar
4070531b9a3aSBram Moolenaar  " Test for cfile/lfile
4071531b9a3aSBram Moolenaar  enew
4072531b9a3aSBram Moolenaar  call writefile(l, 'Xerr')
4073531b9a3aSBram Moolenaar  Xfile Xerr
4074bdd2c290SBram Moolenaar  call assert_equal('Xtestfile1', @%)
4075531b9a3aSBram Moolenaar  call assert_equal(2, line('.'))
4076531b9a3aSBram Moolenaar
4077531b9a3aSBram Moolenaar  " Test for cbuffer/lbuffer
4078531b9a3aSBram Moolenaar  edit Xerr
4079531b9a3aSBram Moolenaar  Xbuffer
4080bdd2c290SBram Moolenaar  call assert_equal('Xtestfile1', @%)
4081531b9a3aSBram Moolenaar  call assert_equal(2, line('.'))
4082531b9a3aSBram Moolenaar
4083531b9a3aSBram Moolenaar  call delete('Xerr')
4084531b9a3aSBram Moolenaar  call delete('Xtestfile1')
4085531b9a3aSBram Moolenaar  call delete('Xtestfile2')
4086531b9a3aSBram Moolenaarendfunc
4087531b9a3aSBram Moolenaar
4088531b9a3aSBram Moolenaarfunc Test_jumpto_first_error()
4089531b9a3aSBram Moolenaar  call Xjumpto_first_error_test('c')
4090531b9a3aSBram Moolenaar  call Xjumpto_first_error_test('l')
4091531b9a3aSBram Moolenaarendfunc
4092531b9a3aSBram Moolenaar
4093531b9a3aSBram Moolenaar" Test for a quickfix autocmd changing the quickfix/location list before
4094531b9a3aSBram Moolenaar" jumping to the first error in the new list.
4095531b9a3aSBram Moolenaarfunc Xautocmd_changelist(cchar)
4096531b9a3aSBram Moolenaar  call s:setup_commands(a:cchar)
4097531b9a3aSBram Moolenaar
4098531b9a3aSBram Moolenaar  " Test for cfile/lfile
4099531b9a3aSBram Moolenaar  call s:create_test_file('Xtestfile1')
4100531b9a3aSBram Moolenaar  call s:create_test_file('Xtestfile2')
4101531b9a3aSBram Moolenaar  Xexpr 'Xtestfile1:2:Line2'
4102531b9a3aSBram Moolenaar  autocmd QuickFixCmdPost * Xolder
4103531b9a3aSBram Moolenaar  call writefile(['Xtestfile2:4:Line4'], 'Xerr')
4104531b9a3aSBram Moolenaar  Xfile Xerr
4105bdd2c290SBram Moolenaar  call assert_equal('Xtestfile2', @%)
4106531b9a3aSBram Moolenaar  call assert_equal(4, line('.'))
4107531b9a3aSBram Moolenaar  autocmd! QuickFixCmdPost
4108531b9a3aSBram Moolenaar
4109531b9a3aSBram Moolenaar  " Test for cbuffer/lbuffer
4110531b9a3aSBram Moolenaar  call g:Xsetlist([], 'f')
4111531b9a3aSBram Moolenaar  Xexpr 'Xtestfile1:2:Line2'
4112531b9a3aSBram Moolenaar  autocmd QuickFixCmdPost * Xolder
4113531b9a3aSBram Moolenaar  call writefile(['Xtestfile2:4:Line4'], 'Xerr')
4114531b9a3aSBram Moolenaar  edit Xerr
4115531b9a3aSBram Moolenaar  Xbuffer
4116bdd2c290SBram Moolenaar  call assert_equal('Xtestfile2', @%)
4117531b9a3aSBram Moolenaar  call assert_equal(4, line('.'))
4118531b9a3aSBram Moolenaar  autocmd! QuickFixCmdPost
4119531b9a3aSBram Moolenaar
4120531b9a3aSBram Moolenaar  " Test for cexpr/lexpr
4121531b9a3aSBram Moolenaar  call g:Xsetlist([], 'f')
4122531b9a3aSBram Moolenaar  Xexpr 'Xtestfile1:2:Line2'
4123531b9a3aSBram Moolenaar  autocmd QuickFixCmdPost * Xolder
4124531b9a3aSBram Moolenaar  Xexpr 'Xtestfile2:4:Line4'
4125bdd2c290SBram Moolenaar  call assert_equal('Xtestfile2', @%)
4126531b9a3aSBram Moolenaar  call assert_equal(4, line('.'))
4127531b9a3aSBram Moolenaar  autocmd! QuickFixCmdPost
4128531b9a3aSBram Moolenaar
4129851332eaSBram Moolenaar  " The grepprg may not be set on non-Unix systems
4130851332eaSBram Moolenaar  if has('unix')
4131531b9a3aSBram Moolenaar    " Test for grep/lgrep
4132531b9a3aSBram Moolenaar    call g:Xsetlist([], 'f')
4133531b9a3aSBram Moolenaar    Xexpr 'Xtestfile1:2:Line2'
4134531b9a3aSBram Moolenaar    autocmd QuickFixCmdPost * Xolder
4135531b9a3aSBram Moolenaar    silent Xgrep Line5 Xtestfile2
4136bdd2c290SBram Moolenaar    call assert_equal('Xtestfile2', @%)
4137531b9a3aSBram Moolenaar    call assert_equal(5, line('.'))
4138531b9a3aSBram Moolenaar    autocmd! QuickFixCmdPost
4139851332eaSBram Moolenaar  endif
4140531b9a3aSBram Moolenaar
4141531b9a3aSBram Moolenaar  " Test for vimgrep/lvimgrep
4142531b9a3aSBram Moolenaar  call g:Xsetlist([], 'f')
4143531b9a3aSBram Moolenaar  Xexpr 'Xtestfile1:2:Line2'
4144531b9a3aSBram Moolenaar  autocmd QuickFixCmdPost * Xolder
4145531b9a3aSBram Moolenaar  silent Xvimgrep Line5 Xtestfile2
4146bdd2c290SBram Moolenaar  call assert_equal('Xtestfile2', @%)
4147531b9a3aSBram Moolenaar  call assert_equal(5, line('.'))
4148531b9a3aSBram Moolenaar  autocmd! QuickFixCmdPost
4149531b9a3aSBram Moolenaar
41503f347e47SBram Moolenaar  " Test for autocommands clearing the quickfix list before jumping to the
41513f347e47SBram Moolenaar  " first error. This should not result in an error
41523f347e47SBram Moolenaar  autocmd QuickFixCmdPost * call g:Xsetlist([], 'r')
41533f347e47SBram Moolenaar  let v:errmsg = ''
41543f347e47SBram Moolenaar  " Test for cfile/lfile
41553f347e47SBram Moolenaar  Xfile Xerr
41563f347e47SBram Moolenaar  call assert_true(v:errmsg !~# 'E42:')
41573f347e47SBram Moolenaar  " Test for cbuffer/lbuffer
41583f347e47SBram Moolenaar  edit Xerr
41593f347e47SBram Moolenaar  Xbuffer
41603f347e47SBram Moolenaar  call assert_true(v:errmsg !~# 'E42:')
41613f347e47SBram Moolenaar  " Test for cexpr/lexpr
41623f347e47SBram Moolenaar  Xexpr 'Xtestfile2:4:Line4'
41633f347e47SBram Moolenaar  call assert_true(v:errmsg !~# 'E42:')
41643f347e47SBram Moolenaar  " Test for grep/lgrep
41653f347e47SBram Moolenaar  " The grepprg may not be set on non-Unix systems
41663f347e47SBram Moolenaar  if has('unix')
41673f347e47SBram Moolenaar    silent Xgrep Line5 Xtestfile2
41683f347e47SBram Moolenaar    call assert_true(v:errmsg !~# 'E42:')
41693f347e47SBram Moolenaar  endif
41703f347e47SBram Moolenaar  " Test for vimgrep/lvimgrep
41713f347e47SBram Moolenaar  call assert_fails('silent Xvimgrep Line5 Xtestfile2', 'E480:')
41723f347e47SBram Moolenaar  autocmd! QuickFixCmdPost
41733f347e47SBram Moolenaar
4174531b9a3aSBram Moolenaar  call delete('Xerr')
4175531b9a3aSBram Moolenaar  call delete('Xtestfile1')
4176531b9a3aSBram Moolenaar  call delete('Xtestfile2')
4177531b9a3aSBram Moolenaarendfunc
4178531b9a3aSBram Moolenaar
4179531b9a3aSBram Moolenaarfunc Test_autocmd_changelist()
4180531b9a3aSBram Moolenaar  call Xautocmd_changelist('c')
4181531b9a3aSBram Moolenaar  call Xautocmd_changelist('l')
4182531b9a3aSBram Moolenaarendfunc
41834cde86c2SBram Moolenaar
41844cde86c2SBram Moolenaar" Tests for the ':filter /pat/ clist' command
41854cde86c2SBram Moolenaarfunc Test_filter_clist()
41864cde86c2SBram Moolenaar  cexpr ['Xfile1:10:10:Line 10', 'Xfile2:15:15:Line 15']
41874cde86c2SBram Moolenaar  call assert_equal([' 2 Xfile2:15 col 15: Line 15'],
41884cde86c2SBram Moolenaar			\ split(execute('filter /Line 15/ clist'), "\n"))
41894cde86c2SBram Moolenaar  call assert_equal([' 1 Xfile1:10 col 10: Line 10'],
41904cde86c2SBram Moolenaar			\ split(execute('filter /Xfile1/ clist'), "\n"))
41914cde86c2SBram Moolenaar  call assert_equal([], split(execute('filter /abc/ clist'), "\n"))
41924cde86c2SBram Moolenaar
41934cde86c2SBram Moolenaar  call setqflist([{'module' : 'abc', 'pattern' : 'pat1'},
41944cde86c2SBram Moolenaar			\ {'module' : 'pqr', 'pattern' : 'pat2'}], ' ')
41954cde86c2SBram Moolenaar  call assert_equal([' 2 pqr:pat2:  '],
41964cde86c2SBram Moolenaar			\ split(execute('filter /pqr/ clist'), "\n"))
41974cde86c2SBram Moolenaar  call assert_equal([' 1 abc:pat1:  '],
41984cde86c2SBram Moolenaar			\ split(execute('filter /pat1/ clist'), "\n"))
41994cde86c2SBram Moolenaarendfunc
42000a08c63dSBram Moolenaar
42010a08c63dSBram Moolenaar" Tests for the "CTRL-W <CR>" command.
42020a08c63dSBram Moolenaarfunc Xview_result_split_tests(cchar)
42030a08c63dSBram Moolenaar  call s:setup_commands(a:cchar)
42040a08c63dSBram Moolenaar
42050a08c63dSBram Moolenaar  " Test that "CTRL-W <CR>" in a qf/ll window fails with empty list.
42060a08c63dSBram Moolenaar  call g:Xsetlist([])
42070a08c63dSBram Moolenaar  Xopen
42080a08c63dSBram Moolenaar  let l:win_count = winnr('$')
42090a08c63dSBram Moolenaar  call assert_fails('execute "normal! \<C-W>\<CR>"', 'E42')
42100a08c63dSBram Moolenaar  call assert_equal(l:win_count, winnr('$'))
42110a08c63dSBram Moolenaar  Xclose
42120a08c63dSBram Moolenaarendfunc
42130a08c63dSBram Moolenaar
42140a08c63dSBram Moolenaarfunc Test_view_result_split()
42150a08c63dSBram Moolenaar  call Xview_result_split_tests('c')
42160a08c63dSBram Moolenaar  call Xview_result_split_tests('l')
42170a08c63dSBram Moolenaarendfunc
42182dfcef4cSBram Moolenaar
42192dfcef4cSBram Moolenaar" Test that :cc sets curswant
42202dfcef4cSBram Moolenaarfunc Test_curswant()
42212dfcef4cSBram Moolenaar  helpgrep quickfix
42222dfcef4cSBram Moolenaar  normal! llll
42232dfcef4cSBram Moolenaar  1cc
42242dfcef4cSBram Moolenaar  call assert_equal(getcurpos()[4], virtcol('.'))
42252dfcef4cSBram Moolenaar  cclose | helpclose
42262dfcef4cSBram Moolenaarendfunc
4227b244373bSBram Moolenaar
4228b244373bSBram Moolenaar" Test for opening a file from the quickfix window using CTRL-W <Enter>
4229b244373bSBram Moolenaar" doesn't leave an empty buffer around.
4230b244373bSBram Moolenaarfunc Test_splitview()
4231b244373bSBram Moolenaar  call s:create_test_file('Xtestfile1')
4232b244373bSBram Moolenaar  call s:create_test_file('Xtestfile2')
4233b244373bSBram Moolenaar  new | only
4234b244373bSBram Moolenaar  let last_bufnr = bufnr('Test_sv_1', 1)
4235b244373bSBram Moolenaar  let l = ['Xtestfile1:2:Line2', 'Xtestfile2:4:Line4']
4236b244373bSBram Moolenaar  cgetexpr l
4237b244373bSBram Moolenaar  copen
4238b244373bSBram Moolenaar  let numbufs = len(getbufinfo())
4239b244373bSBram Moolenaar  exe "normal \<C-W>\<CR>"
4240b244373bSBram Moolenaar  copen
4241b244373bSBram Moolenaar  exe "normal j\<C-W>\<CR>"
4242b244373bSBram Moolenaar  " Make sure new empty buffers are not created
4243b244373bSBram Moolenaar  call assert_equal(numbufs, len(getbufinfo()))
4244b244373bSBram Moolenaar  " Creating a new buffer should use the next available buffer number
4245b244373bSBram Moolenaar  call assert_equal(last_bufnr + 4, bufnr("Test_sv_2", 1))
4246b244373bSBram Moolenaar  bwipe Test_sv_1
4247b244373bSBram Moolenaar  bwipe Test_sv_2
4248b244373bSBram Moolenaar  new | only
4249b244373bSBram Moolenaar
4250b244373bSBram Moolenaar  " When split opening files from location list window, make sure that two
4251b244373bSBram Moolenaar  " windows doesn't refer to the same location list
4252b244373bSBram Moolenaar  lgetexpr l
4253b244373bSBram Moolenaar  let locid = getloclist(0, {'id' : 0}).id
4254b244373bSBram Moolenaar  lopen
4255b244373bSBram Moolenaar  exe "normal \<C-W>\<CR>"
4256b244373bSBram Moolenaar  call assert_notequal(locid, getloclist(0, {'id' : 0}).id)
4257b244373bSBram Moolenaar  call assert_equal(0, getloclist(0, {'winid' : 0}).winid)
4258b244373bSBram Moolenaar  new | only
4259b244373bSBram Moolenaar
4260b244373bSBram Moolenaar  " When split opening files from a helpgrep location list window, a new help
4261eeb1b9c7SBram Moolenaar  " window should be opened with a copy of the location list.
4262b244373bSBram Moolenaar  lhelpgrep window
4263b244373bSBram Moolenaar  let locid = getloclist(0, {'id' : 0}).id
4264b244373bSBram Moolenaar  lwindow
4265b244373bSBram Moolenaar  exe "normal j\<C-W>\<CR>"
4266b244373bSBram Moolenaar  call assert_notequal(locid, getloclist(0, {'id' : 0}).id)
4267b244373bSBram Moolenaar  call assert_equal(0, getloclist(0, {'winid' : 0}).winid)
4268b244373bSBram Moolenaar  new | only
4269b244373bSBram Moolenaar
4270406cd90fSBram Moolenaar  " Using :split or :vsplit from a quickfix window should behave like a :new
4271406cd90fSBram Moolenaar  " or a :vnew command
4272406cd90fSBram Moolenaar  copen
4273406cd90fSBram Moolenaar  split
4274406cd90fSBram Moolenaar  call assert_equal(3, winnr('$'))
4275406cd90fSBram Moolenaar  let l = getwininfo()
4276406cd90fSBram Moolenaar  call assert_equal([0, 0, 1], [l[0].quickfix, l[1].quickfix, l[2].quickfix])
4277406cd90fSBram Moolenaar  close
4278406cd90fSBram Moolenaar  copen
4279406cd90fSBram Moolenaar  vsplit
4280406cd90fSBram Moolenaar  let l = getwininfo()
4281406cd90fSBram Moolenaar  call assert_equal([0, 0, 1], [l[0].quickfix, l[1].quickfix, l[2].quickfix])
4282406cd90fSBram Moolenaar  new | only
4283406cd90fSBram Moolenaar
4284b244373bSBram Moolenaar  call delete('Xtestfile1')
4285b244373bSBram Moolenaar  call delete('Xtestfile2')
4286b244373bSBram Moolenaarendfunc
4287c45eb770SBram Moolenaar
4288c45eb770SBram Moolenaar" Test for parsing entries using visual screen column
4289c45eb770SBram Moolenaarfunc Test_viscol()
4290c45eb770SBram Moolenaar  enew
4291c45eb770SBram Moolenaar  call writefile(["Col1\tCol2\tCol3"], 'Xfile1')
4292c45eb770SBram Moolenaar  edit Xfile1
4293c45eb770SBram Moolenaar
4294c45eb770SBram Moolenaar  " Use byte offset for column number
4295c45eb770SBram Moolenaar  set efm&
4296c45eb770SBram Moolenaar  cexpr "Xfile1:1:5:XX\nXfile1:1:9:YY\nXfile1:1:20:ZZ"
4297c45eb770SBram Moolenaar  call assert_equal([5, 8], [col('.'), virtcol('.')])
4298c45eb770SBram Moolenaar  cnext
4299c45eb770SBram Moolenaar  call assert_equal([9, 12], [col('.'), virtcol('.')])
4300c45eb770SBram Moolenaar  cnext
4301c45eb770SBram Moolenaar  call assert_equal([14, 20], [col('.'), virtcol('.')])
4302c45eb770SBram Moolenaar
4303c45eb770SBram Moolenaar  " Use screen column offset for column number
4304c45eb770SBram Moolenaar  set efm=%f:%l:%v:%m
4305c45eb770SBram Moolenaar  cexpr "Xfile1:1:8:XX\nXfile1:1:12:YY\nXfile1:1:20:ZZ"
4306c45eb770SBram Moolenaar  call assert_equal([5, 8], [col('.'), virtcol('.')])
4307c45eb770SBram Moolenaar  cnext
4308c45eb770SBram Moolenaar  call assert_equal([9, 12], [col('.'), virtcol('.')])
4309c45eb770SBram Moolenaar  cnext
4310c45eb770SBram Moolenaar  call assert_equal([14, 20], [col('.'), virtcol('.')])
4311c45eb770SBram Moolenaar  cexpr "Xfile1:1:6:XX\nXfile1:1:15:YY\nXfile1:1:24:ZZ"
4312c45eb770SBram Moolenaar  call assert_equal([5, 8], [col('.'), virtcol('.')])
4313c45eb770SBram Moolenaar  cnext
4314c45eb770SBram Moolenaar  call assert_equal([10, 16], [col('.'), virtcol('.')])
4315c45eb770SBram Moolenaar  cnext
4316c45eb770SBram Moolenaar  call assert_equal([14, 20], [col('.'), virtcol('.')])
4317c45eb770SBram Moolenaar
4318c45eb770SBram Moolenaar  enew
4319c45eb770SBram Moolenaar  call writefile(["Col1\täü\töß\tCol4"], 'Xfile1')
4320c45eb770SBram Moolenaar
4321c45eb770SBram Moolenaar  " Use byte offset for column number
4322c45eb770SBram Moolenaar  set efm&
4323c45eb770SBram Moolenaar  cexpr "Xfile1:1:8:XX\nXfile1:1:11:YY\nXfile1:1:16:ZZ"
4324c45eb770SBram Moolenaar  call assert_equal([8, 10], [col('.'), virtcol('.')])
4325c45eb770SBram Moolenaar  cnext
4326c45eb770SBram Moolenaar  call assert_equal([11, 17], [col('.'), virtcol('.')])
4327c45eb770SBram Moolenaar  cnext
4328c45eb770SBram Moolenaar  call assert_equal([16, 25], [col('.'), virtcol('.')])
4329c45eb770SBram Moolenaar
4330c45eb770SBram Moolenaar  " Use screen column offset for column number
4331c45eb770SBram Moolenaar  set efm=%f:%l:%v:%m
4332c45eb770SBram Moolenaar  cexpr "Xfile1:1:10:XX\nXfile1:1:17:YY\nXfile1:1:25:ZZ"
4333c45eb770SBram Moolenaar  call assert_equal([8, 10], [col('.'), virtcol('.')])
4334c45eb770SBram Moolenaar  cnext
4335c45eb770SBram Moolenaar  call assert_equal([11, 17], [col('.'), virtcol('.')])
4336c45eb770SBram Moolenaar  cnext
4337c45eb770SBram Moolenaar  call assert_equal([16, 25], [col('.'), virtcol('.')])
4338c45eb770SBram Moolenaar
4339c45eb770SBram Moolenaar  enew | only
4340c45eb770SBram Moolenaar  set efm&
4341c45eb770SBram Moolenaar  call delete('Xfile1')
4342c45eb770SBram Moolenaarendfunc
4343ee8188fcSBram Moolenaar
4344ee8188fcSBram Moolenaar" Test for the quickfix window buffer
4345ee8188fcSBram Moolenaarfunc Xqfbuf_test(cchar)
4346ee8188fcSBram Moolenaar  call s:setup_commands(a:cchar)
4347ee8188fcSBram Moolenaar
4348ee8188fcSBram Moolenaar  " Quickfix buffer should be reused across closing and opening a quickfix
4349ee8188fcSBram Moolenaar  " window
4350ee8188fcSBram Moolenaar  Xexpr "F1:10:Line10"
4351ee8188fcSBram Moolenaar  Xopen
4352ee8188fcSBram Moolenaar  let qfbnum = bufnr('')
4353ee8188fcSBram Moolenaar  Xclose
4354ee8188fcSBram Moolenaar  " Even after the quickfix window is closed, the buffer should be loaded
4355ee8188fcSBram Moolenaar  call assert_true(bufloaded(qfbnum))
4356647e24baSBram Moolenaar  call assert_true(qfbnum, g:Xgetlist({'qfbufnr' : 0}).qfbufnr)
4357ee8188fcSBram Moolenaar  Xopen
4358ee8188fcSBram Moolenaar  " Buffer should be reused when opening the window again
4359ee8188fcSBram Moolenaar  call assert_equal(qfbnum, bufnr(''))
4360ee8188fcSBram Moolenaar  Xclose
4361ee8188fcSBram Moolenaar
4362ee8188fcSBram Moolenaar  if a:cchar == 'l'
4363ee8188fcSBram Moolenaar    %bwipe
4364ee8188fcSBram Moolenaar    " For a location list, when both the file window and the location list
4365ee8188fcSBram Moolenaar    " window for the list are closed, then the buffer should be freed.
4366ee8188fcSBram Moolenaar    new | only
4367ee8188fcSBram Moolenaar    lexpr "F1:10:Line10"
4368ee8188fcSBram Moolenaar    let wid = win_getid()
4369ee8188fcSBram Moolenaar    lopen
4370ee8188fcSBram Moolenaar    let qfbnum = bufnr('')
4371ee8188fcSBram Moolenaar    call assert_match(qfbnum . ' %a-  "\[Location List]"', execute('ls'))
4372ee8188fcSBram Moolenaar    close
4373ee8188fcSBram Moolenaar    " When the location list window is closed, the buffer name should not
4374ee8188fcSBram Moolenaar    " change to 'Quickfix List'
4375647e24baSBram Moolenaar    call assert_match(qfbnum . 'u h-  "\[Location List]"', execute('ls!'))
4376ee8188fcSBram Moolenaar    call assert_true(bufloaded(qfbnum))
4377ee8188fcSBram Moolenaar
4378d82a81caSBram Moolenaar    " After deleting a location list buffer using ":bdelete", opening the
4379d82a81caSBram Moolenaar    " location list window should mark the buffer as a location list buffer.
4380d82a81caSBram Moolenaar    exe "bdelete " . qfbnum
4381d82a81caSBram Moolenaar    lopen
4382d82a81caSBram Moolenaar    call assert_equal("quickfix", &buftype)
4383d82a81caSBram Moolenaar    call assert_equal(1, getwininfo(win_getid(winnr()))[0].loclist)
4384d82a81caSBram Moolenaar    call assert_equal(wid, getloclist(0, {'filewinid' : 0}).filewinid)
4385d82a81caSBram Moolenaar    call assert_false(&swapfile)
4386d82a81caSBram Moolenaar    lclose
4387d82a81caSBram Moolenaar
4388eeb1b9c7SBram Moolenaar    " When the location list is cleared for the window, the buffer should be
4389eeb1b9c7SBram Moolenaar    " removed
4390eeb1b9c7SBram Moolenaar    call setloclist(0, [], 'f')
4391eeb1b9c7SBram Moolenaar    call assert_false(bufexists(qfbnum))
4392647e24baSBram Moolenaar    call assert_equal(0, getloclist(0, {'qfbufnr' : 0}).qfbufnr)
4393eeb1b9c7SBram Moolenaar
4394eeb1b9c7SBram Moolenaar    " When the location list is freed with the location list window open, the
4395eeb1b9c7SBram Moolenaar    " location list buffer should not be lost. It should be reused when the
4396eeb1b9c7SBram Moolenaar    " location list is again populated.
4397eeb1b9c7SBram Moolenaar    lexpr "F1:10:Line10"
4398eeb1b9c7SBram Moolenaar    lopen
4399eeb1b9c7SBram Moolenaar    let wid = win_getid()
4400eeb1b9c7SBram Moolenaar    let qfbnum = bufnr('')
4401eeb1b9c7SBram Moolenaar    wincmd p
4402eeb1b9c7SBram Moolenaar    call setloclist(0, [], 'f')
4403eeb1b9c7SBram Moolenaar    lexpr "F1:10:Line10"
4404eeb1b9c7SBram Moolenaar    lopen
4405eeb1b9c7SBram Moolenaar    call assert_equal(wid, win_getid())
4406eeb1b9c7SBram Moolenaar    call assert_equal(qfbnum, bufnr(''))
4407eeb1b9c7SBram Moolenaar    lclose
4408eeb1b9c7SBram Moolenaar
4409eeb1b9c7SBram Moolenaar    " When the window with the location list is closed, the buffer should be
4410eeb1b9c7SBram Moolenaar    " removed
4411ee8188fcSBram Moolenaar    new | only
4412eeb1b9c7SBram Moolenaar    call assert_false(bufexists(qfbnum))
4413ee8188fcSBram Moolenaar  endif
4414ee8188fcSBram Moolenaarendfunc
4415ee8188fcSBram Moolenaar
4416ee8188fcSBram Moolenaarfunc Test_qfbuf()
4417ee8188fcSBram Moolenaar  call Xqfbuf_test('c')
4418ee8188fcSBram Moolenaar  call Xqfbuf_test('l')
4419ee8188fcSBram Moolenaarendfunc
4420eeb1b9c7SBram Moolenaar
4421eeb1b9c7SBram Moolenaar" If there is an autocmd to use only one window, then opening the location
4422eeb1b9c7SBram Moolenaar" list window used to crash Vim.
4423eeb1b9c7SBram Moolenaarfunc Test_winonly_autocmd()
4424eeb1b9c7SBram Moolenaar  call s:create_test_file('Xtest1')
4425eeb1b9c7SBram Moolenaar  " Autocmd to show only one Vim window at a time
4426eeb1b9c7SBram Moolenaar  autocmd WinEnter * only
4427eeb1b9c7SBram Moolenaar  new
4428eeb1b9c7SBram Moolenaar  " Load the location list
4429eeb1b9c7SBram Moolenaar  lexpr "Xtest1:5:Line5\nXtest1:10:Line10\nXtest1:15:Line15"
4430eeb1b9c7SBram Moolenaar  let loclistid = getloclist(0, {'id' : 0}).id
4431eeb1b9c7SBram Moolenaar  " Open the location list window. Only this window will be shown and the file
4432eeb1b9c7SBram Moolenaar  " window is closed.
4433eeb1b9c7SBram Moolenaar  lopen
4434eeb1b9c7SBram Moolenaar  call assert_equal(loclistid, getloclist(0, {'id' : 0}).id)
4435eeb1b9c7SBram Moolenaar  " Jump to an entry in the location list and make sure that the cursor is
4436eeb1b9c7SBram Moolenaar  " positioned correctly.
4437eeb1b9c7SBram Moolenaar  ll 3
4438eeb1b9c7SBram Moolenaar  call assert_equal(loclistid, getloclist(0, {'id' : 0}).id)
4439bdd2c290SBram Moolenaar  call assert_equal('Xtest1', @%)
4440eeb1b9c7SBram Moolenaar  call assert_equal(15, line('.'))
4441eeb1b9c7SBram Moolenaar  " Cleanup
4442eeb1b9c7SBram Moolenaar  autocmd! WinEnter
4443eeb1b9c7SBram Moolenaar  new | only
4444eeb1b9c7SBram Moolenaar  call delete('Xtest1')
4445eeb1b9c7SBram Moolenaarendfunc
444639803d82SBram Moolenaar
444739803d82SBram Moolenaar" Test to make sure that an empty quickfix buffer is not reused for loading
444839803d82SBram Moolenaar" a normal buffer.
444939803d82SBram Moolenaarfunc Test_empty_qfbuf()
445039803d82SBram Moolenaar  enew | only
445139803d82SBram Moolenaar  call writefile(["Test"], 'Xfile1')
445239803d82SBram Moolenaar  call setqflist([], 'f')
445339803d82SBram Moolenaar  copen | only
445439803d82SBram Moolenaar  let qfbuf = bufnr('')
445539803d82SBram Moolenaar  edit Xfile1
445639803d82SBram Moolenaar  call assert_notequal(qfbuf, bufnr(''))
445739803d82SBram Moolenaar  enew
445839803d82SBram Moolenaar  call delete('Xfile1')
445939803d82SBram Moolenaarendfunc
44603ff33114SBram Moolenaar
44613ff33114SBram Moolenaar" Test for the :cbelow, :cabove, :lbelow and :labove commands.
4462cf6a55c4SBram Moolenaar" And for the :cafter, :cbefore, :lafter and :lbefore commands.
44633ff33114SBram Moolenaarfunc Xtest_below(cchar)
44643ff33114SBram Moolenaar  call s:setup_commands(a:cchar)
44653ff33114SBram Moolenaar
44663ff33114SBram Moolenaar  " No quickfix/location list
44673ff33114SBram Moolenaar  call assert_fails('Xbelow', 'E42:')
44683ff33114SBram Moolenaar  call assert_fails('Xabove', 'E42:')
4469cf6a55c4SBram Moolenaar  call assert_fails('Xbefore', 'E42:')
4470cf6a55c4SBram Moolenaar  call assert_fails('Xafter', 'E42:')
44713ff33114SBram Moolenaar
44723ff33114SBram Moolenaar  " Empty quickfix/location list
44733ff33114SBram Moolenaar  call g:Xsetlist([])
44743ff33114SBram Moolenaar  call assert_fails('Xbelow', 'E42:')
44753ff33114SBram Moolenaar  call assert_fails('Xabove', 'E42:')
4476cf6a55c4SBram Moolenaar  call assert_fails('Xbefore', 'E42:')
4477cf6a55c4SBram Moolenaar  call assert_fails('Xafter', 'E42:')
44783ff33114SBram Moolenaar
44793ff33114SBram Moolenaar  call s:create_test_file('X1')
44803ff33114SBram Moolenaar  call s:create_test_file('X2')
44813ff33114SBram Moolenaar  call s:create_test_file('X3')
44823ff33114SBram Moolenaar  call s:create_test_file('X4')
44833ff33114SBram Moolenaar
44843ff33114SBram Moolenaar  " Invalid entries
44853ff33114SBram Moolenaar  edit X1
44863ff33114SBram Moolenaar  call g:Xsetlist(["E1", "E2"])
44873ff33114SBram Moolenaar  call assert_fails('Xbelow', 'E42:')
44883ff33114SBram Moolenaar  call assert_fails('Xabove', 'E42:')
44893ff33114SBram Moolenaar  call assert_fails('3Xbelow', 'E42:')
44903ff33114SBram Moolenaar  call assert_fails('4Xabove', 'E42:')
4491cf6a55c4SBram Moolenaar  call assert_fails('Xbefore', 'E42:')
4492cf6a55c4SBram Moolenaar  call assert_fails('Xafter', 'E42:')
4493cf6a55c4SBram Moolenaar  call assert_fails('3Xbefore', 'E42:')
4494cf6a55c4SBram Moolenaar  call assert_fails('4Xafter', 'E42:')
44953ff33114SBram Moolenaar
44963ff33114SBram Moolenaar  " Test the commands with various arguments
4497cf6a55c4SBram Moolenaar  Xexpr ["X1:5:3:L5", "X2:5:2:L5", "X2:10:3:L10", "X2:15:4:L15", "X3:3:5:L3"]
44983ff33114SBram Moolenaar  edit +7 X2
44993ff33114SBram Moolenaar  Xabove
4500bdd2c290SBram Moolenaar  call assert_equal(['X2', 5], [@%, line('.')])
45013ff33114SBram Moolenaar  call assert_fails('Xabove', 'E553:')
4502cf6a55c4SBram Moolenaar  normal 7G
4503cf6a55c4SBram Moolenaar  Xbefore
4504bdd2c290SBram Moolenaar  call assert_equal(['X2', 5, 2], [@%, line('.'), col('.')])
4505cf6a55c4SBram Moolenaar  call assert_fails('Xbefore', 'E553:')
4506cf6a55c4SBram Moolenaar
45073ff33114SBram Moolenaar  normal 2j
45083ff33114SBram Moolenaar  Xbelow
4509bdd2c290SBram Moolenaar  call assert_equal(['X2', 10], [@%, line('.')])
4510cf6a55c4SBram Moolenaar  normal 7G
4511cf6a55c4SBram Moolenaar  Xafter
4512bdd2c290SBram Moolenaar  call assert_equal(['X2', 10, 3], [@%, line('.'), col('.')])
4513cf6a55c4SBram Moolenaar
45143ff33114SBram Moolenaar  " Last error in this file
45153ff33114SBram Moolenaar  Xbelow 99
4516bdd2c290SBram Moolenaar  call assert_equal(['X2', 15], [@%, line('.')])
45173ff33114SBram Moolenaar  call assert_fails('Xbelow', 'E553:')
4518cf6a55c4SBram Moolenaar  normal gg
4519cf6a55c4SBram Moolenaar  Xafter 99
4520bdd2c290SBram Moolenaar  call assert_equal(['X2', 15, 4], [@%, line('.'), col('.')])
4521cf6a55c4SBram Moolenaar  call assert_fails('Xafter', 'E553:')
4522cf6a55c4SBram Moolenaar
45233ff33114SBram Moolenaar  " First error in this file
45243ff33114SBram Moolenaar  Xabove 99
4525bdd2c290SBram Moolenaar  call assert_equal(['X2', 5], [@%, line('.')])
45263ff33114SBram Moolenaar  call assert_fails('Xabove', 'E553:')
4527cf6a55c4SBram Moolenaar  normal G
4528cf6a55c4SBram Moolenaar  Xbefore 99
4529bdd2c290SBram Moolenaar  call assert_equal(['X2', 5, 2], [@%, line('.'), col('.')])
4530cf6a55c4SBram Moolenaar  call assert_fails('Xbefore', 'E553:')
4531cf6a55c4SBram Moolenaar
45323ff33114SBram Moolenaar  normal gg
45333ff33114SBram Moolenaar  Xbelow 2
4534bdd2c290SBram Moolenaar  call assert_equal(['X2', 10], [@%, line('.')])
4535cf6a55c4SBram Moolenaar  normal gg
4536cf6a55c4SBram Moolenaar  Xafter 2
4537bdd2c290SBram Moolenaar  call assert_equal(['X2', 10, 3], [@%, line('.'), col('.')])
4538cf6a55c4SBram Moolenaar
45393ff33114SBram Moolenaar  normal G
45403ff33114SBram Moolenaar  Xabove 2
4541bdd2c290SBram Moolenaar  call assert_equal(['X2', 10], [@%, line('.')])
4542cf6a55c4SBram Moolenaar  normal G
4543cf6a55c4SBram Moolenaar  Xbefore 2
4544bdd2c290SBram Moolenaar  call assert_equal(['X2', 10, 3], [@%, line('.'), col('.')])
4545cf6a55c4SBram Moolenaar
45463ff33114SBram Moolenaar  edit X4
45473ff33114SBram Moolenaar  call assert_fails('Xabove', 'E42:')
45483ff33114SBram Moolenaar  call assert_fails('Xbelow', 'E42:')
4549cf6a55c4SBram Moolenaar  call assert_fails('Xbefore', 'E42:')
4550cf6a55c4SBram Moolenaar  call assert_fails('Xafter', 'E42:')
45513ff33114SBram Moolenaar  if a:cchar == 'l'
45523ff33114SBram Moolenaar    " If a buffer has location list entries from some other window but not
45533ff33114SBram Moolenaar    " from the current window, then the commands should fail.
45543ff33114SBram Moolenaar    edit X1 | split | call setloclist(0, [], 'f')
45553ff33114SBram Moolenaar    call assert_fails('Xabove', 'E776:')
45563ff33114SBram Moolenaar    call assert_fails('Xbelow', 'E776:')
4557cf6a55c4SBram Moolenaar    call assert_fails('Xbefore', 'E776:')
4558cf6a55c4SBram Moolenaar    call assert_fails('Xafter', 'E776:')
45593ff33114SBram Moolenaar    close
45603ff33114SBram Moolenaar  endif
45613ff33114SBram Moolenaar
45623ff33114SBram Moolenaar  " Test for lines with multiple quickfix entries
45633ff33114SBram Moolenaar  Xexpr ["X1:5:L5", "X2:5:1:L5_1", "X2:5:2:L5_2", "X2:5:3:L5_3",
45643ff33114SBram Moolenaar	      \ "X2:10:1:L10_1", "X2:10:2:L10_2", "X2:10:3:L10_3",
45653ff33114SBram Moolenaar	      \ "X2:15:1:L15_1", "X2:15:2:L15_2", "X2:15:3:L15_3", "X3:3:L3"]
45663ff33114SBram Moolenaar  edit +1 X2
45673ff33114SBram Moolenaar  Xbelow 2
4568bdd2c290SBram Moolenaar  call assert_equal(['X2', 10, 1], [@%, line('.'), col('.')])
4569cf6a55c4SBram Moolenaar  normal 1G
4570cf6a55c4SBram Moolenaar  Xafter 2
4571bdd2c290SBram Moolenaar  call assert_equal(['X2', 5, 2], [@%, line('.'), col('.')])
4572cf6a55c4SBram Moolenaar
45733ff33114SBram Moolenaar  normal gg
45743ff33114SBram Moolenaar  Xbelow 99
4575bdd2c290SBram Moolenaar  call assert_equal(['X2', 15, 1], [@%, line('.'), col('.')])
4576cf6a55c4SBram Moolenaar  normal gg
4577cf6a55c4SBram Moolenaar  Xafter 99
4578bdd2c290SBram Moolenaar  call assert_equal(['X2', 15, 3], [@%, line('.'), col('.')])
4579cf6a55c4SBram Moolenaar
45803ff33114SBram Moolenaar  normal G
45813ff33114SBram Moolenaar  Xabove 2
4582bdd2c290SBram Moolenaar  call assert_equal(['X2', 10, 1], [@%, line('.'), col('.')])
45833ff33114SBram Moolenaar  normal G
4584cf6a55c4SBram Moolenaar  Xbefore 2
4585bdd2c290SBram Moolenaar  call assert_equal(['X2', 15, 2], [@%, line('.'), col('.')])
4586cf6a55c4SBram Moolenaar
4587cf6a55c4SBram Moolenaar  normal G
45883ff33114SBram Moolenaar  Xabove 99
4589bdd2c290SBram Moolenaar  call assert_equal(['X2', 5, 1], [@%, line('.'), col('.')])
4590cf6a55c4SBram Moolenaar  normal G
4591cf6a55c4SBram Moolenaar  Xbefore 99
4592bdd2c290SBram Moolenaar  call assert_equal(['X2', 5, 1], [@%, line('.'), col('.')])
4593cf6a55c4SBram Moolenaar
45943ff33114SBram Moolenaar  normal 10G
45953ff33114SBram Moolenaar  Xabove
4596bdd2c290SBram Moolenaar  call assert_equal(['X2', 5, 1], [@%, line('.'), col('.')])
4597cf6a55c4SBram Moolenaar  normal 10G$
4598cf6a55c4SBram Moolenaar  2Xbefore
4599bdd2c290SBram Moolenaar  call assert_equal(['X2', 10, 2], [@%, line('.'), col('.')])
4600cf6a55c4SBram Moolenaar
46013ff33114SBram Moolenaar  normal 10G
46023ff33114SBram Moolenaar  Xbelow
4603bdd2c290SBram Moolenaar  call assert_equal(['X2', 15, 1], [@%, line('.'), col('.')])
4604cf6a55c4SBram Moolenaar  normal 9G
4605cf6a55c4SBram Moolenaar  5Xafter
4606bdd2c290SBram Moolenaar  call assert_equal(['X2', 15, 2], [@%, line('.'), col('.')])
46073ff33114SBram Moolenaar
46083ff33114SBram Moolenaar  " Invalid range
46093ff33114SBram Moolenaar  if a:cchar == 'c'
461025190db2SBram Moolenaar    call assert_fails('-2cbelow', 'E16:')
4611cf6a55c4SBram Moolenaar    call assert_fails('-2cafter', 'E16:')
46123ff33114SBram Moolenaar  else
461325190db2SBram Moolenaar    call assert_fails('-2lbelow', 'E16:')
4614cf6a55c4SBram Moolenaar    call assert_fails('-2lafter', 'E16:')
46153ff33114SBram Moolenaar  endif
46163ff33114SBram Moolenaar
46173ff33114SBram Moolenaar  call delete('X1')
46183ff33114SBram Moolenaar  call delete('X2')
46193ff33114SBram Moolenaar  call delete('X3')
46203ff33114SBram Moolenaar  call delete('X4')
46213ff33114SBram Moolenaarendfunc
46223ff33114SBram Moolenaar
46233ff33114SBram Moolenaarfunc Test_cbelow()
46243ff33114SBram Moolenaar  call Xtest_below('c')
46253ff33114SBram Moolenaar  call Xtest_below('l')
46263ff33114SBram Moolenaarendfunc
462725190db2SBram Moolenaar
462825190db2SBram Moolenaarfunc Test_quickfix_count()
462925190db2SBram Moolenaar  let commands = [
463025190db2SBram Moolenaar	\ 'cNext',
463125190db2SBram Moolenaar	\ 'cNfile',
463225190db2SBram Moolenaar	\ 'cabove',
463325190db2SBram Moolenaar	\ 'cbelow',
463425190db2SBram Moolenaar	\ 'cfirst',
463525190db2SBram Moolenaar	\ 'clast',
463625190db2SBram Moolenaar	\ 'cnewer',
463725190db2SBram Moolenaar	\ 'cnext',
463825190db2SBram Moolenaar	\ 'cnfile',
463925190db2SBram Moolenaar	\ 'colder',
464025190db2SBram Moolenaar	\ 'cprevious',
464125190db2SBram Moolenaar	\ 'crewind',
464225190db2SBram Moolenaar	\
464325190db2SBram Moolenaar	\ 'lNext',
464425190db2SBram Moolenaar	\ 'lNfile',
464525190db2SBram Moolenaar	\ 'labove',
464625190db2SBram Moolenaar	\ 'lbelow',
464725190db2SBram Moolenaar	\ 'lfirst',
464825190db2SBram Moolenaar	\ 'llast',
464925190db2SBram Moolenaar	\ 'lnewer',
465025190db2SBram Moolenaar	\ 'lnext',
465125190db2SBram Moolenaar	\ 'lnfile',
465225190db2SBram Moolenaar	\ 'lolder',
465325190db2SBram Moolenaar	\ 'lprevious',
465425190db2SBram Moolenaar	\ 'lrewind',
465525190db2SBram Moolenaar	\ ]
465625190db2SBram Moolenaar  for cmd in commands
465725190db2SBram Moolenaar    call assert_fails('-1' .. cmd, 'E16:')
465825190db2SBram Moolenaar    call assert_fails('.' .. cmd, 'E16:')
465925190db2SBram Moolenaar    call assert_fails('%' .. cmd, 'E16:')
466025190db2SBram Moolenaar    call assert_fails('$' .. cmd, 'E16:')
466125190db2SBram Moolenaar  endfor
466225190db2SBram Moolenaarendfunc
46636a0cc916SBram Moolenaar
46646a0cc916SBram Moolenaar" Test for aborting quickfix commands using QuickFixCmdPre
46656a0cc916SBram Moolenaarfunc Xtest_qfcmd_abort(cchar)
46666a0cc916SBram Moolenaar  call s:setup_commands(a:cchar)
46676a0cc916SBram Moolenaar
46686a0cc916SBram Moolenaar  call g:Xsetlist([], 'f')
46696a0cc916SBram Moolenaar
46706a0cc916SBram Moolenaar  " cexpr/lexpr
46716a0cc916SBram Moolenaar  let e = ''
46726a0cc916SBram Moolenaar  try
46736a0cc916SBram Moolenaar    Xexpr ["F1:10:Line10", "F2:20:Line20"]
46746a0cc916SBram Moolenaar  catch /.*/
46756a0cc916SBram Moolenaar    let e = v:exception
46766a0cc916SBram Moolenaar  endtry
46776a0cc916SBram Moolenaar  call assert_equal('AbortCmd', e)
46786a0cc916SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
46796a0cc916SBram Moolenaar
46806a0cc916SBram Moolenaar  " cfile/lfile
46816a0cc916SBram Moolenaar  call writefile(["F1:10:Line10", "F2:20:Line20"], 'Xfile1')
46826a0cc916SBram Moolenaar  let e = ''
46836a0cc916SBram Moolenaar  try
46846a0cc916SBram Moolenaar    Xfile Xfile1
46856a0cc916SBram Moolenaar  catch /.*/
46866a0cc916SBram Moolenaar    let e = v:exception
46876a0cc916SBram Moolenaar  endtry
46886a0cc916SBram Moolenaar  call assert_equal('AbortCmd', e)
46896a0cc916SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
46906a0cc916SBram Moolenaar  call delete('Xfile1')
46916a0cc916SBram Moolenaar
46926a0cc916SBram Moolenaar  " cgetbuffer/lgetbuffer
46936a0cc916SBram Moolenaar  enew!
46946a0cc916SBram Moolenaar  call append(0, ["F1:10:Line10", "F2:20:Line20"])
46956a0cc916SBram Moolenaar  let e = ''
46966a0cc916SBram Moolenaar  try
46976a0cc916SBram Moolenaar    Xgetbuffer
46986a0cc916SBram Moolenaar  catch /.*/
46996a0cc916SBram Moolenaar    let e = v:exception
47006a0cc916SBram Moolenaar  endtry
47016a0cc916SBram Moolenaar  call assert_equal('AbortCmd', e)
47026a0cc916SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
47036a0cc916SBram Moolenaar  enew!
47046a0cc916SBram Moolenaar
47056a0cc916SBram Moolenaar  " vimgrep/lvimgrep
47066a0cc916SBram Moolenaar  let e = ''
47076a0cc916SBram Moolenaar  try
47086a0cc916SBram Moolenaar    Xvimgrep /func/ test_quickfix.vim
47096a0cc916SBram Moolenaar  catch /.*/
47106a0cc916SBram Moolenaar    let e = v:exception
47116a0cc916SBram Moolenaar  endtry
47126a0cc916SBram Moolenaar  call assert_equal('AbortCmd', e)
47136a0cc916SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
47146a0cc916SBram Moolenaar
47156a0cc916SBram Moolenaar  " helpgrep/lhelpgrep
47166a0cc916SBram Moolenaar  let e = ''
47176a0cc916SBram Moolenaar  try
47186a0cc916SBram Moolenaar    Xhelpgrep quickfix
47196a0cc916SBram Moolenaar  catch /.*/
47206a0cc916SBram Moolenaar    let e = v:exception
47216a0cc916SBram Moolenaar  endtry
47226a0cc916SBram Moolenaar  call assert_equal('AbortCmd', e)
47236a0cc916SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
47246a0cc916SBram Moolenaar
47256a0cc916SBram Moolenaar  " grep/lgrep
47266a0cc916SBram Moolenaar  if has('unix')
47276a0cc916SBram Moolenaar    let e = ''
47286a0cc916SBram Moolenaar    try
47296a0cc916SBram Moolenaar      silent Xgrep func test_quickfix.vim
47306a0cc916SBram Moolenaar    catch /.*/
47316a0cc916SBram Moolenaar      let e = v:exception
47326a0cc916SBram Moolenaar    endtry
47336a0cc916SBram Moolenaar    call assert_equal('AbortCmd', e)
47346a0cc916SBram Moolenaar    call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
47356a0cc916SBram Moolenaar  endif
47366a0cc916SBram Moolenaarendfunc
47376a0cc916SBram Moolenaar
47386a0cc916SBram Moolenaarfunc Test_qfcmd_abort()
47396a0cc916SBram Moolenaar  augroup QF_Test
47406a0cc916SBram Moolenaar    au!
47416a0cc916SBram Moolenaar    autocmd  QuickFixCmdPre * throw "AbortCmd"
47426a0cc916SBram Moolenaar  augroup END
47436a0cc916SBram Moolenaar
47446a0cc916SBram Moolenaar  call Xtest_qfcmd_abort('c')
47456a0cc916SBram Moolenaar  call Xtest_qfcmd_abort('l')
47466a0cc916SBram Moolenaar
47476a0cc916SBram Moolenaar  augroup QF_Test
47486a0cc916SBram Moolenaar    au!
47496a0cc916SBram Moolenaar  augroup END
47506a0cc916SBram Moolenaarendfunc
47516a0cc916SBram Moolenaar
4752d8a8c4caSBram Moolenaar" Test for using a file in one of the parent directories.
4753d8a8c4caSBram Moolenaarfunc Test_search_in_dirstack()
4754d8a8c4caSBram Moolenaar  call mkdir('Xtestdir/a/b/c', 'p')
4755d8a8c4caSBram Moolenaar  let save_cwd = getcwd()
4756d8a8c4caSBram Moolenaar  call writefile(["X1_L1", "X1_L2"], 'Xtestdir/Xfile1')
4757d8a8c4caSBram Moolenaar  call writefile(["X2_L1", "X2_L2"], 'Xtestdir/a/Xfile2')
4758d8a8c4caSBram Moolenaar  call writefile(["X3_L1", "X3_L2"], 'Xtestdir/a/b/Xfile3')
4759d8a8c4caSBram Moolenaar  call writefile(["X4_L1", "X4_L2"], 'Xtestdir/a/b/c/Xfile4')
4760d8a8c4caSBram Moolenaar
4761d8a8c4caSBram Moolenaar  let lines = "Entering dir Xtestdir\n" .
4762d8a8c4caSBram Moolenaar	      \ "Entering dir a\n" .
4763d8a8c4caSBram Moolenaar	      \ "Entering dir b\n" .
4764d8a8c4caSBram Moolenaar	      \ "Xfile2:2:X2_L2\n" .
4765d8a8c4caSBram Moolenaar	      \ "Leaving dir a\n" .
4766d8a8c4caSBram Moolenaar	      \ "Xfile1:2:X1_L2\n" .
4767d8a8c4caSBram Moolenaar	      \ "Xfile3:1:X3_L1\n" .
4768d8a8c4caSBram Moolenaar	      \ "Entering dir c\n" .
4769d8a8c4caSBram Moolenaar	      \ "Xfile4:2:X4_L2\n" .
477088a3e2b2SBram Moolenaar	      \ "Leaving dir c\n"
4771d8a8c4caSBram Moolenaar  set efm=%DEntering\ dir\ %f,%XLeaving\ dir\ %f,%f:%l:%m
477288a3e2b2SBram Moolenaar  cexpr lines .. "Leaving dir Xtestdir|\n" | let next = 1
4773d8a8c4caSBram Moolenaar  call assert_equal(11, getqflist({'size' : 0}).size)
4774d8a8c4caSBram Moolenaar  call assert_equal(4, getqflist({'idx' : 0}).idx)
4775d8a8c4caSBram Moolenaar  call assert_equal('X2_L2', getline('.'))
477688a3e2b2SBram Moolenaar  call assert_equal(1, next)
4777d8a8c4caSBram Moolenaar  cnext
4778d8a8c4caSBram Moolenaar  call assert_equal(6, getqflist({'idx' : 0}).idx)
4779d8a8c4caSBram Moolenaar  call assert_equal('X1_L2', getline('.'))
4780d8a8c4caSBram Moolenaar  cnext
4781d8a8c4caSBram Moolenaar  call assert_equal(7, getqflist({'idx' : 0}).idx)
4782d8a8c4caSBram Moolenaar  call assert_equal(1, line('$'))
4783d8a8c4caSBram Moolenaar  call assert_equal('', getline(1))
4784d8a8c4caSBram Moolenaar  cnext
4785d8a8c4caSBram Moolenaar  call assert_equal(9, getqflist({'idx' : 0}).idx)
4786d8a8c4caSBram Moolenaar  call assert_equal(1, line('$'))
4787d8a8c4caSBram Moolenaar  call assert_equal('', getline(1))
4788d8a8c4caSBram Moolenaar
4789d8a8c4caSBram Moolenaar  set efm&
4790d8a8c4caSBram Moolenaar  exe 'cd ' . save_cwd
4791d8a8c4caSBram Moolenaar  call delete('Xtestdir', 'rf')
4792d8a8c4caSBram Moolenaarendfunc
4793d8a8c4caSBram Moolenaar
47941860bde9SBram Moolenaar" Test for :cquit
47951860bde9SBram Moolenaarfunc Test_cquit()
47961860bde9SBram Moolenaar  " Exit Vim with a non-zero value
47971860bde9SBram Moolenaar  if RunVim([], ["cquit 7"], '')
47981860bde9SBram Moolenaar    call assert_equal(7, v:shell_error)
47991860bde9SBram Moolenaar  endif
48001860bde9SBram Moolenaar
48011860bde9SBram Moolenaar  if RunVim([], ["50cquit"], '')
48021860bde9SBram Moolenaar    call assert_equal(50, v:shell_error)
48031860bde9SBram Moolenaar  endif
48041860bde9SBram Moolenaar
48051860bde9SBram Moolenaar  " Exit Vim with default value
48061860bde9SBram Moolenaar  if RunVim([], ["cquit"], '')
48071860bde9SBram Moolenaar    call assert_equal(1, v:shell_error)
48081860bde9SBram Moolenaar  endif
48091860bde9SBram Moolenaar
48101860bde9SBram Moolenaar  " Exit Vim with zero value
48111860bde9SBram Moolenaar  if RunVim([], ["cquit 0"], '')
48121860bde9SBram Moolenaar    call assert_equal(0, v:shell_error)
48131860bde9SBram Moolenaar  endif
48141860bde9SBram Moolenaar
48151860bde9SBram Moolenaar  " Exit Vim with negative value
48161860bde9SBram Moolenaar  call assert_fails('-3cquit', 'E16:')
48171860bde9SBram Moolenaarendfunc
48181860bde9SBram Moolenaar
4819858ba06dSBram Moolenaar" Test for getting a specific item from a quickfix list
4820858ba06dSBram Moolenaarfunc Xtest_getqflist_by_idx(cchar)
4821858ba06dSBram Moolenaar  call s:setup_commands(a:cchar)
4822858ba06dSBram Moolenaar  " Empty list
4823858ba06dSBram Moolenaar  call assert_equal([], g:Xgetlist({'idx' : 1, 'items' : 0}).items)
4824858ba06dSBram Moolenaar  Xexpr ['F1:10:L10', 'F1:20:L20']
4825858ba06dSBram Moolenaar  let l = g:Xgetlist({'idx' : 2, 'items' : 0}).items
4826858ba06dSBram Moolenaar  call assert_equal(bufnr('F1'), l[0].bufnr)
4827858ba06dSBram Moolenaar  call assert_equal(20, l[0].lnum)
4828858ba06dSBram Moolenaar  call assert_equal('L20', l[0].text)
4829858ba06dSBram Moolenaar  call assert_equal([], g:Xgetlist({'idx' : -1, 'items' : 0}).items)
4830858ba06dSBram Moolenaar  call assert_equal([], g:Xgetlist({'idx' : 3, 'items' : 0}).items)
4831858ba06dSBram Moolenaar  %bwipe!
4832858ba06dSBram Moolenaarendfunc
4833858ba06dSBram Moolenaar
4834858ba06dSBram Moolenaarfunc Test_getqflist_by_idx()
4835858ba06dSBram Moolenaar  call Xtest_getqflist_by_idx('c')
4836858ba06dSBram Moolenaar  call Xtest_getqflist_by_idx('l')
4837858ba06dSBram Moolenaarendfunc
4838858ba06dSBram Moolenaar
4839858ba06dSBram Moolenaar" Test for the 'quickfixtextfunc' setting
4840858ba06dSBram Moolenaarfunc Tqfexpr(info)
4841858ba06dSBram Moolenaar  if a:info.quickfix
484200e260bbSBram Moolenaar    let qfl = getqflist({'id' : a:info.id, 'items' : 1}).items
4843858ba06dSBram Moolenaar  else
484400e260bbSBram Moolenaar    let qfl = getloclist(a:info.winid, {'id' : a:info.id, 'items' : 1}).items
4845858ba06dSBram Moolenaar  endif
4846858ba06dSBram Moolenaar
484700e260bbSBram Moolenaar  let l = []
484800e260bbSBram Moolenaar  for idx in range(a:info.start_idx - 1, a:info.end_idx - 1)
484900e260bbSBram Moolenaar    let e = qfl[idx]
4850858ba06dSBram Moolenaar    let s = ''
4851858ba06dSBram Moolenaar    if e.bufnr != 0
4852858ba06dSBram Moolenaar      let bname = bufname(e.bufnr)
4853858ba06dSBram Moolenaar      let s ..= fnamemodify(bname, ':.')
4854858ba06dSBram Moolenaar    endif
4855858ba06dSBram Moolenaar    let s ..= '-'
4856858ba06dSBram Moolenaar    let s ..= 'L' .. string(e.lnum) .. 'C' .. string(e.col) .. '-'
4857858ba06dSBram Moolenaar    let s ..= e.text
485800e260bbSBram Moolenaar    call add(l, s)
485900e260bbSBram Moolenaar  endfor
4860858ba06dSBram Moolenaar
486100e260bbSBram Moolenaar  return l
4862858ba06dSBram Moolenaarendfunc
4863858ba06dSBram Moolenaar
4864858ba06dSBram Moolenaarfunc Xtest_qftextfunc(cchar)
4865858ba06dSBram Moolenaar  call s:setup_commands(a:cchar)
4866858ba06dSBram Moolenaar
4867858ba06dSBram Moolenaar  set efm=%f:%l:%c:%m
4868858ba06dSBram Moolenaar  set quickfixtextfunc=Tqfexpr
4869*d43906d2SBram Moolenaar  call assert_equal('Tqfexpr', &quickfixtextfunc)
4870*d43906d2SBram Moolenaar  call assert_equal('',
4871*d43906d2SBram Moolenaar        \ g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc)
4872858ba06dSBram Moolenaar  Xexpr ['F1:10:2:green', 'F1:20:4:blue']
4873858ba06dSBram Moolenaar  Xwindow
4874858ba06dSBram Moolenaar  call assert_equal('F1-L10C2-green', getline(1))
4875858ba06dSBram Moolenaar  call assert_equal('F1-L20C4-blue', getline(2))
4876858ba06dSBram Moolenaar  Xclose
4877858ba06dSBram Moolenaar  set quickfixtextfunc&vim
4878858ba06dSBram Moolenaar  Xwindow
4879858ba06dSBram Moolenaar  call assert_equal('F1|10 col 2| green', getline(1))
4880858ba06dSBram Moolenaar  call assert_equal('F1|20 col 4| blue', getline(2))
4881858ba06dSBram Moolenaar  Xclose
4882858ba06dSBram Moolenaar  set efm&
4883858ba06dSBram Moolenaar  set quickfixtextfunc&
4884858ba06dSBram Moolenaar
4885858ba06dSBram Moolenaar  " Test for per list 'quickfixtextfunc' setting
4886858ba06dSBram Moolenaar  func PerQfText(info)
4887858ba06dSBram Moolenaar    if a:info.quickfix
488800e260bbSBram Moolenaar      let qfl = getqflist({'id' : a:info.id, 'items' : 1}).items
4889858ba06dSBram Moolenaar    else
489000e260bbSBram Moolenaar      let qfl = getloclist(a:info.winid, {'id' : a:info.id, 'items' : 1}).items
4891858ba06dSBram Moolenaar    endif
4892858ba06dSBram Moolenaar    if empty(qfl)
489300e260bbSBram Moolenaar      return []
4894858ba06dSBram Moolenaar    endif
489500e260bbSBram Moolenaar    let l = []
489600e260bbSBram Moolenaar    for idx in range(a:info.start_idx - 1, a:info.end_idx - 1)
489700e260bbSBram Moolenaar      call add(l, 'Line ' .. qfl[idx].lnum .. ', Col ' .. qfl[idx].col)
489800e260bbSBram Moolenaar    endfor
489900e260bbSBram Moolenaar    return l
4900858ba06dSBram Moolenaar  endfunc
4901858ba06dSBram Moolenaar  set quickfixtextfunc=Tqfexpr
4902858ba06dSBram Moolenaar  call g:Xsetlist([], ' ', {'quickfixtextfunc' : "PerQfText"})
4903858ba06dSBram Moolenaar  Xaddexpr ['F1:10:2:green', 'F1:20:4:blue']
4904858ba06dSBram Moolenaar  Xwindow
4905858ba06dSBram Moolenaar  call assert_equal('Line 10, Col 2', getline(1))
4906858ba06dSBram Moolenaar  call assert_equal('Line 20, Col 4', getline(2))
4907858ba06dSBram Moolenaar  Xclose
4908*d43906d2SBram Moolenaar  call assert_equal(function('PerQfText'),
4909*d43906d2SBram Moolenaar        \ g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc)
49107ba5a7efSBram Moolenaar  " Add entries to the list when the quickfix buffer is hidden
49117ba5a7efSBram Moolenaar  Xaddexpr ['F1:30:6:red']
49127ba5a7efSBram Moolenaar  Xwindow
49137ba5a7efSBram Moolenaar  call assert_equal('Line 30, Col 6', getline(3))
49147ba5a7efSBram Moolenaar  Xclose
4915858ba06dSBram Moolenaar  call g:Xsetlist([], 'r', {'quickfixtextfunc' : ''})
4916*d43906d2SBram Moolenaar  call assert_equal('', g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc)
4917858ba06dSBram Moolenaar  set quickfixtextfunc&
4918858ba06dSBram Moolenaar  delfunc PerQfText
4919858ba06dSBram Moolenaar
4920858ba06dSBram Moolenaar  " Non-existing function
4921858ba06dSBram Moolenaar  set quickfixtextfunc=Tabc
4922858ba06dSBram Moolenaar  call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue']", 'E117:')
4923858ba06dSBram Moolenaar  call assert_fails("Xwindow", 'E117:')
4924858ba06dSBram Moolenaar  Xclose
4925858ba06dSBram Moolenaar  set quickfixtextfunc&
4926858ba06dSBram Moolenaar
4927858ba06dSBram Moolenaar  " set option to a non-function
4928858ba06dSBram Moolenaar  set quickfixtextfunc=[10,\ 20]
4929858ba06dSBram Moolenaar  call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue']", 'E117:')
4930858ba06dSBram Moolenaar  call assert_fails("Xwindow", 'E117:')
4931858ba06dSBram Moolenaar  Xclose
4932858ba06dSBram Moolenaar  set quickfixtextfunc&
4933858ba06dSBram Moolenaar
4934858ba06dSBram Moolenaar  " set option to a function with different set of arguments
4935858ba06dSBram Moolenaar  func Xqftext(a, b, c)
4936858ba06dSBram Moolenaar    return a:a .. a:b .. a:c
4937858ba06dSBram Moolenaar  endfunc
4938858ba06dSBram Moolenaar  set quickfixtextfunc=Xqftext
4939858ba06dSBram Moolenaar  call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue']", 'E119:')
4940858ba06dSBram Moolenaar  call assert_fails("Xwindow", 'E119:')
4941858ba06dSBram Moolenaar  Xclose
494200e260bbSBram Moolenaar
494300e260bbSBram Moolenaar  " set option to a function that returns a list with non-strings
494400e260bbSBram Moolenaar  func Xqftext2(d)
494500e260bbSBram Moolenaar    return ['one', [], 'two']
494600e260bbSBram Moolenaar  endfunc
494700e260bbSBram Moolenaar  set quickfixtextfunc=Xqftext2
494800e260bbSBram Moolenaar  call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue', 'F1:30:6:red']",
494900e260bbSBram Moolenaar                                                                  \ 'E730:')
495000e260bbSBram Moolenaar  call assert_fails('Xwindow', 'E730:')
4951*d43906d2SBram Moolenaar  call assert_equal(['one', 'F1|20 col 4| blue', 'F1|30 col 6| red'],
4952*d43906d2SBram Moolenaar        \ getline(1, '$'))
495300e260bbSBram Moolenaar  Xclose
495400e260bbSBram Moolenaar
4955858ba06dSBram Moolenaar  set quickfixtextfunc&
4956858ba06dSBram Moolenaar  delfunc Xqftext
495700e260bbSBram Moolenaar  delfunc Xqftext2
4958*d43906d2SBram Moolenaar
4959*d43906d2SBram Moolenaar  " set the global option to a lambda function
4960*d43906d2SBram Moolenaar  set quickfixtextfunc={d\ ->\ map(g:Xgetlist({'id'\ :\ d.id,\ 'items'\ :\ 1}).items[d.start_idx-1:d.end_idx-1],\ 'v:val.text')}
4961*d43906d2SBram Moolenaar  Xexpr ['F1:10:2:green', 'F1:20:4:blue']
4962*d43906d2SBram Moolenaar  Xwindow
4963*d43906d2SBram Moolenaar  call assert_equal(['green', 'blue'], getline(1, '$'))
4964*d43906d2SBram Moolenaar  Xclose
4965*d43906d2SBram 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)
4966*d43906d2SBram Moolenaar  set quickfixtextfunc&
4967*d43906d2SBram Moolenaar
4968*d43906d2SBram Moolenaar  " use a lambda function that returns an empty list
4969*d43906d2SBram Moolenaar  set quickfixtextfunc={d\ ->\ []}
4970*d43906d2SBram Moolenaar  Xexpr ['F1:10:2:green', 'F1:20:4:blue']
4971*d43906d2SBram Moolenaar  Xwindow
4972*d43906d2SBram Moolenaar  call assert_equal(['F1|10 col 2| green', 'F1|20 col 4| blue'],
4973*d43906d2SBram Moolenaar        \ getline(1, '$'))
4974*d43906d2SBram Moolenaar  Xclose
4975*d43906d2SBram Moolenaar  set quickfixtextfunc&
4976*d43906d2SBram Moolenaar
4977*d43906d2SBram Moolenaar  " use a lambda function that returns a list with empty strings
4978*d43906d2SBram Moolenaar  set quickfixtextfunc={d\ ->\ ['',\ '']}
4979*d43906d2SBram Moolenaar  Xexpr ['F1:10:2:green', 'F1:20:4:blue']
4980*d43906d2SBram Moolenaar  Xwindow
4981*d43906d2SBram Moolenaar  call assert_equal(['F1|10 col 2| green', 'F1|20 col 4| blue'],
4982*d43906d2SBram Moolenaar        \ getline(1, '$'))
4983*d43906d2SBram Moolenaar  Xclose
4984*d43906d2SBram Moolenaar  set quickfixtextfunc&
4985*d43906d2SBram Moolenaar
4986*d43906d2SBram Moolenaar  " set the per-quickfix list text function to a lambda function
4987*d43906d2SBram Moolenaar  call g:Xsetlist([], ' ',
4988*d43906d2SBram Moolenaar        \ {'quickfixtextfunc' :
4989*d43906d2SBram Moolenaar        \   {d -> map(g:Xgetlist({'id' : d.id, 'items' : 1}).items[d.start_idx-1:d.end_idx-1],
4990*d43906d2SBram Moolenaar        \ "'Line ' .. v:val.lnum .. ', Col ' .. v:val.col")}})
4991*d43906d2SBram Moolenaar  Xaddexpr ['F1:10:2:green', 'F1:20:4:blue']
4992*d43906d2SBram Moolenaar  Xwindow
4993*d43906d2SBram Moolenaar  call assert_equal('Line 10, Col 2', getline(1))
4994*d43906d2SBram Moolenaar  call assert_equal('Line 20, Col 4', getline(2))
4995*d43906d2SBram Moolenaar  Xclose
4996*d43906d2SBram Moolenaar  call assert_match("function('<lambda>\\d\\+')", string(g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc))
4997*d43906d2SBram Moolenaar  call g:Xsetlist([], 'f')
4998858ba06dSBram Moolenaarendfunc
4999858ba06dSBram Moolenaar
5000858ba06dSBram Moolenaarfunc Test_qftextfunc()
5001858ba06dSBram Moolenaar  call Xtest_qftextfunc('c')
5002858ba06dSBram Moolenaar  call Xtest_qftextfunc('l')
5003858ba06dSBram Moolenaarendfunc
5004858ba06dSBram Moolenaar
5005ec98e93aSBram Moolenaar" Running :lhelpgrep command more than once in a help window, doesn't jump to
5006ec98e93aSBram Moolenaar" the help topic
5007ec98e93aSBram Moolenaarfunc Test_lhelpgrep_from_help_window()
5008ec98e93aSBram Moolenaar  call mkdir('Xtestdir/doc', 'p')
5009ec98e93aSBram Moolenaar  call writefile(['window'], 'Xtestdir/doc/a.txt')
5010ec98e93aSBram Moolenaar  call writefile(['buffer'], 'Xtestdir/doc/b.txt')
5011ec98e93aSBram Moolenaar  let save_rtp = &rtp
5012ec98e93aSBram Moolenaar  let &rtp = 'Xtestdir'
5013ec98e93aSBram Moolenaar  lhelpgrep window
5014ec98e93aSBram Moolenaar  lhelpgrep buffer
5015ec98e93aSBram Moolenaar  call assert_equal('b.txt', fnamemodify(@%, ":p:t"))
5016ec98e93aSBram Moolenaar  lhelpgrep window
5017ec98e93aSBram Moolenaar  call assert_equal('a.txt', fnamemodify(@%, ":p:t"))
5018ec98e93aSBram Moolenaar  let &rtp = save_rtp
5019ec98e93aSBram Moolenaar  call delete('Xtestdir', 'rf')
5020ec98e93aSBram Moolenaar  new | only!
5021ec98e93aSBram Moolenaarendfunc
5022ec98e93aSBram Moolenaar
50236a0cc916SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
5024