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>
35bb01a1efSYegappan Lakshmanan    command! -count=999 -nargs=* Xvimgrep <mods> <count>vimgrep <args>
36ee85df37SBram Moolenaar    command! -nargs=* Xvimgrepadd <mods> vimgrepadd <args>
37049cba9eSBram Moolenaar    command! -nargs=* Xgrep <mods> grep <args>
38049cba9eSBram Moolenaar    command! -nargs=* Xgrepadd <mods> grepadd <args>
39049cba9eSBram Moolenaar    command! -nargs=* Xhelpgrep helpgrep <args>
4074240d3fSBram Moolenaar    command! -nargs=0 -count Xcc <count>cc
413ff33114SBram Moolenaar    command! -count=1 -nargs=0 Xbelow <mods><count>cbelow
423ff33114SBram Moolenaar    command! -count=1 -nargs=0 Xabove <mods><count>cabove
43cf6a55c4SBram Moolenaar    command! -count=1 -nargs=0 Xbefore <mods><count>cbefore
44cf6a55c4SBram Moolenaar    command! -count=1 -nargs=0 Xafter <mods><count>cafter
453ef5bf7dSBram Moolenaar    let g:Xgetlist = function('getqflist')
463ef5bf7dSBram Moolenaar    let g:Xsetlist = function('setqflist')
47b6fa30ccSBram Moolenaar    call setqflist([], 'f')
483ef5bf7dSBram Moolenaar  else
493ef5bf7dSBram Moolenaar    command! -nargs=* -bang Xlist <mods>llist<bang> <args>
503ef5bf7dSBram Moolenaar    command! -nargs=* Xgetexpr <mods>lgetexpr <args>
51361c8f0eSBram Moolenaar    command! -nargs=* Xaddexpr <mods>laddexpr <args>
5255b69264SBram Moolenaar    command! -nargs=* -count Xolder <mods><count>lolder <args>
533ef5bf7dSBram Moolenaar    command! -nargs=* Xnewer <mods>lnewer <args>
543ef5bf7dSBram Moolenaar    command! -nargs=* Xopen <mods> lopen <args>
553ef5bf7dSBram Moolenaar    command! -nargs=* Xwindow <mods>lwindow <args>
56537ef084SBram Moolenaar    command! -nargs=* Xbottom <mods>lbottom <args>
573ef5bf7dSBram Moolenaar    command! -nargs=* Xclose <mods>lclose <args>
583ef5bf7dSBram Moolenaar    command! -nargs=* -bang Xfile <mods>lfile<bang> <args>
593ef5bf7dSBram Moolenaar    command! -nargs=* Xgetfile <mods>lgetfile <args>
603ef5bf7dSBram Moolenaar    command! -nargs=* Xaddfile <mods>laddfile <args>
613ef5bf7dSBram Moolenaar    command! -nargs=* -bang Xbuffer <mods>lbuffer<bang> <args>
623ef5bf7dSBram Moolenaar    command! -nargs=* Xgetbuffer <mods>lgetbuffer <args>
633ef5bf7dSBram Moolenaar    command! -nargs=* Xaddbuffer <mods>laddbuffer <args>
643ef5bf7dSBram Moolenaar    command! -nargs=* Xrewind <mods>lrewind <args>
6599895eacSBram Moolenaar    command! -count -nargs=* -bang Xnext <mods><count>lnext<bang> <args>
6699895eacSBram Moolenaar    command! -count -nargs=* -bang Xprev <mods><count>lprev<bang> <args>
670fcc7c6dSBram Moolenaar    command! -nargs=* -bang Xfirst <mods>lfirst<bang> <args>
680fcc7c6dSBram Moolenaar    command! -nargs=* -bang Xlast <mods>llast<bang> <args>
6925190db2SBram Moolenaar    command! -count -nargs=* -bang Xnfile <mods><count>lnfile<bang> <args>
700fcc7c6dSBram Moolenaar    command! -nargs=* -bang Xpfile <mods>lpfile<bang> <args>
713ef5bf7dSBram Moolenaar    command! -nargs=* Xexpr <mods>lexpr <args>
72bb01a1efSYegappan Lakshmanan    command! -count=999 -nargs=* Xvimgrep <mods> <count>lvimgrep <args>
73ee85df37SBram Moolenaar    command! -nargs=* Xvimgrepadd <mods> lvimgrepadd <args>
74049cba9eSBram Moolenaar    command! -nargs=* Xgrep <mods> lgrep <args>
75049cba9eSBram Moolenaar    command! -nargs=* Xgrepadd <mods> lgrepadd <args>
76049cba9eSBram Moolenaar    command! -nargs=* Xhelpgrep lhelpgrep <args>
7774240d3fSBram Moolenaar    command! -nargs=0 -count Xcc <count>ll
783ff33114SBram Moolenaar    command! -count=1 -nargs=0 Xbelow <mods><count>lbelow
793ff33114SBram Moolenaar    command! -count=1 -nargs=0 Xabove <mods><count>labove
80cf6a55c4SBram Moolenaar    command! -count=1 -nargs=0 Xbefore <mods><count>lbefore
81cf6a55c4SBram Moolenaar    command! -count=1 -nargs=0 Xafter <mods><count>lafter
823ef5bf7dSBram Moolenaar    let g:Xgetlist = function('getloclist', [0])
833ef5bf7dSBram Moolenaar    let g:Xsetlist = function('setloclist', [0])
84b6fa30ccSBram Moolenaar    call setloclist(0, [], 'f')
853ef5bf7dSBram Moolenaar  endif
862b946c9fSBram Moolenaarendfunc
873ef5bf7dSBram Moolenaar
88da59dd5dSBram Moolenaar" Tests for the :clist and :llist commands
892b946c9fSBram Moolenaarfunc XlistTests(cchar)
903ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
91da59dd5dSBram Moolenaar
92b6fa30ccSBram Moolenaar  if a:cchar == 'l'
93b6fa30ccSBram Moolenaar      call assert_fails('llist', 'E776:')
94b6fa30ccSBram Moolenaar  endif
95da59dd5dSBram Moolenaar  " With an empty list, command should return error
963ef5bf7dSBram Moolenaar  Xgetexpr []
973ef5bf7dSBram Moolenaar  silent! Xlist
98da59dd5dSBram Moolenaar  call assert_true(v:errmsg ==# 'E42: No Errors')
99da59dd5dSBram Moolenaar
100da59dd5dSBram Moolenaar  " Populate the list and then try
1013ef5bf7dSBram Moolenaar  Xgetexpr ['non-error 1', 'Xtestfile1:1:3:Line1',
102da59dd5dSBram Moolenaar		  \ 'non-error 2', 'Xtestfile2:2:2:Line2',
10388a3e2b2SBram Moolenaar		  \ 'non-error| 3', 'Xtestfile3:3:1:Line3']
104da59dd5dSBram Moolenaar
105da59dd5dSBram Moolenaar  " List only valid entries
106ee85df37SBram Moolenaar  let l = split(execute('Xlist', ''), "\n")
107da59dd5dSBram Moolenaar  call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
108da59dd5dSBram Moolenaar		   \ ' 4 Xtestfile2:2 col 2: Line2',
109da59dd5dSBram Moolenaar		   \ ' 6 Xtestfile3:3 col 1: Line3'], l)
110da59dd5dSBram Moolenaar
111da59dd5dSBram Moolenaar  " List all the entries
112ee85df37SBram Moolenaar  let l = split(execute('Xlist!', ''), "\n")
113da59dd5dSBram Moolenaar  call assert_equal([' 1: non-error 1', ' 2 Xtestfile1:1 col 3: Line1',
114da59dd5dSBram Moolenaar		   \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2',
11588a3e2b2SBram Moolenaar		   \ ' 5: non-error| 3', ' 6 Xtestfile3:3 col 1: Line3'], l)
116da59dd5dSBram Moolenaar
117da59dd5dSBram Moolenaar  " List a range of errors
118ee85df37SBram Moolenaar  let l = split(execute('Xlist 3,6', ''), "\n")
119da59dd5dSBram Moolenaar  call assert_equal([' 4 Xtestfile2:2 col 2: Line2',
120da59dd5dSBram Moolenaar		   \ ' 6 Xtestfile3:3 col 1: Line3'], l)
121da59dd5dSBram Moolenaar
122ee85df37SBram Moolenaar  let l = split(execute('Xlist! 3,4', ''), "\n")
123da59dd5dSBram Moolenaar  call assert_equal([' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
124da59dd5dSBram Moolenaar
125ee85df37SBram Moolenaar  let l = split(execute('Xlist -6,-4', ''), "\n")
126da59dd5dSBram Moolenaar  call assert_equal([' 2 Xtestfile1:1 col 3: Line1'], l)
127da59dd5dSBram Moolenaar
128ee85df37SBram Moolenaar  let l = split(execute('Xlist! -5,-3', ''), "\n")
129da59dd5dSBram Moolenaar  call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
130da59dd5dSBram Moolenaar		   \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
131391b1dd0SBram Moolenaar
132391b1dd0SBram Moolenaar  " Test for '+'
133ee85df37SBram Moolenaar  let l = split(execute('Xlist! +2', ''), "\n")
134391b1dd0SBram Moolenaar  call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
135391b1dd0SBram Moolenaar		   \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
136ee85df37SBram Moolenaar
1376864efa5Sthinca  " Ranged entries
1386864efa5Sthinca  call g:Xsetlist([{'lnum':10,'text':'Line1'},
1396864efa5Sthinca	      \ {'lnum':20,'col':10,'text':'Line2'},
1406864efa5Sthinca	      \ {'lnum':30,'col':15,'end_col':20,'text':'Line3'},
1416864efa5Sthinca	      \ {'lnum':40,'end_lnum':45,'text':'Line4'},
1426864efa5Sthinca	      \ {'lnum':50,'end_lnum':55,'col':15,'text':'Line5'},
1436864efa5Sthinca	      \ {'lnum':60,'end_lnum':65,'col':25,'end_col':35,'text':'Line6'}])
1446864efa5Sthinca  let l = split(execute('Xlist', ""), "\n")
1456864efa5Sthinca  call assert_equal([' 1:10: Line1',
1466864efa5Sthinca	      \ ' 2:20 col 10: Line2',
1476864efa5Sthinca	      \ ' 3:30 col 15-20: Line3',
1486864efa5Sthinca	      \ ' 4:40-45: Line4',
1496864efa5Sthinca	      \ ' 5:50-55 col 15: Line5',
1506864efa5Sthinca	      \ ' 6:60-65 col 25-35: Line6'], l)
1516864efa5Sthinca
152ee85df37SBram Moolenaar  " Different types of errors
153ee85df37SBram Moolenaar  call g:Xsetlist([{'lnum':10,'col':5,'type':'W', 'text':'Warning','nr':11},
154ee85df37SBram Moolenaar	      \ {'lnum':20,'col':10,'type':'e','text':'Error','nr':22},
155ee85df37SBram Moolenaar	      \ {'lnum':30,'col':15,'type':'i','text':'Info','nr':33},
156ee85df37SBram Moolenaar	      \ {'lnum':40,'col':20,'type':'x', 'text':'Other','nr':44},
157ee85df37SBram Moolenaar	      \ {'lnum':50,'col':25,'type':"\<C-A>",'text':'one','nr':55}])
158ee85df37SBram Moolenaar  let l = split(execute('Xlist', ""), "\n")
159ee85df37SBram Moolenaar  call assert_equal([' 1:10 col 5 warning  11: Warning',
160ee85df37SBram Moolenaar	      \ ' 2:20 col 10 error  22: Error',
161ee85df37SBram Moolenaar	      \ ' 3:30 col 15 info  33: Info',
162ee85df37SBram Moolenaar	      \ ' 4:40 col 20 x  44: Other',
163ee85df37SBram Moolenaar	      \ ' 5:50 col 25  55: one'], l)
164ee85df37SBram Moolenaar
165d76ce852SBram Moolenaar  " Test for module names, one needs to explicitly set `'valid':v:true` so
166d76ce852SBram Moolenaar  call g:Xsetlist([
167d76ce852SBram Moolenaar	\ {'lnum':10,'col':5,'type':'W','module':'Data.Text','text':'ModuleWarning','nr':11,'valid':v:true},
168d76ce852SBram Moolenaar	\ {'lnum':20,'col':10,'type':'W','module':'Data.Text','filename':'Data/Text.hs','text':'ModuleWarning','nr':22,'valid':v:true},
169d76ce852SBram Moolenaar	\ {'lnum':30,'col':15,'type':'W','filename':'Data/Text.hs','text':'FileWarning','nr':33,'valid':v:true}])
170d76ce852SBram Moolenaar  let l = split(execute('Xlist', ""), "\n")
171d76ce852SBram Moolenaar  call assert_equal([' 1 Data.Text:10 col 5 warning  11: ModuleWarning',
172d76ce852SBram Moolenaar	\ ' 2 Data.Text:20 col 10 warning  22: ModuleWarning',
173d76ce852SBram Moolenaar	\ ' 3 Data/Text.hs:30 col 15 warning  33: FileWarning'], l)
174d76ce852SBram Moolenaar
175f9ae154cSBram Moolenaar  " For help entries in the quickfix list, only the filename without directory
176f9ae154cSBram Moolenaar  " should be displayed
177f9ae154cSBram Moolenaar  Xhelpgrep setqflist()
178f9ae154cSBram Moolenaar  let l = split(execute('Xlist 1', ''), "\n")
179f9ae154cSBram Moolenaar  call assert_match('^ 1 [^\\/]\{-}:', l[0])
180f9ae154cSBram Moolenaar
181ee85df37SBram Moolenaar  " Error cases
182ee85df37SBram Moolenaar  call assert_fails('Xlist abc', 'E488:')
1832b946c9fSBram Moolenaarendfunc
184da59dd5dSBram Moolenaar
1852b946c9fSBram Moolenaarfunc Test_clist()
186da59dd5dSBram Moolenaar  call XlistTests('c')
187da59dd5dSBram Moolenaar  call XlistTests('l')
1882b946c9fSBram Moolenaarendfunc
189da59dd5dSBram Moolenaar
190da59dd5dSBram Moolenaar" Tests for the :colder, :cnewer, :lolder and :lnewer commands
191da59dd5dSBram Moolenaar" Note that this test assumes that a quickfix/location list is
192cfc0a350SBram Moolenaar" already set by the caller.
1932b946c9fSBram Moolenaarfunc XageTests(cchar)
1943ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
195da59dd5dSBram Moolenaar
19687f59b09SBram Moolenaar  if a:cchar == 'l'
19787f59b09SBram Moolenaar    " No location list for the current window
19887f59b09SBram Moolenaar    call assert_fails('lolder', 'E776:')
19987f59b09SBram Moolenaar    call assert_fails('lnewer', 'E776:')
20087f59b09SBram Moolenaar  endif
20187f59b09SBram Moolenaar
202cf1ba35fSBram Moolenaar  let list = [{'bufnr': bufnr('%'), 'lnum': 1}]
203b6fa30ccSBram Moolenaar  call g:Xsetlist(list)
204b6fa30ccSBram Moolenaar
205da59dd5dSBram Moolenaar  " Jumping to a non existent list should return error
2063ef5bf7dSBram Moolenaar  silent! Xolder 99
207da59dd5dSBram Moolenaar  call assert_true(v:errmsg ==# 'E380: At bottom of quickfix stack')
208da59dd5dSBram Moolenaar
2093ef5bf7dSBram Moolenaar  silent! Xnewer 99
210da59dd5dSBram Moolenaar  call assert_true(v:errmsg ==# 'E381: At top of quickfix stack')
211da59dd5dSBram Moolenaar
212da59dd5dSBram Moolenaar  " Add three quickfix/location lists
2133ef5bf7dSBram Moolenaar  Xgetexpr ['Xtestfile1:1:3:Line1']
2143ef5bf7dSBram Moolenaar  Xgetexpr ['Xtestfile2:2:2:Line2']
2153ef5bf7dSBram Moolenaar  Xgetexpr ['Xtestfile3:3:1:Line3']
216da59dd5dSBram Moolenaar
217da59dd5dSBram Moolenaar  " Go back two lists
2183ef5bf7dSBram Moolenaar  Xolder
2193ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
220da59dd5dSBram Moolenaar  call assert_equal('Line2', l[0].text)
221da59dd5dSBram Moolenaar
222da59dd5dSBram Moolenaar  " Go forward two lists
2233ef5bf7dSBram Moolenaar  Xnewer
2243ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
225da59dd5dSBram Moolenaar  call assert_equal('Line3', l[0].text)
226da59dd5dSBram Moolenaar
227da59dd5dSBram Moolenaar  " Test for the optional count argument
2283ef5bf7dSBram Moolenaar  Xolder 2
2293ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
230da59dd5dSBram Moolenaar  call assert_equal('Line1', l[0].text)
231da59dd5dSBram Moolenaar
2323ef5bf7dSBram Moolenaar  Xnewer 2
2333ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
234da59dd5dSBram Moolenaar  call assert_equal('Line3', l[0].text)
2352b946c9fSBram Moolenaarendfunc
236da59dd5dSBram Moolenaar
2372b946c9fSBram Moolenaarfunc Test_cage()
238da59dd5dSBram Moolenaar  call XageTests('c')
239da59dd5dSBram Moolenaar  call XageTests('l')
2402b946c9fSBram Moolenaarendfunc
241da59dd5dSBram Moolenaar
242da59dd5dSBram Moolenaar" Tests for the :cwindow, :lwindow :cclose, :lclose, :copen and :lopen
243da59dd5dSBram Moolenaar" commands
2442b946c9fSBram Moolenaarfunc XwindowTests(cchar)
2453ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
246da59dd5dSBram Moolenaar
247b6fa30ccSBram Moolenaar  " Opening the location list window without any errors should fail
248b6fa30ccSBram Moolenaar  if a:cchar == 'l'
249b6fa30ccSBram Moolenaar      call assert_fails('lopen', 'E776:')
250b6fa30ccSBram Moolenaar  endif
251b6fa30ccSBram Moolenaar
252da59dd5dSBram Moolenaar  " Create a list with no valid entries
2533ef5bf7dSBram Moolenaar  Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
254da59dd5dSBram Moolenaar
255da59dd5dSBram Moolenaar  " Quickfix/Location window should not open with no valid errors
2563ef5bf7dSBram Moolenaar  Xwindow
257da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 1)
258da59dd5dSBram Moolenaar
259da59dd5dSBram Moolenaar  " Create a list with valid entries
2603ef5bf7dSBram Moolenaar  Xgetexpr ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2',
2613ef5bf7dSBram Moolenaar		  \ 'Xtestfile3:3:1:Line3']
262da59dd5dSBram Moolenaar
263da59dd5dSBram Moolenaar  " Open the window
2643ef5bf7dSBram Moolenaar  Xwindow
265da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 2 && winnr() == 2 &&
266da59dd5dSBram Moolenaar	\ getline('.') ==# 'Xtestfile1|1 col 3| Line1')
267537ef084SBram Moolenaar  redraw!
268da59dd5dSBram Moolenaar
269da59dd5dSBram Moolenaar  " Close the window
2703ef5bf7dSBram Moolenaar  Xclose
271da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 1)
272da59dd5dSBram Moolenaar
273da59dd5dSBram Moolenaar  " Create a list with no valid entries
2743ef5bf7dSBram Moolenaar  Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
275da59dd5dSBram Moolenaar
276da59dd5dSBram Moolenaar  " Open the window
2773ef5bf7dSBram Moolenaar  Xopen 5
278da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 2 && getline('.') ==# '|| non-error 1'
279c05d1c04SBram Moolenaar		      \  && winheight(0) == 5)
280da59dd5dSBram Moolenaar
281da59dd5dSBram Moolenaar  " Opening the window again, should move the cursor to that window
282da59dd5dSBram Moolenaar  wincmd t
2833ef5bf7dSBram Moolenaar  Xopen 7
284da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 2 && winnr() == 2 &&
285c05d1c04SBram Moolenaar	\ winheight(0) == 7 &&
286da59dd5dSBram Moolenaar	\ getline('.') ==# '|| non-error 1')
287da59dd5dSBram Moolenaar
28815a7bdcbSBram Moolenaar  " :cnext in quickfix window should move to the next entry
28915a7bdcbSBram Moolenaar  Xnext
29015a7bdcbSBram Moolenaar  call assert_equal(2, g:Xgetlist({'idx' : 0}).idx)
291da59dd5dSBram Moolenaar
292da59dd5dSBram Moolenaar  " Calling cwindow should close the quickfix window with no valid errors
2933ef5bf7dSBram Moolenaar  Xwindow
294da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 1)
295b6fa30ccSBram Moolenaar
296f9ae154cSBram Moolenaar  " Specifying the width should adjust the width for a vertically split
297f9ae154cSBram Moolenaar  " quickfix window.
298f9ae154cSBram Moolenaar  vert Xopen
299f9ae154cSBram Moolenaar  call assert_equal(10, winwidth(0))
300f9ae154cSBram Moolenaar  vert Xopen 12
301f9ae154cSBram Moolenaar  call assert_equal(12, winwidth(0))
302f9ae154cSBram Moolenaar  Xclose
303f9ae154cSBram Moolenaar
3045d3c9f8cSBram Moolenaar  " Horizontally or vertically splitting the quickfix window should create a
3055d3c9f8cSBram Moolenaar  " normal window/buffer
3065d3c9f8cSBram Moolenaar  Xopen
3075d3c9f8cSBram Moolenaar  wincmd s
3085d3c9f8cSBram Moolenaar  call assert_equal(0, getwininfo(win_getid())[0].quickfix)
3095d3c9f8cSBram Moolenaar  call assert_equal(0, getwininfo(win_getid())[0].loclist)
3105d3c9f8cSBram Moolenaar  call assert_notequal('quickfix', &buftype)
3115d3c9f8cSBram Moolenaar  close
3125d3c9f8cSBram Moolenaar  Xopen
3135d3c9f8cSBram Moolenaar  wincmd v
3145d3c9f8cSBram Moolenaar  call assert_equal(0, getwininfo(win_getid())[0].quickfix)
3155d3c9f8cSBram Moolenaar  call assert_equal(0, getwininfo(win_getid())[0].loclist)
3165d3c9f8cSBram Moolenaar  call assert_notequal('quickfix', &buftype)
3175d3c9f8cSBram Moolenaar  close
3185d3c9f8cSBram Moolenaar  Xopen
3195d3c9f8cSBram Moolenaar  Xclose
3205d3c9f8cSBram Moolenaar
321b6fa30ccSBram Moolenaar  if a:cchar == 'c'
322b6fa30ccSBram Moolenaar      " Opening the quickfix window in multiple tab pages should reuse the
323b6fa30ccSBram Moolenaar      " quickfix buffer
324b6fa30ccSBram Moolenaar      Xgetexpr ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2',
325b6fa30ccSBram Moolenaar		  \ 'Xtestfile3:3:1:Line3']
326b6fa30ccSBram Moolenaar      Xopen
327b6fa30ccSBram Moolenaar      let qfbufnum = bufnr('%')
328b6fa30ccSBram Moolenaar      tabnew
329b6fa30ccSBram Moolenaar      Xopen
330b6fa30ccSBram Moolenaar      call assert_equal(qfbufnum, bufnr('%'))
331b6fa30ccSBram Moolenaar      new | only | tabonly
332b6fa30ccSBram Moolenaar  endif
3332b946c9fSBram Moolenaarendfunc
334da59dd5dSBram Moolenaar
3352b946c9fSBram Moolenaarfunc Test_cwindow()
336da59dd5dSBram Moolenaar  call XwindowTests('c')
337da59dd5dSBram Moolenaar  call XwindowTests('l')
3382b946c9fSBram Moolenaarendfunc
339da59dd5dSBram Moolenaar
34036d50222SBram Moolenaarfunc Test_copenHeight()
34136d50222SBram Moolenaar  copen
34236d50222SBram Moolenaar  wincmd H
34336d50222SBram Moolenaar  let height = winheight(0)
34436d50222SBram Moolenaar  copen 10
34536d50222SBram Moolenaar  call assert_equal(height, winheight(0))
34636d50222SBram Moolenaar  quit
34736d50222SBram Moolenaarendfunc
34836d50222SBram Moolenaar
3491142a31bSBram Moolenaarfunc Test_copenHeight_tabline()
3501142a31bSBram Moolenaar  set tabline=foo showtabline=2
3511142a31bSBram Moolenaar  copen
3521142a31bSBram Moolenaar  wincmd H
3531142a31bSBram Moolenaar  let height = winheight(0)
3541142a31bSBram Moolenaar  copen 10
3551142a31bSBram Moolenaar  call assert_equal(height, winheight(0))
3561142a31bSBram Moolenaar  quit
3571142a31bSBram Moolenaar  set tabline& showtabline&
3581142a31bSBram Moolenaarendfunc
3591142a31bSBram Moolenaar
3601142a31bSBram Moolenaar
361da59dd5dSBram Moolenaar" Tests for the :cfile, :lfile, :caddfile, :laddfile, :cgetfile and :lgetfile
362da59dd5dSBram Moolenaar" commands.
3632b946c9fSBram Moolenaarfunc XfileTests(cchar)
3643ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
365da59dd5dSBram Moolenaar
366da59dd5dSBram Moolenaar  call writefile(['Xtestfile1:700:10:Line 700',
367da59dd5dSBram Moolenaar	\ 'Xtestfile2:800:15:Line 800'], 'Xqftestfile1')
368da59dd5dSBram Moolenaar
369da59dd5dSBram Moolenaar  enew!
3703ef5bf7dSBram Moolenaar  Xfile Xqftestfile1
3713ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
372da59dd5dSBram Moolenaar  call assert_true(len(l) == 2 &&
373da59dd5dSBram Moolenaar	\ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
374da59dd5dSBram Moolenaar	\ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
375da59dd5dSBram Moolenaar
376049cba9eSBram Moolenaar  " Test with a non existent file
377e2e4075fSBram Moolenaar  call assert_fails('Xfile non_existent_file', 'E40:')
378049cba9eSBram Moolenaar
379da59dd5dSBram Moolenaar  " Run cfile/lfile from a modified buffer
380da59dd5dSBram Moolenaar  enew!
381da59dd5dSBram Moolenaar  silent! put ='Quickfix'
3823ef5bf7dSBram Moolenaar  silent! Xfile Xqftestfile1
383da59dd5dSBram Moolenaar  call assert_true(v:errmsg ==# 'E37: No write since last change (add ! to override)')
384da59dd5dSBram Moolenaar
385da59dd5dSBram Moolenaar  call writefile(['Xtestfile3:900:30:Line 900'], 'Xqftestfile1')
3863ef5bf7dSBram Moolenaar  Xaddfile Xqftestfile1
3873ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
388da59dd5dSBram Moolenaar  call assert_true(len(l) == 3 &&
389da59dd5dSBram Moolenaar	\ l[2].lnum == 900 && l[2].col == 30 && l[2].text ==# 'Line 900')
390da59dd5dSBram Moolenaar
391da59dd5dSBram Moolenaar  call writefile(['Xtestfile1:222:77:Line 222',
392da59dd5dSBram Moolenaar	\ 'Xtestfile2:333:88:Line 333'], 'Xqftestfile1')
393da59dd5dSBram Moolenaar
394da59dd5dSBram Moolenaar  enew!
3953ef5bf7dSBram Moolenaar  Xgetfile Xqftestfile1
3963ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
397da59dd5dSBram Moolenaar  call assert_true(len(l) == 2 &&
398da59dd5dSBram Moolenaar	\ l[0].lnum == 222 && l[0].col == 77 && l[0].text ==# 'Line 222' &&
399da59dd5dSBram Moolenaar	\ l[1].lnum == 333 && l[1].col == 88 && l[1].text ==# 'Line 333')
400da59dd5dSBram Moolenaar
40170077dd1SBram Moolenaar  " Test for a file with a long line and without a newline at the end
40270077dd1SBram Moolenaar  let text = repeat('x', 1024)
40370077dd1SBram Moolenaar  let t = 'a.txt:18:' . text
40470077dd1SBram Moolenaar  call writefile([t], 'Xqftestfile1', 'b')
40570077dd1SBram Moolenaar  silent! Xfile Xqftestfile1
40670077dd1SBram Moolenaar  call assert_equal(text, g:Xgetlist()[0].text)
40770077dd1SBram Moolenaar
408da59dd5dSBram Moolenaar  call delete('Xqftestfile1')
4092b946c9fSBram Moolenaarendfunc
410da59dd5dSBram Moolenaar
4112b946c9fSBram Moolenaarfunc Test_cfile()
412da59dd5dSBram Moolenaar  call XfileTests('c')
413da59dd5dSBram Moolenaar  call XfileTests('l')
4142b946c9fSBram Moolenaarendfunc
415da59dd5dSBram Moolenaar
416da59dd5dSBram Moolenaar" Tests for the :cbuffer, :lbuffer, :caddbuffer, :laddbuffer, :cgetbuffer and
417da59dd5dSBram Moolenaar" :lgetbuffer commands.
4182b946c9fSBram Moolenaarfunc XbufferTests(cchar)
4193ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
420da59dd5dSBram Moolenaar
421da59dd5dSBram Moolenaar  enew!
422da59dd5dSBram Moolenaar  silent! call setline(1, ['Xtestfile7:700:10:Line 700',
423da59dd5dSBram Moolenaar	\ 'Xtestfile8:800:15:Line 800'])
4243ef5bf7dSBram Moolenaar  Xbuffer!
4253ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
426da59dd5dSBram Moolenaar  call assert_true(len(l) == 2 &&
427da59dd5dSBram Moolenaar	\ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
428da59dd5dSBram Moolenaar	\ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
429da59dd5dSBram Moolenaar
430da59dd5dSBram Moolenaar  enew!
431da59dd5dSBram Moolenaar  silent! call setline(1, ['Xtestfile9:900:55:Line 900',
432da59dd5dSBram Moolenaar	\ 'Xtestfile10:950:66:Line 950'])
4333ef5bf7dSBram Moolenaar  Xgetbuffer
4343ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
435da59dd5dSBram Moolenaar  call assert_true(len(l) == 2 &&
436da59dd5dSBram Moolenaar	\ l[0].lnum == 900 && l[0].col == 55 && l[0].text ==# 'Line 900' &&
437da59dd5dSBram Moolenaar	\ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950')
438da59dd5dSBram Moolenaar
439da59dd5dSBram Moolenaar  enew!
440da59dd5dSBram Moolenaar  silent! call setline(1, ['Xtestfile11:700:20:Line 700',
441da59dd5dSBram Moolenaar	\ 'Xtestfile12:750:25:Line 750'])
4423ef5bf7dSBram Moolenaar  Xaddbuffer
4433ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
444da59dd5dSBram Moolenaar  call assert_true(len(l) == 4 &&
445da59dd5dSBram Moolenaar	\ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950' &&
446da59dd5dSBram Moolenaar	\ l[2].lnum == 700 && l[2].col == 20 && l[2].text ==# 'Line 700' &&
447da59dd5dSBram Moolenaar	\ l[3].lnum == 750 && l[3].col == 25 && l[3].text ==# 'Line 750')
448ab47c61fSBram Moolenaar  enew!
449da59dd5dSBram Moolenaar
450ee85df37SBram Moolenaar  " Check for invalid buffer
451ee85df37SBram Moolenaar  call assert_fails('Xbuffer 199', 'E474:')
452ee85df37SBram Moolenaar
453ee85df37SBram Moolenaar  " Check for unloaded buffer
454ee85df37SBram Moolenaar  edit Xtestfile1
455ee85df37SBram Moolenaar  let bnr = bufnr('%')
456ee85df37SBram Moolenaar  enew!
457ee85df37SBram Moolenaar  call assert_fails('Xbuffer ' . bnr, 'E681:')
458ee85df37SBram Moolenaar
459ee85df37SBram Moolenaar  " Check for invalid range
460ee85df37SBram Moolenaar  " Using Xbuffer will not run the range check in the cbuffer/lbuffer
461ee85df37SBram Moolenaar  " commands. So directly call the commands.
462ee85df37SBram Moolenaar  if (a:cchar == 'c')
463ee85df37SBram Moolenaar      call assert_fails('900,999cbuffer', 'E16:')
464ee85df37SBram Moolenaar  else
465ee85df37SBram Moolenaar      call assert_fails('900,999lbuffer', 'E16:')
466ee85df37SBram Moolenaar  endif
4672b946c9fSBram Moolenaarendfunc
468da59dd5dSBram Moolenaar
4692b946c9fSBram Moolenaarfunc Test_cbuffer()
470da59dd5dSBram Moolenaar  call XbufferTests('c')
471da59dd5dSBram Moolenaar  call XbufferTests('l')
4722b946c9fSBram Moolenaarendfunc
473da59dd5dSBram Moolenaar
4742b946c9fSBram Moolenaarfunc XexprTests(cchar)
4750fcc7c6dSBram Moolenaar  call s:setup_commands(a:cchar)
4760fcc7c6dSBram Moolenaar
4770fcc7c6dSBram Moolenaar  call assert_fails('Xexpr 10', 'E777:')
4782b946c9fSBram Moolenaarendfunc
4790fcc7c6dSBram Moolenaar
4802b946c9fSBram Moolenaarfunc Test_cexpr()
4810fcc7c6dSBram Moolenaar  call XexprTests('c')
4820fcc7c6dSBram Moolenaar  call XexprTests('l')
4832b946c9fSBram Moolenaarendfunc
4840fcc7c6dSBram Moolenaar
4850fcc7c6dSBram Moolenaar" Tests for :cnext, :cprev, :cfirst, :clast commands
4862b946c9fSBram Moolenaarfunc Xtest_browse(cchar)
4870fcc7c6dSBram Moolenaar  call s:setup_commands(a:cchar)
4880fcc7c6dSBram Moolenaar
48974240d3fSBram Moolenaar  call g:Xsetlist([], 'f')
490b6fa30ccSBram Moolenaar  " Jumping to first or next location list entry without any error should
491b6fa30ccSBram Moolenaar  " result in failure
49274240d3fSBram Moolenaar  if a:cchar == 'c'
49374240d3fSBram Moolenaar    let err = 'E42:'
49415a7bdcbSBram Moolenaar    let cmd = '$cc'
49574240d3fSBram Moolenaar  else
49674240d3fSBram Moolenaar    let err = 'E776:'
49715a7bdcbSBram Moolenaar    let cmd = '$ll'
498b6fa30ccSBram Moolenaar  endif
49974240d3fSBram Moolenaar  call assert_fails('Xnext', err)
50074240d3fSBram Moolenaar  call assert_fails('Xprev', err)
50174240d3fSBram Moolenaar  call assert_fails('Xnfile', err)
50274240d3fSBram Moolenaar  call assert_fails('Xpfile', err)
50315a7bdcbSBram Moolenaar  call assert_fails(cmd, err)
504b6fa30ccSBram Moolenaar
505f9ae154cSBram Moolenaar  Xexpr ''
506f9ae154cSBram Moolenaar  call assert_fails(cmd, 'E42:')
507f9ae154cSBram Moolenaar
5080fcc7c6dSBram Moolenaar  call s:create_test_file('Xqftestfile1')
5090fcc7c6dSBram Moolenaar  call s:create_test_file('Xqftestfile2')
5100fcc7c6dSBram Moolenaar
5110fcc7c6dSBram Moolenaar  Xgetexpr ['Xqftestfile1:5:Line5',
5120fcc7c6dSBram Moolenaar		\ 'Xqftestfile1:6:Line6',
5130fcc7c6dSBram Moolenaar		\ 'Xqftestfile2:10:Line10',
51499895eacSBram Moolenaar		\ 'Xqftestfile2:11:Line11',
51599895eacSBram Moolenaar		\ 'RegularLine1',
51699895eacSBram Moolenaar		\ 'RegularLine2']
5170fcc7c6dSBram Moolenaar
5180fcc7c6dSBram Moolenaar  Xfirst
519818fc9adSBram Moolenaar  call assert_fails('-5Xcc', 'E16:')
520e2e4075fSBram Moolenaar  call assert_fails('Xprev', 'E553:')
521e2e4075fSBram Moolenaar  call assert_fails('Xpfile', 'E553:')
5220fcc7c6dSBram Moolenaar  Xnfile
523bdd2c290SBram Moolenaar  call assert_equal('Xqftestfile2', @%)
5240fcc7c6dSBram Moolenaar  call assert_equal(10, line('.'))
5250fcc7c6dSBram Moolenaar  Xpfile
526bdd2c290SBram Moolenaar  call assert_equal('Xqftestfile1', @%)
5270fcc7c6dSBram Moolenaar  call assert_equal(6, line('.'))
52874240d3fSBram Moolenaar  5Xcc
52974240d3fSBram Moolenaar  call assert_equal(5, g:Xgetlist({'idx':0}).idx)
53074240d3fSBram Moolenaar  2Xcc
53174240d3fSBram Moolenaar  call assert_equal(2, g:Xgetlist({'idx':0}).idx)
532f9ae154cSBram Moolenaar  if a:cchar == 'c'
533f9ae154cSBram Moolenaar    cc
534f9ae154cSBram Moolenaar  else
535f9ae154cSBram Moolenaar    ll
536f9ae154cSBram Moolenaar  endif
537f9ae154cSBram Moolenaar  call assert_equal(2, g:Xgetlist({'idx':0}).idx)
53874240d3fSBram Moolenaar  10Xcc
53974240d3fSBram Moolenaar  call assert_equal(6, g:Xgetlist({'idx':0}).idx)
5400fcc7c6dSBram Moolenaar  Xlast
54199895eacSBram Moolenaar  Xprev
542bdd2c290SBram Moolenaar  call assert_equal('Xqftestfile2', @%)
5430fcc7c6dSBram Moolenaar  call assert_equal(11, line('.'))
544e2e4075fSBram Moolenaar  call assert_fails('Xnext', 'E553:')
545e2e4075fSBram Moolenaar  call assert_fails('Xnfile', 'E553:')
546f9ae154cSBram Moolenaar  " To process the range using quickfix list entries, directly use the
547f9ae154cSBram Moolenaar  " quickfix commands (don't use the user defined commands)
548f9ae154cSBram Moolenaar  if a:cchar == 'c'
549f9ae154cSBram Moolenaar    $cc
550f9ae154cSBram Moolenaar  else
551f9ae154cSBram Moolenaar    $ll
552f9ae154cSBram Moolenaar  endif
553f9ae154cSBram Moolenaar  call assert_equal(6, g:Xgetlist({'idx':0}).idx)
5540fcc7c6dSBram Moolenaar  Xrewind
555bdd2c290SBram Moolenaar  call assert_equal('Xqftestfile1', @%)
5560fcc7c6dSBram Moolenaar  call assert_equal(5, line('.'))
5570fcc7c6dSBram Moolenaar
55899895eacSBram Moolenaar  10Xnext
559bdd2c290SBram Moolenaar  call assert_equal('Xqftestfile2', @%)
56099895eacSBram Moolenaar  call assert_equal(11, line('.'))
56199895eacSBram Moolenaar  10Xprev
562bdd2c290SBram Moolenaar  call assert_equal('Xqftestfile1', @%)
56399895eacSBram Moolenaar  call assert_equal(5, line('.'))
56499895eacSBram Moolenaar
56574240d3fSBram Moolenaar  " Jumping to an error from the error window using cc command
56674240d3fSBram Moolenaar  Xgetexpr ['Xqftestfile1:5:Line5',
56774240d3fSBram Moolenaar		\ 'Xqftestfile1:6:Line6',
56874240d3fSBram Moolenaar		\ 'Xqftestfile2:10:Line10',
56974240d3fSBram Moolenaar		\ 'Xqftestfile2:11:Line11']
57074240d3fSBram Moolenaar  Xopen
57174240d3fSBram Moolenaar  10Xcc
57274240d3fSBram Moolenaar  call assert_equal(11, line('.'))
573bdd2c290SBram Moolenaar  call assert_equal('Xqftestfile2', @%)
574f0cee197SBram Moolenaar  Xopen
575f0cee197SBram Moolenaar  call cursor(2, 1)
576f0cee197SBram Moolenaar  if a:cchar == 'c'
577f0cee197SBram Moolenaar    .cc
578f0cee197SBram Moolenaar  else
579f0cee197SBram Moolenaar    .ll
580f0cee197SBram Moolenaar  endif
581f0cee197SBram Moolenaar  call assert_equal(6, line('.'))
582bdd2c290SBram Moolenaar  call assert_equal('Xqftestfile1', @%)
58374240d3fSBram Moolenaar
58474240d3fSBram Moolenaar  " Jumping to an error from the error window (when only the error window is
58574240d3fSBram Moolenaar  " present)
58674240d3fSBram Moolenaar  Xopen | only
58774240d3fSBram Moolenaar  Xlast 1
58874240d3fSBram Moolenaar  call assert_equal(5, line('.'))
589bdd2c290SBram Moolenaar  call assert_equal('Xqftestfile1', @%)
59074240d3fSBram Moolenaar
591ee85df37SBram Moolenaar  Xexpr ""
592ee85df37SBram Moolenaar  call assert_fails('Xnext', 'E42:')
593ee85df37SBram Moolenaar
5940fcc7c6dSBram Moolenaar  call delete('Xqftestfile1')
5950fcc7c6dSBram Moolenaar  call delete('Xqftestfile2')
596fc2b270cSBram Moolenaar
597fc2b270cSBram Moolenaar  " Should be able to use next/prev with invalid entries
598fc2b270cSBram Moolenaar  Xexpr ""
599fc2b270cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
600fc2b270cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'size' : 0}).size)
60188a3e2b2SBram Moolenaar  Xaddexpr ['foo', 'bar', 'baz', 'quux', 'sh|moo']
602fc2b270cSBram Moolenaar  call assert_equal(5, g:Xgetlist({'size' : 0}).size)
603fc2b270cSBram Moolenaar  Xlast
604fc2b270cSBram Moolenaar  call assert_equal(5, g:Xgetlist({'idx' : 0}).idx)
605fc2b270cSBram Moolenaar  Xfirst
606fc2b270cSBram Moolenaar  call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
607fc2b270cSBram Moolenaar  2Xnext
608fc2b270cSBram Moolenaar  call assert_equal(3, g:Xgetlist({'idx' : 0}).idx)
6092b946c9fSBram Moolenaarendfunc
6100fcc7c6dSBram Moolenaar
6112b946c9fSBram Moolenaarfunc Test_browse()
6120fcc7c6dSBram Moolenaar  call Xtest_browse('c')
6130fcc7c6dSBram Moolenaar  call Xtest_browse('l')
6142b946c9fSBram Moolenaarendfunc
6150fcc7c6dSBram Moolenaar
6162b946c9fSBram Moolenaarfunc Test_nomem()
6178e8df251SBram Moolenaar  call test_alloc_fail(GetAllocId('qf_dirname_start'), 0, 0)
618a260b87dSBram Moolenaar  call assert_fails('vimgrep vim runtest.vim', 'E342:')
61975bdf6aaSBram Moolenaar
620ce90e36fSBram Moolenaar  call GetAllocId('qf_dirname_now')->test_alloc_fail(0, 0)
621a260b87dSBram Moolenaar  call assert_fails('vimgrep vim runtest.vim', 'E342:')
62275bdf6aaSBram Moolenaar
6238e8df251SBram Moolenaar  call test_alloc_fail(GetAllocId('qf_namebuf'), 0, 0)
624a260b87dSBram Moolenaar  call assert_fails('cfile runtest.vim', 'E342:')
62575bdf6aaSBram Moolenaar
6268e8df251SBram Moolenaar  call test_alloc_fail(GetAllocId('qf_errmsg'), 0, 0)
627a260b87dSBram Moolenaar  call assert_fails('cfile runtest.vim', 'E342:')
62875bdf6aaSBram Moolenaar
6298e8df251SBram Moolenaar  call test_alloc_fail(GetAllocId('qf_pattern'), 0, 0)
630a260b87dSBram Moolenaar  call assert_fails('cfile runtest.vim', 'E342:')
63175bdf6aaSBram Moolenaar
63275bdf6aaSBram Moolenaarendfunc
63375bdf6aaSBram Moolenaar
6342b946c9fSBram Moolenaarfunc s:test_xhelpgrep(cchar)
635049cba9eSBram Moolenaar  call s:setup_commands(a:cchar)
636049cba9eSBram Moolenaar  Xhelpgrep quickfix
637049cba9eSBram Moolenaar  Xopen
638049cba9eSBram Moolenaar  if a:cchar == 'c'
639049cba9eSBram Moolenaar    let title_text = ':helpgrep quickfix'
640049cba9eSBram Moolenaar  else
641049cba9eSBram Moolenaar    let title_text = ':lhelpgrep quickfix'
642049cba9eSBram Moolenaar  endif
643049cba9eSBram Moolenaar  call assert_true(w:quickfix_title =~ title_text, w:quickfix_title)
64499895eacSBram Moolenaar
64599895eacSBram Moolenaar  " Jumping to a help topic should open the help window
64699895eacSBram Moolenaar  only
64799895eacSBram Moolenaar  Xnext
64899895eacSBram Moolenaar  call assert_true(&buftype == 'help')
64999895eacSBram Moolenaar  call assert_true(winnr('$') == 2)
65099895eacSBram Moolenaar  " Jumping to the next match should reuse the help window
65199895eacSBram Moolenaar  Xnext
65299895eacSBram Moolenaar  call assert_true(&buftype == 'help')
65399895eacSBram Moolenaar  call assert_true(winnr() == 1)
65499895eacSBram Moolenaar  call assert_true(winnr('$') == 2)
65599895eacSBram Moolenaar  " Jumping to the next match from the quickfix window should reuse the help
65699895eacSBram Moolenaar  " window
65799895eacSBram Moolenaar  Xopen
65899895eacSBram Moolenaar  Xnext
65999895eacSBram Moolenaar  call assert_true(&buftype == 'help')
66099895eacSBram Moolenaar  call assert_true(winnr() == 1)
66199895eacSBram Moolenaar  call assert_true(winnr('$') == 2)
6626864efa5Sthinca  call assert_match('|\d\+ col \d\+-\d\+|', getbufline(winbufnr(2), 1)[0])
66399895eacSBram Moolenaar
66462ef7974SBram Moolenaar  " This wipes out the buffer, make sure that doesn't cause trouble.
665049cba9eSBram Moolenaar  Xclose
666ee85df37SBram Moolenaar
667f9ae154cSBram Moolenaar  " When the current window is vertically split, jumping to a help match
668f9ae154cSBram Moolenaar  " should open the help window at the top.
669f9ae154cSBram Moolenaar  only | enew
670f9ae154cSBram Moolenaar  let w1 = win_getid()
671f9ae154cSBram Moolenaar  vert new
672f9ae154cSBram Moolenaar  let w2 = win_getid()
673f9ae154cSBram Moolenaar  Xnext
674f9ae154cSBram Moolenaar  let w3 = win_getid()
675f9ae154cSBram Moolenaar  call assert_true(&buftype == 'help')
676f9ae154cSBram Moolenaar  call assert_true(winnr() == 1)
677a106e6cdSBram Moolenaar  " See jump_to_help_window() for details
678a106e6cdSBram Moolenaar  let w2_width = winwidth(w2)
679a106e6cdSBram Moolenaar  if w2_width != &columns && w2_width < 80
680a106e6cdSBram Moolenaar    call assert_equal(['col', [['leaf', w3],
681a106e6cdSBram Moolenaar          \ ['row', [['leaf', w2], ['leaf', w1]]]]], winlayout())
682a106e6cdSBram Moolenaar  else
683a106e6cdSBram Moolenaar    call assert_equal(['row', [['col', [['leaf', w3], ['leaf', w2]]],
684a106e6cdSBram Moolenaar          \ ['leaf', w1]]] , winlayout())
685a106e6cdSBram Moolenaar  endif
686f9ae154cSBram Moolenaar
687f9ae154cSBram Moolenaar  new | only
688f9ae154cSBram Moolenaar  set buftype=help
689f9ae154cSBram Moolenaar  set modified
690f9ae154cSBram Moolenaar  call assert_fails('Xnext', 'E37:')
691f9ae154cSBram Moolenaar  set nomodified
692f9ae154cSBram Moolenaar  new | only
693f9ae154cSBram Moolenaar
694b4d5fbabSBram Moolenaar  if a:cchar == 'l'
695b4d5fbabSBram Moolenaar      " When a help window is present, running :lhelpgrep should reuse the
696b4d5fbabSBram Moolenaar      " help window and not the current window
697b4d5fbabSBram Moolenaar      new | only
698b4d5fbabSBram Moolenaar      call g:Xsetlist([], 'f')
699b4d5fbabSBram Moolenaar      help index.txt
700b4d5fbabSBram Moolenaar      wincmd w
701b4d5fbabSBram Moolenaar      lhelpgrep quickfix
702b4d5fbabSBram Moolenaar      call assert_equal(1, winnr())
703b4d5fbabSBram Moolenaar      call assert_notequal([], getloclist(1))
704b4d5fbabSBram Moolenaar      call assert_equal([], getloclist(2))
705b4d5fbabSBram Moolenaar  endif
706b4d5fbabSBram Moolenaar
70799895eacSBram Moolenaar  new | only
70899895eacSBram Moolenaar
709ee85df37SBram Moolenaar  " Search for non existing help string
710ee85df37SBram Moolenaar  call assert_fails('Xhelpgrep a1b2c3', 'E480:')
711108e7b42SBram Moolenaar  " Invalid regular expression
7129b7bf9e9SBram Moolenaar  call assert_fails('Xhelpgrep \@<!', 'E866:')
7132b946c9fSBram Moolenaarendfunc
714049cba9eSBram Moolenaar
7152b946c9fSBram Moolenaarfunc Test_helpgrep()
716049cba9eSBram Moolenaar  call s:test_xhelpgrep('c')
717cf25fdb8SBram Moolenaar  helpclose
718049cba9eSBram Moolenaar  call s:test_xhelpgrep('l')
71962ef7974SBram Moolenaarendfunc
72075bdf6aaSBram Moolenaar
721e5a2dc87SBram Moolenaardef Test_helpgrep_vim9_restore_cpo()
722e5a2dc87SBram Moolenaar  assert_equal('aABceFs', &cpo)
723e5a2dc87SBram Moolenaar
724e5a2dc87SBram Moolenaar  var rtp_save = &rtp
725e5a2dc87SBram Moolenaar  var dir = 'Xruntime/after'
726e5a2dc87SBram Moolenaar  &rtp ..= ',' .. dir
727e5a2dc87SBram Moolenaar  mkdir(dir .. '/ftplugin', 'p')
72839f3b141SBram Moolenaar  writefile(['vim9script'], dir .. '/ftplugin/qf.vim')
729e5a2dc87SBram Moolenaar  filetype plugin on
730e5a2dc87SBram Moolenaar  silent helpgrep grail
731e5a2dc87SBram Moolenaar  cwindow
732e5a2dc87SBram Moolenaar  silent helpgrep grail
733e5a2dc87SBram Moolenaar
734e5a2dc87SBram Moolenaar  assert_equal('aABceFs', &cpo)
735e5a2dc87SBram Moolenaar  delete(dir, 'rf')
736e5a2dc87SBram Moolenaar  &rtp = rtp_save
737e5a2dc87SBram Moolenaar  cclose
738e5a2dc87SBram Moolenaar  helpclose
739e5a2dc87SBram Moolenaarenddef
740e5a2dc87SBram Moolenaar
7415f7d4c04SBram Moolenaardef Test_vim9_cexpr()
7425f7d4c04SBram Moolenaar  var text = 'somefile:95:error'
7435f7d4c04SBram Moolenaar  cexpr text
7445f7d4c04SBram Moolenaar  var l = getqflist()
7455f7d4c04SBram Moolenaar  assert_equal(1, l->len())
7465f7d4c04SBram Moolenaar  assert_equal(95, l[0].lnum)
7475f7d4c04SBram Moolenaar  assert_equal('error', l[0].text)
7485f7d4c04SBram Moolenaar
7495f7d4c04SBram Moolenaar  text = 'somefile:77:warning'
7505f7d4c04SBram Moolenaar  caddexpr text
7515f7d4c04SBram Moolenaar  l = getqflist()
7525f7d4c04SBram Moolenaar  assert_equal(2, l->len())
7535f7d4c04SBram Moolenaar  assert_equal(77, l[1].lnum)
7545f7d4c04SBram Moolenaar  assert_equal('warning', l[1].text)
7555f7d4c04SBram Moolenaarenddef
7565f7d4c04SBram Moolenaar
7576920c72dSBram Moolenaarfunc Test_errortitle()
7586920c72dSBram Moolenaar  augroup QfBufWinEnter
7596920c72dSBram Moolenaar    au!
7606920c72dSBram Moolenaar    au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
7616920c72dSBram Moolenaar  augroup END
7626920c72dSBram Moolenaar  copen
7636920c72dSBram 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'')'}]
7646920c72dSBram Moolenaar  call setqflist(a)
7656920c72dSBram Moolenaar  call assert_equal(':setqflist()', g:a)
7666920c72dSBram Moolenaar  augroup QfBufWinEnter
7676920c72dSBram Moolenaar    au!
7686920c72dSBram Moolenaar  augroup END
7696920c72dSBram Moolenaar  augroup! QfBufWinEnter
7706920c72dSBram Moolenaarendfunc
771e27dba49SBram Moolenaar
7725584df65SBram Moolenaarfunc Test_vimgreptitle()
7735584df65SBram Moolenaar  augroup QfBufWinEnter
7745584df65SBram Moolenaar    au!
7755584df65SBram Moolenaar    au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
7765584df65SBram Moolenaar  augroup END
7775584df65SBram Moolenaar  try
7785584df65SBram Moolenaar    vimgrep /pattern/j file
7795584df65SBram Moolenaar  catch /E480/
7805584df65SBram Moolenaar  endtry
7815584df65SBram Moolenaar  copen
7825584df65SBram Moolenaar  call assert_equal(':    vimgrep /pattern/j file', g:a)
7835584df65SBram Moolenaar  augroup QfBufWinEnter
7845584df65SBram Moolenaar    au!
7855584df65SBram Moolenaar  augroup END
7865584df65SBram Moolenaar  augroup! QfBufWinEnter
7875584df65SBram Moolenaarendfunc
7885584df65SBram Moolenaar
789*1d30fde3SBram Moolenaarfunc Test_bufwinenter_once()
790*1d30fde3SBram Moolenaar  augroup QfBufWinEnter
791*1d30fde3SBram Moolenaar    au!
792*1d30fde3SBram Moolenaar    au BufWinEnter * let g:got_afile ..= 'got ' .. expand('<afile>')
793*1d30fde3SBram Moolenaar  augroup END
794*1d30fde3SBram Moolenaar  let g:got_afile = ''
795*1d30fde3SBram Moolenaar  copen
796*1d30fde3SBram Moolenaar  call assert_equal('got quickfix', g:got_afile)
797*1d30fde3SBram Moolenaar
798*1d30fde3SBram Moolenaar  cclose
799*1d30fde3SBram Moolenaar  unlet g:got_afile
800*1d30fde3SBram Moolenaar  augroup QfBufWinEnter
801*1d30fde3SBram Moolenaar    au!
802*1d30fde3SBram Moolenaar  augroup END
803*1d30fde3SBram Moolenaar  augroup! QfBufWinEnter
804*1d30fde3SBram Moolenaarendfunc
805*1d30fde3SBram Moolenaar
8062b946c9fSBram Moolenaarfunc XqfTitleTests(cchar)
8073ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
808e27dba49SBram Moolenaar
8093ef5bf7dSBram Moolenaar  Xgetexpr ['file:1:1:message']
8103ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
811e27dba49SBram Moolenaar  if a:cchar == 'c'
812e27dba49SBram Moolenaar    call setqflist(l, 'r')
813e27dba49SBram Moolenaar  else
814e27dba49SBram Moolenaar    call setloclist(0, l, 'r')
815e27dba49SBram Moolenaar  endif
816e27dba49SBram Moolenaar
8173ef5bf7dSBram Moolenaar  Xopen
818e27dba49SBram Moolenaar  if a:cchar == 'c'
819e27dba49SBram Moolenaar    let title = ':setqflist()'
820e27dba49SBram Moolenaar  else
821e27dba49SBram Moolenaar    let title = ':setloclist()'
822e27dba49SBram Moolenaar  endif
823e27dba49SBram Moolenaar  call assert_equal(title, w:quickfix_title)
8243ef5bf7dSBram Moolenaar  Xclose
8252b946c9fSBram Moolenaarendfunc
826e27dba49SBram Moolenaar
827e27dba49SBram Moolenaar" Tests for quickfix window's title
8282b946c9fSBram Moolenaarfunc Test_qf_title()
829e27dba49SBram Moolenaar  call XqfTitleTests('c')
830e27dba49SBram Moolenaar  call XqfTitleTests('l')
8312b946c9fSBram Moolenaarendfunc
832e27dba49SBram Moolenaar
833e27dba49SBram Moolenaar" Tests for 'errorformat'
8342b946c9fSBram Moolenaarfunc Test_efm()
835e27dba49SBram Moolenaar  let save_efm = &efm
836e27dba49SBram Moolenaar  set efm=%EEEE%m,%WWWW%m,%+CCCC%.%#,%-GGGG%.%#
837e27dba49SBram Moolenaar  cgetexpr ['WWWW', 'EEEE', 'CCCC']
838e27dba49SBram Moolenaar  let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
839e27dba49SBram Moolenaar  call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
840e27dba49SBram Moolenaar  cgetexpr ['WWWW', 'GGGG', 'EEEE', 'CCCC']
841e27dba49SBram Moolenaar  let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
842e27dba49SBram Moolenaar  call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
843e27dba49SBram Moolenaar  cgetexpr ['WWWW', 'GGGG', 'ZZZZ', 'EEEE', 'CCCC', 'YYYY']
844e27dba49SBram Moolenaar  let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
845e27dba49SBram Moolenaar  call assert_equal("[['W', 1], ['ZZZZ', 0], ['E^@CCCC', 1], ['YYYY', 0]]", l)
846e27dba49SBram Moolenaar  let &efm = save_efm
8472b946c9fSBram Moolenaarendfunc
8481ff2b64bSBram Moolenaar
8491ff2b64bSBram Moolenaar" This will test for problems in quickfix:
8501ff2b64bSBram Moolenaar" A. incorrectly copying location lists which caused the location list to show
8511ff2b64bSBram Moolenaar"    a different name than the file that was actually being displayed.
8521ff2b64bSBram Moolenaar" B. not reusing the window for which the location list window is opened but
8531ff2b64bSBram Moolenaar"    instead creating new windows.
8541ff2b64bSBram Moolenaar" C. make sure that the location list window is not reused instead of the
8551ff2b64bSBram Moolenaar"    window it belongs to.
8561ff2b64bSBram Moolenaar"
8571ff2b64bSBram Moolenaar" Set up the test environment:
8582b946c9fSBram Moolenaarfunc ReadTestProtocol(name)
8591ff2b64bSBram Moolenaar  let base = substitute(a:name, '\v^test://(.*)%(\.[^.]+)?', '\1', '')
8601ff2b64bSBram Moolenaar  let word = substitute(base, '\v(.*)\..*', '\1', '')
8611ff2b64bSBram Moolenaar
8621ff2b64bSBram Moolenaar  setl modifiable
8631ff2b64bSBram Moolenaar  setl noreadonly
8641ff2b64bSBram Moolenaar  setl noswapfile
8651ff2b64bSBram Moolenaar  setl bufhidden=delete
8661ff2b64bSBram Moolenaar  %del _
8671ff2b64bSBram Moolenaar  " For problem 2:
8681ff2b64bSBram Moolenaar  " 'buftype' has to be set to reproduce the constant opening of new windows
8691ff2b64bSBram Moolenaar  setl buftype=nofile
8701ff2b64bSBram Moolenaar
8711ff2b64bSBram Moolenaar  call setline(1, word)
8721ff2b64bSBram Moolenaar
8731ff2b64bSBram Moolenaar  setl nomodified
8741ff2b64bSBram Moolenaar  setl nomodifiable
8751ff2b64bSBram Moolenaar  setl readonly
8761ff2b64bSBram Moolenaar  exe 'doautocmd BufRead ' . substitute(a:name, '\v^test://(.*)', '\1', '')
8772b946c9fSBram Moolenaarendfunc
8781ff2b64bSBram Moolenaar
8792b946c9fSBram Moolenaarfunc Test_locationlist()
8801ff2b64bSBram Moolenaar  enew
8811ff2b64bSBram Moolenaar
8821ff2b64bSBram Moolenaar  augroup testgroup
8831ff2b64bSBram Moolenaar    au!
8841ff2b64bSBram Moolenaar    autocmd BufReadCmd test://* call ReadTestProtocol(expand("<amatch>"))
8851ff2b64bSBram Moolenaar  augroup END
8861ff2b64bSBram Moolenaar
8871ff2b64bSBram Moolenaar  let words = [ "foo", "bar", "baz", "quux", "shmoo", "spam", "eggs" ]
8881ff2b64bSBram Moolenaar
8891ff2b64bSBram Moolenaar  let qflist = []
8901ff2b64bSBram Moolenaar  for word in words
8911ff2b64bSBram Moolenaar    call add(qflist, {'filename': 'test://' . word . '.txt', 'text': 'file ' . word . '.txt', })
8921ff2b64bSBram Moolenaar    " NOTE: problem 1:
8931ff2b64bSBram Moolenaar    " intentionally not setting 'lnum' so that the quickfix entries are not
8941ff2b64bSBram Moolenaar    " valid
895aad222c9SBram Moolenaar    eval qflist->setloclist(0, ' ')
8961ff2b64bSBram Moolenaar  endfor
8971ff2b64bSBram Moolenaar
8981ff2b64bSBram Moolenaar  " Test A
8991ff2b64bSBram Moolenaar  lrewind
9001ff2b64bSBram Moolenaar  enew
9011ff2b64bSBram Moolenaar  lopen
90299895eacSBram Moolenaar  4lnext
9031ff2b64bSBram Moolenaar  vert split
9041ff2b64bSBram Moolenaar  wincmd L
9051ff2b64bSBram Moolenaar  lopen
9061ff2b64bSBram Moolenaar  wincmd p
9071ff2b64bSBram Moolenaar  lnext
9081ff2b64bSBram Moolenaar  let fileName = expand("%")
9091ff2b64bSBram Moolenaar  wincmd p
9101ff2b64bSBram Moolenaar  let locationListFileName = substitute(getline(line('.')), '\([^|]*\)|.*', '\1', '')
9111ff2b64bSBram Moolenaar  let fileName = substitute(fileName, '\\', '/', 'g')
9121ff2b64bSBram Moolenaar  let locationListFileName = substitute(locationListFileName, '\\', '/', 'g')
9131ff2b64bSBram Moolenaar  call assert_equal("test://bar.txt", fileName)
9141ff2b64bSBram Moolenaar  call assert_equal("test://bar.txt", locationListFileName)
9151ff2b64bSBram Moolenaar
9161ff2b64bSBram Moolenaar  wincmd n | only
9171ff2b64bSBram Moolenaar
9181ff2b64bSBram Moolenaar  " Test B:
9191ff2b64bSBram Moolenaar  lrewind
9201ff2b64bSBram Moolenaar  lopen
9211ff2b64bSBram Moolenaar  2
9221ff2b64bSBram Moolenaar  exe "normal \<CR>"
9231ff2b64bSBram Moolenaar  wincmd p
9241ff2b64bSBram Moolenaar  3
9251ff2b64bSBram Moolenaar  exe "normal \<CR>"
9261ff2b64bSBram Moolenaar  wincmd p
9271ff2b64bSBram Moolenaar  4
9281ff2b64bSBram Moolenaar  exe "normal \<CR>"
9291ff2b64bSBram Moolenaar  call assert_equal(2, winnr('$'))
9301ff2b64bSBram Moolenaar  wincmd n | only
9311ff2b64bSBram Moolenaar
9321ff2b64bSBram Moolenaar  " Test C:
9331ff2b64bSBram Moolenaar  lrewind
9341ff2b64bSBram Moolenaar  lopen
9351ff2b64bSBram Moolenaar  " Let's move the location list window to the top to check whether it (the
9361ff2b64bSBram Moolenaar  " first window found) will be reused when we try to open new windows:
9371ff2b64bSBram Moolenaar  wincmd K
9381ff2b64bSBram Moolenaar  2
9391ff2b64bSBram Moolenaar  exe "normal \<CR>"
9401ff2b64bSBram Moolenaar  wincmd p
9411ff2b64bSBram Moolenaar  3
9421ff2b64bSBram Moolenaar  exe "normal \<CR>"
9431ff2b64bSBram Moolenaar  wincmd p
9441ff2b64bSBram Moolenaar  4
9451ff2b64bSBram Moolenaar  exe "normal \<CR>"
9461ff2b64bSBram Moolenaar  1wincmd w
9471ff2b64bSBram Moolenaar  call assert_equal('quickfix', &buftype)
9481ff2b64bSBram Moolenaar  2wincmd w
9491ff2b64bSBram Moolenaar  let bufferName = expand("%")
9501ff2b64bSBram Moolenaar  let bufferName = substitute(bufferName, '\\', '/', 'g')
9511ff2b64bSBram Moolenaar  call assert_equal('test://quux.txt', bufferName)
9521ff2b64bSBram Moolenaar
9531ff2b64bSBram Moolenaar  wincmd n | only
9541ff2b64bSBram Moolenaar
9551ff2b64bSBram Moolenaar  augroup! testgroup
9562b946c9fSBram Moolenaarendfunc
9570899d698SBram Moolenaar
9582b946c9fSBram Moolenaarfunc Test_locationlist_curwin_was_closed()
9590899d698SBram Moolenaar  augroup testgroup
9600899d698SBram Moolenaar    au!
961d106e5baSBram Moolenaar    autocmd BufReadCmd test_curwin.txt call R(expand("<amatch>"))
9620899d698SBram Moolenaar  augroup END
9630899d698SBram Moolenaar
9642b946c9fSBram Moolenaar  func! R(n)
9650899d698SBram Moolenaar    quit
9660899d698SBram Moolenaar  endfunc
9670899d698SBram Moolenaar
9680899d698SBram Moolenaar  new
9690899d698SBram Moolenaar  let q = []
970d106e5baSBram Moolenaar  call add(q, {'filename': 'test_curwin.txt' })
9710899d698SBram Moolenaar  call setloclist(0, q)
9720899d698SBram Moolenaar  call assert_fails('lrewind', 'E924:')
9730899d698SBram Moolenaar
9740899d698SBram Moolenaar  augroup! testgroup
9752b946c9fSBram Moolenaarendfunc
9767eba3d2cSBram Moolenaar
9772b946c9fSBram Moolenaarfunc Test_locationlist_cross_tab_jump()
9780a9046fbSBram Moolenaar  call writefile(['loclistfoo'], 'loclistfoo')
9790a9046fbSBram Moolenaar  call writefile(['loclistbar'], 'loclistbar')
9800a9046fbSBram Moolenaar  set switchbuf=usetab
9810a9046fbSBram Moolenaar
9820a9046fbSBram Moolenaar  edit loclistfoo
9830a9046fbSBram Moolenaar  tabedit loclistbar
9840a9046fbSBram Moolenaar  silent lgrep loclistfoo loclist*
9850a9046fbSBram Moolenaar  call assert_equal(1, tabpagenr())
9860a9046fbSBram Moolenaar
9870a9046fbSBram Moolenaar  enew | only | tabonly
9880a9046fbSBram Moolenaar  set switchbuf&vim
9890a9046fbSBram Moolenaar  call delete('loclistfoo')
9900a9046fbSBram Moolenaar  call delete('loclistbar')
9912b946c9fSBram Moolenaarendfunc
9920a9046fbSBram Moolenaar
9937eba3d2cSBram Moolenaar" More tests for 'errorformat'
9942b946c9fSBram Moolenaarfunc Test_efm1()
9957eba3d2cSBram Moolenaar  " The 'errorformat' setting is different on non-Unix systems.
9967eba3d2cSBram Moolenaar  " This test works only on Unix-like systems.
9976d91bcb4SBram Moolenaar  CheckUnix
9987eba3d2cSBram Moolenaar
999c79745a8SBram Moolenaar  let l =<< trim [DATA]
1000c79745a8SBram Moolenaar    "Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set.
1001c79745a8SBram Moolenaar    "Xtestfile", line 6 col 19; this is an error
1002c79745a8SBram Moolenaar    gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include  version.c
1003c79745a8SBram Moolenaar    Xtestfile:9: parse error before `asd'
1004c79745a8SBram Moolenaar    make: *** [vim] Error 1
1005c79745a8SBram Moolenaar    in file "Xtestfile" linenr 10: there is an error
1006c79745a8SBram Moolenaar
1007c79745a8SBram Moolenaar    2 returned
1008c79745a8SBram Moolenaar    "Xtestfile", line 11 col 1; this is an error
1009c79745a8SBram Moolenaar    "Xtestfile", line 12 col 2; this is another error
1010c79745a8SBram Moolenaar    "Xtestfile", line 14:10; this is an error in column 10
1011c79745a8SBram Moolenaar    =Xtestfile=, line 15:10; this is another error, but in vcol 10 this time
1012c79745a8SBram Moolenaar    "Xtestfile", linenr 16: yet another problem
1013c79745a8SBram Moolenaar    Error in "Xtestfile" at line 17:
1014c79745a8SBram Moolenaar    x should be a dot
1015c79745a8SBram Moolenaar    	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 17
1016c79745a8SBram Moolenaar                ^
1017c79745a8SBram Moolenaar    Error in "Xtestfile" at line 18:
1018c79745a8SBram Moolenaar    x should be a dot
1019c79745a8SBram Moolenaar    	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 18
1020c79745a8SBram Moolenaar    .............^
1021c79745a8SBram Moolenaar    Error in "Xtestfile" at line 19:
1022c79745a8SBram Moolenaar    x should be a dot
1023c79745a8SBram Moolenaar    	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 19
1024c79745a8SBram Moolenaar    --------------^
1025c79745a8SBram Moolenaar    Error in "Xtestfile" at line 20:
1026c79745a8SBram Moolenaar    x should be a dot
1027c79745a8SBram Moolenaar    	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 20
1028c79745a8SBram Moolenaar    	       ^
1029c79745a8SBram Moolenaar
1030c79745a8SBram Moolenaar    Does anyone know what is the problem and how to correction it?
1031c79745a8SBram Moolenaar    "Xtestfile", line 21 col 9: What is the title of the quickfix window?
1032c79745a8SBram Moolenaar    "Xtestfile", line 22 col 9: What is the title of the quickfix window?
1033c79745a8SBram Moolenaar  [DATA]
10347eba3d2cSBram Moolenaar
10357eba3d2cSBram Moolenaar  call writefile(l, 'Xerrorfile1')
10367eba3d2cSBram Moolenaar  call writefile(l[:-2], 'Xerrorfile2')
10377eba3d2cSBram Moolenaar
1038e7eb9270SBram Moolenaar  let m =<< [DATA]
1039c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  2
1040c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  3
1041c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  4
1042c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  5
1043c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  6
1044c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  7
1045c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  8
1046c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  9
1047c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 10
1048c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 11
1049c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 12
1050c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 13
1051c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 14
1052c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 15
1053c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 16
1054c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 17
1055c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 18
1056c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 19
1057c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 20
1058c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 21
1059c79745a8SBram Moolenaar	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 22
1060c79745a8SBram Moolenaar[DATA]
10617eba3d2cSBram Moolenaar  call writefile(m, 'Xtestfile')
10627eba3d2cSBram Moolenaar
10637eba3d2cSBram Moolenaar  let save_efm = &efm
10647eba3d2cSBram Moolenaar  set efm+==%f=\\,\ line\ %l%*\\D%v%*[^\ ]\ %m
10657eba3d2cSBram Moolenaar  set efm^=%AError\ in\ \"%f\"\ at\ line\ %l:,%Z%p^,%C%m
10667eba3d2cSBram Moolenaar
10677eba3d2cSBram Moolenaar  exe 'cf Xerrorfile2'
10687eba3d2cSBram Moolenaar  clast
10697eba3d2cSBram Moolenaar  copen
10707eba3d2cSBram Moolenaar  call assert_equal(':cf Xerrorfile2', w:quickfix_title)
10717eba3d2cSBram Moolenaar  wincmd p
10727eba3d2cSBram Moolenaar
10737eba3d2cSBram Moolenaar  exe 'cf Xerrorfile1'
10747eba3d2cSBram Moolenaar  call assert_equal([4, 12], [line('.'), col('.')])
10757eba3d2cSBram Moolenaar  cn
10767eba3d2cSBram Moolenaar  call assert_equal([6, 19], [line('.'), col('.')])
10777eba3d2cSBram Moolenaar  cn
10787eba3d2cSBram Moolenaar  call assert_equal([9, 2], [line('.'), col('.')])
10797eba3d2cSBram Moolenaar  cn
10807eba3d2cSBram Moolenaar  call assert_equal([10, 2], [line('.'), col('.')])
10817eba3d2cSBram Moolenaar  cn
10827eba3d2cSBram Moolenaar  call assert_equal([11, 1], [line('.'), col('.')])
10837eba3d2cSBram Moolenaar  cn
10847eba3d2cSBram Moolenaar  call assert_equal([12, 2], [line('.'), col('.')])
10857eba3d2cSBram Moolenaar  cn
10867eba3d2cSBram Moolenaar  call assert_equal([14, 10], [line('.'), col('.')])
10877eba3d2cSBram Moolenaar  cn
10887eba3d2cSBram Moolenaar  call assert_equal([15, 3, 10], [line('.'), col('.'), virtcol('.')])
10897eba3d2cSBram Moolenaar  cn
10907eba3d2cSBram Moolenaar  call assert_equal([16, 2], [line('.'), col('.')])
10917eba3d2cSBram Moolenaar  cn
10927eba3d2cSBram Moolenaar  call assert_equal([17, 6], [line('.'), col('.')])
10937eba3d2cSBram Moolenaar  cn
10947eba3d2cSBram Moolenaar  call assert_equal([18, 7], [line('.'), col('.')])
10957eba3d2cSBram Moolenaar  cn
10967eba3d2cSBram Moolenaar  call assert_equal([19, 8], [line('.'), col('.')])
10977eba3d2cSBram Moolenaar  cn
10987eba3d2cSBram Moolenaar  call assert_equal([20, 9], [line('.'), col('.')])
10997eba3d2cSBram Moolenaar  clast
11007eba3d2cSBram Moolenaar  cprev
11017eba3d2cSBram Moolenaar  cprev
11027eba3d2cSBram Moolenaar  wincmd w
11037eba3d2cSBram Moolenaar  call assert_equal(':cf Xerrorfile1', w:quickfix_title)
11047eba3d2cSBram Moolenaar  wincmd p
11057eba3d2cSBram Moolenaar
11067eba3d2cSBram Moolenaar  let &efm = save_efm
11077eba3d2cSBram Moolenaar  call delete('Xerrorfile1')
11087eba3d2cSBram Moolenaar  call delete('Xerrorfile2')
11097eba3d2cSBram Moolenaar  call delete('Xtestfile')
11102b946c9fSBram Moolenaarendfunc
1111ffec3c53SBram Moolenaar
1112ab47c61fSBram Moolenaar" Test for quickfix directory stack support
11132b946c9fSBram Moolenaarfunc s:dir_stack_tests(cchar)
111438df43bdSBram Moolenaar  call s:setup_commands(a:cchar)
111538df43bdSBram Moolenaar
1116ab47c61fSBram Moolenaar  let save_efm=&efm
1117ab47c61fSBram Moolenaar  set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
1118ab47c61fSBram Moolenaar
1119361c8f0eSBram Moolenaar  let lines = ["Entering dir 'dir1/a'",
1120361c8f0eSBram Moolenaar		\ 'habits2.txt:1:Nine Healthy Habits',
1121361c8f0eSBram Moolenaar		\ "Entering dir 'b'",
1122361c8f0eSBram Moolenaar		\ 'habits3.txt:2:0 Hours of television',
1123361c8f0eSBram Moolenaar		\ 'habits2.txt:7:5 Small meals',
1124361c8f0eSBram Moolenaar		\ "Entering dir 'dir1/c'",
1125361c8f0eSBram Moolenaar		\ 'habits4.txt:3:1 Hour of exercise',
1126361c8f0eSBram Moolenaar		\ "Leaving dir 'dir1/c'",
1127361c8f0eSBram Moolenaar		\ "Leaving dir 'dir1/a'",
1128361c8f0eSBram Moolenaar		\ 'habits1.txt:4:2 Liters of water',
1129361c8f0eSBram Moolenaar		\ "Entering dir 'dir2'",
1130361c8f0eSBram Moolenaar		\ 'habits5.txt:5:3 Cups of hot green tea',
1131361c8f0eSBram Moolenaar		\ "Leaving dir 'dir2'"
1132361c8f0eSBram Moolenaar		\]
1133ab47c61fSBram Moolenaar
1134361c8f0eSBram Moolenaar  Xexpr ""
1135361c8f0eSBram Moolenaar  for l in lines
1136361c8f0eSBram Moolenaar      Xaddexpr l
1137361c8f0eSBram Moolenaar  endfor
1138ab47c61fSBram Moolenaar
11393ef5bf7dSBram Moolenaar  let qf = g:Xgetlist()
1140ab47c61fSBram Moolenaar
1141ab47c61fSBram Moolenaar  call assert_equal('dir1/a/habits2.txt', bufname(qf[1].bufnr))
1142ab47c61fSBram Moolenaar  call assert_equal(1, qf[1].lnum)
1143ab47c61fSBram Moolenaar  call assert_equal('dir1/a/b/habits3.txt', bufname(qf[3].bufnr))
1144ab47c61fSBram Moolenaar  call assert_equal(2, qf[3].lnum)
1145ab47c61fSBram Moolenaar  call assert_equal('dir1/a/habits2.txt', bufname(qf[4].bufnr))
1146ab47c61fSBram Moolenaar  call assert_equal(7, qf[4].lnum)
1147ab47c61fSBram Moolenaar  call assert_equal('dir1/c/habits4.txt', bufname(qf[6].bufnr))
1148ab47c61fSBram Moolenaar  call assert_equal(3, qf[6].lnum)
1149ab47c61fSBram Moolenaar  call assert_equal('habits1.txt', bufname(qf[9].bufnr))
1150ab47c61fSBram Moolenaar  call assert_equal(4, qf[9].lnum)
1151ab47c61fSBram Moolenaar  call assert_equal('dir2/habits5.txt', bufname(qf[11].bufnr))
1152ab47c61fSBram Moolenaar  call assert_equal(5, qf[11].lnum)
1153ab47c61fSBram Moolenaar
1154ab47c61fSBram Moolenaar  let &efm=save_efm
11552b946c9fSBram Moolenaarendfunc
1156ab47c61fSBram Moolenaar
1157ab47c61fSBram Moolenaar" Tests for %D and %X errorformat options
11582b946c9fSBram Moolenaarfunc Test_efm_dirstack()
1159ab47c61fSBram Moolenaar  " Create the directory stack and files
1160ab47c61fSBram Moolenaar  call mkdir('dir1')
1161ab47c61fSBram Moolenaar  call mkdir('dir1/a')
1162ab47c61fSBram Moolenaar  call mkdir('dir1/a/b')
1163ab47c61fSBram Moolenaar  call mkdir('dir1/c')
1164ab47c61fSBram Moolenaar  call mkdir('dir2')
1165ab47c61fSBram Moolenaar
1166ab47c61fSBram Moolenaar  let lines = ["Nine Healthy Habits",
1167ab47c61fSBram Moolenaar		\ "0 Hours of television",
1168ab47c61fSBram Moolenaar		\ "1 Hour of exercise",
1169ab47c61fSBram Moolenaar		\ "2 Liters of water",
1170ab47c61fSBram Moolenaar		\ "3 Cups of hot green tea",
1171ab47c61fSBram Moolenaar		\ "4 Short mental breaks",
1172ab47c61fSBram Moolenaar		\ "5 Small meals",
1173ab47c61fSBram Moolenaar		\ "6 AM wake up time",
1174ab47c61fSBram Moolenaar		\ "7 Minutes of laughter",
1175ab47c61fSBram Moolenaar		\ "8 Hours of sleep (at least)",
1176ab47c61fSBram Moolenaar		\ "9 PM end of the day and off to bed"
1177ab47c61fSBram Moolenaar		\ ]
1178ab47c61fSBram Moolenaar  call writefile(lines, 'habits1.txt')
1179ab47c61fSBram Moolenaar  call writefile(lines, 'dir1/a/habits2.txt')
1180ab47c61fSBram Moolenaar  call writefile(lines, 'dir1/a/b/habits3.txt')
1181ab47c61fSBram Moolenaar  call writefile(lines, 'dir1/c/habits4.txt')
1182ab47c61fSBram Moolenaar  call writefile(lines, 'dir2/habits5.txt')
1183ab47c61fSBram Moolenaar
1184ab47c61fSBram Moolenaar  call s:dir_stack_tests('c')
1185ab47c61fSBram Moolenaar  call s:dir_stack_tests('l')
1186ab47c61fSBram Moolenaar
1187ab47c61fSBram Moolenaar  call delete('dir1', 'rf')
1188ab47c61fSBram Moolenaar  call delete('dir2', 'rf')
1189ab47c61fSBram Moolenaar  call delete('habits1.txt')
11902b946c9fSBram Moolenaarendfunc
1191ab47c61fSBram Moolenaar
11929b457948SBram Moolenaar" Test for resync after continuing an ignored message
11932b946c9fSBram Moolenaarfunc Xefm_ignore_continuations(cchar)
11949b457948SBram Moolenaar  call s:setup_commands(a:cchar)
11959b457948SBram Moolenaar
11969b457948SBram Moolenaar  let save_efm = &efm
11979b457948SBram Moolenaar
11989b457948SBram Moolenaar  let &efm =
11999b457948SBram Moolenaar	\ '%Eerror %m %l,' .
12009b457948SBram Moolenaar	\ '%-Wignored %m %l,' .
12019b457948SBram Moolenaar	\ '%+Cmore ignored %m %l,' .
12029b457948SBram Moolenaar	\ '%Zignored end'
12039b457948SBram Moolenaar  Xgetexpr ['ignored warning 1', 'more ignored continuation 2', 'ignored end', 'error resync 4']
12049b457948SBram Moolenaar  let l = map(g:Xgetlist(), '[v:val.text, v:val.valid, v:val.lnum, v:val.type]')
12059b457948SBram Moolenaar  call assert_equal([['resync', 1, 4, 'E']], l)
12069b457948SBram Moolenaar
12079b457948SBram Moolenaar  let &efm = save_efm
12082b946c9fSBram Moolenaarendfunc
12099b457948SBram Moolenaar
12102b946c9fSBram Moolenaarfunc Test_efm_ignore_continuations()
12119b457948SBram Moolenaar  call Xefm_ignore_continuations('c')
12129b457948SBram Moolenaar  call Xefm_ignore_continuations('l')
12132b946c9fSBram Moolenaarendfunc
12149b457948SBram Moolenaar
12150fcc7c6dSBram Moolenaar" Tests for invalid error format specifies
12162b946c9fSBram Moolenaarfunc Xinvalid_efm_Tests(cchar)
12170fcc7c6dSBram Moolenaar  call s:setup_commands(a:cchar)
12180fcc7c6dSBram Moolenaar
1219049cba9eSBram Moolenaar  let save_efm = &efm
1220049cba9eSBram Moolenaar
12210fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%f:%l:%m
12220fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E372:')
12230fcc7c6dSBram Moolenaar
12240fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%l:%r:%m
12250fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
12260fcc7c6dSBram Moolenaar
12270fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%O:%f:%l:%m
12280fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
12290fcc7c6dSBram Moolenaar
12300fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%l:%*[^a-z
12310fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E374:')
12320fcc7c6dSBram Moolenaar
12330fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%l:%*c
12340fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E375:')
12350fcc7c6dSBram Moolenaar
12360fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%L%M%N
12370fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E376:')
12380fcc7c6dSBram Moolenaar
12390fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%l:%m:%R
12400fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E377:')
12410fcc7c6dSBram Moolenaar
124270077dd1SBram Moolenaar  " Invalid regular expression
124370077dd1SBram Moolenaar  set efm=%\\%%k
124470077dd1SBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E867:')
124570077dd1SBram Moolenaar
12460fcc7c6dSBram Moolenaar  set efm=
12470fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E378:')
12480fcc7c6dSBram Moolenaar
12490fcc7c6dSBram Moolenaar  set efm=%DEntering\ dir\ abc,%f:%l:%m
12500fcc7c6dSBram Moolenaar  call assert_fails('Xexpr ["Entering dir abc", "abc.txt:1:Hello world"]', 'E379:')
12510fcc7c6dSBram Moolenaar
12520fcc7c6dSBram Moolenaar  let &efm = save_efm
12532b946c9fSBram Moolenaarendfunc
12540fcc7c6dSBram Moolenaar
12552b946c9fSBram Moolenaarfunc Test_invalid_efm()
12560fcc7c6dSBram Moolenaar  call Xinvalid_efm_Tests('c')
12570fcc7c6dSBram Moolenaar  call Xinvalid_efm_Tests('l')
12582b946c9fSBram Moolenaarendfunc
12590fcc7c6dSBram Moolenaar
12600fcc7c6dSBram Moolenaar" TODO:
12610fcc7c6dSBram Moolenaar" Add tests for the following formats in 'errorformat'
12620fcc7c6dSBram Moolenaar"	%r  %O
12632b946c9fSBram Moolenaarfunc Test_efm2()
12640fcc7c6dSBram Moolenaar  let save_efm = &efm
1265049cba9eSBram Moolenaar
1266049cba9eSBram Moolenaar  " Test for %s format in efm
1267049cba9eSBram Moolenaar  set efm=%f:%s
1268049cba9eSBram Moolenaar  cexpr 'Xtestfile:Line search text'
1269049cba9eSBram Moolenaar  let l = getqflist()
127070077dd1SBram Moolenaar  call assert_equal('^\VLine search text\$', l[0].pattern)
127170077dd1SBram Moolenaar  call assert_equal(0, l[0].lnum)
1272049cba9eSBram Moolenaar
1273ee85df37SBram Moolenaar  let l = split(execute('clist', ''), "\n")
1274ee85df37SBram Moolenaar  call assert_equal([' 1 Xtestfile:^\VLine search text\$:  '], l)
1275ee85df37SBram Moolenaar
127670077dd1SBram Moolenaar  " Test for a long line
127770077dd1SBram Moolenaar  cexpr 'Xtestfile:' . repeat('a', 1026)
127870077dd1SBram Moolenaar  let l = getqflist()
127970077dd1SBram Moolenaar  call assert_equal('^\V' . repeat('a', 1019) . '\$', l[0].pattern)
128070077dd1SBram Moolenaar
12810fcc7c6dSBram Moolenaar  " Test for %P, %Q and %t format specifiers
1282c79745a8SBram Moolenaar  let lines =<< trim [DATA]
1283c79745a8SBram Moolenaar    [Xtestfile1]
1284c79745a8SBram Moolenaar    (1,17)  error: ';' missing
1285c79745a8SBram Moolenaar    (21,2)  warning: variable 'z' not defined
1286c79745a8SBram Moolenaar    (67,3)  error: end of file found before string ended
1287c79745a8SBram Moolenaar    --
1288c79745a8SBram Moolenaar
1289c79745a8SBram Moolenaar    [Xtestfile2]
1290c79745a8SBram Moolenaar    --
1291c79745a8SBram Moolenaar
1292c79745a8SBram Moolenaar    [Xtestfile3]
1293c79745a8SBram Moolenaar    NEW compiler v1.1
1294c79745a8SBram Moolenaar    (2,2)   warning: variable 'x' not defined
1295c79745a8SBram Moolenaar    (67,3)  warning: 's' already defined
1296c79745a8SBram Moolenaar    --
1297c79745a8SBram Moolenaar  [DATA]
1298c79745a8SBram Moolenaar
1299ee85df37SBram Moolenaar  set efm=%+P[%f]%r,(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%+Q--%r
1300391b1dd0SBram Moolenaar  " To exercise the push/pop file functionality in quickfix, the test files
1301391b1dd0SBram Moolenaar  " need to be created.
1302391b1dd0SBram Moolenaar  call writefile(['Line1'], 'Xtestfile1')
1303391b1dd0SBram Moolenaar  call writefile(['Line2'], 'Xtestfile2')
1304391b1dd0SBram Moolenaar  call writefile(['Line3'], 'Xtestfile3')
1305361c8f0eSBram Moolenaar  cexpr ""
1306361c8f0eSBram Moolenaar  for l in lines
1307361c8f0eSBram Moolenaar      caddexpr l
1308361c8f0eSBram Moolenaar  endfor
1309049cba9eSBram Moolenaar  let l = getqflist()
1310ee85df37SBram Moolenaar  call assert_equal(12, len(l))
1311049cba9eSBram Moolenaar  call assert_equal(21, l[2].lnum)
1312049cba9eSBram Moolenaar  call assert_equal(2, l[2].col)
13130fcc7c6dSBram Moolenaar  call assert_equal('w', l[2].type)
13140fcc7c6dSBram Moolenaar  call assert_equal('e', l[3].type)
1315391b1dd0SBram Moolenaar  call delete('Xtestfile1')
1316391b1dd0SBram Moolenaar  call delete('Xtestfile2')
1317391b1dd0SBram Moolenaar  call delete('Xtestfile3')
13180fcc7c6dSBram Moolenaar
131970077dd1SBram Moolenaar  " Test for %P, %Q with non-existing files
132070077dd1SBram Moolenaar  cexpr lines
132170077dd1SBram Moolenaar  let l = getqflist()
132270077dd1SBram Moolenaar  call assert_equal(14, len(l))
132370077dd1SBram Moolenaar  call assert_equal('[Xtestfile1]', l[0].text)
132470077dd1SBram Moolenaar  call assert_equal('[Xtestfile2]', l[6].text)
132570077dd1SBram Moolenaar  call assert_equal('[Xtestfile3]', l[9].text)
132670077dd1SBram Moolenaar
13270fcc7c6dSBram Moolenaar  " Tests for %E, %C and %Z format specifiers
1328c79745a8SBram Moolenaar  let lines =<< trim [DATA]
1329c79745a8SBram Moolenaar    Error 275
1330c79745a8SBram Moolenaar    line 42
1331c79745a8SBram Moolenaar    column 3
1332c79745a8SBram Moolenaar    ' ' expected after '--'
1333c79745a8SBram Moolenaar  [DATA]
1334c79745a8SBram Moolenaar
13350fcc7c6dSBram Moolenaar  set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m
13360fcc7c6dSBram Moolenaar  cgetexpr lines
13370fcc7c6dSBram Moolenaar  let l = getqflist()
13380fcc7c6dSBram Moolenaar  call assert_equal(275, l[0].nr)
13390fcc7c6dSBram Moolenaar  call assert_equal(42, l[0].lnum)
13400fcc7c6dSBram Moolenaar  call assert_equal(3, l[0].col)
13410fcc7c6dSBram Moolenaar  call assert_equal('E', l[0].type)
13420fcc7c6dSBram Moolenaar  call assert_equal("\n' ' expected after '--'", l[0].text)
13430fcc7c6dSBram Moolenaar
13440fcc7c6dSBram Moolenaar  " Test for %>
1345c79745a8SBram Moolenaar  let lines =<< trim [DATA]
1346c79745a8SBram Moolenaar    Error in line 147 of foo.c:
1347c79745a8SBram Moolenaar    unknown variable 'i'
1348c79745a8SBram Moolenaar  [DATA]
1349c79745a8SBram Moolenaar
13500fcc7c6dSBram Moolenaar  set efm=unknown\ variable\ %m,%E%>Error\ in\ line\ %l\ of\ %f:,%Z%m
13510fcc7c6dSBram Moolenaar  cgetexpr lines
13520fcc7c6dSBram Moolenaar  let l = getqflist()
13530fcc7c6dSBram Moolenaar  call assert_equal(147, l[0].lnum)
13540fcc7c6dSBram Moolenaar  call assert_equal('E', l[0].type)
13550fcc7c6dSBram Moolenaar  call assert_equal("\nunknown variable 'i'", l[0].text)
1356049cba9eSBram Moolenaar
1357e87e6dddSBram Moolenaar  " Test for %A, %C and other formats
1358c79745a8SBram Moolenaar  let lines =<< trim [DATA]
1359c79745a8SBram Moolenaar    ==============================================================
1360c79745a8SBram Moolenaar    FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest)
1361c79745a8SBram Moolenaar    --------------------------------------------------------------
1362c79745a8SBram Moolenaar    Traceback (most recent call last):
1363c79745a8SBram Moolenaar      File "unittests/dbfacadeTest.py", line 89, in testFoo
1364c79745a8SBram Moolenaar        self.assertEquals(34, dtid)
1365c79745a8SBram Moolenaar      File "/usr/lib/python2.2/unittest.py", line 286, in
1366c79745a8SBram Moolenaar     failUnlessEqual
1367c79745a8SBram Moolenaar        raise self.failureException, \\
136870077dd1SBram Moolenaar    W:AssertionError: 34 != 33
1369c79745a8SBram Moolenaar
1370c79745a8SBram Moolenaar    --------------------------------------------------------------
1371c79745a8SBram Moolenaar    Ran 27 tests in 0.063s
1372c79745a8SBram Moolenaar  [DATA]
1373c79745a8SBram Moolenaar
137470077dd1SBram Moolenaar  set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%t:%m
1375e87e6dddSBram Moolenaar  cgetexpr lines
1376e87e6dddSBram Moolenaar  let l = getqflist()
1377e87e6dddSBram Moolenaar  call assert_equal(8, len(l))
1378e87e6dddSBram Moolenaar  call assert_equal(89, l[4].lnum)
1379e87e6dddSBram Moolenaar  call assert_equal(1, l[4].valid)
1380e87e6dddSBram Moolenaar  call assert_equal('unittests/dbfacadeTest.py', bufname(l[4].bufnr))
138170077dd1SBram Moolenaar  call assert_equal('W', l[4].type)
1382e87e6dddSBram Moolenaar
1383d76ce852SBram Moolenaar  " Test for %o
1384d76ce852SBram Moolenaar  set efm=%f(%o):%l\ %m
1385bc7845daSBram Moolenaar  cgetexpr ['Xotestfile(Language.PureScript.Types):20 Error']
1386bc7845daSBram Moolenaar  call writefile(['Line1'], 'Xotestfile')
1387d76ce852SBram Moolenaar  let l = getqflist()
1388d76ce852SBram Moolenaar  call assert_equal(1, len(l), string(l))
1389d76ce852SBram Moolenaar  call assert_equal('Language.PureScript.Types', l[0].module)
1390d76ce852SBram Moolenaar  copen
1391d76ce852SBram Moolenaar  call assert_equal('Language.PureScript.Types|20| Error', getline(1))
1392d76ce852SBram Moolenaar  call feedkeys("\<CR>", 'xn')
1393bc7845daSBram Moolenaar  call assert_equal('Xotestfile', expand('%:t'))
1394d76ce852SBram Moolenaar  cclose
1395d76ce852SBram Moolenaar  bd
1396bc7845daSBram Moolenaar  call delete("Xotestfile")
1397d76ce852SBram Moolenaar
139870077dd1SBram Moolenaar  " Test for a long module name
139970077dd1SBram Moolenaar  cexpr 'Xtest(' . repeat('m', 1026) . '):15 message'
140070077dd1SBram Moolenaar  let l = getqflist()
140170077dd1SBram Moolenaar  call assert_equal(repeat('m', 1024), l[0].module)
140270077dd1SBram Moolenaar  call assert_equal(15, l[0].lnum)
140370077dd1SBram Moolenaar  call assert_equal('message', l[0].text)
140470077dd1SBram Moolenaar
140599895eacSBram Moolenaar  " The following sequence of commands used to crash Vim
140699895eacSBram Moolenaar  set efm=%W%m
140799895eacSBram Moolenaar  cgetexpr ['msg1']
140899895eacSBram Moolenaar  let l = getqflist()
140999895eacSBram Moolenaar  call assert_equal(1, len(l), string(l))
141099895eacSBram Moolenaar  call assert_equal('msg1', l[0].text)
141199895eacSBram Moolenaar  set efm=%C%m
141299895eacSBram Moolenaar  lexpr 'msg2'
141399895eacSBram Moolenaar  let l = getloclist(0)
141499895eacSBram Moolenaar  call assert_equal(1, len(l), string(l))
141599895eacSBram Moolenaar  call assert_equal('msg2', l[0].text)
141699895eacSBram Moolenaar  lopen
141799895eacSBram Moolenaar  call setqflist([], 'r')
141899895eacSBram Moolenaar  caddbuf
141999895eacSBram Moolenaar  let l = getqflist()
142099895eacSBram Moolenaar  call assert_equal(1, len(l), string(l))
142199895eacSBram Moolenaar  call assert_equal('|| msg2', l[0].text)
142299895eacSBram Moolenaar
142378ddc06bSBram Moolenaar  " When matching error lines, case should be ignored. Test for this.
142478ddc06bSBram Moolenaar  set noignorecase
142578ddc06bSBram Moolenaar  let l=getqflist({'lines' : ['Xtest:FOO10:Line 20'], 'efm':'%f:foo%l:%m'})
142678ddc06bSBram Moolenaar  call assert_equal(10, l.items[0].lnum)
142778ddc06bSBram Moolenaar  call assert_equal('Line 20', l.items[0].text)
142878ddc06bSBram Moolenaar  set ignorecase&
142978ddc06bSBram Moolenaar
143099895eacSBram Moolenaar  new | only
1431049cba9eSBram Moolenaar  let &efm = save_efm
14322b946c9fSBram Moolenaarendfunc
1433049cba9eSBram Moolenaar
1434e928366dSBram Moolenaar" Test for '%t' (error type) field in 'efm'
1435e928366dSBram Moolenaarfunc Test_efm_error_type()
1436e928366dSBram Moolenaar  let save_efm = &efm
1437e928366dSBram Moolenaar
1438e928366dSBram Moolenaar  " error type
1439e928366dSBram Moolenaar  set efm=%f:%l:%t:%m
1440e928366dSBram Moolenaar  cexpr ["Xfile1:10:E:msg1", "Xfile1:20:W:msg2", "Xfile1:30:I:msg3",
1441e928366dSBram Moolenaar        \ "Xfile1:40:N:msg4", "Xfile1:50:R:msg5"]
1442e928366dSBram Moolenaar  let output = split(execute('clist'), "\n")
1443e928366dSBram Moolenaar  call assert_equal([
1444e928366dSBram Moolenaar        \ ' 1 Xfile1:10 error: msg1',
1445e928366dSBram Moolenaar        \ ' 2 Xfile1:20 warning: msg2',
1446e928366dSBram Moolenaar        \ ' 3 Xfile1:30 info: msg3',
1447e928366dSBram Moolenaar        \ ' 4 Xfile1:40 note: msg4',
1448e928366dSBram Moolenaar        \ ' 5 Xfile1:50 R: msg5'], output)
1449e928366dSBram Moolenaar
1450e928366dSBram Moolenaar  " error type and a error number
1451e928366dSBram Moolenaar  set efm=%f:%l:%t:%n:%m
1452e928366dSBram Moolenaar  cexpr ["Xfile1:10:E:2:msg1", "Xfile1:20:W:4:msg2", "Xfile1:30:I:6:msg3",
1453e928366dSBram Moolenaar        \ "Xfile1:40:N:8:msg4", "Xfile1:50:R:3:msg5"]
1454e928366dSBram Moolenaar  let output = split(execute('clist'), "\n")
1455e928366dSBram Moolenaar  call assert_equal([
1456e928366dSBram Moolenaar        \ ' 1 Xfile1:10 error   2: msg1',
1457e928366dSBram Moolenaar        \ ' 2 Xfile1:20 warning   4: msg2',
1458e928366dSBram Moolenaar        \ ' 3 Xfile1:30 info   6: msg3',
1459e928366dSBram Moolenaar        \ ' 4 Xfile1:40 note   8: msg4',
1460e928366dSBram Moolenaar        \ ' 5 Xfile1:50 R   3: msg5'], output)
1461e928366dSBram Moolenaar  let &efm = save_efm
1462e928366dSBram Moolenaarendfunc
1463e928366dSBram Moolenaar
14642b946c9fSBram Moolenaarfunc XquickfixChangedByAutocmd(cchar)
14653ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
1466ffec3c53SBram Moolenaar  if a:cchar == 'c'
1467ffec3c53SBram Moolenaar    let ErrorNr = 'E925'
14682b946c9fSBram Moolenaar    func! ReadFunc()
1469ffec3c53SBram Moolenaar      colder
1470ffec3c53SBram Moolenaar      cgetexpr []
1471ffec3c53SBram Moolenaar    endfunc
1472ffec3c53SBram Moolenaar  else
1473ffec3c53SBram Moolenaar    let ErrorNr = 'E926'
14742b946c9fSBram Moolenaar    func! ReadFunc()
1475ffec3c53SBram Moolenaar      lolder
1476ffec3c53SBram Moolenaar      lgetexpr []
1477ffec3c53SBram Moolenaar    endfunc
1478ffec3c53SBram Moolenaar  endif
1479ffec3c53SBram Moolenaar
1480ffec3c53SBram Moolenaar  augroup testgroup
1481ffec3c53SBram Moolenaar    au!
1482d106e5baSBram Moolenaar    autocmd BufReadCmd test_changed.txt call ReadFunc()
1483ffec3c53SBram Moolenaar  augroup END
1484ffec3c53SBram Moolenaar
1485d106e5baSBram Moolenaar  new | only
1486ffec3c53SBram Moolenaar  let words = [ "a", "b" ]
1487ffec3c53SBram Moolenaar  let qflist = []
1488ffec3c53SBram Moolenaar  for word in words
1489d106e5baSBram Moolenaar    call add(qflist, {'filename': 'test_changed.txt'})
14903ef5bf7dSBram Moolenaar    call g:Xsetlist(qflist, ' ')
1491ffec3c53SBram Moolenaar  endfor
14923ef5bf7dSBram Moolenaar  call assert_fails('Xrewind', ErrorNr . ':')
1493ffec3c53SBram Moolenaar
1494ffec3c53SBram Moolenaar  augroup! testgroup
1495ffec3c53SBram Moolenaarendfunc
1496ffec3c53SBram Moolenaar
14972b946c9fSBram Moolenaarfunc Test_quickfix_was_changed_by_autocmd()
1498ffec3c53SBram Moolenaar  call XquickfixChangedByAutocmd('c')
1499ffec3c53SBram Moolenaar  call XquickfixChangedByAutocmd('l')
15002b946c9fSBram Moolenaarendfunc
15018b20179cSBram Moolenaar
15024d170af0SBram Moolenaarfunc Test_setloclist_in_autocommand()
15034d170af0SBram Moolenaar  call writefile(['test1', 'test2'], 'Xfile')
15044d170af0SBram Moolenaar  edit Xfile
15054d170af0SBram Moolenaar  let s:bufnr = bufnr()
15064d170af0SBram Moolenaar  call setloclist(1,
15074d170af0SBram Moolenaar        \ [{'bufnr' : s:bufnr, 'lnum' : 1, 'text' : 'test1'},
15084d170af0SBram Moolenaar        \  {'bufnr' : s:bufnr, 'lnum' : 2, 'text' : 'test2'}])
15094d170af0SBram Moolenaar
15104d170af0SBram Moolenaar  augroup Test_LocList
15114d170af0SBram Moolenaar    au!
15124d170af0SBram Moolenaar    autocmd BufEnter * call setloclist(1,
15134d170af0SBram Moolenaar          \ [{'bufnr' : s:bufnr, 'lnum' : 1, 'text' : 'test1'},
15144d170af0SBram Moolenaar          \  {'bufnr' : s:bufnr, 'lnum' : 2, 'text' : 'test2'}], 'r')
15154d170af0SBram Moolenaar  augroup END
15164d170af0SBram Moolenaar
15174d170af0SBram Moolenaar  lopen
15184d170af0SBram Moolenaar  call assert_fails('exe "normal j\<CR>"', 'E926:')
15194d170af0SBram Moolenaar
15204d170af0SBram Moolenaar  augroup Test_LocList
15214d170af0SBram Moolenaar    au!
15224d170af0SBram Moolenaar  augroup END
15234d170af0SBram Moolenaar  call delete('Xfile')
15244d170af0SBram Moolenaarendfunc
15254d170af0SBram Moolenaar
15268b20179cSBram Moolenaarfunc Test_caddbuffer_to_empty()
15278b20179cSBram Moolenaar  helpgr quickfix
15288b20179cSBram Moolenaar  call setqflist([], 'r')
15298b20179cSBram Moolenaar  cad
1530f68f1d70SBram Moolenaar  try
1531f68f1d70SBram Moolenaar    cn
1532f68f1d70SBram Moolenaar  catch
1533f68f1d70SBram Moolenaar    " number of matches is unknown
1534f68f1d70SBram Moolenaar    call assert_true(v:exception =~ 'E553:')
1535f68f1d70SBram Moolenaar  endtry
15368b20179cSBram Moolenaar  quit!
15378b20179cSBram Moolenaarendfunc
153889c64d55SBram Moolenaar
153989c64d55SBram Moolenaarfunc Test_cgetexpr_works()
154089c64d55SBram Moolenaar  " this must not crash Vim
154189c64d55SBram Moolenaar  cgetexpr [$x]
15423ef5bf7dSBram Moolenaar  lgetexpr [$x]
154389c64d55SBram Moolenaarendfunc
1544c1808d58SBram Moolenaar
1545c1808d58SBram Moolenaar" Tests for the setqflist() and setloclist() functions
15462b946c9fSBram Moolenaarfunc SetXlistTests(cchar, bnum)
15473ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
1548c1808d58SBram Moolenaar
15493ef5bf7dSBram Moolenaar  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 1},
15506864efa5Sthinca	      \  {'bufnr': a:bnum, 'lnum': 2, 'end_lnum': 3, 'col': 4, 'end_col': 5}])
15513ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
1552c1808d58SBram Moolenaar  call assert_equal(2, len(l))
1553c1808d58SBram Moolenaar  call assert_equal(2, l[1].lnum)
15546864efa5Sthinca  call assert_equal(3, l[1].end_lnum)
15556864efa5Sthinca  call assert_equal(4, l[1].col)
15566864efa5Sthinca  call assert_equal(5, l[1].end_col)
1557c1808d58SBram Moolenaar
15583ef5bf7dSBram Moolenaar  Xnext
15593ef5bf7dSBram Moolenaar  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3}], 'a')
15603ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
1561c1808d58SBram Moolenaar  call assert_equal(3, len(l))
15623ef5bf7dSBram Moolenaar  Xnext
1563c1808d58SBram Moolenaar  call assert_equal(3, line('.'))
1564c1808d58SBram Moolenaar
15652b2b8ae5SBram Moolenaar  " Appending entries to the list should not change the cursor position
15662b2b8ae5SBram Moolenaar  " in the quickfix window
15673ef5bf7dSBram Moolenaar  Xwindow
15682b2b8ae5SBram Moolenaar  1
15693ef5bf7dSBram Moolenaar  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 4},
15702b2b8ae5SBram Moolenaar	      \  {'bufnr': a:bnum, 'lnum': 5}], 'a')
15712b2b8ae5SBram Moolenaar  call assert_equal(1, line('.'))
15722b2b8ae5SBram Moolenaar  close
15732b2b8ae5SBram Moolenaar
15743ef5bf7dSBram Moolenaar  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3},
1575c1808d58SBram Moolenaar	      \  {'bufnr': a:bnum, 'lnum': 4},
1576c1808d58SBram Moolenaar	      \  {'bufnr': a:bnum, 'lnum': 5}], 'r')
15773ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
1578c1808d58SBram Moolenaar  call assert_equal(3, len(l))
1579c1808d58SBram Moolenaar  call assert_equal(5, l[2].lnum)
1580c1808d58SBram Moolenaar
15813ef5bf7dSBram Moolenaar  call g:Xsetlist([])
15823ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
1583c1808d58SBram Moolenaar  call assert_equal(0, len(l))
1584ee85df37SBram Moolenaar
1585f1d21c8cSBram Moolenaar  " Tests for setting the 'valid' flag
1586f1d21c8cSBram Moolenaar  call g:Xsetlist([{'bufnr':a:bnum, 'lnum':4, 'valid':0}])
1587f1d21c8cSBram Moolenaar  Xwindow
1588f1d21c8cSBram Moolenaar  call assert_equal(1, winnr('$'))
1589f1d21c8cSBram Moolenaar  let l = g:Xgetlist()
1590f1d21c8cSBram Moolenaar  call g:Xsetlist(l)
1591f1d21c8cSBram Moolenaar  call assert_equal(0, g:Xgetlist()[0].valid)
15929752c72fSBram Moolenaar  " Adding a non-valid entry should not mark the list as having valid entries
15939752c72fSBram Moolenaar  call g:Xsetlist([{'bufnr':a:bnum, 'lnum':5, 'valid':0}], 'a')
15949752c72fSBram Moolenaar  Xwindow
15959752c72fSBram Moolenaar  call assert_equal(1, winnr('$'))
15969752c72fSBram Moolenaar
15979752c72fSBram Moolenaar  " :cnext/:cprev should still work even with invalid entries in the list
15989752c72fSBram Moolenaar  let l = [{'bufnr' : a:bnum, 'lnum' : 1, 'text' : '1', 'valid' : 0},
15999752c72fSBram Moolenaar	      \ {'bufnr' : a:bnum, 'lnum' : 2, 'text' : '2', 'valid' : 0}]
16009752c72fSBram Moolenaar  call g:Xsetlist(l)
16019752c72fSBram Moolenaar  Xnext
16029752c72fSBram Moolenaar  call assert_equal(2, g:Xgetlist({'idx' : 0}).idx)
16039752c72fSBram Moolenaar  Xprev
16049752c72fSBram Moolenaar  call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
16059752c72fSBram Moolenaar  " :cnext/:cprev should still work after appending invalid entries to an
16069752c72fSBram Moolenaar  " empty list
16079752c72fSBram Moolenaar  call g:Xsetlist([])
16089752c72fSBram Moolenaar  call g:Xsetlist(l, 'a')
16099752c72fSBram Moolenaar  Xnext
16109752c72fSBram Moolenaar  call assert_equal(2, g:Xgetlist({'idx' : 0}).idx)
16119752c72fSBram Moolenaar  Xprev
16129752c72fSBram Moolenaar  call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
16139752c72fSBram Moolenaar
1614f1d21c8cSBram Moolenaar  call g:Xsetlist([{'text':'Text1', 'valid':1}])
1615f1d21c8cSBram Moolenaar  Xwindow
1616f1d21c8cSBram Moolenaar  call assert_equal(2, winnr('$'))
1617f1d21c8cSBram Moolenaar  Xclose
1618f1d21c8cSBram Moolenaar  let save_efm = &efm
1619f1d21c8cSBram Moolenaar  set efm=%m
1620f1d21c8cSBram Moolenaar  Xgetexpr 'TestMessage'
1621f1d21c8cSBram Moolenaar  let l = g:Xgetlist()
1622f1d21c8cSBram Moolenaar  call g:Xsetlist(l)
1623f1d21c8cSBram Moolenaar  call assert_equal(1, g:Xgetlist()[0].valid)
1624f1d21c8cSBram Moolenaar  let &efm = save_efm
1625f1d21c8cSBram Moolenaar
1626ee85df37SBram Moolenaar  " Error cases:
1627ee85df37SBram Moolenaar  " Refer to a non-existing buffer and pass a non-dictionary type
1628ee85df37SBram Moolenaar  call assert_fails("call g:Xsetlist([{'bufnr':998, 'lnum':4}," .
1629ee85df37SBram Moolenaar	      \ " {'bufnr':999, 'lnum':5}])", 'E92:')
1630ee85df37SBram Moolenaar  call g:Xsetlist([[1, 2,3]])
1631ee85df37SBram Moolenaar  call assert_equal(0, len(g:Xgetlist()))
163299fa7219SBram Moolenaar  call assert_fails('call g:Xsetlist([], [])', 'E928:')
16332b946c9fSBram Moolenaarendfunc
1634c1808d58SBram Moolenaar
16352b946c9fSBram Moolenaarfunc Test_setqflist()
1636c1808d58SBram Moolenaar  new Xtestfile | only
1637c1808d58SBram Moolenaar  let bnum = bufnr('%')
1638c1808d58SBram Moolenaar  call setline(1, range(1,5))
1639c1808d58SBram Moolenaar
1640c1808d58SBram Moolenaar  call SetXlistTests('c', bnum)
1641c1808d58SBram Moolenaar  call SetXlistTests('l', bnum)
1642c1808d58SBram Moolenaar
16431cee693bSBram Moolenaar  enew!
1644c1808d58SBram Moolenaar  call delete('Xtestfile')
16452b946c9fSBram Moolenaarendfunc
1646d106e5baSBram Moolenaar
16472b946c9fSBram Moolenaarfunc Xlist_empty_middle(cchar)
16483ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
16493ef5bf7dSBram Moolenaar
16501cee693bSBram Moolenaar  " create three quickfix lists
1651ee85df37SBram Moolenaar  let @/ = 'Test_'
1652ee85df37SBram Moolenaar  Xvimgrep // test_quickfix.vim
16533ef5bf7dSBram Moolenaar  let testlen = len(g:Xgetlist())
16541cee693bSBram Moolenaar  call assert_true(testlen > 0)
16553ef5bf7dSBram Moolenaar  Xvimgrep empty test_quickfix.vim
16563ef5bf7dSBram Moolenaar  call assert_true(len(g:Xgetlist()) > 0)
16573ef5bf7dSBram Moolenaar  Xvimgrep matches test_quickfix.vim
16583ef5bf7dSBram Moolenaar  let matchlen = len(g:Xgetlist())
16591cee693bSBram Moolenaar  call assert_true(matchlen > 0)
16603ef5bf7dSBram Moolenaar  Xolder
16611cee693bSBram Moolenaar  " make the middle list empty
16623ef5bf7dSBram Moolenaar  call g:Xsetlist([], 'r')
16633ef5bf7dSBram Moolenaar  call assert_true(len(g:Xgetlist()) == 0)
16643ef5bf7dSBram Moolenaar  Xolder
16653ef5bf7dSBram Moolenaar  call assert_equal(testlen, len(g:Xgetlist()))
16663ef5bf7dSBram Moolenaar  Xnewer
16673ef5bf7dSBram Moolenaar  Xnewer
16683ef5bf7dSBram Moolenaar  call assert_equal(matchlen, len(g:Xgetlist()))
16691cee693bSBram Moolenaarendfunc
16701cee693bSBram Moolenaar
16712b946c9fSBram Moolenaarfunc Test_setqflist_empty_middle()
16723ef5bf7dSBram Moolenaar  call Xlist_empty_middle('c')
16733ef5bf7dSBram Moolenaar  call Xlist_empty_middle('l')
16742b946c9fSBram Moolenaarendfunc
16753ef5bf7dSBram Moolenaar
16762b946c9fSBram Moolenaarfunc Xlist_empty_older(cchar)
16773ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
16783ef5bf7dSBram Moolenaar
16791cee693bSBram Moolenaar  " create three quickfix lists
16803ef5bf7dSBram Moolenaar  Xvimgrep one test_quickfix.vim
16813ef5bf7dSBram Moolenaar  let onelen = len(g:Xgetlist())
16821cee693bSBram Moolenaar  call assert_true(onelen > 0)
16833ef5bf7dSBram Moolenaar  Xvimgrep two test_quickfix.vim
16843ef5bf7dSBram Moolenaar  let twolen = len(g:Xgetlist())
16851cee693bSBram Moolenaar  call assert_true(twolen > 0)
16863ef5bf7dSBram Moolenaar  Xvimgrep three test_quickfix.vim
16873ef5bf7dSBram Moolenaar  let threelen = len(g:Xgetlist())
16881cee693bSBram Moolenaar  call assert_true(threelen > 0)
16893ef5bf7dSBram Moolenaar  Xolder 2
16901cee693bSBram Moolenaar  " make the first list empty, check the others didn't change
16913ef5bf7dSBram Moolenaar  call g:Xsetlist([], 'r')
16923ef5bf7dSBram Moolenaar  call assert_true(len(g:Xgetlist()) == 0)
16933ef5bf7dSBram Moolenaar  Xnewer
16943ef5bf7dSBram Moolenaar  call assert_equal(twolen, len(g:Xgetlist()))
16953ef5bf7dSBram Moolenaar  Xnewer
16963ef5bf7dSBram Moolenaar  call assert_equal(threelen, len(g:Xgetlist()))
16972b946c9fSBram Moolenaarendfunc
16983ef5bf7dSBram Moolenaar
16992b946c9fSBram Moolenaarfunc Test_setqflist_empty_older()
17003ef5bf7dSBram Moolenaar  call Xlist_empty_older('c')
17013ef5bf7dSBram Moolenaar  call Xlist_empty_older('l')
17022b946c9fSBram Moolenaarendfunc
17031cee693bSBram Moolenaar
17042b946c9fSBram Moolenaarfunc XquickfixSetListWithAct(cchar)
17053ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
17063ef5bf7dSBram Moolenaar
1707d106e5baSBram Moolenaar  let list1 = [{'filename': 'fnameA', 'text': 'A'},
1708d106e5baSBram Moolenaar          \    {'filename': 'fnameB', 'text': 'B'}]
1709d106e5baSBram Moolenaar  let list2 = [{'filename': 'fnameC', 'text': 'C'},
1710d106e5baSBram Moolenaar          \    {'filename': 'fnameD', 'text': 'D'},
1711d106e5baSBram Moolenaar          \    {'filename': 'fnameE', 'text': 'E'}]
1712d106e5baSBram Moolenaar
1713eeb1b9c7SBram Moolenaar  " {action} is unspecified.  Same as specifying ' '.
1714d106e5baSBram Moolenaar  new | only
17153ef5bf7dSBram Moolenaar  silent! Xnewer 99
17163ef5bf7dSBram Moolenaar  call g:Xsetlist(list1)
17173ef5bf7dSBram Moolenaar  call g:Xsetlist(list2)
17183ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1719d106e5baSBram Moolenaar  call assert_equal(3, len(li))
1720d106e5baSBram Moolenaar  call assert_equal('C', li[0]['text'])
1721d106e5baSBram Moolenaar  call assert_equal('D', li[1]['text'])
1722d106e5baSBram Moolenaar  call assert_equal('E', li[2]['text'])
17233ef5bf7dSBram Moolenaar  silent! Xolder
17243ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1725d106e5baSBram Moolenaar  call assert_equal(2, len(li))
1726d106e5baSBram Moolenaar  call assert_equal('A', li[0]['text'])
1727d106e5baSBram Moolenaar  call assert_equal('B', li[1]['text'])
1728d106e5baSBram Moolenaar
1729d106e5baSBram Moolenaar  " {action} is specified ' '.
1730d106e5baSBram Moolenaar  new | only
17313ef5bf7dSBram Moolenaar  silent! Xnewer 99
17323ef5bf7dSBram Moolenaar  call g:Xsetlist(list1)
17333ef5bf7dSBram Moolenaar  call g:Xsetlist(list2, ' ')
17343ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1735d106e5baSBram Moolenaar  call assert_equal(3, len(li))
1736d106e5baSBram Moolenaar  call assert_equal('C', li[0]['text'])
1737d106e5baSBram Moolenaar  call assert_equal('D', li[1]['text'])
1738d106e5baSBram Moolenaar  call assert_equal('E', li[2]['text'])
17393ef5bf7dSBram Moolenaar  silent! Xolder
17403ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1741d106e5baSBram Moolenaar  call assert_equal(2, len(li))
1742d106e5baSBram Moolenaar  call assert_equal('A', li[0]['text'])
1743d106e5baSBram Moolenaar  call assert_equal('B', li[1]['text'])
1744d106e5baSBram Moolenaar
1745d106e5baSBram Moolenaar  " {action} is specified 'a'.
1746d106e5baSBram Moolenaar  new | only
17473ef5bf7dSBram Moolenaar  silent! Xnewer 99
17483ef5bf7dSBram Moolenaar  call g:Xsetlist(list1)
17493ef5bf7dSBram Moolenaar  call g:Xsetlist(list2, 'a')
17503ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1751d106e5baSBram Moolenaar  call assert_equal(5, len(li))
1752d106e5baSBram Moolenaar  call assert_equal('A', li[0]['text'])
1753d106e5baSBram Moolenaar  call assert_equal('B', li[1]['text'])
1754d106e5baSBram Moolenaar  call assert_equal('C', li[2]['text'])
1755d106e5baSBram Moolenaar  call assert_equal('D', li[3]['text'])
1756d106e5baSBram Moolenaar  call assert_equal('E', li[4]['text'])
1757d106e5baSBram Moolenaar
1758d106e5baSBram Moolenaar  " {action} is specified 'r'.
1759d106e5baSBram Moolenaar  new | only
17603ef5bf7dSBram Moolenaar  silent! Xnewer 99
17613ef5bf7dSBram Moolenaar  call g:Xsetlist(list1)
17623ef5bf7dSBram Moolenaar  call g:Xsetlist(list2, 'r')
17633ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1764d106e5baSBram Moolenaar  call assert_equal(3, len(li))
1765d106e5baSBram Moolenaar  call assert_equal('C', li[0]['text'])
1766d106e5baSBram Moolenaar  call assert_equal('D', li[1]['text'])
1767d106e5baSBram Moolenaar  call assert_equal('E', li[2]['text'])
1768d106e5baSBram Moolenaar
1769d106e5baSBram Moolenaar  " Test for wrong value.
1770d106e5baSBram Moolenaar  new | only
17713ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(0)", 'E714:')
17723ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(list1, '')", 'E927:')
17733ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(list1, 'aa')", 'E927:')
17743ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(list1, ' a')", 'E927:')
17753ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(list1, 0)", 'E928:')
1776d106e5baSBram Moolenaarendfunc
1777d106e5baSBram Moolenaar
1778a0ca7d00SBram Moolenaarfunc Test_setqflist_invalid_nr()
1779a0ca7d00SBram Moolenaar  " The following command used to crash Vim
1780aad222c9SBram Moolenaar  eval []->setqflist(' ', {'nr' : $XXX_DOES_NOT_EXIST})
1781a0ca7d00SBram Moolenaarendfunc
1782a0ca7d00SBram Moolenaar
178399234f29SBram Moolenaarfunc Test_setqflist_user_sets_buftype()
178499234f29SBram Moolenaar  call setqflist([{'text': 'foo'}, {'text': 'bar'}])
178599234f29SBram Moolenaar  set buftype=quickfix
178699234f29SBram Moolenaar  call setqflist([], 'a')
178799234f29SBram Moolenaar  enew
178899234f29SBram Moolenaarendfunc
178999234f29SBram Moolenaar
17902b946c9fSBram Moolenaarfunc Test_quickfix_set_list_with_act()
1791d106e5baSBram Moolenaar  call XquickfixSetListWithAct('c')
1792d106e5baSBram Moolenaar  call XquickfixSetListWithAct('l')
17932b946c9fSBram Moolenaarendfunc
17946be8c8e1SBram Moolenaar
17952b946c9fSBram Moolenaarfunc XLongLinesTests(cchar)
17963ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
17976be8c8e1SBram Moolenaar
1798049cba9eSBram Moolenaar  call assert_equal(4, len(l))
17996be8c8e1SBram Moolenaar  call assert_equal(1, l[0].lnum)
18006be8c8e1SBram Moolenaar  call assert_equal(1, l[0].col)
1801049cba9eSBram Moolenaar  call assert_equal(1975, len(l[0].text))
18026be8c8e1SBram Moolenaar  call assert_equal(2, l[1].lnum)
18036be8c8e1SBram Moolenaar  call assert_equal(1, l[1].col)
18046be8c8e1SBram Moolenaar  call assert_equal(4070, len(l[1].text))
18056be8c8e1SBram Moolenaar  call assert_equal(3, l[2].lnum)
18066be8c8e1SBram Moolenaar  call assert_equal(1, l[2].col)
1807049cba9eSBram Moolenaar  call assert_equal(4070, len(l[2].text))
1808049cba9eSBram Moolenaar  call assert_equal(4, l[3].lnum)
1809049cba9eSBram Moolenaar  call assert_equal(1, l[3].col)
1810049cba9eSBram Moolenaar  call assert_equal(10, len(l[3].text))
18116be8c8e1SBram Moolenaar
18123ef5bf7dSBram Moolenaar  call g:Xsetlist([], 'r')
18132b946c9fSBram Moolenaarendfunc
18146be8c8e1SBram Moolenaar
18152b946c9fSBram Moolenaarfunc s:long_lines_tests(cchar)
18163ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
18173ef5bf7dSBram Moolenaar
18186be8c8e1SBram Moolenaar  let testfile = 'samples/quickfix.txt'
18196be8c8e1SBram Moolenaar
18206be8c8e1SBram Moolenaar  " file
18213ef5bf7dSBram Moolenaar  exe 'Xgetfile' testfile
18223ef5bf7dSBram Moolenaar  call XLongLinesTests(a:cchar)
18236be8c8e1SBram Moolenaar
18246be8c8e1SBram Moolenaar  " list
18253ef5bf7dSBram Moolenaar  Xexpr readfile(testfile)
18263ef5bf7dSBram Moolenaar  call XLongLinesTests(a:cchar)
18276be8c8e1SBram Moolenaar
18286be8c8e1SBram Moolenaar  " string
18293ef5bf7dSBram Moolenaar  Xexpr join(readfile(testfile), "\n")
18303ef5bf7dSBram Moolenaar  call XLongLinesTests(a:cchar)
18316be8c8e1SBram Moolenaar
18326be8c8e1SBram Moolenaar  " buffer
18333ef5bf7dSBram Moolenaar  exe 'edit' testfile
18343ef5bf7dSBram Moolenaar  exe 'Xbuffer' bufnr('%')
1835f50df392SBram Moolenaar  call XLongLinesTests(a:cchar)
18362b946c9fSBram Moolenaarendfunc
18373ef5bf7dSBram Moolenaar
18382b946c9fSBram Moolenaarfunc Test_long_lines()
18393ef5bf7dSBram Moolenaar  call s:long_lines_tests('c')
18403ef5bf7dSBram Moolenaar  call s:long_lines_tests('l')
18412b946c9fSBram Moolenaarendfunc
1842049cba9eSBram Moolenaar
184359941cbdSBram Moolenaarfunc Test_cgetfile_on_long_lines()
184459941cbdSBram Moolenaar  " Problematic values if the line is longer than 4096 bytes.  Then 1024 bytes
184559941cbdSBram Moolenaar  " are read at a time.
184659941cbdSBram Moolenaar  for len in [4078, 4079, 4080, 5102, 5103, 5104, 6126, 6127, 6128, 7150, 7151, 7152]
184759941cbdSBram Moolenaar    let lines = [
184859941cbdSBram Moolenaar      \ '/tmp/file1:1:1:aaa',
184959941cbdSBram Moolenaar      \ '/tmp/file2:1:1:%s',
185059941cbdSBram Moolenaar      \ '/tmp/file3:1:1:bbb',
185159941cbdSBram Moolenaar      \ '/tmp/file4:1:1:ccc',
185259941cbdSBram Moolenaar      \ ]
185359941cbdSBram Moolenaar    let lines[1] = substitute(lines[1], '%s', repeat('x', len), '')
185459941cbdSBram Moolenaar    call writefile(lines, 'Xcqetfile.txt')
185559941cbdSBram Moolenaar    cgetfile Xcqetfile.txt
185659941cbdSBram Moolenaar    call assert_equal(4, getqflist(#{size: v:true}).size, 'with length ' .. len)
185759941cbdSBram Moolenaar  endfor
185859941cbdSBram Moolenaar  call delete('Xcqetfile.txt')
185959941cbdSBram Moolenaarendfunc
186059941cbdSBram Moolenaar
18612b946c9fSBram Moolenaarfunc s:create_test_file(filename)
1862049cba9eSBram Moolenaar  let l = []
1863049cba9eSBram Moolenaar  for i in range(1, 20)
1864049cba9eSBram Moolenaar      call add(l, 'Line' . i)
1865049cba9eSBram Moolenaar  endfor
1866049cba9eSBram Moolenaar  call writefile(l, a:filename)
18672b946c9fSBram Moolenaarendfunc
1868049cba9eSBram Moolenaar
18692b946c9fSBram Moolenaarfunc Test_switchbuf()
1870049cba9eSBram Moolenaar  call s:create_test_file('Xqftestfile1')
1871049cba9eSBram Moolenaar  call s:create_test_file('Xqftestfile2')
1872049cba9eSBram Moolenaar  call s:create_test_file('Xqftestfile3')
1873049cba9eSBram Moolenaar
1874049cba9eSBram Moolenaar  new | only
1875049cba9eSBram Moolenaar  edit Xqftestfile1
1876049cba9eSBram Moolenaar  let file1_winid = win_getid()
1877049cba9eSBram Moolenaar  new Xqftestfile2
1878049cba9eSBram Moolenaar  let file2_winid = win_getid()
1879049cba9eSBram Moolenaar  cgetexpr ['Xqftestfile1:5:Line5',
1880049cba9eSBram Moolenaar		\ 'Xqftestfile1:6:Line6',
1881049cba9eSBram Moolenaar		\ 'Xqftestfile2:10:Line10',
1882049cba9eSBram Moolenaar		\ 'Xqftestfile2:11:Line11',
1883049cba9eSBram Moolenaar		\ 'Xqftestfile3:15:Line15',
1884049cba9eSBram Moolenaar		\ 'Xqftestfile3:16:Line16']
1885049cba9eSBram Moolenaar
1886049cba9eSBram Moolenaar  new
1887049cba9eSBram Moolenaar  let winid = win_getid()
1888049cba9eSBram Moolenaar  cfirst | cnext
1889049cba9eSBram Moolenaar  call assert_equal(winid, win_getid())
189099895eacSBram Moolenaar  2cnext
1891049cba9eSBram Moolenaar  call assert_equal(winid, win_getid())
189299895eacSBram Moolenaar  2cnext
1893049cba9eSBram Moolenaar  call assert_equal(winid, win_getid())
1894049cba9eSBram Moolenaar
1895f9ae154cSBram Moolenaar  " Test for 'switchbuf' set to search for files in windows in the current
1896f9ae154cSBram Moolenaar  " tabpage and jump to an existing window (if present)
1897049cba9eSBram Moolenaar  set switchbuf=useopen
1898f9ae154cSBram Moolenaar  enew
1899049cba9eSBram Moolenaar  cfirst | cnext
1900049cba9eSBram Moolenaar  call assert_equal(file1_winid, win_getid())
190199895eacSBram Moolenaar  2cnext
1902049cba9eSBram Moolenaar  call assert_equal(file2_winid, win_getid())
190399895eacSBram Moolenaar  2cnext
1904049cba9eSBram Moolenaar  call assert_equal(file2_winid, win_getid())
1905049cba9eSBram Moolenaar
1906f9ae154cSBram Moolenaar  " Test for 'switchbuf' set to search for files in tabpages and jump to an
1907f9ae154cSBram Moolenaar  " existing tabpage (if present)
1908049cba9eSBram Moolenaar  enew | only
1909049cba9eSBram Moolenaar  set switchbuf=usetab
1910049cba9eSBram Moolenaar  tabedit Xqftestfile1
1911049cba9eSBram Moolenaar  tabedit Xqftestfile2
191274240d3fSBram Moolenaar  tabedit Xqftestfile3
1913049cba9eSBram Moolenaar  tabfirst
1914049cba9eSBram Moolenaar  cfirst | cnext
1915049cba9eSBram Moolenaar  call assert_equal(2, tabpagenr())
191699895eacSBram Moolenaar  2cnext
1917049cba9eSBram Moolenaar  call assert_equal(3, tabpagenr())
191874240d3fSBram Moolenaar  6cnext
191974240d3fSBram Moolenaar  call assert_equal(4, tabpagenr())
192074240d3fSBram Moolenaar  2cpfile
192174240d3fSBram Moolenaar  call assert_equal(2, tabpagenr())
192274240d3fSBram Moolenaar  2cnfile
192374240d3fSBram Moolenaar  call assert_equal(4, tabpagenr())
1924049cba9eSBram Moolenaar  tabfirst | tabonly | enew
1925049cba9eSBram Moolenaar
1926f9ae154cSBram Moolenaar  " Test for 'switchbuf' set to open a new window for every file
1927049cba9eSBram Moolenaar  set switchbuf=split
1928049cba9eSBram Moolenaar  cfirst | cnext
1929049cba9eSBram Moolenaar  call assert_equal(1, winnr('$'))
1930049cba9eSBram Moolenaar  cnext | cnext
1931049cba9eSBram Moolenaar  call assert_equal(2, winnr('$'))
1932049cba9eSBram Moolenaar  cnext | cnext
1933049cba9eSBram Moolenaar  call assert_equal(3, winnr('$'))
1934049cba9eSBram Moolenaar
1935f9ae154cSBram Moolenaar  " Test for 'switchbuf' set to open a new tabpage for every file
1936049cba9eSBram Moolenaar  set switchbuf=newtab
1937f9ae154cSBram Moolenaar  enew | only
1938049cba9eSBram Moolenaar  cfirst | cnext
1939049cba9eSBram Moolenaar  call assert_equal(1, tabpagenr('$'))
1940049cba9eSBram Moolenaar  cnext | cnext
1941049cba9eSBram Moolenaar  call assert_equal(2, tabpagenr('$'))
1942049cba9eSBram Moolenaar  cnext | cnext
1943049cba9eSBram Moolenaar  call assert_equal(3, tabpagenr('$'))
1944049cba9eSBram Moolenaar  tabfirst | enew | tabonly | only
1945049cba9eSBram Moolenaar
1946539aa6b2SBram Moolenaar  set switchbuf=uselast
1947539aa6b2SBram Moolenaar  split
1948539aa6b2SBram Moolenaar  let last_winid = win_getid()
1949539aa6b2SBram Moolenaar  copen
1950539aa6b2SBram Moolenaar  exe "normal 1G\<CR>"
1951539aa6b2SBram Moolenaar  call assert_equal(last_winid, win_getid())
1952539aa6b2SBram Moolenaar  enew | only
1953539aa6b2SBram Moolenaar
1954f9ae154cSBram Moolenaar  " With an empty 'switchbuf', jumping to a quickfix entry should open the
1955f9ae154cSBram Moolenaar  " file in an existing window (if present)
1956049cba9eSBram Moolenaar  set switchbuf=
1957049cba9eSBram Moolenaar  edit Xqftestfile1
1958049cba9eSBram Moolenaar  let file1_winid = win_getid()
1959049cba9eSBram Moolenaar  new Xqftestfile2
1960049cba9eSBram Moolenaar  let file2_winid = win_getid()
1961049cba9eSBram Moolenaar  copen
1962049cba9eSBram Moolenaar  exe "normal 1G\<CR>"
1963049cba9eSBram Moolenaar  call assert_equal(file1_winid, win_getid())
1964049cba9eSBram Moolenaar  copen
1965049cba9eSBram Moolenaar  exe "normal 3G\<CR>"
1966049cba9eSBram Moolenaar  call assert_equal(file2_winid, win_getid())
1967049cba9eSBram Moolenaar  copen | only
1968049cba9eSBram Moolenaar  exe "normal 5G\<CR>"
1969049cba9eSBram Moolenaar  call assert_equal(2, winnr('$'))
1970049cba9eSBram Moolenaar  call assert_equal(1, bufwinnr('Xqftestfile3'))
1971049cba9eSBram Moolenaar
1972391b1dd0SBram Moolenaar  " If only quickfix window is open in the current tabpage, jumping to an
19731bc353b6SBram Moolenaar  " entry with 'switchbuf' set to 'usetab' should search in other tabpages.
1974049cba9eSBram Moolenaar  enew | only
1975391b1dd0SBram Moolenaar  set switchbuf=usetab
1976391b1dd0SBram Moolenaar  tabedit Xqftestfile1
1977391b1dd0SBram Moolenaar  tabedit Xqftestfile2
1978391b1dd0SBram Moolenaar  tabedit Xqftestfile3
1979391b1dd0SBram Moolenaar  tabfirst
1980391b1dd0SBram Moolenaar  copen | only
1981391b1dd0SBram Moolenaar  clast
1982391b1dd0SBram Moolenaar  call assert_equal(4, tabpagenr())
1983391b1dd0SBram Moolenaar  tabfirst | tabonly | enew | only
1984049cba9eSBram Moolenaar
1985f9ae154cSBram Moolenaar  " Jumping to a file that is not present in any of the tabpages and the
1986f9ae154cSBram Moolenaar  " current tabpage doesn't have any usable windows, should open it in a new
1987f9ae154cSBram Moolenaar  " window in the current tabpage.
1988f9ae154cSBram Moolenaar  copen | only
1989f9ae154cSBram Moolenaar  cfirst
1990f9ae154cSBram Moolenaar  call assert_equal(1, tabpagenr())
1991bdd2c290SBram Moolenaar  call assert_equal('Xqftestfile1', @%)
1992f9ae154cSBram Moolenaar
1993f9ae154cSBram Moolenaar  " If opening a file changes 'switchbuf', then the new value should be
1994f9ae154cSBram Moolenaar  " retained.
199541d4299fSBram Moolenaar  set modeline&vim
1996f9ae154cSBram Moolenaar  call writefile(["vim: switchbuf=split"], 'Xqftestfile1')
1997f9ae154cSBram Moolenaar  enew | only
1998f9ae154cSBram Moolenaar  set switchbuf&vim
1999f9ae154cSBram Moolenaar  cexpr "Xqftestfile1:1:10"
2000f9ae154cSBram Moolenaar  call assert_equal('split', &switchbuf)
2001f9ae154cSBram Moolenaar  call writefile(["vim: switchbuf=usetab"], 'Xqftestfile1')
2002f9ae154cSBram Moolenaar  enew | only
2003f9ae154cSBram Moolenaar  set switchbuf=useopen
2004f9ae154cSBram Moolenaar  cexpr "Xqftestfile1:1:10"
2005f9ae154cSBram Moolenaar  call assert_equal('usetab', &switchbuf)
2006f9ae154cSBram Moolenaar  call writefile(["vim: switchbuf&vim"], 'Xqftestfile1')
2007f9ae154cSBram Moolenaar  enew | only
2008f9ae154cSBram Moolenaar  set switchbuf=useopen
2009f9ae154cSBram Moolenaar  cexpr "Xqftestfile1:1:10"
2010f9ae154cSBram Moolenaar  call assert_equal('', &switchbuf)
2011f9ae154cSBram Moolenaar
2012049cba9eSBram Moolenaar  call delete('Xqftestfile1')
2013049cba9eSBram Moolenaar  call delete('Xqftestfile2')
2014049cba9eSBram Moolenaar  call delete('Xqftestfile3')
2015391b1dd0SBram Moolenaar  set switchbuf&vim
2016391b1dd0SBram Moolenaar
2017391b1dd0SBram Moolenaar  enew | only
20182b946c9fSBram Moolenaarendfunc
2019049cba9eSBram Moolenaar
20202b946c9fSBram Moolenaarfunc Xadjust_qflnum(cchar)
2021049cba9eSBram Moolenaar  call s:setup_commands(a:cchar)
2022049cba9eSBram Moolenaar
2023049cba9eSBram Moolenaar  enew | only
2024049cba9eSBram Moolenaar
2025c1542744SBram Moolenaar  let fname = 'Xqftestfile' . a:cchar
2026c1542744SBram Moolenaar  call s:create_test_file(fname)
2027c1542744SBram Moolenaar  exe 'edit ' . fname
2028049cba9eSBram Moolenaar
2029c1542744SBram Moolenaar  Xgetexpr [fname . ':5:Line5',
2030c1542744SBram Moolenaar	      \ fname . ':10:Line10',
2031c1542744SBram Moolenaar	      \ fname . ':15:Line15',
2032c1542744SBram Moolenaar	      \ fname . ':20:Line20']
2033049cba9eSBram Moolenaar
2034049cba9eSBram Moolenaar  6,14delete
2035049cba9eSBram Moolenaar  call append(6, ['Buffer', 'Window'])
2036049cba9eSBram Moolenaar
2037049cba9eSBram Moolenaar  let l = g:Xgetlist()
2038049cba9eSBram Moolenaar  call assert_equal(5, l[0].lnum)
2039049cba9eSBram Moolenaar  call assert_equal(6, l[2].lnum)
2040049cba9eSBram Moolenaar  call assert_equal(13, l[3].lnum)
2041049cba9eSBram Moolenaar
2042f9ae154cSBram Moolenaar  " If a file doesn't have any quickfix entries, then deleting lines in the
2043f9ae154cSBram Moolenaar  " file should not update the quickfix list
2044f9ae154cSBram Moolenaar  call g:Xsetlist([], 'f')
2045f9ae154cSBram Moolenaar  1,2delete
2046f9ae154cSBram Moolenaar  call assert_equal([], g:Xgetlist())
2047f9ae154cSBram Moolenaar
2048049cba9eSBram Moolenaar  enew!
2049c1542744SBram Moolenaar  call delete(fname)
20502b946c9fSBram Moolenaarendfunc
2051049cba9eSBram Moolenaar
20522b946c9fSBram Moolenaarfunc Test_adjust_lnum()
2053c1542744SBram Moolenaar  call setloclist(0, [])
2054049cba9eSBram Moolenaar  call Xadjust_qflnum('c')
2055c1542744SBram Moolenaar  call setqflist([])
2056049cba9eSBram Moolenaar  call Xadjust_qflnum('l')
20572b946c9fSBram Moolenaarendfunc
2058049cba9eSBram Moolenaar
2059049cba9eSBram Moolenaar" Tests for the :grep/:lgrep and :grepadd/:lgrepadd commands
20602b946c9fSBram Moolenaarfunc s:test_xgrep(cchar)
2061049cba9eSBram Moolenaar  call s:setup_commands(a:cchar)
2062049cba9eSBram Moolenaar
2063049cba9eSBram Moolenaar  " The following lines are used for the grep test. Don't remove.
2064049cba9eSBram Moolenaar  " Grep_Test_Text: Match 1
2065049cba9eSBram Moolenaar  " Grep_Test_Text: Match 2
2066049cba9eSBram Moolenaar  " GrepAdd_Test_Text: Match 1
2067049cba9eSBram Moolenaar  " GrepAdd_Test_Text: Match 2
2068049cba9eSBram Moolenaar  enew! | only
2069049cba9eSBram Moolenaar  set makeef&vim
2070049cba9eSBram Moolenaar  silent Xgrep Grep_Test_Text: test_quickfix.vim
207115a7bdcbSBram Moolenaar  call assert_true(len(g:Xgetlist()) == 5)
2072049cba9eSBram Moolenaar  Xopen
2073049cba9eSBram Moolenaar  call assert_true(w:quickfix_title =~ '^:grep')
2074049cba9eSBram Moolenaar  Xclose
2075049cba9eSBram Moolenaar  enew
2076049cba9eSBram Moolenaar  set makeef=Temp_File_##
2077049cba9eSBram Moolenaar  silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
207815a7bdcbSBram Moolenaar  call assert_true(len(g:Xgetlist()) == 9)
207915a7bdcbSBram Moolenaar
208015a7bdcbSBram Moolenaar  " Try with 'grepprg' set to 'internal'
208115a7bdcbSBram Moolenaar  set grepprg=internal
208215a7bdcbSBram Moolenaar  silent Xgrep Grep_Test_Text: test_quickfix.vim
208315a7bdcbSBram Moolenaar  silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
208415a7bdcbSBram Moolenaar  call assert_true(len(g:Xgetlist()) == 9)
208515a7bdcbSBram Moolenaar  set grepprg&vim
2086f9ae154cSBram Moolenaar
2087f9ae154cSBram Moolenaar  call writefile(['Vim'], 'XtestTempFile')
2088f9ae154cSBram Moolenaar  set makeef=XtestTempFile
2089f9ae154cSBram Moolenaar  silent Xgrep Grep_Test_Text: test_quickfix.vim
209015a7bdcbSBram Moolenaar  call assert_equal(5, len(g:Xgetlist()))
2091f9ae154cSBram Moolenaar  call assert_false(filereadable('XtestTempFile'))
2092f9ae154cSBram Moolenaar  set makeef&vim
20932b946c9fSBram Moolenaarendfunc
2094049cba9eSBram Moolenaar
20952b946c9fSBram Moolenaarfunc Test_grep()
2096049cba9eSBram Moolenaar  " The grepprg may not be set on non-Unix systems
20976d91bcb4SBram Moolenaar  CheckUnix
2098049cba9eSBram Moolenaar
2099049cba9eSBram Moolenaar  call s:test_xgrep('c')
2100049cba9eSBram Moolenaar  call s:test_xgrep('l')
21012b946c9fSBram Moolenaarendfunc
2102361c8f0eSBram Moolenaar
21032b946c9fSBram Moolenaarfunc Test_two_windows()
2104361c8f0eSBram Moolenaar  " Use one 'errorformat' for two windows.  Add an expression to each of them,
2105361c8f0eSBram Moolenaar  " make sure they each keep their own state.
2106361c8f0eSBram Moolenaar  set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
2107361c8f0eSBram Moolenaar  call mkdir('Xone/a', 'p')
2108361c8f0eSBram Moolenaar  call mkdir('Xtwo/a', 'p')
2109361c8f0eSBram Moolenaar  let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
2110361c8f0eSBram Moolenaar  call writefile(lines, 'Xone/a/one.txt')
2111361c8f0eSBram Moolenaar  call writefile(lines, 'Xtwo/a/two.txt')
2112361c8f0eSBram Moolenaar
2113361c8f0eSBram Moolenaar  new one
2114361c8f0eSBram Moolenaar  let one_id = win_getid()
2115361c8f0eSBram Moolenaar  lexpr ""
2116361c8f0eSBram Moolenaar  new two
2117361c8f0eSBram Moolenaar  let two_id = win_getid()
2118361c8f0eSBram Moolenaar  lexpr ""
2119361c8f0eSBram Moolenaar
2120361c8f0eSBram Moolenaar  laddexpr "Entering dir 'Xtwo/a'"
2121361c8f0eSBram Moolenaar  call win_gotoid(one_id)
2122361c8f0eSBram Moolenaar  laddexpr "Entering dir 'Xone/a'"
2123361c8f0eSBram Moolenaar  call win_gotoid(two_id)
2124361c8f0eSBram Moolenaar  laddexpr 'two.txt:5:two two two'
2125361c8f0eSBram Moolenaar  call win_gotoid(one_id)
2126361c8f0eSBram Moolenaar  laddexpr 'one.txt:3:one one one'
2127361c8f0eSBram Moolenaar
2128361c8f0eSBram Moolenaar  let loc_one = getloclist(one_id)
2129361c8f0eSBram Moolenaar  call assert_equal('Xone/a/one.txt', bufname(loc_one[1].bufnr))
2130361c8f0eSBram Moolenaar  call assert_equal(3, loc_one[1].lnum)
2131361c8f0eSBram Moolenaar
2132361c8f0eSBram Moolenaar  let loc_two = getloclist(two_id)
2133361c8f0eSBram Moolenaar  call assert_equal('Xtwo/a/two.txt', bufname(loc_two[1].bufnr))
2134361c8f0eSBram Moolenaar  call assert_equal(5, loc_two[1].lnum)
2135361c8f0eSBram Moolenaar
2136361c8f0eSBram Moolenaar  call win_gotoid(one_id)
2137361c8f0eSBram Moolenaar  bwipe!
2138361c8f0eSBram Moolenaar  call win_gotoid(two_id)
2139361c8f0eSBram Moolenaar  bwipe!
2140361c8f0eSBram Moolenaar  call delete('Xone', 'rf')
2141361c8f0eSBram Moolenaar  call delete('Xtwo', 'rf')
2142361c8f0eSBram Moolenaarendfunc
2143dcb17001SBram Moolenaar
21442b946c9fSBram Moolenaarfunc XbottomTests(cchar)
2145537ef084SBram Moolenaar  call s:setup_commands(a:cchar)
2146537ef084SBram Moolenaar
2147b6fa30ccSBram Moolenaar  " Calling lbottom without any errors should fail
2148b6fa30ccSBram Moolenaar  if a:cchar == 'l'
2149b6fa30ccSBram Moolenaar      call assert_fails('lbottom', 'E776:')
2150b6fa30ccSBram Moolenaar  endif
2151b6fa30ccSBram Moolenaar
2152537ef084SBram Moolenaar  call g:Xsetlist([{'filename': 'foo', 'lnum': 42}])
2153537ef084SBram Moolenaar  Xopen
2154dcb17001SBram Moolenaar  let wid = win_getid()
2155dcb17001SBram Moolenaar  call assert_equal(1, line('.'))
2156dcb17001SBram Moolenaar  wincmd w
2157537ef084SBram Moolenaar  call g:Xsetlist([{'filename': 'var', 'lnum': 24}], 'a')
2158537ef084SBram Moolenaar  Xbottom
2159dcb17001SBram Moolenaar  call win_gotoid(wid)
2160dcb17001SBram Moolenaar  call assert_equal(2, line('.'))
2161537ef084SBram Moolenaar  Xclose
2162dcb17001SBram Moolenaarendfunc
2163537ef084SBram Moolenaar
2164537ef084SBram Moolenaar" Tests for the :cbottom and :lbottom commands
21652b946c9fSBram Moolenaarfunc Test_cbottom()
2166537ef084SBram Moolenaar  call XbottomTests('c')
2167537ef084SBram Moolenaar  call XbottomTests('l')
21682b946c9fSBram Moolenaarendfunc
2169f6acffbeSBram Moolenaar
21702b946c9fSBram Moolenaarfunc HistoryTest(cchar)
2171f6acffbeSBram Moolenaar  call s:setup_commands(a:cchar)
2172f6acffbeSBram Moolenaar
2173f6acffbeSBram Moolenaar  " clear all lists after the first one, then replace the first one.
2174f6acffbeSBram Moolenaar  call g:Xsetlist([])
2175b6fa30ccSBram Moolenaar  call assert_fails('Xolder 99', 'E380:')
2176f6acffbeSBram Moolenaar  let entry = {'filename': 'foo', 'lnum': 42}
2177f6acffbeSBram Moolenaar  call g:Xsetlist([entry], 'r')
2178f6acffbeSBram Moolenaar  call g:Xsetlist([entry, entry])
2179f6acffbeSBram Moolenaar  call g:Xsetlist([entry, entry, entry])
2180f6acffbeSBram Moolenaar  let res = split(execute(a:cchar . 'hist'), "\n")
2181f6acffbeSBram Moolenaar  call assert_equal(3, len(res))
2182f6acffbeSBram Moolenaar  let common = 'errors     :set' . (a:cchar == 'c' ? 'qf' : 'loc') . 'list()'
2183f6acffbeSBram Moolenaar  call assert_equal('  error list 1 of 3; 1 ' . common, res[0])
2184f6acffbeSBram Moolenaar  call assert_equal('  error list 2 of 3; 2 ' . common, res[1])
2185f6acffbeSBram Moolenaar  call assert_equal('> error list 3 of 3; 3 ' . common, res[2])
2186b4d5fbabSBram Moolenaar
21878ffc7c8bSBram Moolenaar  " Test for changing the quickfix lists
21888ffc7c8bSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 0}).nr)
21898ffc7c8bSBram Moolenaar  exe '1' . a:cchar . 'hist'
21908ffc7c8bSBram Moolenaar  call assert_equal(1, g:Xgetlist({'nr' : 0}).nr)
21918ffc7c8bSBram Moolenaar  exe '3' . a:cchar . 'hist'
21928ffc7c8bSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 0}).nr)
21938ffc7c8bSBram Moolenaar  call assert_fails('-2' . a:cchar . 'hist', 'E16:')
21948ffc7c8bSBram Moolenaar  call assert_fails('4' . a:cchar . 'hist', 'E16:')
21958ffc7c8bSBram Moolenaar
2196b4d5fbabSBram Moolenaar  call g:Xsetlist([], 'f')
2197b4d5fbabSBram Moolenaar  let l = split(execute(a:cchar . 'hist'), "\n")
2198b4d5fbabSBram Moolenaar  call assert_equal('No entries', l[0])
21998ffc7c8bSBram Moolenaar  if a:cchar == 'c'
22008ffc7c8bSBram Moolenaar    call assert_fails('4chist', 'E16:')
22018ffc7c8bSBram Moolenaar  else
22028ffc7c8bSBram Moolenaar    call assert_fails('4lhist', 'E776:')
22038ffc7c8bSBram Moolenaar  endif
22045b69c22fSBram Moolenaar
22055b69c22fSBram Moolenaar  " An empty list should still show the stack history
22065b69c22fSBram Moolenaar  call g:Xsetlist([])
22075b69c22fSBram Moolenaar  let res = split(execute(a:cchar . 'hist'), "\n")
22085b69c22fSBram Moolenaar  call assert_equal('> error list 1 of 1; 0 ' . common, res[0])
22095b69c22fSBram Moolenaar
22105b69c22fSBram Moolenaar  call g:Xsetlist([], 'f')
2211f6acffbeSBram Moolenaarendfunc
2212f6acffbeSBram Moolenaar
2213f6acffbeSBram Moolenaarfunc Test_history()
2214f6acffbeSBram Moolenaar  call HistoryTest('c')
2215f6acffbeSBram Moolenaar  call HistoryTest('l')
2216f6acffbeSBram Moolenaarendfunc
2217015102e9SBram Moolenaar
2218015102e9SBram Moolenaarfunc Test_duplicate_buf()
2219015102e9SBram Moolenaar  " make sure we can get the highest buffer number
2220015102e9SBram Moolenaar  edit DoesNotExist
2221015102e9SBram Moolenaar  edit DoesNotExist2
2222015102e9SBram Moolenaar  let last_buffer = bufnr("$")
2223015102e9SBram Moolenaar
2224015102e9SBram Moolenaar  " make sure only one buffer is created
2225015102e9SBram Moolenaar  call writefile(['this one', 'that one'], 'Xgrepthis')
2226015102e9SBram Moolenaar  vimgrep one Xgrepthis
2227015102e9SBram Moolenaar  vimgrep one Xgrepthis
2228015102e9SBram Moolenaar  call assert_equal(last_buffer + 1, bufnr("$"))
2229015102e9SBram Moolenaar
2230015102e9SBram Moolenaar  call delete('Xgrepthis')
2231015102e9SBram Moolenaarendfunc
2232d823fa91SBram Moolenaar
2233d823fa91SBram Moolenaar" Quickfix/Location list set/get properties tests
22342b946c9fSBram Moolenaarfunc Xproperty_tests(cchar)
2235d823fa91SBram Moolenaar  call s:setup_commands(a:cchar)
2236d823fa91SBram Moolenaar
2237d823fa91SBram Moolenaar  " Error cases
2238d823fa91SBram Moolenaar  call assert_fails('call g:Xgetlist(99)', 'E715:')
2239d823fa91SBram Moolenaar  call assert_fails('call g:Xsetlist(99)', 'E714:')
2240d823fa91SBram Moolenaar  call assert_fails('call g:Xsetlist([], "a", [])', 'E715:')
2241d823fa91SBram Moolenaar
2242d823fa91SBram Moolenaar  " Set and get the title
2243b6fa30ccSBram Moolenaar  call g:Xsetlist([])
2244d823fa91SBram Moolenaar  Xopen
2245d823fa91SBram Moolenaar  wincmd p
2246d823fa91SBram Moolenaar  call g:Xsetlist([{'filename':'foo', 'lnum':27}])
224786f100dcSBram Moolenaar  let s = g:Xsetlist([], 'a', {'title' : 'Sample'})
224886f100dcSBram Moolenaar  call assert_equal(0, s)
2249d823fa91SBram Moolenaar  let d = g:Xgetlist({"title":1})
2250d823fa91SBram Moolenaar  call assert_equal('Sample', d.title)
2251a2aa8a2bSBram Moolenaar  " Try setting title to a non-string value
2252a2aa8a2bSBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'title' : ['Test']}))
2253a2aa8a2bSBram Moolenaar  call assert_equal('Sample', g:Xgetlist({"title":1}).title)
2254d823fa91SBram Moolenaar
2255d823fa91SBram Moolenaar  Xopen
2256d823fa91SBram Moolenaar  call assert_equal('Sample', w:quickfix_title)
2257d823fa91SBram Moolenaar  Xclose
2258d823fa91SBram Moolenaar
22592b529bb6SBram Moolenaar  " Tests for action argument
22602b529bb6SBram Moolenaar  silent! Xolder 999
22612b529bb6SBram Moolenaar  let qfnr = g:Xgetlist({'all':1}).nr
22622b529bb6SBram Moolenaar  call g:Xsetlist([], 'r', {'title' : 'N1'})
22632b529bb6SBram Moolenaar  call assert_equal('N1', g:Xgetlist({'all':1}).title)
22642b529bb6SBram Moolenaar  call g:Xsetlist([], ' ', {'title' : 'N2'})
22652b529bb6SBram Moolenaar  call assert_equal(qfnr + 1, g:Xgetlist({'all':1}).nr)
2266890680caSBram Moolenaar
2267890680caSBram Moolenaar  let res = g:Xgetlist({'nr': 0})
2268890680caSBram Moolenaar  call assert_equal(qfnr + 1, res.nr)
2269890680caSBram Moolenaar  call assert_equal(['nr'], keys(res))
2270890680caSBram Moolenaar
22712b529bb6SBram Moolenaar  call g:Xsetlist([], ' ', {'title' : 'N3'})
22722b529bb6SBram Moolenaar  call assert_equal('N2', g:Xgetlist({'nr':2, 'title':1}).title)
22732b529bb6SBram Moolenaar
2274ee85df37SBram Moolenaar  " Changing the title of an earlier quickfix list
227555b69264SBram Moolenaar  call g:Xsetlist([], 'r', {'title' : 'NewTitle', 'nr' : 2})
2276ee85df37SBram Moolenaar  call assert_equal('NewTitle', g:Xgetlist({'nr':2, 'title':1}).title)
2277ee85df37SBram Moolenaar
2278ee85df37SBram Moolenaar  " Changing the title of an invalid quickfix list
2279ee85df37SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], ' ',
2280ee85df37SBram Moolenaar        \ {'title' : 'SomeTitle', 'nr' : 99}))
2281ee85df37SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], ' ',
2282ee85df37SBram Moolenaar        \ {'title' : 'SomeTitle', 'nr' : 'abc'}))
2283ee85df37SBram Moolenaar
2284ee85df37SBram Moolenaar  if a:cchar == 'c'
2285ee85df37SBram Moolenaar    copen
2286ee85df37SBram Moolenaar    call assert_equal({'winid':win_getid()}, getqflist({'winid':1}))
2287ee85df37SBram Moolenaar    cclose
2288ee85df37SBram Moolenaar  endif
2289ee85df37SBram Moolenaar
2290d823fa91SBram Moolenaar  " Invalid arguments
2291e2e4075fSBram Moolenaar  call assert_fails('call g:Xgetlist([])', 'E715:')
2292e2e4075fSBram Moolenaar  call assert_fails('call g:Xsetlist([], "a", [])', 'E715:')
2293d823fa91SBram Moolenaar  let s = g:Xsetlist([], 'a', {'abc':1})
2294d823fa91SBram Moolenaar  call assert_equal(-1, s)
2295d823fa91SBram Moolenaar
2296d823fa91SBram Moolenaar  call assert_equal({}, g:Xgetlist({'abc':1}))
2297a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'nr':99, 'title':1}).title)
2298a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'nr':[], 'title':1}).title)
2299d823fa91SBram Moolenaar
2300d823fa91SBram Moolenaar  if a:cchar == 'l'
2301890680caSBram Moolenaar    call assert_equal({}, getloclist(99, {'title': 1}))
2302d823fa91SBram Moolenaar  endif
23038f77c5a4SBram Moolenaar
23048f77c5a4SBram Moolenaar  " Context related tests
230586f100dcSBram Moolenaar  let s = g:Xsetlist([], 'a', {'context':[1,2,3]})
230686f100dcSBram Moolenaar  call assert_equal(0, s)
23078f77c5a4SBram Moolenaar  call test_garbagecollect_now()
23088f77c5a4SBram Moolenaar  let d = g:Xgetlist({'context':1})
23098f77c5a4SBram Moolenaar  call assert_equal([1,2,3], d.context)
23108f77c5a4SBram Moolenaar  call g:Xsetlist([], 'a', {'context':{'color':'green'}})
23118f77c5a4SBram Moolenaar  let d = g:Xgetlist({'context':1})
23128f77c5a4SBram Moolenaar  call assert_equal({'color':'green'}, d.context)
23138f77c5a4SBram Moolenaar  call g:Xsetlist([], 'a', {'context':"Context info"})
23148f77c5a4SBram Moolenaar  let d = g:Xgetlist({'context':1})
23158f77c5a4SBram Moolenaar  call assert_equal("Context info", d.context)
23168f77c5a4SBram Moolenaar  call g:Xsetlist([], 'a', {'context':246})
23178f77c5a4SBram Moolenaar  let d = g:Xgetlist({'context':1})
23188f77c5a4SBram Moolenaar  call assert_equal(246, d.context)
231992b83ccfSBram Moolenaar  " set other Vim data types as context
232092b83ccfSBram Moolenaar  call g:Xsetlist([], 'a', {'context' : test_null_blob()})
232192b83ccfSBram Moolenaar  if has('channel')
232292b83ccfSBram Moolenaar    call g:Xsetlist([], 'a', {'context' : test_null_channel()})
232392b83ccfSBram Moolenaar  endif
232492b83ccfSBram Moolenaar  if has('job')
232592b83ccfSBram Moolenaar    call g:Xsetlist([], 'a', {'context' : test_null_job()})
232692b83ccfSBram Moolenaar  endif
232792b83ccfSBram Moolenaar  call g:Xsetlist([], 'a', {'context' : test_null_function()})
232892b83ccfSBram Moolenaar  call g:Xsetlist([], 'a', {'context' : test_null_partial()})
232992b83ccfSBram Moolenaar  call g:Xsetlist([], 'a', {'context' : ''})
233092b83ccfSBram Moolenaar  call test_garbagecollect_now()
23318f77c5a4SBram Moolenaar  if a:cchar == 'l'
23328f77c5a4SBram Moolenaar    " Test for copying context across two different location lists
23338f77c5a4SBram Moolenaar    new | only
23348f77c5a4SBram Moolenaar    let w1_id = win_getid()
23358f77c5a4SBram Moolenaar    let l = [1]
23368f77c5a4SBram Moolenaar    call setloclist(0, [], 'a', {'context':l})
23378f77c5a4SBram Moolenaar    new
23388f77c5a4SBram Moolenaar    let w2_id = win_getid()
23398f77c5a4SBram Moolenaar    call add(l, 2)
23408f77c5a4SBram Moolenaar    call assert_equal([1, 2], getloclist(w1_id, {'context':1}).context)
23418f77c5a4SBram Moolenaar    call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
23428f77c5a4SBram Moolenaar    unlet! l
23438f77c5a4SBram Moolenaar    call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
23448f77c5a4SBram Moolenaar    only
23458f77c5a4SBram Moolenaar    call setloclist(0, [], 'f')
2346a6d4849cSBram Moolenaar    call assert_equal('', getloclist(0, {'context':1}).context)
23478f77c5a4SBram Moolenaar  endif
23486e62da3eSBram Moolenaar
23496e62da3eSBram Moolenaar  " Test for changing the context of previous quickfix lists
23506e62da3eSBram Moolenaar  call g:Xsetlist([], 'f')
23516e62da3eSBram Moolenaar  Xexpr "One"
23526e62da3eSBram Moolenaar  Xexpr "Two"
23536e62da3eSBram Moolenaar  Xexpr "Three"
235455b69264SBram Moolenaar  call g:Xsetlist([], 'r', {'context' : [1], 'nr' : 1})
235555b69264SBram Moolenaar  call g:Xsetlist([], 'a', {'context' : [2], 'nr' : 2})
23566e62da3eSBram Moolenaar  " Also, check for setting the context using quickfix list number zero.
235755b69264SBram Moolenaar  call g:Xsetlist([], 'r', {'context' : [3], 'nr' : 0})
23586e62da3eSBram Moolenaar  call test_garbagecollect_now()
23596e62da3eSBram Moolenaar  let l = g:Xgetlist({'nr' : 1, 'context' : 1})
23606e62da3eSBram Moolenaar  call assert_equal([1], l.context)
23616e62da3eSBram Moolenaar  let l = g:Xgetlist({'nr' : 2, 'context' : 1})
23626e62da3eSBram Moolenaar  call assert_equal([2], l.context)
23636e62da3eSBram Moolenaar  let l = g:Xgetlist({'nr' : 3, 'context' : 1})
23646e62da3eSBram Moolenaar  call assert_equal([3], l.context)
23656e62da3eSBram Moolenaar
23666e62da3eSBram Moolenaar  " Test for changing the context through reference and for garbage
23676e62da3eSBram Moolenaar  " collection of quickfix context
23686e62da3eSBram Moolenaar  let l = ["red"]
23696e62da3eSBram Moolenaar  call g:Xsetlist([], ' ', {'context' : l})
23706e62da3eSBram Moolenaar  call add(l, "blue")
23716e62da3eSBram Moolenaar  let x = g:Xgetlist({'context' : 1})
23726e62da3eSBram Moolenaar  call add(x.context, "green")
23736e62da3eSBram Moolenaar  call assert_equal(["red", "blue", "green"], l)
23746e62da3eSBram Moolenaar  call assert_equal(["red", "blue", "green"], x.context)
23756e62da3eSBram Moolenaar  unlet l
23766e62da3eSBram Moolenaar  call test_garbagecollect_now()
23776e62da3eSBram Moolenaar  let m = g:Xgetlist({'context' : 1})
23786e62da3eSBram Moolenaar  call assert_equal(["red", "blue", "green"], m.context)
23796a8958dbSBram Moolenaar
23806a8958dbSBram Moolenaar  " Test for setting/getting items
23816a8958dbSBram Moolenaar  Xexpr ""
23826a8958dbSBram Moolenaar  let qfprev = g:Xgetlist({'nr':0})
238386f100dcSBram Moolenaar  let s = g:Xsetlist([], ' ', {'title':'Green',
23846a8958dbSBram Moolenaar        \ 'items' : [{'filename':'F1', 'lnum':10}]})
238586f100dcSBram Moolenaar  call assert_equal(0, s)
23866a8958dbSBram Moolenaar  let qfcur = g:Xgetlist({'nr':0})
23876a8958dbSBram Moolenaar  call assert_true(qfcur.nr == qfprev.nr + 1)
23886a8958dbSBram Moolenaar  let l = g:Xgetlist({'items':1})
23896a8958dbSBram Moolenaar  call assert_equal('F1', bufname(l.items[0].bufnr))
23906a8958dbSBram Moolenaar  call assert_equal(10, l.items[0].lnum)
23916a8958dbSBram Moolenaar  call g:Xsetlist([], 'a', {'items' : [{'filename':'F2', 'lnum':20},
23926a8958dbSBram Moolenaar        \  {'filename':'F2', 'lnum':30}]})
23936a8958dbSBram Moolenaar  let l = g:Xgetlist({'items':1})
23946a8958dbSBram Moolenaar  call assert_equal('F2', bufname(l.items[2].bufnr))
23956a8958dbSBram Moolenaar  call assert_equal(30, l.items[2].lnum)
23966a8958dbSBram Moolenaar  call g:Xsetlist([], 'r', {'items' : [{'filename':'F3', 'lnum':40}]})
23976a8958dbSBram Moolenaar  let l = g:Xgetlist({'items':1})
23986a8958dbSBram Moolenaar  call assert_equal('F3', bufname(l.items[0].bufnr))
23996a8958dbSBram Moolenaar  call assert_equal(40, l.items[0].lnum)
24006a8958dbSBram Moolenaar  call g:Xsetlist([], 'r', {'items' : []})
24016a8958dbSBram Moolenaar  let l = g:Xgetlist({'items':1})
24026a8958dbSBram Moolenaar  call assert_equal(0, len(l.items))
24036a8958dbSBram Moolenaar
2404b4d5fbabSBram Moolenaar  call g:Xsetlist([], 'r', {'title' : 'TestTitle'})
2405b4d5fbabSBram Moolenaar  call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]})
2406b4d5fbabSBram Moolenaar  call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]})
2407b4d5fbabSBram Moolenaar  call assert_equal('TestTitle', g:Xgetlist({'title' : 1}).title)
2408b4d5fbabSBram Moolenaar
2409c9cc9c78SBram Moolenaar  " Test for getting id of window associated with a location list window
2410c9cc9c78SBram Moolenaar  if a:cchar == 'l'
2411c9cc9c78SBram Moolenaar    only
2412c9cc9c78SBram Moolenaar    call assert_equal(0, g:Xgetlist({'all' : 1}).filewinid)
2413c9cc9c78SBram Moolenaar    let wid = win_getid()
2414c9cc9c78SBram Moolenaar    Xopen
2415c9cc9c78SBram Moolenaar    call assert_equal(wid, g:Xgetlist({'filewinid' : 1}).filewinid)
2416c9cc9c78SBram Moolenaar    wincmd w
2417c9cc9c78SBram Moolenaar    call assert_equal(0, g:Xgetlist({'filewinid' : 1}).filewinid)
2418c9cc9c78SBram Moolenaar    only
2419c9cc9c78SBram Moolenaar  endif
2420c9cc9c78SBram Moolenaar
2421ae338338SBram Moolenaar  " The following used to crash Vim with address sanitizer
2422ae338338SBram Moolenaar  call g:Xsetlist([], 'f')
2423ae338338SBram Moolenaar  call g:Xsetlist([], 'a', {'items' : [{'filename':'F1', 'lnum':10}]})
2424ae338338SBram Moolenaar  call assert_equal(10, g:Xgetlist({'items':1}).items[0].lnum)
2425ae338338SBram Moolenaar
2426a2aa8a2bSBram Moolenaar  " Try setting the items using a string
2427a2aa8a2bSBram Moolenaar  call assert_equal(-1, g:Xsetlist([], ' ', {'items' : 'Test'}))
2428a2aa8a2bSBram Moolenaar
24296a8958dbSBram Moolenaar  " Save and restore the quickfix stack
24306a8958dbSBram Moolenaar  call g:Xsetlist([], 'f')
24316a8958dbSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
24326a8958dbSBram Moolenaar  Xexpr "File1:10:Line1"
24336a8958dbSBram Moolenaar  Xexpr "File2:20:Line2"
24346a8958dbSBram Moolenaar  Xexpr "File3:30:Line3"
24356a8958dbSBram Moolenaar  let last_qf = g:Xgetlist({'nr':'$'}).nr
24366a8958dbSBram Moolenaar  call assert_equal(3, last_qf)
24376a8958dbSBram Moolenaar  let qstack = []
24386a8958dbSBram Moolenaar  for i in range(1, last_qf)
24396a8958dbSBram Moolenaar    let qstack = add(qstack, g:Xgetlist({'nr':i, 'all':1}))
24406a8958dbSBram Moolenaar  endfor
24416a8958dbSBram Moolenaar  call g:Xsetlist([], 'f')
24426a8958dbSBram Moolenaar  for i in range(len(qstack))
24436a8958dbSBram Moolenaar    call g:Xsetlist([], ' ', qstack[i])
24446a8958dbSBram Moolenaar  endfor
24456a8958dbSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
24466a8958dbSBram Moolenaar  call assert_equal(10, g:Xgetlist({'nr':1, 'items':1}).items[0].lnum)
24476a8958dbSBram Moolenaar  call assert_equal(20, g:Xgetlist({'nr':2, 'items':1}).items[0].lnum)
24486a8958dbSBram Moolenaar  call assert_equal(30, g:Xgetlist({'nr':3, 'items':1}).items[0].lnum)
24496a8958dbSBram Moolenaar  call g:Xsetlist([], 'f')
24506a8958dbSBram Moolenaar
24516a8958dbSBram Moolenaar  " Swap two quickfix lists
24526a8958dbSBram Moolenaar  Xexpr "File1:10:Line10"
24536a8958dbSBram Moolenaar  Xexpr "File2:20:Line20"
24546a8958dbSBram Moolenaar  Xexpr "File3:30:Line30"
24556a8958dbSBram Moolenaar  call g:Xsetlist([], 'r', {'nr':1,'title':'Colors','context':['Colors']})
24566a8958dbSBram Moolenaar  call g:Xsetlist([], 'r', {'nr':2,'title':'Fruits','context':['Fruits']})
24576a8958dbSBram Moolenaar  let l1=g:Xgetlist({'nr':1,'all':1})
24586a8958dbSBram Moolenaar  let l2=g:Xgetlist({'nr':2,'all':1})
2459a539f4f1SBram Moolenaar  let save_id = l1.id
2460a539f4f1SBram Moolenaar  let l1.id=l2.id
2461a539f4f1SBram Moolenaar  let l2.id=save_id
24626a8958dbSBram Moolenaar  call g:Xsetlist([], 'r', l1)
24636a8958dbSBram Moolenaar  call g:Xsetlist([], 'r', l2)
24646a8958dbSBram Moolenaar  let newl1=g:Xgetlist({'nr':1,'all':1})
24656a8958dbSBram Moolenaar  let newl2=g:Xgetlist({'nr':2,'all':1})
2466b4d5fbabSBram Moolenaar  call assert_equal('Fruits', newl1.title)
24676a8958dbSBram Moolenaar  call assert_equal(['Fruits'], newl1.context)
24686a8958dbSBram Moolenaar  call assert_equal('Line20', newl1.items[0].text)
2469b4d5fbabSBram Moolenaar  call assert_equal('Colors', newl2.title)
24706a8958dbSBram Moolenaar  call assert_equal(['Colors'], newl2.context)
24716a8958dbSBram Moolenaar  call assert_equal('Line10', newl2.items[0].text)
24726a8958dbSBram Moolenaar  call g:Xsetlist([], 'f')
2473be7a50c2SBram Moolenaar
2474be7a50c2SBram Moolenaar  " Cannot specify both a non-empty list argument and a dict argument
2475be7a50c2SBram Moolenaar  call assert_fails("call g:Xsetlist([{}], ' ', {})", 'E475:')
24762b946c9fSBram Moolenaarendfunc
2477d823fa91SBram Moolenaar
24782b946c9fSBram Moolenaarfunc Test_qf_property()
2479d823fa91SBram Moolenaar  call Xproperty_tests('c')
2480d823fa91SBram Moolenaar  call Xproperty_tests('l')
24812b946c9fSBram Moolenaarendfunc
248204c4ce65SBram Moolenaar
24835b69c22fSBram Moolenaar" Test for setting the current index in the location/quickfix list
24845b69c22fSBram Moolenaarfunc Xtest_setqfidx(cchar)
24855b69c22fSBram Moolenaar  call s:setup_commands(a:cchar)
24865b69c22fSBram Moolenaar
24875b69c22fSBram Moolenaar  Xgetexpr "F1:10:1:Line1\nF2:20:2:Line2\nF3:30:3:Line3"
24885b69c22fSBram Moolenaar  Xgetexpr "F4:10:1:Line1\nF5:20:2:Line2\nF6:30:3:Line3"
24895b69c22fSBram Moolenaar  Xgetexpr "F7:10:1:Line1\nF8:20:2:Line2\nF9:30:3:Line3"
24905b69c22fSBram Moolenaar
24915b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 3, 'idx' : 2})
24925b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'idx' : 2})
24935b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 3})
24945b69c22fSBram Moolenaar  Xolder 2
24955b69c22fSBram Moolenaar  Xopen
24965b69c22fSBram Moolenaar  call assert_equal(3, line('.'))
24975b69c22fSBram Moolenaar  Xnewer
24985b69c22fSBram Moolenaar  call assert_equal(2, line('.'))
24995b69c22fSBram Moolenaar  Xnewer
25005b69c22fSBram Moolenaar  call assert_equal(2, line('.'))
25015b69c22fSBram Moolenaar  " Update the current index with the quickfix window open
25025b69c22fSBram Moolenaar  wincmd w
25035b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 3, 'idx' : 3})
25045b69c22fSBram Moolenaar  Xopen
25055b69c22fSBram Moolenaar  call assert_equal(3, line('.'))
25065b69c22fSBram Moolenaar  Xclose
25075b69c22fSBram Moolenaar
25085b69c22fSBram Moolenaar  " Set the current index to the last entry
25095b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : '$'})
25105b69c22fSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
25115b69c22fSBram Moolenaar  " A large value should set the index to the last index
25125b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 1})
25135b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 999})
25145b69c22fSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
25155b69c22fSBram Moolenaar  " Invalid index values
25165b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : -1})
25175b69c22fSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
25185b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 0})
25195b69c22fSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
25205b69c22fSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 'xx'})
25215b69c22fSBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
25225b69c22fSBram Moolenaar  call assert_fails("call g:Xsetlist([], 'a', {'nr':1, 'idx':[]})", 'E745:')
25235b69c22fSBram Moolenaar
25245b69c22fSBram Moolenaar  call g:Xsetlist([], 'f')
25255b69c22fSBram Moolenaar  new | only
25265b69c22fSBram Moolenaarendfunc
25275b69c22fSBram Moolenaar
25285b69c22fSBram Moolenaarfunc Test_setqfidx()
25295b69c22fSBram Moolenaar  call Xtest_setqfidx('c')
25305b69c22fSBram Moolenaar  call Xtest_setqfidx('l')
25315b69c22fSBram Moolenaarendfunc
25325b69c22fSBram Moolenaar
253304c4ce65SBram Moolenaar" Tests for the QuickFixCmdPre/QuickFixCmdPost autocommands
25342b946c9fSBram Moolenaarfunc QfAutoCmdHandler(loc, cmd)
253504c4ce65SBram Moolenaar  call add(g:acmds, a:loc . a:cmd)
25362b946c9fSBram Moolenaarendfunc
253704c4ce65SBram Moolenaar
25382b946c9fSBram Moolenaarfunc Test_Autocmd()
253904c4ce65SBram Moolenaar  autocmd QuickFixCmdPre * call QfAutoCmdHandler('pre', expand('<amatch>'))
254004c4ce65SBram Moolenaar  autocmd QuickFixCmdPost * call QfAutoCmdHandler('post', expand('<amatch>'))
254104c4ce65SBram Moolenaar
254204c4ce65SBram Moolenaar  let g:acmds = []
254304c4ce65SBram Moolenaar  cexpr "F1:10:Line 10"
254404c4ce65SBram Moolenaar  caddexpr "F1:20:Line 20"
254504c4ce65SBram Moolenaar  cgetexpr "F1:30:Line 30"
25461ed2276fSBram Moolenaar  cexpr ""
25471ed2276fSBram Moolenaar  caddexpr ""
25481ed2276fSBram Moolenaar  cgetexpr ""
25491ed2276fSBram Moolenaar  silent! cexpr non_existing_func()
25501ed2276fSBram Moolenaar  silent! caddexpr non_existing_func()
25511ed2276fSBram Moolenaar  silent! cgetexpr non_existing_func()
255204c4ce65SBram Moolenaar  let l = ['precexpr',
255304c4ce65SBram Moolenaar	      \ 'postcexpr',
255404c4ce65SBram Moolenaar	      \ 'precaddexpr',
255504c4ce65SBram Moolenaar	      \ 'postcaddexpr',
255604c4ce65SBram Moolenaar	      \ 'precgetexpr',
255704c4ce65SBram Moolenaar	      \ 'postcgetexpr',
25581ed2276fSBram Moolenaar	      \ 'precexpr',
25591ed2276fSBram Moolenaar	      \ 'postcexpr',
25601ed2276fSBram Moolenaar	      \ 'precaddexpr',
25611ed2276fSBram Moolenaar	      \ 'postcaddexpr',
25621ed2276fSBram Moolenaar	      \ 'precgetexpr',
25631ed2276fSBram Moolenaar	      \ 'postcgetexpr',
25641ed2276fSBram Moolenaar	      \ 'precexpr',
25651ed2276fSBram Moolenaar	      \ 'precaddexpr',
25661ed2276fSBram Moolenaar	      \ 'precgetexpr']
25671ed2276fSBram Moolenaar  call assert_equal(l, g:acmds)
25681ed2276fSBram Moolenaar
25691ed2276fSBram Moolenaar  let g:acmds = []
25701ed2276fSBram Moolenaar  enew! | call append(0, "F2:10:Line 10")
25711ed2276fSBram Moolenaar  cbuffer!
25721ed2276fSBram Moolenaar  enew! | call append(0, "F2:20:Line 20")
25731ed2276fSBram Moolenaar  cgetbuffer
25741ed2276fSBram Moolenaar  enew! | call append(0, "F2:30:Line 30")
25751ed2276fSBram Moolenaar  caddbuffer
25761ed2276fSBram Moolenaar  new
25771ed2276fSBram Moolenaar  let bnum = bufnr('%')
25781ed2276fSBram Moolenaar  bunload
25791ed2276fSBram Moolenaar  exe 'silent! cbuffer! ' . bnum
25801ed2276fSBram Moolenaar  exe 'silent! cgetbuffer ' . bnum
25811ed2276fSBram Moolenaar  exe 'silent! caddbuffer ' . bnum
25821ed2276fSBram Moolenaar  enew!
25831ed2276fSBram Moolenaar  let l = ['precbuffer',
258404c4ce65SBram Moolenaar	      \ 'postcbuffer',
258504c4ce65SBram Moolenaar	      \ 'precgetbuffer',
258604c4ce65SBram Moolenaar	      \ 'postcgetbuffer',
258704c4ce65SBram Moolenaar	      \ 'precaddbuffer',
25881ed2276fSBram Moolenaar	      \ 'postcaddbuffer',
25891ed2276fSBram Moolenaar	      \ 'precbuffer',
25901ed2276fSBram Moolenaar	      \ 'precgetbuffer',
25911ed2276fSBram Moolenaar	      \ 'precaddbuffer']
259204c4ce65SBram Moolenaar  call assert_equal(l, g:acmds)
25931ed2276fSBram Moolenaar
25941ed2276fSBram Moolenaar  call writefile(['Xtest:1:Line1'], 'Xtest')
25951ed2276fSBram Moolenaar  call writefile([], 'Xempty')
25961ed2276fSBram Moolenaar  let g:acmds = []
25971ed2276fSBram Moolenaar  cfile Xtest
25981ed2276fSBram Moolenaar  caddfile Xtest
25991ed2276fSBram Moolenaar  cgetfile Xtest
26001ed2276fSBram Moolenaar  cfile Xempty
26011ed2276fSBram Moolenaar  caddfile Xempty
26021ed2276fSBram Moolenaar  cgetfile Xempty
26031ed2276fSBram Moolenaar  silent! cfile do_not_exist
26041ed2276fSBram Moolenaar  silent! caddfile do_not_exist
26051ed2276fSBram Moolenaar  silent! cgetfile do_not_exist
26061ed2276fSBram Moolenaar  let l = ['precfile',
26071ed2276fSBram Moolenaar	      \ 'postcfile',
26081ed2276fSBram Moolenaar	      \ 'precaddfile',
26091ed2276fSBram Moolenaar	      \ 'postcaddfile',
26101ed2276fSBram Moolenaar	      \ 'precgetfile',
26111ed2276fSBram Moolenaar	      \ 'postcgetfile',
26121ed2276fSBram Moolenaar	      \ 'precfile',
26131ed2276fSBram Moolenaar	      \ 'postcfile',
26141ed2276fSBram Moolenaar	      \ 'precaddfile',
26151ed2276fSBram Moolenaar	      \ 'postcaddfile',
26161ed2276fSBram Moolenaar	      \ 'precgetfile',
26171ed2276fSBram Moolenaar	      \ 'postcgetfile',
26181ed2276fSBram Moolenaar	      \ 'precfile',
26191ed2276fSBram Moolenaar	      \ 'postcfile',
26201ed2276fSBram Moolenaar	      \ 'precaddfile',
26211ed2276fSBram Moolenaar	      \ 'postcaddfile',
26221ed2276fSBram Moolenaar	      \ 'precgetfile',
26231ed2276fSBram Moolenaar	      \ 'postcgetfile']
26241ed2276fSBram Moolenaar  call assert_equal(l, g:acmds)
26251ed2276fSBram Moolenaar
26261ed2276fSBram Moolenaar  let g:acmds = []
26271ed2276fSBram Moolenaar  helpgrep quickfix
26281ed2276fSBram Moolenaar  silent! helpgrep non_existing_help_topic
26291ed2276fSBram Moolenaar  vimgrep test Xtest
26301ed2276fSBram Moolenaar  vimgrepadd test Xtest
26311ed2276fSBram Moolenaar  silent! vimgrep non_existing_test Xtest
26321ed2276fSBram Moolenaar  silent! vimgrepadd non_existing_test Xtest
26331ed2276fSBram Moolenaar  set makeprg=
26341ed2276fSBram Moolenaar  silent! make
26351ed2276fSBram Moolenaar  set makeprg&
26361ed2276fSBram Moolenaar  let l = ['prehelpgrep',
26371ed2276fSBram Moolenaar	      \ 'posthelpgrep',
26381ed2276fSBram Moolenaar	      \ 'prehelpgrep',
26391ed2276fSBram Moolenaar	      \ 'posthelpgrep',
26401ed2276fSBram Moolenaar	      \ 'previmgrep',
26411ed2276fSBram Moolenaar	      \ 'postvimgrep',
26421ed2276fSBram Moolenaar	      \ 'previmgrepadd',
26431ed2276fSBram Moolenaar	      \ 'postvimgrepadd',
26441ed2276fSBram Moolenaar	      \ 'previmgrep',
26451ed2276fSBram Moolenaar	      \ 'postvimgrep',
26461ed2276fSBram Moolenaar	      \ 'previmgrepadd',
26471ed2276fSBram Moolenaar	      \ 'postvimgrepadd',
26481ed2276fSBram Moolenaar	      \ 'premake',
26491ed2276fSBram Moolenaar	      \ 'postmake']
26501ed2276fSBram Moolenaar  call assert_equal(l, g:acmds)
26511ed2276fSBram Moolenaar
26521ed2276fSBram Moolenaar  if has('unix')
26531ed2276fSBram Moolenaar    " Run this test only on Unix-like systems. The grepprg may not be set on
26541ed2276fSBram Moolenaar    " non-Unix systems.
26551ed2276fSBram Moolenaar    " The following lines are used for the grep test. Don't remove.
26561ed2276fSBram Moolenaar    " Grep_Autocmd_Text: Match 1
26571ed2276fSBram Moolenaar    " GrepAdd_Autocmd_Text: Match 2
26581ed2276fSBram Moolenaar    let g:acmds = []
26591ed2276fSBram Moolenaar    silent grep Grep_Autocmd_Text test_quickfix.vim
26601ed2276fSBram Moolenaar    silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim
26611ed2276fSBram Moolenaar    silent grep abc123def Xtest
26621ed2276fSBram Moolenaar    silent grepadd abc123def Xtest
266315a7bdcbSBram Moolenaar    set grepprg=internal
266415a7bdcbSBram Moolenaar    silent grep Grep_Autocmd_Text test_quickfix.vim
266515a7bdcbSBram Moolenaar    silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim
266615a7bdcbSBram Moolenaar    silent lgrep Grep_Autocmd_Text test_quickfix.vim
266715a7bdcbSBram Moolenaar    silent lgrepadd GrepAdd_Autocmd_Text test_quickfix.vim
266815a7bdcbSBram Moolenaar    set grepprg&vim
26691ed2276fSBram Moolenaar    let l = ['pregrep',
26701ed2276fSBram Moolenaar		\ 'postgrep',
26711ed2276fSBram Moolenaar		\ 'pregrepadd',
26721ed2276fSBram Moolenaar		\ 'postgrepadd',
26731ed2276fSBram Moolenaar		\ 'pregrep',
26741ed2276fSBram Moolenaar		\ 'postgrep',
26751ed2276fSBram Moolenaar		\ 'pregrepadd',
267615a7bdcbSBram Moolenaar		\ 'postgrepadd',
267715a7bdcbSBram Moolenaar		\ 'pregrep',
267815a7bdcbSBram Moolenaar		\ 'postgrep',
267915a7bdcbSBram Moolenaar		\ 'pregrepadd',
268015a7bdcbSBram Moolenaar		\ 'postgrepadd',
268115a7bdcbSBram Moolenaar		\ 'prelgrep',
268215a7bdcbSBram Moolenaar		\ 'postlgrep',
268315a7bdcbSBram Moolenaar		\ 'prelgrepadd',
268415a7bdcbSBram Moolenaar		\ 'postlgrepadd']
26851ed2276fSBram Moolenaar    call assert_equal(l, g:acmds)
26861ed2276fSBram Moolenaar  endif
26871ed2276fSBram Moolenaar
26881ed2276fSBram Moolenaar  call delete('Xtest')
26891ed2276fSBram Moolenaar  call delete('Xempty')
2690b254af31SBram Moolenaar  au! QuickFixCmdPre
2691b254af31SBram Moolenaar  au! QuickFixCmdPost
26922b946c9fSBram Moolenaarendfunc
269321662be2SBram Moolenaar
26942b946c9fSBram Moolenaarfunc Test_Autocmd_Exception()
269521662be2SBram Moolenaar  set efm=%m
269621662be2SBram Moolenaar  lgetexpr '?'
269721662be2SBram Moolenaar
269821662be2SBram Moolenaar  try
269921662be2SBram Moolenaar    call DoesNotExit()
270021662be2SBram Moolenaar  catch
270121662be2SBram Moolenaar    lgetexpr '1'
270221662be2SBram Moolenaar  finally
270321662be2SBram Moolenaar    lgetexpr '1'
270421662be2SBram Moolenaar  endtry
270521662be2SBram Moolenaar
270621662be2SBram Moolenaar  call assert_equal('1', getloclist(0)[0].text)
270721662be2SBram Moolenaar
270821662be2SBram Moolenaar  set efm&vim
27092b946c9fSBram Moolenaarendfunc
271063bed3d3SBram Moolenaar
27112b946c9fSBram Moolenaarfunc Test_caddbuffer_wrong()
27122b946c9fSBram Moolenaar  " This used to cause a memory access in freed memory.
271363bed3d3SBram Moolenaar  let save_efm = &efm
271463bed3d3SBram Moolenaar  set efm=%EEEE%m,%WWWW,%+CCCC%>%#,%GGGG%.#
271563bed3d3SBram Moolenaar  cgetexpr ['WWWW', 'EEEE', 'CCCC']
271663bed3d3SBram Moolenaar  let &efm = save_efm
27172b946c9fSBram Moolenaar  caddbuffer
271863bed3d3SBram Moolenaar  bwipe!
271963bed3d3SBram Moolenaarendfunc
27202b946c9fSBram Moolenaar
27212b946c9fSBram Moolenaarfunc Test_caddexpr_wrong()
27222b946c9fSBram Moolenaar  " This used to cause a memory access in freed memory.
27232b946c9fSBram Moolenaar  cbuffer
27242b946c9fSBram Moolenaar  cbuffer
27252b946c9fSBram Moolenaar  copen
27262b946c9fSBram Moolenaar  let save_efm = &efm
27272b946c9fSBram Moolenaar  set efm=%
27282b946c9fSBram Moolenaar  call assert_fails('caddexpr ""', 'E376:')
27292b946c9fSBram Moolenaar  let &efm = save_efm
27302b946c9fSBram Moolenaarendfunc
27317618e00dSBram Moolenaar
27327618e00dSBram Moolenaarfunc Test_dirstack_cleanup()
27337618e00dSBram Moolenaar  " This used to cause a memory access in freed memory.
27347618e00dSBram Moolenaar  let save_efm = &efm
27357618e00dSBram Moolenaar  lexpr '0'
27367618e00dSBram Moolenaar  lopen
27377618e00dSBram Moolenaar  fun X(c)
27387618e00dSBram Moolenaar    let save_efm=&efm
27397618e00dSBram Moolenaar    set efm=%D%f
27407618e00dSBram Moolenaar    if a:c == 'c'
27417618e00dSBram Moolenaar      caddexpr '::'
27427618e00dSBram Moolenaar    else
27437618e00dSBram Moolenaar      laddexpr ':0:0'
27447618e00dSBram Moolenaar    endif
27457618e00dSBram Moolenaar    let &efm=save_efm
27467618e00dSBram Moolenaar  endfun
27477618e00dSBram Moolenaar  call X('c')
27487618e00dSBram Moolenaar  call X('l')
27497618e00dSBram Moolenaar  call setqflist([], 'r')
27507618e00dSBram Moolenaar  caddbuffer
27517618e00dSBram Moolenaar  let &efm = save_efm
27527618e00dSBram Moolenaarendfunc
2753391b1dd0SBram Moolenaar
2754391b1dd0SBram Moolenaar" Tests for jumping to entries from the location list window and quickfix
2755391b1dd0SBram Moolenaar" window
2756391b1dd0SBram Moolenaarfunc Test_cwindow_jump()
2757391b1dd0SBram Moolenaar  set efm=%f%%%l%%%m
2758391b1dd0SBram Moolenaar  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2759391b1dd0SBram Moolenaar  lopen | only
2760391b1dd0SBram Moolenaar  lfirst
2761391b1dd0SBram Moolenaar  call assert_true(winnr('$') == 2)
2762391b1dd0SBram Moolenaar  call assert_true(winnr() == 1)
2763391b1dd0SBram Moolenaar  " Location list for the new window should be set
2764391b1dd0SBram Moolenaar  call assert_true(getloclist(0)[2].text == 'Line 30')
2765391b1dd0SBram Moolenaar
2766391b1dd0SBram Moolenaar  " Open a scratch buffer
2767391b1dd0SBram Moolenaar  " Open a new window and create a location list
2768391b1dd0SBram Moolenaar  " Open the location list window and close the other window
2769391b1dd0SBram Moolenaar  " Jump to an entry.
2770eeb1b9c7SBram Moolenaar  " Should create a new window and jump to the entry. The scratch buffer
2771391b1dd0SBram Moolenaar  " should not be used.
2772391b1dd0SBram Moolenaar  enew | only
2773391b1dd0SBram Moolenaar  set buftype=nofile
2774391b1dd0SBram Moolenaar  below new
2775391b1dd0SBram Moolenaar  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2776391b1dd0SBram Moolenaar  lopen
2777391b1dd0SBram Moolenaar  2wincmd c
2778391b1dd0SBram Moolenaar  lnext
2779391b1dd0SBram Moolenaar  call assert_true(winnr('$') == 3)
2780391b1dd0SBram Moolenaar  call assert_true(winnr() == 2)
2781391b1dd0SBram Moolenaar
2782391b1dd0SBram Moolenaar  " Open two windows with two different location lists
2783391b1dd0SBram Moolenaar  " Open the location list window and close the previous window
2784391b1dd0SBram Moolenaar  " Jump to an entry in the location list window
2785391b1dd0SBram Moolenaar  " Should open the file in the first window and not set the location list.
2786391b1dd0SBram Moolenaar  enew | only
2787391b1dd0SBram Moolenaar  lgetexpr ["F1%5%Line 5"]
2788391b1dd0SBram Moolenaar  below new
2789391b1dd0SBram Moolenaar  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2790391b1dd0SBram Moolenaar  lopen
2791391b1dd0SBram Moolenaar  2wincmd c
2792391b1dd0SBram Moolenaar  lnext
2793391b1dd0SBram Moolenaar  call assert_true(winnr() == 1)
2794391b1dd0SBram Moolenaar  call assert_true(getloclist(0)[0].text == 'Line 5')
2795391b1dd0SBram Moolenaar
2796391b1dd0SBram Moolenaar  enew | only
2797391b1dd0SBram Moolenaar  cgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2798391b1dd0SBram Moolenaar  copen
2799391b1dd0SBram Moolenaar  cnext
2800391b1dd0SBram Moolenaar  call assert_true(winnr('$') == 2)
2801391b1dd0SBram Moolenaar  call assert_true(winnr() == 1)
2802391b1dd0SBram Moolenaar
2803f9ae154cSBram Moolenaar  " open the quickfix buffer in two windows and jump to an entry. Should open
2804f9ae154cSBram Moolenaar  " the file in the first quickfix window.
2805f9ae154cSBram Moolenaar  enew | only
2806f9ae154cSBram Moolenaar  copen
2807f9ae154cSBram Moolenaar  let bnum = bufnr('')
2808f9ae154cSBram Moolenaar  exe 'sbuffer ' . bnum
2809f9ae154cSBram Moolenaar  wincmd b
2810f9ae154cSBram Moolenaar  cfirst
2811f9ae154cSBram Moolenaar  call assert_equal(2, winnr())
2812bdd2c290SBram Moolenaar  call assert_equal('F1', @%)
2813f9ae154cSBram Moolenaar  enew | only
2814f9ae154cSBram Moolenaar  exe 'sb' bnum
2815f9ae154cSBram Moolenaar  exe 'botright sb' bnum
2816f9ae154cSBram Moolenaar  wincmd t
2817f9ae154cSBram Moolenaar  clast
2818f9ae154cSBram Moolenaar  call assert_equal(2, winnr())
2819f9ae154cSBram Moolenaar  call assert_equal('quickfix', getwinvar(1, '&buftype'))
2820f9ae154cSBram Moolenaar  call assert_equal('quickfix', getwinvar(3, '&buftype'))
2821f9ae154cSBram Moolenaar
28224b96df5aSBram Moolenaar  " Jumping to a file from the location list window should find a usable
282315a7bdcbSBram Moolenaar  " window by wrapping around the window list.
282415a7bdcbSBram Moolenaar  enew | only
282515a7bdcbSBram Moolenaar  call setloclist(0, [], 'f')
282615a7bdcbSBram Moolenaar  new | new
282715a7bdcbSBram Moolenaar  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
282815a7bdcbSBram Moolenaar  lopen
282915a7bdcbSBram Moolenaar  1close
283015a7bdcbSBram Moolenaar  call assert_equal(0, getloclist(3, {'id' : 0}).id)
283115a7bdcbSBram Moolenaar  lnext
283215a7bdcbSBram Moolenaar  call assert_equal(3, winnr())
283315a7bdcbSBram Moolenaar  call assert_equal(getloclist(1, {'id' : 0}).id, getloclist(3, {'id' : 0}).id)
283415a7bdcbSBram Moolenaar
2835391b1dd0SBram Moolenaar  enew | only
2836391b1dd0SBram Moolenaar  set efm&vim
2837391b1dd0SBram Moolenaarendfunc
2838ee85df37SBram Moolenaar
2839e00fdf35SBram Moolenaarfunc Test_cwindow_highlight()
2840e00fdf35SBram Moolenaar  CheckScreendump
2841e00fdf35SBram Moolenaar
2842e00fdf35SBram Moolenaar  let lines =<< trim END
2843e00fdf35SBram Moolenaar	call setline(1, ['some', 'text', 'with', 'matches'])
2844e00fdf35SBram Moolenaar	write XCwindow
2845e00fdf35SBram Moolenaar	vimgrep e XCwindow
2846e00fdf35SBram Moolenaar	redraw
2847e00fdf35SBram Moolenaar	cwindow 4
2848e00fdf35SBram Moolenaar  END
2849e00fdf35SBram Moolenaar  call writefile(lines, 'XtestCwindow')
2850e00fdf35SBram Moolenaar  let buf = RunVimInTerminal('-S XtestCwindow', #{rows: 12})
2851e00fdf35SBram Moolenaar  call VerifyScreenDump(buf, 'Test_quickfix_cwindow_1', {})
2852e00fdf35SBram Moolenaar
2853e00fdf35SBram Moolenaar  call term_sendkeys(buf, ":cnext\<CR>")
2854e00fdf35SBram Moolenaar  call VerifyScreenDump(buf, 'Test_quickfix_cwindow_2', {})
2855e00fdf35SBram Moolenaar
2856e00fdf35SBram Moolenaar  " clean up
2857e00fdf35SBram Moolenaar  call StopVimInTerminal(buf)
2858e00fdf35SBram Moolenaar  call delete('XtestCwindow')
2859e00fdf35SBram Moolenaar  call delete('XCwindow')
2860e00fdf35SBram Moolenaarendfunc
2861e00fdf35SBram Moolenaar
2862ee85df37SBram Moolenaarfunc XvimgrepTests(cchar)
2863ee85df37SBram Moolenaar  call s:setup_commands(a:cchar)
2864ee85df37SBram Moolenaar
2865ee85df37SBram Moolenaar  call writefile(['Editor:VIM vim',
2866ee85df37SBram Moolenaar	      \ 'Editor:Emacs EmAcS',
2867ee85df37SBram Moolenaar	      \ 'Editor:Notepad NOTEPAD'], 'Xtestfile1')
2868ee85df37SBram Moolenaar  call writefile(['Linux', 'MacOS', 'MS-Windows'], 'Xtestfile2')
2869ee85df37SBram Moolenaar
2870ee85df37SBram Moolenaar  " Error cases
2871ee85df37SBram Moolenaar  call assert_fails('Xvimgrep /abc *', 'E682:')
2872ee85df37SBram Moolenaar
2873ee85df37SBram Moolenaar  let @/=''
2874ee85df37SBram Moolenaar  call assert_fails('Xvimgrep // *', 'E35:')
2875ee85df37SBram Moolenaar
2876ee85df37SBram Moolenaar  call assert_fails('Xvimgrep abc', 'E683:')
2877ee85df37SBram Moolenaar  call assert_fails('Xvimgrep a1b2c3 Xtestfile1', 'E480:')
2878ee85df37SBram Moolenaar  call assert_fails('Xvimgrep pat Xa1b2c3', 'E480:')
2879ee85df37SBram Moolenaar
2880ee85df37SBram Moolenaar  Xexpr ""
2881ee85df37SBram Moolenaar  Xvimgrepadd Notepad Xtestfile1
2882ee85df37SBram Moolenaar  Xvimgrepadd MacOS Xtestfile2
2883ee85df37SBram Moolenaar  let l = g:Xgetlist()
2884ee85df37SBram Moolenaar  call assert_equal(2, len(l))
2885ee85df37SBram Moolenaar  call assert_equal('Editor:Notepad NOTEPAD', l[0].text)
2886ee85df37SBram Moolenaar
2887f9ae154cSBram Moolenaar  10Xvimgrep #\cvim#g Xtestfile?
2888ee85df37SBram Moolenaar  let l = g:Xgetlist()
2889ee85df37SBram Moolenaar  call assert_equal(2, len(l))
2890ee85df37SBram Moolenaar  call assert_equal(8, l[0].col)
28916864efa5Sthinca  call assert_equal(11, l[0].end_col)
2892ee85df37SBram Moolenaar  call assert_equal(12, l[1].col)
28936864efa5Sthinca  call assert_equal(15, l[1].end_col)
2894ee85df37SBram Moolenaar
2895ee85df37SBram Moolenaar  1Xvimgrep ?Editor? Xtestfile*
2896ee85df37SBram Moolenaar  let l = g:Xgetlist()
2897ee85df37SBram Moolenaar  call assert_equal(1, len(l))
2898ee85df37SBram Moolenaar  call assert_equal('Editor:VIM vim', l[0].text)
2899ee85df37SBram Moolenaar
2900ee85df37SBram Moolenaar  edit +3 Xtestfile2
2901ee85df37SBram Moolenaar  Xvimgrep +\cemacs+j Xtestfile1
2902ee85df37SBram Moolenaar  let l = g:Xgetlist()
2903bdd2c290SBram Moolenaar  call assert_equal('Xtestfile2', @%)
2904ee85df37SBram Moolenaar  call assert_equal('Editor:Emacs EmAcS', l[0].text)
2905ee85df37SBram Moolenaar
29062225ebb4SBram Moolenaar  " Test for unloading a buffer after vimgrep searched the buffer
29072225ebb4SBram Moolenaar  %bwipe
29082225ebb4SBram Moolenaar  Xvimgrep /Editor/j Xtestfile*
29092225ebb4SBram Moolenaar  call assert_equal(0, getbufinfo('Xtestfile1')[0].loaded)
29102225ebb4SBram Moolenaar  call assert_equal([], getbufinfo('Xtestfile2'))
29112225ebb4SBram Moolenaar
2912ee85df37SBram Moolenaar  call delete('Xtestfile1')
2913ee85df37SBram Moolenaar  call delete('Xtestfile2')
2914ee85df37SBram Moolenaarendfunc
2915ee85df37SBram Moolenaar
2916ee85df37SBram Moolenaar" Tests for the :vimgrep command
2917ee85df37SBram Moolenaarfunc Test_vimgrep()
2918ee85df37SBram Moolenaar  call XvimgrepTests('c')
2919ee85df37SBram Moolenaar  call XvimgrepTests('l')
2920ee85df37SBram Moolenaarendfunc
292169f40be6SBram Moolenaar
2922f8c6a171SBram Moolenaarfunc Test_vimgrep_wildcards_expanded_once()
2923f8c6a171SBram Moolenaar  new X[id-01] file.txt
2924f8c6a171SBram Moolenaar  call setline(1, 'some text to search for')
2925f8c6a171SBram Moolenaar  vimgrep text %
2926f8c6a171SBram Moolenaar  bwipe!
2927f8c6a171SBram Moolenaarendfunc
2928f8c6a171SBram Moolenaar
29291c299434SBram Moolenaar" Test for incsearch highlighting of the :vimgrep pattern
29301c299434SBram Moolenaar" This test used to cause "E315: ml_get: invalid lnum" errors.
29311c299434SBram Moolenaarfunc Test_vimgrep_incsearch()
29321c299434SBram Moolenaar  enew
29331c299434SBram Moolenaar  set incsearch
29341c299434SBram Moolenaar  call test_override("char_avail", 1)
29351c299434SBram Moolenaar
29361c299434SBram Moolenaar  call feedkeys(":2vimgrep assert test_quickfix.vim test_cdo.vim\<CR>", "ntx")
29371c299434SBram Moolenaar  let l = getqflist()
29381c299434SBram Moolenaar  call assert_equal(2, len(l))
29391c299434SBram Moolenaar
29401c299434SBram Moolenaar  call test_override("ALL", 0)
29411c299434SBram Moolenaar  set noincsearch
29421c299434SBram Moolenaarendfunc
29431c299434SBram Moolenaar
29449f6277bdSBram Moolenaar" Test vimgrep with the last search pattern not set
29459f6277bdSBram Moolenaarfunc Test_vimgrep_with_no_last_search_pat()
29469f6277bdSBram Moolenaar  let lines =<< trim [SCRIPT]
29479f6277bdSBram Moolenaar    call assert_fails('vimgrep // *', 'E35:')
29489f6277bdSBram Moolenaar    call writefile(v:errors, 'Xresult')
29499f6277bdSBram Moolenaar    qall!
29509f6277bdSBram Moolenaar  [SCRIPT]
29519f6277bdSBram Moolenaar  call writefile(lines, 'Xscript')
29529f6277bdSBram Moolenaar  if RunVim([], [], '--clean -S Xscript')
29539f6277bdSBram Moolenaar    call assert_equal([], readfile('Xresult'))
29549f6277bdSBram Moolenaar  endif
29559f6277bdSBram Moolenaar  call delete('Xscript')
29569f6277bdSBram Moolenaar  call delete('Xresult')
29579f6277bdSBram Moolenaarendfunc
29589f6277bdSBram Moolenaar
2959997cd1a1SBram Moolenaar" Test vimgrep without swap file
2960997cd1a1SBram Moolenaarfunc Test_vimgrep_without_swap_file()
2961997cd1a1SBram Moolenaar  let lines =<< trim [SCRIPT]
2962997cd1a1SBram Moolenaar    vimgrep grep test_c*
2963997cd1a1SBram Moolenaar    call writefile(['done'], 'Xresult')
2964997cd1a1SBram Moolenaar    qall!
2965997cd1a1SBram Moolenaar  [SCRIPT]
2966997cd1a1SBram Moolenaar  call writefile(lines, 'Xscript')
2967997cd1a1SBram Moolenaar  if RunVim([], [], '--clean -n -S Xscript Xscript')
2968997cd1a1SBram Moolenaar    call assert_equal(['done'], readfile('Xresult'))
2969997cd1a1SBram Moolenaar  endif
2970997cd1a1SBram Moolenaar  call delete('Xscript')
2971997cd1a1SBram Moolenaar  call delete('Xresult')
2972997cd1a1SBram Moolenaarendfunc
2973997cd1a1SBram Moolenaar
29748ce4b7edSBram Moolenaarfunc Test_vimgrep_existing_swapfile()
29758ce4b7edSBram Moolenaar  call writefile(['match apple with apple'], 'Xapple')
29768ce4b7edSBram Moolenaar  call writefile(['swapfile'], '.Xapple.swp')
29778ce4b7edSBram Moolenaar  let g:foundSwap = 0
29788ce4b7edSBram Moolenaar  let g:ignoreSwapExists = 1
29798ce4b7edSBram Moolenaar  augroup grep
29808ce4b7edSBram Moolenaar    au SwapExists * let foundSwap = 1 | let v:swapchoice = 'e'
29818ce4b7edSBram Moolenaar  augroup END
29828ce4b7edSBram Moolenaar  vimgrep apple Xapple
29838ce4b7edSBram Moolenaar  call assert_equal(1, g:foundSwap)
29848ce4b7edSBram Moolenaar  call assert_match('.Xapple.swo', swapname(''))
29858ce4b7edSBram Moolenaar
29868ce4b7edSBram Moolenaar  call delete('Xapple')
29876d91bcb4SBram Moolenaar  call delete('.Xapple.swp')
29888ce4b7edSBram Moolenaar  augroup grep
29898ce4b7edSBram Moolenaar    au! SwapExists
29908ce4b7edSBram Moolenaar  augroup END
29918ce4b7edSBram Moolenaar  unlet g:ignoreSwapExists
29928ce4b7edSBram Moolenaarendfunc
29938ce4b7edSBram Moolenaar
299469f40be6SBram Moolenaarfunc XfreeTests(cchar)
299569f40be6SBram Moolenaar  call s:setup_commands(a:cchar)
299669f40be6SBram Moolenaar
299769f40be6SBram Moolenaar  enew | only
299869f40be6SBram Moolenaar
299969f40be6SBram Moolenaar  " Deleting the quickfix stack should work even When the current list is
300069f40be6SBram Moolenaar  " somewhere in the middle of the stack
300169f40be6SBram Moolenaar  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
300269f40be6SBram Moolenaar  Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
300369f40be6SBram Moolenaar  Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
300469f40be6SBram Moolenaar  Xolder
300569f40be6SBram Moolenaar  call g:Xsetlist([], 'f')
300669f40be6SBram Moolenaar  call assert_equal(0, len(g:Xgetlist()))
300769f40be6SBram Moolenaar
300869f40be6SBram Moolenaar  " After deleting the stack, adding a new list should create a stack with a
300969f40be6SBram Moolenaar  " single list.
301069f40be6SBram Moolenaar  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
301169f40be6SBram Moolenaar  call assert_equal(1, g:Xgetlist({'all':1}).nr)
301269f40be6SBram Moolenaar
301369f40be6SBram Moolenaar  " Deleting the stack from a quickfix window should update/clear the
301469f40be6SBram Moolenaar  " quickfix/location list window.
301569f40be6SBram Moolenaar  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
301669f40be6SBram Moolenaar  Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
301769f40be6SBram Moolenaar  Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
301869f40be6SBram Moolenaar  Xolder
301969f40be6SBram Moolenaar  Xwindow
302069f40be6SBram Moolenaar  call g:Xsetlist([], 'f')
302169f40be6SBram Moolenaar  call assert_equal(2, winnr('$'))
302269f40be6SBram Moolenaar  call assert_equal(1, line('$'))
302369f40be6SBram Moolenaar  Xclose
302469f40be6SBram Moolenaar
302569f40be6SBram Moolenaar  " Deleting the stack from a non-quickfix window should update/clear the
302669f40be6SBram Moolenaar  " quickfix/location list window.
302769f40be6SBram Moolenaar  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
302869f40be6SBram Moolenaar  Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
302969f40be6SBram Moolenaar  Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
303069f40be6SBram Moolenaar  Xolder
303169f40be6SBram Moolenaar  Xwindow
303269f40be6SBram Moolenaar  wincmd p
303369f40be6SBram Moolenaar  call g:Xsetlist([], 'f')
303469f40be6SBram Moolenaar  call assert_equal(0, len(g:Xgetlist()))
303569f40be6SBram Moolenaar  wincmd p
303669f40be6SBram Moolenaar  call assert_equal(2, winnr('$'))
303769f40be6SBram Moolenaar  call assert_equal(1, line('$'))
303869f40be6SBram Moolenaar
303969f40be6SBram Moolenaar  " After deleting the location list stack, if the location list window is
304069f40be6SBram Moolenaar  " opened, then a new location list should be created. So opening the
304169f40be6SBram Moolenaar  " location list window again should not create a new window.
304269f40be6SBram Moolenaar  if a:cchar == 'l'
304369f40be6SBram Moolenaar      lexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
304469f40be6SBram Moolenaar      wincmd p
304569f40be6SBram Moolenaar      lopen
304669f40be6SBram Moolenaar      call assert_equal(2, winnr('$'))
304769f40be6SBram Moolenaar  endif
304869f40be6SBram Moolenaar  Xclose
304969f40be6SBram Moolenaarendfunc
305069f40be6SBram Moolenaar
305174240d3fSBram Moolenaar" Tests for the quickfix free functionality
305269f40be6SBram Moolenaarfunc Test_qf_free()
305369f40be6SBram Moolenaar  call XfreeTests('c')
305469f40be6SBram Moolenaar  call XfreeTests('l')
305569f40be6SBram Moolenaarendfunc
30566e62da3eSBram Moolenaar
30576e62da3eSBram Moolenaar" Test for buffer overflow when parsing lines and adding new entries to
30586e62da3eSBram Moolenaar" the quickfix list.
30596e62da3eSBram Moolenaarfunc Test_bufoverflow()
30606e62da3eSBram Moolenaar  set efm=%f:%l:%m
30616e62da3eSBram Moolenaar  cgetexpr ['File1:100:' . repeat('x', 1025)]
30626e62da3eSBram Moolenaar
30636e62da3eSBram Moolenaar  set efm=%+GCompiler:\ %.%#,%f:%l:%m
30646e62da3eSBram Moolenaar  cgetexpr ['Compiler: ' . repeat('a', 1015), 'File1:10:Hello World']
30656e62da3eSBram Moolenaar
30666e62da3eSBram Moolenaar  set efm=%DEntering\ directory\ %f,%f:%l:%m
30676e62da3eSBram Moolenaar  cgetexpr ['Entering directory ' . repeat('a', 1006),
30686e62da3eSBram Moolenaar	      \ 'File1:10:Hello World']
30696e62da3eSBram Moolenaar  set efm&vim
30706e62da3eSBram Moolenaarendfunc
30716e62da3eSBram Moolenaar
3072875feea6SBram Moolenaar" Tests for getting the quickfix stack size
3073875feea6SBram Moolenaarfunc XsizeTests(cchar)
3074875feea6SBram Moolenaar  call s:setup_commands(a:cchar)
3075875feea6SBram Moolenaar
3076875feea6SBram Moolenaar  call g:Xsetlist([], 'f')
3077875feea6SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
3078a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'nr':'$', 'all':1}).title)
3079a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr':0}).nr)
3080875feea6SBram Moolenaar
3081875feea6SBram Moolenaar  Xexpr "File1:10:Line1"
3082875feea6SBram Moolenaar  Xexpr "File2:20:Line2"
3083875feea6SBram Moolenaar  Xexpr "File3:30:Line3"
3084875feea6SBram Moolenaar  Xolder | Xolder
3085875feea6SBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
3086875feea6SBram Moolenaar  call g:Xsetlist([], 'f')
3087875feea6SBram Moolenaar
3088875feea6SBram Moolenaar  Xexpr "File1:10:Line1"
3089875feea6SBram Moolenaar  Xexpr "File2:20:Line2"
3090875feea6SBram Moolenaar  Xexpr "File3:30:Line3"
3091875feea6SBram Moolenaar  Xolder | Xolder
3092875feea6SBram Moolenaar  call g:Xsetlist([], 'a', {'nr':'$', 'title':'Compiler'})
3093875feea6SBram Moolenaar  call assert_equal('Compiler', g:Xgetlist({'nr':3, 'all':1}).title)
3094875feea6SBram Moolenaarendfunc
3095875feea6SBram Moolenaar
3096875feea6SBram Moolenaarfunc Test_Qf_Size()
3097875feea6SBram Moolenaar  call XsizeTests('c')
3098875feea6SBram Moolenaar  call XsizeTests('l')
3099875feea6SBram Moolenaarendfunc
31001814183bSBram Moolenaar
31019c4fefffSBram Moolenaarfunc Test_cclose_from_copen()
31029c4fefffSBram Moolenaar    augroup QF_Test
31039c4fefffSBram Moolenaar	au!
3104e2e4075fSBram Moolenaar        au FileType qf :call assert_fails(':cclose', 'E788:')
31059c4fefffSBram Moolenaar    augroup END
31069c4fefffSBram Moolenaar    copen
31079c4fefffSBram Moolenaar    augroup QF_Test
31089c4fefffSBram Moolenaar	au!
31099c4fefffSBram Moolenaar    augroup END
31109c4fefffSBram Moolenaar    augroup! QF_Test
31119c4fefffSBram Moolenaarendfunc
31129c4fefffSBram Moolenaar
31131814183bSBram Moolenaarfunc Test_cclose_in_autocmd()
31141814183bSBram Moolenaar  " Problem is only triggered if "starting" is zero, so that the OptionsSet
31151814183bSBram Moolenaar  " event will be triggered.
31161814183bSBram Moolenaar  call test_override('starting', 1)
31171814183bSBram Moolenaar  augroup QF_Test
31181814183bSBram Moolenaar    au!
3119e2e4075fSBram Moolenaar    au FileType qf :call assert_fails(':cclose', 'E788:')
31201814183bSBram Moolenaar  augroup END
31211814183bSBram Moolenaar  copen
31221814183bSBram Moolenaar  augroup QF_Test
31231814183bSBram Moolenaar    au!
31241814183bSBram Moolenaar  augroup END
31251814183bSBram Moolenaar  augroup! QF_Test
31261814183bSBram Moolenaar  call test_override('starting', 0)
31271814183bSBram Moolenaarendfunc
31289c4fefffSBram Moolenaar
3129379fb76bSBram Moolenaar" Check that ":file" without an argument is possible even when "curbuf_lock"
3130379fb76bSBram Moolenaar" is set.
3131379fb76bSBram Moolenaarfunc Test_file_from_copen()
3132379fb76bSBram Moolenaar  " Works without argument.
3133379fb76bSBram Moolenaar  augroup QF_Test
3134379fb76bSBram Moolenaar    au!
3135379fb76bSBram Moolenaar    au FileType qf file
3136379fb76bSBram Moolenaar  augroup END
3137379fb76bSBram Moolenaar  copen
3138379fb76bSBram Moolenaar
3139379fb76bSBram Moolenaar  augroup QF_Test
3140379fb76bSBram Moolenaar    au!
3141379fb76bSBram Moolenaar  augroup END
3142379fb76bSBram Moolenaar  cclose
3143379fb76bSBram Moolenaar
3144379fb76bSBram Moolenaar  " Fails with argument.
3145379fb76bSBram Moolenaar  augroup QF_Test
3146379fb76bSBram Moolenaar    au!
3147e2e4075fSBram Moolenaar    au FileType qf call assert_fails(':file foo', 'E788:')
3148379fb76bSBram Moolenaar  augroup END
3149379fb76bSBram Moolenaar  copen
3150379fb76bSBram Moolenaar  augroup QF_Test
3151379fb76bSBram Moolenaar    au!
3152379fb76bSBram Moolenaar  augroup END
3153379fb76bSBram Moolenaar  cclose
3154379fb76bSBram Moolenaar
3155379fb76bSBram Moolenaar  augroup! QF_Test
31566a0cc916SBram Moolenaarendfunc
3157379fb76bSBram Moolenaar
31589c4fefffSBram Moolenaarfunc Test_resize_from_copen()
31599c4fefffSBram Moolenaar  augroup QF_Test
31609c4fefffSBram Moolenaar    au!
31619c4fefffSBram Moolenaar    au FileType qf resize 5
31629c4fefffSBram Moolenaar  augroup END
31639c4fefffSBram Moolenaar  try
31649c4fefffSBram Moolenaar    " This should succeed without any exception.  No other buffers are
31659c4fefffSBram Moolenaar    " involved in the autocmd.
31669c4fefffSBram Moolenaar    copen
31679c4fefffSBram Moolenaar  finally
31689c4fefffSBram Moolenaar    augroup QF_Test
31699c4fefffSBram Moolenaar      au!
31709c4fefffSBram Moolenaar    augroup END
31719c4fefffSBram Moolenaar    augroup! QF_Test
31729c4fefffSBram Moolenaar  endtry
31739c4fefffSBram Moolenaarendfunc
3174a8788f4dSBram Moolenaar
317533aecb1fSBram Moolenaarfunc Test_vimgrep_with_textlock()
317633aecb1fSBram Moolenaar  new
317733aecb1fSBram Moolenaar
317833aecb1fSBram Moolenaar  " Simple way to execute something with "textwinlock" set.
317933aecb1fSBram Moolenaar  " Check that vimgrep without jumping can be executed.
318033aecb1fSBram Moolenaar  au InsertCharPre * vimgrep /RunTheTest/j runtest.vim
318133aecb1fSBram Moolenaar  normal ax
318233aecb1fSBram Moolenaar  let qflist = getqflist()
318333aecb1fSBram Moolenaar  call assert_true(len(qflist) > 0)
318433aecb1fSBram Moolenaar  call assert_match('RunTheTest', qflist[0].text)
318533aecb1fSBram Moolenaar  call setqflist([], 'r')
318633aecb1fSBram Moolenaar  au! InsertCharPre
318733aecb1fSBram Moolenaar
318833aecb1fSBram Moolenaar  " Check that vimgrepadd without jumping can be executed.
318933aecb1fSBram Moolenaar  au InsertCharPre * vimgrepadd /RunTheTest/j runtest.vim
319033aecb1fSBram Moolenaar  normal ax
319133aecb1fSBram Moolenaar  let qflist = getqflist()
319233aecb1fSBram Moolenaar  call assert_true(len(qflist) > 0)
319333aecb1fSBram Moolenaar  call assert_match('RunTheTest', qflist[0].text)
319433aecb1fSBram Moolenaar  call setqflist([], 'r')
319533aecb1fSBram Moolenaar  au! InsertCharPre
319633aecb1fSBram Moolenaar
319733aecb1fSBram Moolenaar  " Check that lvimgrep without jumping can be executed.
319833aecb1fSBram Moolenaar  au InsertCharPre * lvimgrep /RunTheTest/j runtest.vim
319933aecb1fSBram Moolenaar  normal ax
320033aecb1fSBram Moolenaar  let qflist = getloclist(0)
320133aecb1fSBram Moolenaar  call assert_true(len(qflist) > 0)
320233aecb1fSBram Moolenaar  call assert_match('RunTheTest', qflist[0].text)
320333aecb1fSBram Moolenaar  call setloclist(0, [], 'r')
320433aecb1fSBram Moolenaar  au! InsertCharPre
320533aecb1fSBram Moolenaar
320633aecb1fSBram Moolenaar  " Check that lvimgrepadd without jumping can be executed.
320733aecb1fSBram Moolenaar  au InsertCharPre * lvimgrepadd /RunTheTest/j runtest.vim
320833aecb1fSBram Moolenaar  normal ax
320933aecb1fSBram Moolenaar  let qflist = getloclist(0)
321033aecb1fSBram Moolenaar  call assert_true(len(qflist) > 0)
321133aecb1fSBram Moolenaar  call assert_match('RunTheTest', qflist[0].text)
321233aecb1fSBram Moolenaar  call setloclist(0, [], 'r')
321333aecb1fSBram Moolenaar  au! InsertCharPre
321433aecb1fSBram Moolenaar
321533aecb1fSBram Moolenaar  " trying to jump will give an error
321633aecb1fSBram Moolenaar  au InsertCharPre * vimgrep /RunTheTest/ runtest.vim
321733aecb1fSBram Moolenaar  call assert_fails('normal ax', 'E565:')
321833aecb1fSBram Moolenaar  au! InsertCharPre
321933aecb1fSBram Moolenaar
322033aecb1fSBram Moolenaar  au InsertCharPre * vimgrepadd /RunTheTest/ runtest.vim
322133aecb1fSBram Moolenaar  call assert_fails('normal ax', 'E565:')
322233aecb1fSBram Moolenaar  au! InsertCharPre
322333aecb1fSBram Moolenaar
322433aecb1fSBram Moolenaar  au InsertCharPre * lvimgrep /RunTheTest/ runtest.vim
322533aecb1fSBram Moolenaar  call assert_fails('normal ax', 'E565:')
322633aecb1fSBram Moolenaar  au! InsertCharPre
322733aecb1fSBram Moolenaar
322833aecb1fSBram Moolenaar  au InsertCharPre * lvimgrepadd /RunTheTest/ runtest.vim
322933aecb1fSBram Moolenaar  call assert_fails('normal ax', 'E565:')
323033aecb1fSBram Moolenaar  au! InsertCharPre
323133aecb1fSBram Moolenaar
323233aecb1fSBram Moolenaar  bwipe!
323333aecb1fSBram Moolenaarendfunc
323433aecb1fSBram Moolenaar
3235a8788f4dSBram Moolenaar" Tests for the quickfix buffer b:changedtick variable
3236a8788f4dSBram Moolenaarfunc Xchangedtick_tests(cchar)
3237a8788f4dSBram Moolenaar  call s:setup_commands(a:cchar)
3238a8788f4dSBram Moolenaar
3239a8788f4dSBram Moolenaar  new | only
3240a8788f4dSBram Moolenaar
3241a8788f4dSBram Moolenaar  Xexpr "" | Xexpr "" | Xexpr ""
3242a8788f4dSBram Moolenaar
3243a8788f4dSBram Moolenaar  Xopen
3244a8788f4dSBram Moolenaar  Xolder
3245a8788f4dSBram Moolenaar  Xolder
3246a8788f4dSBram Moolenaar  Xaddexpr "F1:10:Line10"
3247a8788f4dSBram Moolenaar  Xaddexpr "F2:20:Line20"
3248a8788f4dSBram Moolenaar  call g:Xsetlist([{"filename":"F3", "lnum":30, "text":"Line30"}], 'a')
3249a8788f4dSBram Moolenaar  call g:Xsetlist([], 'f')
3250a8788f4dSBram Moolenaar  call assert_equal(8, getbufvar('%', 'changedtick'))
3251a8788f4dSBram Moolenaar  Xclose
3252a8788f4dSBram Moolenaarendfunc
3253a8788f4dSBram Moolenaar
3254a8788f4dSBram Moolenaarfunc Test_changedtick()
3255a8788f4dSBram Moolenaar  call Xchangedtick_tests('c')
3256a8788f4dSBram Moolenaar  call Xchangedtick_tests('l')
3257a8788f4dSBram Moolenaarendfunc
3258d28cc3f5SBram Moolenaar
3259ae338338SBram Moolenaar" Tests for parsing an expression using setqflist()
3260ae338338SBram Moolenaarfunc Xsetexpr_tests(cchar)
3261ae338338SBram Moolenaar  call s:setup_commands(a:cchar)
3262ae338338SBram Moolenaar
3263ae338338SBram Moolenaar  let t = ["File1:10:Line10", "File1:20:Line20"]
32642c809b7cSBram Moolenaar  call g:Xsetlist([], ' ', {'lines' : t})
32652c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'lines' : ["File1:30:Line30"]})
3266ae338338SBram Moolenaar
3267ae338338SBram Moolenaar  let l = g:Xgetlist()
3268ae338338SBram Moolenaar  call assert_equal(3, len(l))
3269ae338338SBram Moolenaar  call assert_equal(20, l[1].lnum)
3270ae338338SBram Moolenaar  call assert_equal('Line30', l[2].text)
32712c809b7cSBram Moolenaar  call g:Xsetlist([], 'r', {'lines' : ["File2:5:Line5"]})
3272ae338338SBram Moolenaar  let l = g:Xgetlist()
3273ae338338SBram Moolenaar  call assert_equal(1, len(l))
3274ae338338SBram Moolenaar  call assert_equal('Line5', l[0].text)
32752c809b7cSBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : 10}))
32762c809b7cSBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : "F1:10:L10"}))
3277ae338338SBram Moolenaar
3278ae338338SBram Moolenaar  call g:Xsetlist([], 'f')
3279ae338338SBram Moolenaar  " Add entries to multiple lists
32802c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:10:Line10"]})
32812c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:20:Line20"]})
32822c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:15:Line15"]})
32832c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:25:Line25"]})
3284ae338338SBram Moolenaar  call assert_equal('Line15', g:Xgetlist({'nr':1, 'items':1}).items[1].text)
3285ae338338SBram Moolenaar  call assert_equal('Line25', g:Xgetlist({'nr':2, 'items':1}).items[1].text)
328636538225SBram Moolenaar
328736538225SBram Moolenaar  " Adding entries using a custom efm
328836538225SBram Moolenaar  set efm&
328936538225SBram Moolenaar  call g:Xsetlist([], ' ', {'efm' : '%f#%l#%m',
329036538225SBram Moolenaar				\ 'lines' : ["F1#10#L10", "F2#20#L20"]})
329136538225SBram Moolenaar  call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
329236538225SBram Moolenaar  call g:Xsetlist([], 'a', {'efm' : '%f#%l#%m', 'lines' : ["F3:30:L30"]})
329336538225SBram Moolenaar  call assert_equal('F3:30:L30', g:Xgetlist({'items':1}).items[2].text)
329436538225SBram Moolenaar  call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
329536538225SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'efm' : [],
329636538225SBram Moolenaar				\ 'lines' : ['F1:10:L10']}))
3297ae338338SBram Moolenaarendfunc
3298ae338338SBram Moolenaar
3299ae338338SBram Moolenaarfunc Test_setexpr()
3300ae338338SBram Moolenaar  call Xsetexpr_tests('c')
3301ae338338SBram Moolenaar  call Xsetexpr_tests('l')
3302ae338338SBram Moolenaarendfunc
3303ae338338SBram Moolenaar
3304ae338338SBram Moolenaar" Tests for per quickfix/location list directory stack
3305ae338338SBram Moolenaarfunc Xmultidirstack_tests(cchar)
3306ae338338SBram Moolenaar  call s:setup_commands(a:cchar)
3307ae338338SBram Moolenaar
3308ae338338SBram Moolenaar  call g:Xsetlist([], 'f')
3309ae338338SBram Moolenaar  Xexpr "" | Xexpr ""
3310ae338338SBram Moolenaar
33112c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["Entering dir 'Xone/a'"]})
33122c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["Entering dir 'Xtwo/a'"]})
33132c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["one.txt:3:one one one"]})
33142c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["two.txt:5:two two two"]})
3315ae338338SBram Moolenaar
3316ae338338SBram Moolenaar  let l1 = g:Xgetlist({'nr':1, 'items':1})
3317ae338338SBram Moolenaar  let l2 = g:Xgetlist({'nr':2, 'items':1})
3318ae338338SBram Moolenaar  call assert_equal('Xone/a/one.txt', bufname(l1.items[1].bufnr))
3319ae338338SBram Moolenaar  call assert_equal(3, l1.items[1].lnum)
3320ae338338SBram Moolenaar  call assert_equal('Xtwo/a/two.txt', bufname(l2.items[1].bufnr))
3321ae338338SBram Moolenaar  call assert_equal(5, l2.items[1].lnum)
3322ae338338SBram Moolenaarendfunc
3323ae338338SBram Moolenaar
3324ae338338SBram Moolenaarfunc Test_multidirstack()
3325ae338338SBram Moolenaar  call mkdir('Xone/a', 'p')
3326ae338338SBram Moolenaar  call mkdir('Xtwo/a', 'p')
3327ae338338SBram Moolenaar  let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
3328ae338338SBram Moolenaar  call writefile(lines, 'Xone/a/one.txt')
3329ae338338SBram Moolenaar  call writefile(lines, 'Xtwo/a/two.txt')
3330ae338338SBram Moolenaar  let save_efm = &efm
3331ae338338SBram Moolenaar  set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
3332ae338338SBram Moolenaar
3333ae338338SBram Moolenaar  call Xmultidirstack_tests('c')
3334ae338338SBram Moolenaar  call Xmultidirstack_tests('l')
3335ae338338SBram Moolenaar
3336ae338338SBram Moolenaar  let &efm = save_efm
3337ae338338SBram Moolenaar  call delete('Xone', 'rf')
3338ae338338SBram Moolenaar  call delete('Xtwo', 'rf')
3339ae338338SBram Moolenaarendfunc
3340ae338338SBram Moolenaar
3341ae338338SBram Moolenaar" Tests for per quickfix/location list file stack
3342ae338338SBram Moolenaarfunc Xmultifilestack_tests(cchar)
3343ae338338SBram Moolenaar  call s:setup_commands(a:cchar)
3344ae338338SBram Moolenaar
3345ae338338SBram Moolenaar  call g:Xsetlist([], 'f')
3346ae338338SBram Moolenaar  Xexpr "" | Xexpr ""
3347ae338338SBram Moolenaar
33482c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["[one.txt]"]})
33492c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["[two.txt]"]})
33502c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["(3,5) one one one"]})
33512c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["(5,9) two two two"]})
3352ae338338SBram Moolenaar
3353ae338338SBram Moolenaar  let l1 = g:Xgetlist({'nr':1, 'items':1})
3354ae338338SBram Moolenaar  let l2 = g:Xgetlist({'nr':2, 'items':1})
3355ae338338SBram Moolenaar  call assert_equal('one.txt', bufname(l1.items[1].bufnr))
3356ae338338SBram Moolenaar  call assert_equal(3, l1.items[1].lnum)
3357ae338338SBram Moolenaar  call assert_equal('two.txt', bufname(l2.items[1].bufnr))
3358ae338338SBram Moolenaar  call assert_equal(5, l2.items[1].lnum)
3359e333e79fSBram Moolenaar
3360e333e79fSBram Moolenaar  " Test for start of a new error line in the same line where a previous
3361e333e79fSBram Moolenaar  " error line ends with a file stack.
3362e333e79fSBram Moolenaar  let efm_val = 'Error\ l%l\ in\ %f,'
3363e333e79fSBram Moolenaar  let efm_val .= '%-P%>(%f%r,Error\ l%l\ in\ %m,%-Q)%r'
3364e333e79fSBram Moolenaar  let l = g:Xgetlist({'lines' : [
3365e333e79fSBram Moolenaar	      \ '(one.txt',
3366e333e79fSBram Moolenaar	      \ 'Error l4 in one.txt',
3367e333e79fSBram Moolenaar	      \ ') (two.txt',
3368e333e79fSBram Moolenaar	      \ 'Error l6 in two.txt',
3369e333e79fSBram Moolenaar	      \ ')',
3370e333e79fSBram Moolenaar	      \ 'Error l8 in one.txt'
3371e333e79fSBram Moolenaar	      \ ], 'efm' : efm_val})
3372e333e79fSBram Moolenaar  call assert_equal(3, len(l.items))
3373e333e79fSBram Moolenaar  call assert_equal('one.txt', bufname(l.items[0].bufnr))
3374e333e79fSBram Moolenaar  call assert_equal(4, l.items[0].lnum)
3375e333e79fSBram Moolenaar  call assert_equal('one.txt', l.items[0].text)
3376e333e79fSBram Moolenaar  call assert_equal('two.txt', bufname(l.items[1].bufnr))
3377e333e79fSBram Moolenaar  call assert_equal(6, l.items[1].lnum)
3378e333e79fSBram Moolenaar  call assert_equal('two.txt', l.items[1].text)
3379e333e79fSBram Moolenaar  call assert_equal('one.txt', bufname(l.items[2].bufnr))
3380e333e79fSBram Moolenaar  call assert_equal(8, l.items[2].lnum)
3381e333e79fSBram Moolenaar  call assert_equal('', l.items[2].text)
3382ae338338SBram Moolenaarendfunc
3383ae338338SBram Moolenaar
3384ae338338SBram Moolenaarfunc Test_multifilestack()
3385ae338338SBram Moolenaar  let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
3386ae338338SBram Moolenaar  call writefile(lines, 'one.txt')
3387ae338338SBram Moolenaar  call writefile(lines, 'two.txt')
3388ae338338SBram Moolenaar  let save_efm = &efm
3389ae338338SBram Moolenaar  set efm=%+P[%f],(%l\\,%c)\ %m,%-Q
3390ae338338SBram Moolenaar
3391ae338338SBram Moolenaar  call Xmultifilestack_tests('c')
3392ae338338SBram Moolenaar  call Xmultifilestack_tests('l')
3393ae338338SBram Moolenaar
3394ae338338SBram Moolenaar  let &efm = save_efm
3395ae338338SBram Moolenaar  call delete('one.txt')
3396ae338338SBram Moolenaar  call delete('two.txt')
3397ae338338SBram Moolenaarendfunc
3398ae338338SBram Moolenaar
3399ae338338SBram Moolenaar" Tests for per buffer 'efm' setting
3400ae338338SBram Moolenaarfunc Test_perbuf_efm()
3401ae338338SBram Moolenaar  call writefile(["File1-10-Line10"], 'one.txt')
3402ae338338SBram Moolenaar  call writefile(["File2#20#Line20"], 'two.txt')
3403ae338338SBram Moolenaar  set efm=%f#%l#%m
3404ae338338SBram Moolenaar  new | only
3405ae338338SBram Moolenaar  new
3406ae338338SBram Moolenaar  setlocal efm=%f-%l-%m
3407ae338338SBram Moolenaar  cfile one.txt
3408ae338338SBram Moolenaar  wincmd w
3409ae338338SBram Moolenaar  caddfile two.txt
3410ae338338SBram Moolenaar
3411ae338338SBram Moolenaar  let l = getqflist()
3412ae338338SBram Moolenaar  call assert_equal(10, l[0].lnum)
3413ae338338SBram Moolenaar  call assert_equal('Line20', l[1].text)
3414ae338338SBram Moolenaar
3415ae338338SBram Moolenaar  set efm&
3416ae338338SBram Moolenaar  new | only
3417ae338338SBram Moolenaar  call delete('one.txt')
3418ae338338SBram Moolenaar  call delete('two.txt')
3419ae338338SBram Moolenaarendfunc
3420ae338338SBram Moolenaar
3421d28cc3f5SBram Moolenaar" Open multiple help windows using ":lhelpgrep
3422d28cc3f5SBram Moolenaar" This test used to crash Vim
3423d28cc3f5SBram Moolenaarfunc Test_Multi_LL_Help()
3424d28cc3f5SBram Moolenaar  new | only
3425d28cc3f5SBram Moolenaar  lhelpgrep window
3426d28cc3f5SBram Moolenaar  lopen
3427d28cc3f5SBram Moolenaar  e#
3428d28cc3f5SBram Moolenaar  lhelpgrep buffer
3429d28cc3f5SBram Moolenaar  call assert_equal(3, winnr('$'))
3430d28cc3f5SBram Moolenaar  call assert_true(len(getloclist(1)) != 0)
3431d28cc3f5SBram Moolenaar  call assert_true(len(getloclist(2)) != 0)
3432d28cc3f5SBram Moolenaar  new | only
3433d28cc3f5SBram Moolenaarendfunc
343455b69264SBram Moolenaar
343555b69264SBram Moolenaar" Tests for adding new quickfix lists using setqflist()
343655b69264SBram Moolenaarfunc XaddQf_tests(cchar)
343755b69264SBram Moolenaar  call s:setup_commands(a:cchar)
343855b69264SBram Moolenaar
343955b69264SBram Moolenaar  " Create a new list using ' ' for action
344055b69264SBram Moolenaar  call g:Xsetlist([], 'f')
344155b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'title' : 'Test1'})
344255b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
344355b69264SBram Moolenaar  call assert_equal(1, l.nr)
344455b69264SBram Moolenaar  call assert_equal('Test1', l.title)
344555b69264SBram Moolenaar
344655b69264SBram Moolenaar  " Create a new list using ' ' for action and '$' for 'nr'
344755b69264SBram Moolenaar  call g:Xsetlist([], 'f')
344855b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'title' : 'Test2', 'nr' : '$'})
344955b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
345055b69264SBram Moolenaar  call assert_equal(1, l.nr)
345155b69264SBram Moolenaar  call assert_equal('Test2', l.title)
345255b69264SBram Moolenaar
345355b69264SBram Moolenaar  " Create a new list using 'a' for action
345455b69264SBram Moolenaar  call g:Xsetlist([], 'f')
345555b69264SBram Moolenaar  call g:Xsetlist([], 'a', {'title' : 'Test3'})
345655b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
345755b69264SBram Moolenaar  call assert_equal(1, l.nr)
345855b69264SBram Moolenaar  call assert_equal('Test3', l.title)
345955b69264SBram Moolenaar
346055b69264SBram Moolenaar  " Create a new list using 'a' for action and '$' for 'nr'
346155b69264SBram Moolenaar  call g:Xsetlist([], 'f')
346255b69264SBram Moolenaar  call g:Xsetlist([], 'a', {'title' : 'Test3', 'nr' : '$'})
346355b69264SBram Moolenaar  call g:Xsetlist([], 'a', {'title' : 'Test4'})
346455b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
346555b69264SBram Moolenaar  call assert_equal(1, l.nr)
346655b69264SBram Moolenaar  call assert_equal('Test4', l.title)
346755b69264SBram Moolenaar
346855b69264SBram Moolenaar  " Adding a quickfix list should remove all the lists following the current
346955b69264SBram Moolenaar  " list.
347055b69264SBram Moolenaar  Xexpr "" | Xexpr "" | Xexpr ""
347155b69264SBram Moolenaar  silent! 10Xolder
347255b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'title' : 'Test5'})
347355b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
347455b69264SBram Moolenaar  call assert_equal(2, l.nr)
347555b69264SBram Moolenaar  call assert_equal('Test5', l.title)
347655b69264SBram Moolenaar
347755b69264SBram Moolenaar  " Add a quickfix list using '$' as the list number.
347855b69264SBram Moolenaar  let lastqf = g:Xgetlist({'nr':'$'}).nr
347955b69264SBram Moolenaar  silent! 99Xolder
348055b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test6'})
348155b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
348255b69264SBram Moolenaar  call assert_equal(lastqf + 1, l.nr)
348355b69264SBram Moolenaar  call assert_equal('Test6', l.title)
348455b69264SBram Moolenaar
348555b69264SBram Moolenaar  " Add a quickfix list using 'nr' set to one more than the quickfix
348655b69264SBram Moolenaar  " list size.
348755b69264SBram Moolenaar  let lastqf = g:Xgetlist({'nr':'$'}).nr
348855b69264SBram Moolenaar  silent! 99Xolder
348955b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'nr' : lastqf + 1, 'title' : 'Test7'})
349055b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
349155b69264SBram Moolenaar  call assert_equal(lastqf + 1, l.nr)
349255b69264SBram Moolenaar  call assert_equal('Test7', l.title)
349355b69264SBram Moolenaar
349455b69264SBram Moolenaar  " Add a quickfix list to a stack with 10 lists using 'nr' set to '$'
349555b69264SBram Moolenaar  exe repeat('Xexpr "" |', 9) . 'Xexpr ""'
349655b69264SBram Moolenaar  silent! 99Xolder
349755b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test8'})
349855b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
349955b69264SBram Moolenaar  call assert_equal(10, l.nr)
350055b69264SBram Moolenaar  call assert_equal('Test8', l.title)
350155b69264SBram Moolenaar
350255b69264SBram Moolenaar  " Add a quickfix list using 'nr' set to a value greater than 10
350355b69264SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 12, 'title' : 'Test9'}))
350455b69264SBram Moolenaar
350555b69264SBram Moolenaar  " Try adding a quickfix list with 'nr' set to a value greater than the
350655b69264SBram Moolenaar  " quickfix list size but less than 10.
350755b69264SBram Moolenaar  call g:Xsetlist([], 'f')
350855b69264SBram Moolenaar  Xexpr "" | Xexpr "" | Xexpr ""
350955b69264SBram Moolenaar  silent! 99Xolder
351055b69264SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 8, 'title' : 'Test10'}))
351155b69264SBram Moolenaar
351255b69264SBram Moolenaar  " Add a quickfix list using 'nr' set to a some string or list
351355b69264SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : [1,2], 'title' : 'Test11'}))
351455b69264SBram Moolenaarendfunc
351555b69264SBram Moolenaar
351655b69264SBram Moolenaarfunc Test_add_qf()
351755b69264SBram Moolenaar  call XaddQf_tests('c')
351855b69264SBram Moolenaar  call XaddQf_tests('l')
351955b69264SBram Moolenaarendfunc
35207adf06f4SBram Moolenaar
35217adf06f4SBram Moolenaar" Test for getting the quickfix list items from some text without modifying
35227adf06f4SBram Moolenaar" the quickfix stack
35232c809b7cSBram Moolenaarfunc XgetListFromLines(cchar)
35247adf06f4SBram Moolenaar  call s:setup_commands(a:cchar)
35257adf06f4SBram Moolenaar  call g:Xsetlist([], 'f')
35267adf06f4SBram Moolenaar
35272c809b7cSBram Moolenaar  let l = g:Xgetlist({'lines' : ["File2:20:Line20", "File2:30:Line30"]}).items
35287adf06f4SBram Moolenaar  call assert_equal(2, len(l))
35297adf06f4SBram Moolenaar  call assert_equal(30, l[1].lnum)
35307adf06f4SBram Moolenaar
35312c809b7cSBram Moolenaar  call assert_equal({}, g:Xgetlist({'lines' : 10}))
35322c809b7cSBram Moolenaar  call assert_equal({}, g:Xgetlist({'lines' : 'File1:10:Line10'}))
35332c809b7cSBram Moolenaar  call assert_equal([], g:Xgetlist({'lines' : []}).items)
35342c809b7cSBram Moolenaar  call assert_equal([], g:Xgetlist({'lines' : [10, 20]}).items)
35357adf06f4SBram Moolenaar
353636538225SBram Moolenaar  " Parse text using a custom efm
353736538225SBram Moolenaar  set efm&
353836538225SBram Moolenaar  let l = g:Xgetlist({'lines':['File3#30#Line30'], 'efm' : '%f#%l#%m'}).items
353936538225SBram Moolenaar  call assert_equal('Line30', l[0].text)
354036538225SBram Moolenaar  let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : '%f-%l-%m'}).items
354136538225SBram Moolenaar  call assert_equal('File3:30:Line30', l[0].text)
354236538225SBram Moolenaar  let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : [1,2]})
354336538225SBram Moolenaar  call assert_equal({}, l)
354436538225SBram Moolenaar  call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':'%2'})", 'E376:')
354536538225SBram Moolenaar  call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':''})", 'E378:')
354636538225SBram Moolenaar
35477adf06f4SBram Moolenaar  " Make sure that the quickfix stack is not modified
35487adf06f4SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
35497adf06f4SBram Moolenaarendfunc
35507adf06f4SBram Moolenaar
35512c809b7cSBram Moolenaarfunc Test_get_list_from_lines()
35522c809b7cSBram Moolenaar  call XgetListFromLines('c')
35532c809b7cSBram Moolenaar  call XgetListFromLines('l')
35547adf06f4SBram Moolenaarendfunc
3555a539f4f1SBram Moolenaar
3556a539f4f1SBram Moolenaar" Tests for the quickfix list id
3557a539f4f1SBram Moolenaarfunc Xqfid_tests(cchar)
3558a539f4f1SBram Moolenaar  call s:setup_commands(a:cchar)
3559a539f4f1SBram Moolenaar
3560a539f4f1SBram Moolenaar  call g:Xsetlist([], 'f')
3561a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':0}).id)
3562a539f4f1SBram Moolenaar  Xexpr ''
3563a539f4f1SBram Moolenaar  let start_id = g:Xgetlist({'id' : 0}).id
3564a539f4f1SBram Moolenaar  Xexpr '' | Xexpr ''
3565a539f4f1SBram Moolenaar  Xolder
3566a539f4f1SBram Moolenaar  call assert_equal(start_id, g:Xgetlist({'id':0, 'nr':1}).id)
3567a539f4f1SBram Moolenaar  call assert_equal(start_id + 1, g:Xgetlist({'id':0, 'nr':0}).id)
3568a539f4f1SBram Moolenaar  call assert_equal(start_id + 2, g:Xgetlist({'id':0, 'nr':'$'}).id)
3569a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':0, 'nr':99}).id)
3570a539f4f1SBram Moolenaar  call assert_equal(2, g:Xgetlist({'id':start_id + 1, 'nr':0}).nr)
3571a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':99, 'nr':0}).id)
3572a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':"abc", 'nr':0}).id)
3573a539f4f1SBram Moolenaar
3574a539f4f1SBram Moolenaar  call g:Xsetlist([], 'a', {'id':start_id, 'context':[1,2]})
3575a539f4f1SBram Moolenaar  call assert_equal([1,2], g:Xgetlist({'nr':1, 'context':1}).context)
35762c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'id':start_id+1, 'lines':['F1:10:L10']})
3577a539f4f1SBram Moolenaar  call assert_equal('L10', g:Xgetlist({'nr':2, 'items':1}).items[0].text)
3578a539f4f1SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'id':999, 'title':'Vim'}))
3579a539f4f1SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'id':'abc', 'title':'Vim'}))
3580a539f4f1SBram Moolenaar
3581a539f4f1SBram Moolenaar  let qfid = g:Xgetlist({'id':0, 'nr':0})
3582a539f4f1SBram Moolenaar  call g:Xsetlist([], 'f')
3583a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':qfid, 'nr':0}).id)
3584a539f4f1SBram Moolenaarendfunc
3585a539f4f1SBram Moolenaar
3586a539f4f1SBram Moolenaarfunc Test_qf_id()
3587a539f4f1SBram Moolenaar  call Xqfid_tests('c')
3588a539f4f1SBram Moolenaar  call Xqfid_tests('l')
3589a539f4f1SBram Moolenaarendfunc
359074240d3fSBram Moolenaar
359174240d3fSBram Moolenaarfunc Xqfjump_tests(cchar)
359274240d3fSBram Moolenaar  call s:setup_commands(a:cchar)
359374240d3fSBram Moolenaar
359474240d3fSBram Moolenaar  call writefile(["Line1\tFoo", "Line2"], 'F1')
359574240d3fSBram Moolenaar  call writefile(["Line1\tBar", "Line2"], 'F2')
359674240d3fSBram Moolenaar  call writefile(["Line1\tBaz", "Line2"], 'F3')
359774240d3fSBram Moolenaar
359874240d3fSBram Moolenaar  call g:Xsetlist([], 'f')
359974240d3fSBram Moolenaar
360074240d3fSBram Moolenaar  " Tests for
360174240d3fSBram Moolenaar  "   Jumping to a line using a pattern
360274240d3fSBram Moolenaar  "   Jumping to a column greater than the last column in a line
360374240d3fSBram Moolenaar  "   Jumping to a line greater than the last line in the file
360474240d3fSBram Moolenaar  let l = []
360574240d3fSBram Moolenaar  for i in range(1, 7)
360674240d3fSBram Moolenaar    call add(l, {})
360774240d3fSBram Moolenaar  endfor
360874240d3fSBram Moolenaar  let l[0].filename='F1'
360974240d3fSBram Moolenaar  let l[0].pattern='Line1'
361074240d3fSBram Moolenaar  let l[1].filename='F2'
361174240d3fSBram Moolenaar  let l[1].pattern='Line1'
361274240d3fSBram Moolenaar  let l[2].filename='F3'
361374240d3fSBram Moolenaar  let l[2].pattern='Line1'
361474240d3fSBram Moolenaar  let l[3].filename='F3'
361574240d3fSBram Moolenaar  let l[3].lnum=1
361674240d3fSBram Moolenaar  let l[3].col=9
361774240d3fSBram Moolenaar  let l[3].vcol=1
361874240d3fSBram Moolenaar  let l[4].filename='F3'
361974240d3fSBram Moolenaar  let l[4].lnum=99
362074240d3fSBram Moolenaar  let l[5].filename='F3'
362174240d3fSBram Moolenaar  let l[5].lnum=1
362274240d3fSBram Moolenaar  let l[5].col=99
362374240d3fSBram Moolenaar  let l[5].vcol=1
362474240d3fSBram Moolenaar  let l[6].filename='F3'
362574240d3fSBram Moolenaar  let l[6].pattern='abcxyz'
362674240d3fSBram Moolenaar
362774240d3fSBram Moolenaar  call g:Xsetlist([], ' ', {'items' : l})
362874240d3fSBram Moolenaar  Xopen | only
362974240d3fSBram Moolenaar  2Xnext
363074240d3fSBram Moolenaar  call assert_equal(3, g:Xgetlist({'idx' : 0}).idx)
3631bdd2c290SBram Moolenaar  call assert_equal('F3', @%)
363274240d3fSBram Moolenaar  Xnext
363374240d3fSBram Moolenaar  call assert_equal(7, col('.'))
363474240d3fSBram Moolenaar  Xnext
363574240d3fSBram Moolenaar  call assert_equal(2, line('.'))
363674240d3fSBram Moolenaar  Xnext
363774240d3fSBram Moolenaar  call assert_equal(9, col('.'))
363874240d3fSBram Moolenaar  2
363974240d3fSBram Moolenaar  Xnext
364074240d3fSBram Moolenaar  call assert_equal(2, line('.'))
364174240d3fSBram Moolenaar
364274240d3fSBram Moolenaar  if a:cchar == 'l'
364374240d3fSBram Moolenaar    " When jumping to a location list entry in the location list window and
364474240d3fSBram Moolenaar    " no usable windows are available, then a new window should be opened.
364574240d3fSBram Moolenaar    enew! | new | only
364674240d3fSBram Moolenaar    call g:Xsetlist([], 'f')
364774240d3fSBram Moolenaar    setlocal buftype=nofile
364874240d3fSBram Moolenaar    new
364974240d3fSBram 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']})
365074240d3fSBram Moolenaar    Xopen
365174240d3fSBram Moolenaar    let winid = win_getid()
365274240d3fSBram Moolenaar    wincmd p
365374240d3fSBram Moolenaar    close
365474240d3fSBram Moolenaar    call win_gotoid(winid)
365574240d3fSBram Moolenaar    Xnext
365674240d3fSBram Moolenaar    call assert_equal(3, winnr('$'))
365774240d3fSBram Moolenaar    call assert_equal(1, winnr())
365874240d3fSBram Moolenaar    call assert_equal(2, line('.'))
365974240d3fSBram Moolenaar
366074240d3fSBram Moolenaar    " When jumping to an entry in the location list window and the window
366174240d3fSBram Moolenaar    " associated with the location list is not present and a window containing
366274240d3fSBram Moolenaar    " the file is already present, then that window should be used.
366374240d3fSBram Moolenaar    close
366474240d3fSBram Moolenaar    belowright new
366574240d3fSBram Moolenaar    call g:Xsetlist([], 'f')
366674240d3fSBram Moolenaar    edit F3
366774240d3fSBram Moolenaar    call win_gotoid(winid)
366874240d3fSBram Moolenaar    Xlast
366974240d3fSBram Moolenaar    call assert_equal(3, winnr())
367074240d3fSBram Moolenaar    call assert_equal(6, g:Xgetlist({'size' : 1}).size)
367174240d3fSBram Moolenaar    call assert_equal(winid, g:Xgetlist({'winid' : 1}).winid)
367274240d3fSBram Moolenaar  endif
367374240d3fSBram Moolenaar
367474240d3fSBram Moolenaar  " Cleanup
367574240d3fSBram Moolenaar  enew!
367674240d3fSBram Moolenaar  new | only
367774240d3fSBram Moolenaar
367874240d3fSBram Moolenaar  call delete('F1')
367974240d3fSBram Moolenaar  call delete('F2')
368074240d3fSBram Moolenaar  call delete('F3')
368174240d3fSBram Moolenaarendfunc
368274240d3fSBram Moolenaar
368374240d3fSBram Moolenaarfunc Test_qfjump()
368474240d3fSBram Moolenaar  call Xqfjump_tests('c')
368574240d3fSBram Moolenaar  call Xqfjump_tests('l')
368674240d3fSBram Moolenaarendfunc
3687a6d4849cSBram Moolenaar
3688a6d4849cSBram Moolenaar" Tests for the getqflist() and getloclist() functions when the list is not
3689a6d4849cSBram Moolenaar" present or is empty
3690a6d4849cSBram Moolenaarfunc Xgetlist_empty_tests(cchar)
3691a6d4849cSBram Moolenaar  call s:setup_commands(a:cchar)
3692a6d4849cSBram Moolenaar
3693a6d4849cSBram Moolenaar  " Empty quickfix stack
3694a6d4849cSBram Moolenaar  call g:Xsetlist([], 'f')
3695a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'context' : 0}).context)
3696a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : 0}).id)
3697a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
3698a6d4849cSBram Moolenaar  call assert_equal([], g:Xgetlist({'items' : 0}).items)
3699a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 0}).nr)
3700a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'size' : 0}).size)
3701a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'title' : 0}).title)
3702a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
3703b254af31SBram Moolenaar  call assert_equal(0, g:Xgetlist({'changedtick' : 0}).changedtick)
3704c9cc9c78SBram Moolenaar  if a:cchar == 'c'
3705c9cc9c78SBram Moolenaar    call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
3706647e24baSBram Moolenaar		  \ 'items' : [], 'nr' : 0, 'size' : 0, 'qfbufnr' : 0,
3707d43906d2SBram Moolenaar		  \ 'title' : '', 'winid' : 0, 'changedtick': 0,
3708d43906d2SBram Moolenaar                  \ 'quickfixtextfunc' : ''}, g:Xgetlist({'all' : 0}))
3709c9cc9c78SBram Moolenaar  else
3710c9cc9c78SBram Moolenaar    call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
3711c9cc9c78SBram Moolenaar		\ 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '',
3712647e24baSBram Moolenaar		\ 'winid' : 0, 'changedtick': 0, 'filewinid' : 0,
3713d43906d2SBram Moolenaar		\ 'qfbufnr' : 0, 'quickfixtextfunc' : ''},
3714c9cc9c78SBram Moolenaar		\ g:Xgetlist({'all' : 0}))
3715c9cc9c78SBram Moolenaar  endif
3716a6d4849cSBram Moolenaar
37172ec364e9SBram Moolenaar  " Quickfix window with empty stack
37182ec364e9SBram Moolenaar  silent! Xopen
37192ec364e9SBram Moolenaar  let qfwinid = (a:cchar == 'c') ? win_getid() : 0
3720647e24baSBram Moolenaar  let qfbufnr = (a:cchar == 'c') ? bufnr('') : 0
37212ec364e9SBram Moolenaar  call assert_equal(qfwinid, g:Xgetlist({'winid' : 0}).winid)
37222ec364e9SBram Moolenaar  Xclose
37232ec364e9SBram Moolenaar
3724a6d4849cSBram Moolenaar  " Empty quickfix list
3725a6d4849cSBram Moolenaar  Xexpr ""
3726a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'context' : 0}).context)
3727a6d4849cSBram Moolenaar  call assert_notequal(0, g:Xgetlist({'id' : 0}).id)
3728a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
3729a6d4849cSBram Moolenaar  call assert_equal([], g:Xgetlist({'items' : 0}).items)
3730a6d4849cSBram Moolenaar  call assert_notequal(0, g:Xgetlist({'nr' : 0}).nr)
3731a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'size' : 0}).size)
3732a6d4849cSBram Moolenaar  call assert_notequal('', g:Xgetlist({'title' : 0}).title)
3733a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
3734b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3735a6d4849cSBram Moolenaar
3736a6d4849cSBram Moolenaar  let qfid = g:Xgetlist({'id' : 0}).id
3737a6d4849cSBram Moolenaar  call g:Xsetlist([], 'f')
3738a6d4849cSBram Moolenaar
3739a6d4849cSBram Moolenaar  " Non-existing quickfix identifier
3740a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'id' : qfid, 'context' : 0}).context)
3741a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid}).id)
3742a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'idx' : 0}).idx)
3743a6d4849cSBram Moolenaar  call assert_equal([], g:Xgetlist({'id' : qfid, 'items' : 0}).items)
3744a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'nr' : 0}).nr)
3745a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'size' : 0}).size)
3746a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'id' : qfid, 'title' : 0}).title)
3747a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'winid' : 0}).winid)
3748b254af31SBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'changedtick' : 0}).changedtick)
3749c9cc9c78SBram Moolenaar  if a:cchar == 'c'
3750c9cc9c78SBram Moolenaar    call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3751c9cc9c78SBram Moolenaar		\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
3752d43906d2SBram Moolenaar		\ 'qfbufnr' : qfbufnr, 'quickfixtextfunc' : '',
3753c9cc9c78SBram Moolenaar		\ 'changedtick' : 0}, g:Xgetlist({'id' : qfid, 'all' : 0}))
3754c9cc9c78SBram Moolenaar  else
3755c9cc9c78SBram Moolenaar    call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3756c9cc9c78SBram Moolenaar		\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
3757d43906d2SBram Moolenaar		\ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0,
3758d43906d2SBram Moolenaar                \ 'quickfixtextfunc' : ''},
3759c9cc9c78SBram Moolenaar		\ g:Xgetlist({'id' : qfid, 'all' : 0}))
3760c9cc9c78SBram Moolenaar  endif
3761a6d4849cSBram Moolenaar
3762a6d4849cSBram Moolenaar  " Non-existing quickfix list number
3763a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'nr' : 5, 'context' : 0}).context)
3764a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5}).nr)
3765a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'idx' : 0}).idx)
3766a6d4849cSBram Moolenaar  call assert_equal([], g:Xgetlist({'nr' : 5, 'items' : 0}).items)
3767a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'id' : 0}).id)
3768a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'size' : 0}).size)
3769a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'nr' : 5, 'title' : 0}).title)
3770a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'winid' : 0}).winid)
3771b254af31SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'changedtick' : 0}).changedtick)
3772c9cc9c78SBram Moolenaar  if a:cchar == 'c'
3773c9cc9c78SBram Moolenaar    call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3774c9cc9c78SBram Moolenaar		\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
3775d43906d2SBram Moolenaar		\ 'changedtick' : 0, 'qfbufnr' : qfbufnr,
3776d43906d2SBram Moolenaar                \ 'quickfixtextfunc' : ''}, g:Xgetlist({'nr' : 5, 'all' : 0}))
3777c9cc9c78SBram Moolenaar  else
3778c9cc9c78SBram Moolenaar    call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3779c9cc9c78SBram Moolenaar		\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
3780d43906d2SBram Moolenaar		\ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0,
3781d43906d2SBram Moolenaar                \ 'quickfixtextfunc' : ''}, g:Xgetlist({'nr' : 5, 'all' : 0}))
3782c9cc9c78SBram Moolenaar  endif
3783a6d4849cSBram Moolenaarendfunc
3784a6d4849cSBram Moolenaar
3785a6d4849cSBram Moolenaarfunc Test_getqflist()
3786a6d4849cSBram Moolenaar  call Xgetlist_empty_tests('c')
3787a6d4849cSBram Moolenaar  call Xgetlist_empty_tests('l')
3788a6d4849cSBram Moolenaarendfunc
3789b254af31SBram Moolenaar
3790a0ca7d00SBram Moolenaarfunc Test_getqflist_invalid_nr()
3791a0ca7d00SBram Moolenaar  " The following commands used to crash Vim
3792a0ca7d00SBram Moolenaar  cexpr ""
3793a0ca7d00SBram Moolenaar  call getqflist({'nr' : $XXX_DOES_NOT_EXIST_XXX})
3794a0ca7d00SBram Moolenaar
3795a0ca7d00SBram Moolenaar  " Cleanup
3796a0ca7d00SBram Moolenaar  call setqflist([], 'r')
3797a0ca7d00SBram Moolenaarendfunc
3798a0ca7d00SBram Moolenaar
3799b254af31SBram Moolenaar" Tests for the quickfix/location list changedtick
3800b254af31SBram Moolenaarfunc Xqftick_tests(cchar)
3801b254af31SBram Moolenaar  call s:setup_commands(a:cchar)
3802b254af31SBram Moolenaar
3803b254af31SBram Moolenaar  call g:Xsetlist([], 'f')
3804b254af31SBram Moolenaar
3805b254af31SBram Moolenaar  Xexpr "F1:10:Line10"
3806b254af31SBram Moolenaar  let qfid = g:Xgetlist({'id' : 0}).id
3807b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3808b254af31SBram Moolenaar  Xaddexpr "F2:20:Line20\nF2:21:Line21"
3809b254af31SBram Moolenaar  call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3810b254af31SBram Moolenaar  call g:Xsetlist([], 'a', {'lines' : ["F3:30:Line30", "F3:31:Line31"]})
3811b254af31SBram Moolenaar  call assert_equal(3, g:Xgetlist({'changedtick' : 0}).changedtick)
3812b254af31SBram Moolenaar  call g:Xsetlist([], 'r', {'lines' : ["F4:40:Line40"]})
3813b254af31SBram Moolenaar  call assert_equal(4, g:Xgetlist({'changedtick' : 0}).changedtick)
3814b254af31SBram Moolenaar  call g:Xsetlist([], 'a', {'title' : 'New Title'})
3815b254af31SBram Moolenaar  call assert_equal(5, g:Xgetlist({'changedtick' : 0}).changedtick)
3816b254af31SBram Moolenaar
3817b254af31SBram Moolenaar  enew!
3818b254af31SBram Moolenaar  call append(0, ["F5:50:L50", "F6:60:L60"])
3819b254af31SBram Moolenaar  Xaddbuffer
3820b254af31SBram Moolenaar  call assert_equal(6, g:Xgetlist({'changedtick' : 0}).changedtick)
3821b254af31SBram Moolenaar  enew!
3822b254af31SBram Moolenaar
3823b254af31SBram Moolenaar  call g:Xsetlist([], 'a', {'context' : {'bus' : 'pci'}})
3824b254af31SBram Moolenaar  call assert_equal(7, g:Xgetlist({'changedtick' : 0}).changedtick)
3825b254af31SBram Moolenaar  call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3826b254af31SBram Moolenaar	      \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'a')
3827b254af31SBram Moolenaar  call assert_equal(8, g:Xgetlist({'changedtick' : 0}).changedtick)
3828b254af31SBram Moolenaar  call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3829b254af31SBram Moolenaar	      \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], ' ')
3830b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3831b254af31SBram Moolenaar  call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3832b254af31SBram Moolenaar	      \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'r')
3833b254af31SBram Moolenaar  call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3834b254af31SBram Moolenaar
3835b254af31SBram Moolenaar  call writefile(["F8:80:L80", "F8:81:L81"], "Xone")
3836b254af31SBram Moolenaar  Xfile Xone
3837b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3838b254af31SBram Moolenaar  Xaddfile Xone
3839b254af31SBram Moolenaar  call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3840b254af31SBram Moolenaar
3841b254af31SBram Moolenaar  " Test case for updating a non-current quickfix list
3842b254af31SBram Moolenaar  call g:Xsetlist([], 'f')
3843b254af31SBram Moolenaar  Xexpr "F1:1:L1"
3844b254af31SBram Moolenaar  Xexpr "F2:2:L2"
3845b254af31SBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, "lines" : ["F10:10:L10"]})
3846b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3847b254af31SBram Moolenaar  call assert_equal(2, g:Xgetlist({'nr' : 1, 'changedtick' : 0}).changedtick)
3848b254af31SBram Moolenaar
3849b254af31SBram Moolenaar  call delete("Xone")
3850b254af31SBram Moolenaarendfunc
3851b254af31SBram Moolenaar
3852b254af31SBram Moolenaarfunc Test_qf_tick()
3853b254af31SBram Moolenaar  call Xqftick_tests('c')
3854b254af31SBram Moolenaar  call Xqftick_tests('l')
3855b254af31SBram Moolenaarendfunc
385612237448SBram Moolenaar
3857c631f2dfSBram Moolenaar" Test helpgrep with lang specifier
3858c631f2dfSBram Moolenaarfunc Xtest_helpgrep_with_lang_specifier(cchar)
3859c631f2dfSBram Moolenaar  call s:setup_commands(a:cchar)
3860c631f2dfSBram Moolenaar  Xhelpgrep Vim@en
3861c631f2dfSBram Moolenaar  call assert_equal('help', &filetype)
3862c631f2dfSBram Moolenaar  call assert_notequal(0, g:Xgetlist({'nr' : '$'}).nr)
3863c631f2dfSBram Moolenaar  new | only
3864c631f2dfSBram Moolenaarendfunc
3865c631f2dfSBram Moolenaar
3866c631f2dfSBram Moolenaarfunc Test_helpgrep_with_lang_specifier()
3867c631f2dfSBram Moolenaar  call Xtest_helpgrep_with_lang_specifier('c')
3868c631f2dfSBram Moolenaar  call Xtest_helpgrep_with_lang_specifier('l')
3869c631f2dfSBram Moolenaarendfunc
3870c631f2dfSBram Moolenaar
387112237448SBram Moolenaar" The following test used to crash Vim.
387212237448SBram Moolenaar" Open the location list window and close the regular window associated with
387312237448SBram Moolenaar" the location list. When the garbage collection runs now, it incorrectly
387412237448SBram Moolenaar" marks the location list context as not in use and frees the context.
387512237448SBram Moolenaarfunc Test_ll_window_ctx()
387612237448SBram Moolenaar  call setloclist(0, [], 'f')
387712237448SBram Moolenaar  call setloclist(0, [], 'a', {'context' : []})
387812237448SBram Moolenaar  lopen | only
387912237448SBram Moolenaar  call test_garbagecollect_now()
388012237448SBram Moolenaar  echo getloclist(0, {'context' : 1}).context
388112237448SBram Moolenaar  enew | only
388212237448SBram Moolenaarendfunc
388312237448SBram Moolenaar
388414a4deb0SBram Moolenaar" The following test used to crash vim
388514a4deb0SBram Moolenaarfunc Test_lfile_crash()
388614a4deb0SBram Moolenaar  sp Xtest
388714a4deb0SBram Moolenaar  au QuickFixCmdPre * bw
3888e2e4075fSBram Moolenaar  call assert_fails('lfile', 'E40:')
388914a4deb0SBram Moolenaar  au! QuickFixCmdPre
389014a4deb0SBram Moolenaarendfunc
38913c097226SBram Moolenaar
38923c097226SBram Moolenaar" The following test used to crash vim
38933c097226SBram Moolenaarfunc Test_lbuffer_crash()
38943c097226SBram Moolenaar  sv Xtest
38953c097226SBram Moolenaar  augroup QF_Test
38963c097226SBram Moolenaar    au!
38979a046fd0SBram Moolenaar    au QuickFixCmdPre,QuickFixCmdPost,BufEnter,BufLeave * bw
38983c097226SBram Moolenaar  augroup END
38993c097226SBram Moolenaar  lbuffer
39003c097226SBram Moolenaar  augroup QF_Test
39013c097226SBram Moolenaar    au!
39023c097226SBram Moolenaar  augroup END
39033c097226SBram Moolenaarendfunc
39043c097226SBram Moolenaar
39053c097226SBram Moolenaar" The following test used to crash vim
39063c097226SBram Moolenaarfunc Test_lexpr_crash()
39073c097226SBram Moolenaar  augroup QF_Test
39083c097226SBram Moolenaar    au!
39099a046fd0SBram Moolenaar    au QuickFixCmdPre,QuickFixCmdPost,BufEnter,BufLeave * call setloclist(0, [], 'f')
39103c097226SBram Moolenaar  augroup END
39113c097226SBram Moolenaar  lexpr ""
39123c097226SBram Moolenaar  augroup QF_Test
39133c097226SBram Moolenaar    au!
39143c097226SBram Moolenaar  augroup END
39159f84ded3SBram Moolenaar
39163c097226SBram Moolenaar  enew | only
39179f84ded3SBram Moolenaar  augroup QF_Test
39189f84ded3SBram Moolenaar    au!
39199f84ded3SBram Moolenaar    au BufNew * call setloclist(0, [], 'f')
39209f84ded3SBram Moolenaar  augroup END
39219f84ded3SBram Moolenaar  lexpr 'x:1:x'
39229f84ded3SBram Moolenaar  augroup QF_Test
39239f84ded3SBram Moolenaar    au!
39249f84ded3SBram Moolenaar  augroup END
39259f84ded3SBram Moolenaar
39269f84ded3SBram Moolenaar  enew | only
39279f84ded3SBram Moolenaar  lexpr ''
39289f84ded3SBram Moolenaar  lopen
39299f84ded3SBram Moolenaar  augroup QF_Test
39309f84ded3SBram Moolenaar    au!
39319f84ded3SBram Moolenaar    au FileType * call setloclist(0, [], 'f')
39329f84ded3SBram Moolenaar  augroup END
39339f84ded3SBram Moolenaar  lexpr ''
39349f84ded3SBram Moolenaar  augroup QF_Test
39359f84ded3SBram Moolenaar    au!
39369f84ded3SBram Moolenaar  augroup END
39373c097226SBram Moolenaarendfunc
39383c097226SBram Moolenaar
39393c097226SBram Moolenaar" The following test used to crash Vim
39403c097226SBram Moolenaarfunc Test_lvimgrep_crash()
39413c097226SBram Moolenaar  sv Xtest
39423c097226SBram Moolenaar  augroup QF_Test
39433c097226SBram Moolenaar    au!
39449a046fd0SBram Moolenaar    au QuickFixCmdPre,QuickFixCmdPost,BufEnter,BufLeave * call setloclist(0, [], 'f')
39453c097226SBram Moolenaar  augroup END
39463c097226SBram Moolenaar  lvimgrep quickfix test_quickfix.vim
39473c097226SBram Moolenaar  augroup QF_Test
39483c097226SBram Moolenaar    au!
39493c097226SBram Moolenaar  augroup END
3950b6f1480aSBram Moolenaar
3951b6f1480aSBram Moolenaar  new | only
3952b6f1480aSBram Moolenaar  augroup QF_Test
3953b6f1480aSBram Moolenaar    au!
3954b6f1480aSBram Moolenaar    au BufEnter * call setloclist(0, [], 'r')
3955b6f1480aSBram Moolenaar  augroup END
3956b6f1480aSBram Moolenaar  call assert_fails('lvimgrep Test_lvimgrep_crash *', 'E926:')
3957b6f1480aSBram Moolenaar  augroup QF_Test
3958b6f1480aSBram Moolenaar    au!
3959b6f1480aSBram Moolenaar  augroup END
3960b6f1480aSBram Moolenaar
39613c097226SBram Moolenaar  enew | only
39623c097226SBram Moolenaarendfunc
3963de04654dSBram Moolenaar
39642573af35SBram Moolenaarfunc Test_lvimgrep_crash2()
39652573af35SBram Moolenaar  au BufNewFile x sfind
39669b7bf9e9SBram Moolenaar  call assert_fails('lvimgrep x x', 'E471:')
39679b7bf9e9SBram Moolenaar  call assert_fails('lvimgrep x x x', 'E471:')
39682573af35SBram Moolenaar
39692573af35SBram Moolenaar  au! BufNewFile
39702573af35SBram Moolenaarendfunc
39712573af35SBram Moolenaar
3972de04654dSBram Moolenaar" Test for the position of the quickfix and location list window
3973de04654dSBram Moolenaarfunc Test_qfwin_pos()
3974de04654dSBram Moolenaar  " Open two windows
3975de04654dSBram Moolenaar  new | only
3976de04654dSBram Moolenaar  new
3977de04654dSBram Moolenaar  cexpr ['F1:10:L10']
3978de04654dSBram Moolenaar  copen
3979de04654dSBram Moolenaar  " Quickfix window should be the bottom most window
3980de04654dSBram Moolenaar  call assert_equal(3, winnr())
3981de04654dSBram Moolenaar  close
3982de04654dSBram Moolenaar  " Open at the very top
3983de04654dSBram Moolenaar  wincmd t
3984de04654dSBram Moolenaar  topleft copen
3985de04654dSBram Moolenaar  call assert_equal(1, winnr())
3986de04654dSBram Moolenaar  close
3987de04654dSBram Moolenaar  " open left of the current window
3988de04654dSBram Moolenaar  wincmd t
3989de04654dSBram Moolenaar  below new
3990de04654dSBram Moolenaar  leftabove copen
3991de04654dSBram Moolenaar  call assert_equal(2, winnr())
3992de04654dSBram Moolenaar  close
3993de04654dSBram Moolenaar  " open right of the current window
3994de04654dSBram Moolenaar  rightbelow copen
3995de04654dSBram Moolenaar  call assert_equal(3, winnr())
3996de04654dSBram Moolenaar  close
3997de04654dSBram Moolenaarendfunc
3998e1bb879fSBram Moolenaar
3999e1bb879fSBram Moolenaar" Tests for quickfix/location lists changed by autocommands when
4000e1bb879fSBram Moolenaar" :vimgrep/:lvimgrep commands are running.
4001e1bb879fSBram Moolenaarfunc Test_vimgrep_autocmd()
4002e1bb879fSBram Moolenaar  call setqflist([], 'f')
4003e1bb879fSBram Moolenaar  call writefile(['stars'], 'Xtest1.txt')
4004e1bb879fSBram Moolenaar  call writefile(['stars'], 'Xtest2.txt')
4005e1bb879fSBram Moolenaar
4006e1bb879fSBram Moolenaar  " Test 1:
4007e1bb879fSBram Moolenaar  " When searching for a pattern using :vimgrep, if the quickfix list is
4008e1bb879fSBram Moolenaar  " changed by an autocmd, the results should be added to the correct quickfix
4009e1bb879fSBram Moolenaar  " list.
4010e1bb879fSBram Moolenaar  autocmd BufRead Xtest2.txt cexpr '' | cexpr ''
4011e1bb879fSBram Moolenaar  silent vimgrep stars Xtest*.txt
4012e1bb879fSBram Moolenaar  call assert_equal(1, getqflist({'nr' : 0}).nr)
4013e1bb879fSBram Moolenaar  call assert_equal(3, getqflist({'nr' : '$'}).nr)
4014e1bb879fSBram Moolenaar  call assert_equal('Xtest2.txt', bufname(getqflist()[1].bufnr))
4015e1bb879fSBram Moolenaar  au! BufRead Xtest2.txt
4016e1bb879fSBram Moolenaar
4017e1bb879fSBram Moolenaar  " Test 2:
4018e1bb879fSBram Moolenaar  " When searching for a pattern using :vimgrep, if the quickfix list is
4019e1bb879fSBram Moolenaar  " freed, then a error should be given.
4020e1bb879fSBram Moolenaar  silent! %bwipe!
4021e1bb879fSBram Moolenaar  call setqflist([], 'f')
4022e1bb879fSBram Moolenaar  autocmd BufRead Xtest2.txt for i in range(10) | cexpr '' | endfor
4023e1bb879fSBram Moolenaar  call assert_fails('vimgrep stars Xtest*.txt', 'E925:')
4024e1bb879fSBram Moolenaar  au! BufRead Xtest2.txt
4025e1bb879fSBram Moolenaar
4026e1bb879fSBram Moolenaar  " Test 3:
4027e1bb879fSBram Moolenaar  " When searching for a pattern using :lvimgrep, if the location list is
4028e1bb879fSBram Moolenaar  " freed, then the command should error out.
4029e1bb879fSBram Moolenaar  silent! %bwipe!
4030e1bb879fSBram Moolenaar  let g:save_winid = win_getid()
4031e1bb879fSBram Moolenaar  autocmd BufRead Xtest2.txt call setloclist(g:save_winid, [], 'f')
4032e1bb879fSBram Moolenaar  call assert_fails('lvimgrep stars Xtest*.txt', 'E926:')
4033e1bb879fSBram Moolenaar  au! BufRead Xtest2.txt
4034e1bb879fSBram Moolenaar
4035e1bb879fSBram Moolenaar  call delete('Xtest1.txt')
4036e1bb879fSBram Moolenaar  call delete('Xtest2.txt')
4037e1bb879fSBram Moolenaar  call setqflist([], 'f')
4038e1bb879fSBram Moolenaarendfunc
40393b9474b4SBram Moolenaar
4040f9ae154cSBram Moolenaar" Test for an autocmd changing the current directory when running vimgrep
4041f9ae154cSBram Moolenaarfunc Xvimgrep_autocmd_cd(cchar)
4042f9ae154cSBram Moolenaar  call s:setup_commands(a:cchar)
4043f9ae154cSBram Moolenaar
4044f9ae154cSBram Moolenaar  %bwipe
4045f9ae154cSBram Moolenaar  let save_cwd = getcwd()
4046f9ae154cSBram Moolenaar
4047f9ae154cSBram Moolenaar  augroup QF_Test
4048f9ae154cSBram Moolenaar    au!
4049f9ae154cSBram Moolenaar    autocmd BufRead * silent cd %:p:h
4050f9ae154cSBram Moolenaar  augroup END
4051f9ae154cSBram Moolenaar
4052f9ae154cSBram Moolenaar  10Xvimgrep /vim/ Xdir/**
4053f9ae154cSBram Moolenaar  let l = g:Xgetlist()
4054f9ae154cSBram Moolenaar  call assert_equal('f1.txt', bufname(l[0].bufnr))
4055f9ae154cSBram Moolenaar  call assert_equal('f2.txt', fnamemodify(bufname(l[2].bufnr), ':t'))
4056f9ae154cSBram Moolenaar
4057f9ae154cSBram Moolenaar  augroup QF_Test
4058f9ae154cSBram Moolenaar    au!
4059f9ae154cSBram Moolenaar  augroup END
4060f9ae154cSBram Moolenaar
4061f9ae154cSBram Moolenaar  exe 'cd ' . save_cwd
4062f9ae154cSBram Moolenaarendfunc
4063f9ae154cSBram Moolenaar
4064f9ae154cSBram Moolenaarfunc Test_vimgrep_autocmd_cd()
4065f9ae154cSBram Moolenaar  call mkdir('Xdir/a', 'p')
4066f9ae154cSBram Moolenaar  call mkdir('Xdir/b', 'p')
4067f9ae154cSBram Moolenaar  call writefile(['a_L1_vim', 'a_L2_vim'], 'Xdir/a/f1.txt')
4068f9ae154cSBram Moolenaar  call writefile(['b_L1_vim', 'b_L2_vim'], 'Xdir/b/f2.txt')
4069f9ae154cSBram Moolenaar  call Xvimgrep_autocmd_cd('c')
4070f9ae154cSBram Moolenaar  call Xvimgrep_autocmd_cd('l')
4071f9ae154cSBram Moolenaar  %bwipe
4072f9ae154cSBram Moolenaar  call delete('Xdir', 'rf')
4073f9ae154cSBram Moolenaarendfunc
4074f9ae154cSBram Moolenaar
40753b9474b4SBram Moolenaar" The following test used to crash Vim
40763b9474b4SBram Moolenaarfunc Test_lhelpgrep_autocmd()
40773b9474b4SBram Moolenaar  lhelpgrep quickfix
40783b9474b4SBram Moolenaar  autocmd QuickFixCmdPost * call setloclist(0, [], 'f')
40793b9474b4SBram Moolenaar  lhelpgrep buffer
40803b9474b4SBram Moolenaar  call assert_equal('help', &filetype)
40813b9474b4SBram Moolenaar  call assert_equal(0, getloclist(0, {'nr' : '$'}).nr)
40823b9474b4SBram Moolenaar  lhelpgrep tabpage
40833b9474b4SBram Moolenaar  call assert_equal('help', &filetype)
40843b9474b4SBram Moolenaar  call assert_equal(1, getloclist(0, {'nr' : '$'}).nr)
40853b9474b4SBram Moolenaar  au! QuickFixCmdPost
4086b6f1480aSBram Moolenaar
4087b6f1480aSBram Moolenaar  new | only
4088b6f1480aSBram Moolenaar  augroup QF_Test
4089b6f1480aSBram Moolenaar    au!
4090b6f1480aSBram Moolenaar    au BufEnter * call setqflist([], 'f')
4091b6f1480aSBram Moolenaar  augroup END
4092b6f1480aSBram Moolenaar  call assert_fails('helpgrep quickfix', 'E925:')
4093dbfa795dSBram Moolenaar  " run the test with a help window already open
4094dbfa795dSBram Moolenaar  help
4095dbfa795dSBram Moolenaar  wincmd w
4096dbfa795dSBram Moolenaar  call assert_fails('helpgrep quickfix', 'E925:')
4097b6f1480aSBram Moolenaar  augroup QF_Test
4098b6f1480aSBram Moolenaar    au! BufEnter
4099b6f1480aSBram Moolenaar  augroup END
4100b6f1480aSBram Moolenaar
4101b6f1480aSBram Moolenaar  new | only
4102b6f1480aSBram Moolenaar  augroup QF_Test
4103b6f1480aSBram Moolenaar    au!
4104b6f1480aSBram Moolenaar    au BufEnter * call setqflist([], 'r')
4105b6f1480aSBram Moolenaar  augroup END
4106b6f1480aSBram Moolenaar  call assert_fails('helpgrep quickfix', 'E925:')
4107b6f1480aSBram Moolenaar  augroup QF_Test
4108b6f1480aSBram Moolenaar    au! BufEnter
4109b6f1480aSBram Moolenaar  augroup END
4110b6f1480aSBram Moolenaar
4111b6f1480aSBram Moolenaar  new | only
4112b6f1480aSBram Moolenaar  augroup QF_Test
4113b6f1480aSBram Moolenaar    au!
4114b6f1480aSBram Moolenaar    au BufEnter * call setloclist(0, [], 'r')
4115b6f1480aSBram Moolenaar  augroup END
4116b6f1480aSBram Moolenaar  call assert_fails('lhelpgrep quickfix', 'E926:')
4117b6f1480aSBram Moolenaar  augroup QF_Test
4118b6f1480aSBram Moolenaar    au! BufEnter
4119b6f1480aSBram Moolenaar  augroup END
4120b6f1480aSBram Moolenaar
41213b9474b4SBram Moolenaar  new | only
41223b9474b4SBram Moolenaarendfunc
4123a796d46fSBram Moolenaar
4124a796d46fSBram Moolenaar" Test for shortening/simplifying the file name when opening the
4125a796d46fSBram Moolenaar" quickfix window or when displaying the quickfix list
4126a796d46fSBram Moolenaarfunc Test_shorten_fname()
41276d91bcb4SBram Moolenaar  CheckUnix
4128a796d46fSBram Moolenaar  %bwipe
4129a796d46fSBram Moolenaar  " Create a quickfix list with a absolute path filename
4130a796d46fSBram Moolenaar  let fname = getcwd() . '/test_quickfix.vim'
4131a796d46fSBram Moolenaar  call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'})
4132a796d46fSBram Moolenaar  call assert_equal(fname, bufname('test_quickfix.vim'))
4133a796d46fSBram Moolenaar  " Opening the quickfix window should simplify the file path
4134a796d46fSBram Moolenaar  cwindow
4135a796d46fSBram Moolenaar  call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
4136a796d46fSBram Moolenaar  cclose
4137a796d46fSBram Moolenaar  %bwipe
4138a796d46fSBram Moolenaar  " Create a quickfix list with a absolute path filename
4139a796d46fSBram Moolenaar  call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'})
4140a796d46fSBram Moolenaar  call assert_equal(fname, bufname('test_quickfix.vim'))
4141a796d46fSBram Moolenaar  " Displaying the quickfix list should simplify the file path
4142a796d46fSBram Moolenaar  silent! clist
4143a796d46fSBram Moolenaar  call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
41448ec92c97SBram Moolenaar  " Add a few entries for the same file with different paths and check whether
41458ec92c97SBram Moolenaar  " the buffer name is shortened
41468ec92c97SBram Moolenaar  %bwipe
41478ec92c97SBram Moolenaar  call setqflist([], 'f')
41488ec92c97SBram Moolenaar  call setqflist([{'filename' : 'test_quickfix.vim', 'lnum' : 10},
41498ec92c97SBram Moolenaar        \ {'filename' : '../testdir/test_quickfix.vim', 'lnum' : 20},
41508ec92c97SBram Moolenaar        \ {'filename' : fname, 'lnum' : 30}], ' ')
41518ec92c97SBram Moolenaar  copen
41528ec92c97SBram Moolenaar  call assert_equal(['test_quickfix.vim|10| ',
41538ec92c97SBram Moolenaar        \ 'test_quickfix.vim|20| ',
41548ec92c97SBram Moolenaar        \ 'test_quickfix.vim|30| '], getline(1, '$'))
41558ec92c97SBram Moolenaar  cclose
4156a796d46fSBram Moolenaarendfunc
41578b62e310SBram Moolenaar
41588b62e310SBram Moolenaar" Quickfix title tests
41598b62e310SBram Moolenaar" In the below tests, 'exe "cmd"' is used to invoke the quickfix commands.
41608b62e310SBram Moolenaar" Otherwise due to indentation, the title is set with spaces at the beginning
41618b62e310SBram Moolenaar" of the command.
41628b62e310SBram Moolenaarfunc Test_qftitle()
41638b62e310SBram Moolenaar  call writefile(["F1:1:Line1"], 'Xerr')
41648b62e310SBram Moolenaar
41658b62e310SBram Moolenaar  " :cexpr
41668b62e310SBram Moolenaar  exe "cexpr readfile('Xerr')"
41678b62e310SBram Moolenaar  call assert_equal(":cexpr readfile('Xerr')", getqflist({'title' : 1}).title)
41688b62e310SBram Moolenaar
41698b62e310SBram Moolenaar  " :cgetexpr
41708b62e310SBram Moolenaar  exe "cgetexpr readfile('Xerr')"
41718b62e310SBram Moolenaar  call assert_equal(":cgetexpr readfile('Xerr')",
41728b62e310SBram Moolenaar					\ getqflist({'title' : 1}).title)
41738b62e310SBram Moolenaar
41748b62e310SBram Moolenaar  " :caddexpr
41758b62e310SBram Moolenaar  call setqflist([], 'f')
41768b62e310SBram Moolenaar  exe "caddexpr readfile('Xerr')"
41778b62e310SBram Moolenaar  call assert_equal(":caddexpr readfile('Xerr')",
41788b62e310SBram Moolenaar					\ getqflist({'title' : 1}).title)
41798b62e310SBram Moolenaar
41808b62e310SBram Moolenaar  " :cbuffer
41818b62e310SBram Moolenaar  new Xerr
41828b62e310SBram Moolenaar  exe "cbuffer"
41838b62e310SBram Moolenaar  call assert_equal(':cbuffer (Xerr)', getqflist({'title' : 1}).title)
41848b62e310SBram Moolenaar
41858b62e310SBram Moolenaar  " :cgetbuffer
41868b62e310SBram Moolenaar  edit Xerr
41878b62e310SBram Moolenaar  exe "cgetbuffer"
41888b62e310SBram Moolenaar  call assert_equal(':cgetbuffer (Xerr)', getqflist({'title' : 1}).title)
41898b62e310SBram Moolenaar
41908b62e310SBram Moolenaar  " :caddbuffer
41918b62e310SBram Moolenaar  call setqflist([], 'f')
41928b62e310SBram Moolenaar  edit Xerr
41938b62e310SBram Moolenaar  exe "caddbuffer"
41948b62e310SBram Moolenaar  call assert_equal(':caddbuffer (Xerr)', getqflist({'title' : 1}).title)
41958b62e310SBram Moolenaar
41968b62e310SBram Moolenaar  " :cfile
41978b62e310SBram Moolenaar  exe "cfile Xerr"
41988b62e310SBram Moolenaar  call assert_equal(':cfile Xerr', getqflist({'title' : 1}).title)
41998b62e310SBram Moolenaar
42008b62e310SBram Moolenaar  " :cgetfile
42018b62e310SBram Moolenaar  exe "cgetfile Xerr"
42028b62e310SBram Moolenaar  call assert_equal(':cgetfile Xerr', getqflist({'title' : 1}).title)
42038b62e310SBram Moolenaar
42048b62e310SBram Moolenaar  " :caddfile
42058b62e310SBram Moolenaar  call setqflist([], 'f')
42068b62e310SBram Moolenaar  exe "caddfile Xerr"
42078b62e310SBram Moolenaar  call assert_equal(':caddfile Xerr', getqflist({'title' : 1}).title)
42088b62e310SBram Moolenaar
42098b62e310SBram Moolenaar  " :grep
42108b62e310SBram Moolenaar  set grepprg=internal
42118b62e310SBram Moolenaar  exe "grep F1 Xerr"
42128b62e310SBram Moolenaar  call assert_equal(':grep F1 Xerr', getqflist({'title' : 1}).title)
42138b62e310SBram Moolenaar
42148b62e310SBram Moolenaar  " :grepadd
42158b62e310SBram Moolenaar  call setqflist([], 'f')
42168b62e310SBram Moolenaar  exe "grepadd F1 Xerr"
42178b62e310SBram Moolenaar  call assert_equal(':grepadd F1 Xerr', getqflist({'title' : 1}).title)
42188b62e310SBram Moolenaar  set grepprg&vim
42198b62e310SBram Moolenaar
42208b62e310SBram Moolenaar  " :vimgrep
42218b62e310SBram Moolenaar  exe "vimgrep F1 Xerr"
42228b62e310SBram Moolenaar  call assert_equal(':vimgrep F1 Xerr', getqflist({'title' : 1}).title)
42238b62e310SBram Moolenaar
42248b62e310SBram Moolenaar  " :vimgrepadd
42258b62e310SBram Moolenaar  call setqflist([], 'f')
42268b62e310SBram Moolenaar  exe "vimgrepadd F1 Xerr"
42278b62e310SBram Moolenaar  call assert_equal(':vimgrepadd F1 Xerr', getqflist({'title' : 1}).title)
42288b62e310SBram Moolenaar
42298b62e310SBram Moolenaar  call setqflist(['F1:10:L10'], ' ')
42308b62e310SBram Moolenaar  call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
42318b62e310SBram Moolenaar
42328b62e310SBram Moolenaar  call setqflist([], 'f')
42338b62e310SBram Moolenaar  call setqflist(['F1:10:L10'], 'a')
42348b62e310SBram Moolenaar  call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
42358b62e310SBram Moolenaar
42368b62e310SBram Moolenaar  call setqflist([], 'f')
42378b62e310SBram Moolenaar  call setqflist(['F1:10:L10'], 'r')
42388b62e310SBram Moolenaar  call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
42398b62e310SBram Moolenaar
42408b62e310SBram Moolenaar  close
42418b62e310SBram Moolenaar  call delete('Xerr')
42428b62e310SBram Moolenaar
42438b62e310SBram Moolenaar  call setqflist([], ' ', {'title' : 'Errors'})
42448b62e310SBram Moolenaar  copen
42458b62e310SBram Moolenaar  call assert_equal('Errors', w:quickfix_title)
42468b62e310SBram Moolenaar  call setqflist([], 'r', {'items' : [{'filename' : 'a.c', 'lnum' : 10}]})
42478b62e310SBram Moolenaar  call assert_equal('Errors', w:quickfix_title)
42488b62e310SBram Moolenaar  cclose
4249530bed99SBram Moolenaar
4250530bed99SBram Moolenaar  " Switching to another quickfix list in one tab page should update the
4251530bed99SBram Moolenaar  " quickfix window title and statusline in all the other tab pages also
4252530bed99SBram Moolenaar  call setqflist([], 'f')
4253530bed99SBram Moolenaar  %bw!
4254530bed99SBram Moolenaar  cgetexpr ['file_one:1:1: error in the first quickfix list']
4255530bed99SBram Moolenaar  call setqflist([], 'a', {'title': 'first quickfix list'})
4256530bed99SBram Moolenaar  cgetexpr ['file_two:2:1: error in the second quickfix list']
4257530bed99SBram Moolenaar  call setqflist([], 'a', {'title': 'second quickfix list'})
4258530bed99SBram Moolenaar  copen
4259530bed99SBram Moolenaar  wincmd t
4260530bed99SBram Moolenaar  tabnew two
4261530bed99SBram Moolenaar  copen
4262530bed99SBram Moolenaar  wincmd t
4263530bed99SBram Moolenaar  colder
4264530bed99SBram Moolenaar  call assert_equal('first quickfix list', gettabwinvar(1, 2, 'quickfix_title'))
4265530bed99SBram Moolenaar  call assert_equal('first quickfix list', gettabwinvar(2, 2, 'quickfix_title'))
4266530bed99SBram Moolenaar  call assert_equal(1, tabpagewinnr(1))
4267530bed99SBram Moolenaar  call assert_equal(1, tabpagewinnr(2))
4268530bed99SBram Moolenaar  tabnew
4269530bed99SBram Moolenaar  call setqflist([], 'a', {'title': 'new quickfix title'})
4270530bed99SBram Moolenaar  call assert_equal('new quickfix title', gettabwinvar(1, 2, 'quickfix_title'))
4271530bed99SBram Moolenaar  call assert_equal('new quickfix title', gettabwinvar(2, 2, 'quickfix_title'))
4272530bed99SBram Moolenaar  %bw!
42738b62e310SBram Moolenaarendfunc
4274600323b4SBram Moolenaar
4275600323b4SBram Moolenaarfunc Test_lbuffer_with_bwipe()
4276600323b4SBram Moolenaar  new
4277600323b4SBram Moolenaar  new
4278600323b4SBram Moolenaar  augroup nasty
42799a046fd0SBram Moolenaar    au QuickFixCmdPre,QuickFixCmdPost,BufEnter,BufLeave * bwipe
4280600323b4SBram Moolenaar  augroup END
4281600323b4SBram Moolenaar  lbuffer
4282600323b4SBram Moolenaar  augroup nasty
4283600323b4SBram Moolenaar    au!
4284600323b4SBram Moolenaar  augroup END
4285600323b4SBram Moolenaarendfunc
42860366c016SBram Moolenaar
4287531b9a3aSBram Moolenaar" Test for an autocmd freeing the quickfix/location list when cexpr/lexpr is
4288531b9a3aSBram Moolenaar" running
4289531b9a3aSBram Moolenaarfunc Xexpr_acmd_freelist(cchar)
4290531b9a3aSBram Moolenaar  call s:setup_commands(a:cchar)
4291531b9a3aSBram Moolenaar
42929a046fd0SBram Moolenaar  " This was using freed memory (but with what events?)
42930366c016SBram Moolenaar  augroup nasty
42949a046fd0SBram Moolenaar    au QuickFixCmdPre,QuickFixCmdPost,BufEnter,BufLeave * call g:Xsetlist([], 'f')
42950366c016SBram Moolenaar  augroup END
4296531b9a3aSBram Moolenaar  Xexpr "x"
42970366c016SBram Moolenaar  augroup nasty
42980366c016SBram Moolenaar    au!
42990366c016SBram Moolenaar  augroup END
43000366c016SBram Moolenaarendfunc
4301531b9a3aSBram Moolenaar
4302531b9a3aSBram Moolenaarfunc Test_cexpr_acmd_freelist()
4303531b9a3aSBram Moolenaar  call Xexpr_acmd_freelist('c')
4304531b9a3aSBram Moolenaar  call Xexpr_acmd_freelist('l')
4305531b9a3aSBram Moolenaarendfunc
4306531b9a3aSBram Moolenaar
4307531b9a3aSBram Moolenaar" Test for commands that create a new quickfix/location list and jump to the
4308531b9a3aSBram Moolenaar" first error automatically.
4309531b9a3aSBram Moolenaarfunc Xjumpto_first_error_test(cchar)
4310531b9a3aSBram Moolenaar  call s:setup_commands(a:cchar)
4311531b9a3aSBram Moolenaar
4312531b9a3aSBram Moolenaar  call s:create_test_file('Xtestfile1')
4313531b9a3aSBram Moolenaar  call s:create_test_file('Xtestfile2')
4314531b9a3aSBram Moolenaar  let l = ['Xtestfile1:2:Line2', 'Xtestfile2:4:Line4']
4315531b9a3aSBram Moolenaar
4316531b9a3aSBram Moolenaar  " Test for cexpr/lexpr
4317531b9a3aSBram Moolenaar  enew
4318531b9a3aSBram Moolenaar  Xexpr l
4319bdd2c290SBram Moolenaar  call assert_equal('Xtestfile1', @%)
4320531b9a3aSBram Moolenaar  call assert_equal(2, line('.'))
4321531b9a3aSBram Moolenaar
4322531b9a3aSBram Moolenaar  " Test for cfile/lfile
4323531b9a3aSBram Moolenaar  enew
4324531b9a3aSBram Moolenaar  call writefile(l, 'Xerr')
4325531b9a3aSBram Moolenaar  Xfile Xerr
4326bdd2c290SBram Moolenaar  call assert_equal('Xtestfile1', @%)
4327531b9a3aSBram Moolenaar  call assert_equal(2, line('.'))
4328531b9a3aSBram Moolenaar
4329531b9a3aSBram Moolenaar  " Test for cbuffer/lbuffer
4330531b9a3aSBram Moolenaar  edit Xerr
4331531b9a3aSBram Moolenaar  Xbuffer
4332bdd2c290SBram Moolenaar  call assert_equal('Xtestfile1', @%)
4333531b9a3aSBram Moolenaar  call assert_equal(2, line('.'))
4334531b9a3aSBram Moolenaar
4335531b9a3aSBram Moolenaar  call delete('Xerr')
4336531b9a3aSBram Moolenaar  call delete('Xtestfile1')
4337531b9a3aSBram Moolenaar  call delete('Xtestfile2')
4338531b9a3aSBram Moolenaarendfunc
4339531b9a3aSBram Moolenaar
4340531b9a3aSBram Moolenaarfunc Test_jumpto_first_error()
4341531b9a3aSBram Moolenaar  call Xjumpto_first_error_test('c')
4342531b9a3aSBram Moolenaar  call Xjumpto_first_error_test('l')
4343531b9a3aSBram Moolenaarendfunc
4344531b9a3aSBram Moolenaar
4345531b9a3aSBram Moolenaar" Test for a quickfix autocmd changing the quickfix/location list before
4346531b9a3aSBram Moolenaar" jumping to the first error in the new list.
4347531b9a3aSBram Moolenaarfunc Xautocmd_changelist(cchar)
4348531b9a3aSBram Moolenaar  call s:setup_commands(a:cchar)
4349531b9a3aSBram Moolenaar
4350531b9a3aSBram Moolenaar  " Test for cfile/lfile
4351531b9a3aSBram Moolenaar  call s:create_test_file('Xtestfile1')
4352531b9a3aSBram Moolenaar  call s:create_test_file('Xtestfile2')
4353531b9a3aSBram Moolenaar  Xexpr 'Xtestfile1:2:Line2'
4354531b9a3aSBram Moolenaar  autocmd QuickFixCmdPost * Xolder
4355531b9a3aSBram Moolenaar  call writefile(['Xtestfile2:4:Line4'], 'Xerr')
4356531b9a3aSBram Moolenaar  Xfile Xerr
4357bdd2c290SBram Moolenaar  call assert_equal('Xtestfile2', @%)
4358531b9a3aSBram Moolenaar  call assert_equal(4, line('.'))
4359531b9a3aSBram Moolenaar  autocmd! QuickFixCmdPost
4360531b9a3aSBram Moolenaar
4361531b9a3aSBram Moolenaar  " Test for cbuffer/lbuffer
4362531b9a3aSBram Moolenaar  call g:Xsetlist([], 'f')
4363531b9a3aSBram Moolenaar  Xexpr 'Xtestfile1:2:Line2'
4364531b9a3aSBram Moolenaar  autocmd QuickFixCmdPost * Xolder
4365531b9a3aSBram Moolenaar  call writefile(['Xtestfile2:4:Line4'], 'Xerr')
4366531b9a3aSBram Moolenaar  edit Xerr
4367531b9a3aSBram Moolenaar  Xbuffer
4368bdd2c290SBram Moolenaar  call assert_equal('Xtestfile2', @%)
4369531b9a3aSBram Moolenaar  call assert_equal(4, line('.'))
4370531b9a3aSBram Moolenaar  autocmd! QuickFixCmdPost
4371531b9a3aSBram Moolenaar
4372531b9a3aSBram Moolenaar  " Test for cexpr/lexpr
4373531b9a3aSBram Moolenaar  call g:Xsetlist([], 'f')
4374531b9a3aSBram Moolenaar  Xexpr 'Xtestfile1:2:Line2'
4375531b9a3aSBram Moolenaar  autocmd QuickFixCmdPost * Xolder
4376531b9a3aSBram Moolenaar  Xexpr 'Xtestfile2:4:Line4'
4377bdd2c290SBram Moolenaar  call assert_equal('Xtestfile2', @%)
4378531b9a3aSBram Moolenaar  call assert_equal(4, line('.'))
4379531b9a3aSBram Moolenaar  autocmd! QuickFixCmdPost
4380531b9a3aSBram Moolenaar
4381851332eaSBram Moolenaar  " The grepprg may not be set on non-Unix systems
4382851332eaSBram Moolenaar  if has('unix')
4383531b9a3aSBram Moolenaar    " Test for grep/lgrep
4384531b9a3aSBram Moolenaar    call g:Xsetlist([], 'f')
4385531b9a3aSBram Moolenaar    Xexpr 'Xtestfile1:2:Line2'
4386531b9a3aSBram Moolenaar    autocmd QuickFixCmdPost * Xolder
4387531b9a3aSBram Moolenaar    silent Xgrep Line5 Xtestfile2
4388bdd2c290SBram Moolenaar    call assert_equal('Xtestfile2', @%)
4389531b9a3aSBram Moolenaar    call assert_equal(5, line('.'))
4390531b9a3aSBram Moolenaar    autocmd! QuickFixCmdPost
4391851332eaSBram Moolenaar  endif
4392531b9a3aSBram Moolenaar
4393531b9a3aSBram Moolenaar  " Test for vimgrep/lvimgrep
4394531b9a3aSBram Moolenaar  call g:Xsetlist([], 'f')
4395531b9a3aSBram Moolenaar  Xexpr 'Xtestfile1:2:Line2'
4396531b9a3aSBram Moolenaar  autocmd QuickFixCmdPost * Xolder
4397531b9a3aSBram Moolenaar  silent Xvimgrep Line5 Xtestfile2
4398bdd2c290SBram Moolenaar  call assert_equal('Xtestfile2', @%)
4399531b9a3aSBram Moolenaar  call assert_equal(5, line('.'))
4400531b9a3aSBram Moolenaar  autocmd! QuickFixCmdPost
4401531b9a3aSBram Moolenaar
44023f347e47SBram Moolenaar  " Test for autocommands clearing the quickfix list before jumping to the
44033f347e47SBram Moolenaar  " first error. This should not result in an error
44043f347e47SBram Moolenaar  autocmd QuickFixCmdPost * call g:Xsetlist([], 'r')
44053f347e47SBram Moolenaar  let v:errmsg = ''
44063f347e47SBram Moolenaar  " Test for cfile/lfile
44073f347e47SBram Moolenaar  Xfile Xerr
44083f347e47SBram Moolenaar  call assert_true(v:errmsg !~# 'E42:')
44093f347e47SBram Moolenaar  " Test for cbuffer/lbuffer
44103f347e47SBram Moolenaar  edit Xerr
44113f347e47SBram Moolenaar  Xbuffer
44123f347e47SBram Moolenaar  call assert_true(v:errmsg !~# 'E42:')
44133f347e47SBram Moolenaar  " Test for cexpr/lexpr
44143f347e47SBram Moolenaar  Xexpr 'Xtestfile2:4:Line4'
44153f347e47SBram Moolenaar  call assert_true(v:errmsg !~# 'E42:')
44163f347e47SBram Moolenaar  " Test for grep/lgrep
44173f347e47SBram Moolenaar  " The grepprg may not be set on non-Unix systems
44183f347e47SBram Moolenaar  if has('unix')
44193f347e47SBram Moolenaar    silent Xgrep Line5 Xtestfile2
44203f347e47SBram Moolenaar    call assert_true(v:errmsg !~# 'E42:')
44213f347e47SBram Moolenaar  endif
44223f347e47SBram Moolenaar  " Test for vimgrep/lvimgrep
44233f347e47SBram Moolenaar  call assert_fails('silent Xvimgrep Line5 Xtestfile2', 'E480:')
44243f347e47SBram Moolenaar  autocmd! QuickFixCmdPost
44253f347e47SBram Moolenaar
4426531b9a3aSBram Moolenaar  call delete('Xerr')
4427531b9a3aSBram Moolenaar  call delete('Xtestfile1')
4428531b9a3aSBram Moolenaar  call delete('Xtestfile2')
4429531b9a3aSBram Moolenaarendfunc
4430531b9a3aSBram Moolenaar
4431531b9a3aSBram Moolenaarfunc Test_autocmd_changelist()
4432531b9a3aSBram Moolenaar  call Xautocmd_changelist('c')
4433531b9a3aSBram Moolenaar  call Xautocmd_changelist('l')
4434531b9a3aSBram Moolenaarendfunc
44354cde86c2SBram Moolenaar
44364cde86c2SBram Moolenaar" Tests for the ':filter /pat/ clist' command
44374cde86c2SBram Moolenaarfunc Test_filter_clist()
44384cde86c2SBram Moolenaar  cexpr ['Xfile1:10:10:Line 10', 'Xfile2:15:15:Line 15']
44394cde86c2SBram Moolenaar  call assert_equal([' 2 Xfile2:15 col 15: Line 15'],
44404cde86c2SBram Moolenaar			\ split(execute('filter /Line 15/ clist'), "\n"))
44414cde86c2SBram Moolenaar  call assert_equal([' 1 Xfile1:10 col 10: Line 10'],
44424cde86c2SBram Moolenaar			\ split(execute('filter /Xfile1/ clist'), "\n"))
44434cde86c2SBram Moolenaar  call assert_equal([], split(execute('filter /abc/ clist'), "\n"))
44444cde86c2SBram Moolenaar
44454cde86c2SBram Moolenaar  call setqflist([{'module' : 'abc', 'pattern' : 'pat1'},
44464cde86c2SBram Moolenaar			\ {'module' : 'pqr', 'pattern' : 'pat2'}], ' ')
44474cde86c2SBram Moolenaar  call assert_equal([' 2 pqr:pat2:  '],
44484cde86c2SBram Moolenaar			\ split(execute('filter /pqr/ clist'), "\n"))
44494cde86c2SBram Moolenaar  call assert_equal([' 1 abc:pat1:  '],
44504cde86c2SBram Moolenaar			\ split(execute('filter /pat1/ clist'), "\n"))
44514cde86c2SBram Moolenaarendfunc
44520a08c63dSBram Moolenaar
44530a08c63dSBram Moolenaar" Tests for the "CTRL-W <CR>" command.
44540a08c63dSBram Moolenaarfunc Xview_result_split_tests(cchar)
44550a08c63dSBram Moolenaar  call s:setup_commands(a:cchar)
44560a08c63dSBram Moolenaar
44570a08c63dSBram Moolenaar  " Test that "CTRL-W <CR>" in a qf/ll window fails with empty list.
44580a08c63dSBram Moolenaar  call g:Xsetlist([])
44590a08c63dSBram Moolenaar  Xopen
44600a08c63dSBram Moolenaar  let l:win_count = winnr('$')
4461e2e4075fSBram Moolenaar  call assert_fails('execute "normal! \<C-W>\<CR>"', 'E42:')
44620a08c63dSBram Moolenaar  call assert_equal(l:win_count, winnr('$'))
44630a08c63dSBram Moolenaar  Xclose
44640a08c63dSBram Moolenaarendfunc
44650a08c63dSBram Moolenaar
44660a08c63dSBram Moolenaarfunc Test_view_result_split()
44670a08c63dSBram Moolenaar  call Xview_result_split_tests('c')
44680a08c63dSBram Moolenaar  call Xview_result_split_tests('l')
44690a08c63dSBram Moolenaarendfunc
44702dfcef4cSBram Moolenaar
44712dfcef4cSBram Moolenaar" Test that :cc sets curswant
44722dfcef4cSBram Moolenaarfunc Test_curswant()
44732dfcef4cSBram Moolenaar  helpgrep quickfix
44742dfcef4cSBram Moolenaar  normal! llll
44752dfcef4cSBram Moolenaar  1cc
44762dfcef4cSBram Moolenaar  call assert_equal(getcurpos()[4], virtcol('.'))
44772dfcef4cSBram Moolenaar  cclose | helpclose
44782dfcef4cSBram Moolenaarendfunc
4479b244373bSBram Moolenaar
4480b244373bSBram Moolenaar" Test for opening a file from the quickfix window using CTRL-W <Enter>
4481b244373bSBram Moolenaar" doesn't leave an empty buffer around.
4482b244373bSBram Moolenaarfunc Test_splitview()
4483b244373bSBram Moolenaar  call s:create_test_file('Xtestfile1')
4484b244373bSBram Moolenaar  call s:create_test_file('Xtestfile2')
4485b244373bSBram Moolenaar  new | only
4486b244373bSBram Moolenaar  let last_bufnr = bufnr('Test_sv_1', 1)
4487b244373bSBram Moolenaar  let l = ['Xtestfile1:2:Line2', 'Xtestfile2:4:Line4']
4488b244373bSBram Moolenaar  cgetexpr l
4489b244373bSBram Moolenaar  copen
4490b244373bSBram Moolenaar  let numbufs = len(getbufinfo())
4491b244373bSBram Moolenaar  exe "normal \<C-W>\<CR>"
4492b244373bSBram Moolenaar  copen
4493b244373bSBram Moolenaar  exe "normal j\<C-W>\<CR>"
4494b244373bSBram Moolenaar  " Make sure new empty buffers are not created
4495b244373bSBram Moolenaar  call assert_equal(numbufs, len(getbufinfo()))
4496b244373bSBram Moolenaar  " Creating a new buffer should use the next available buffer number
4497b244373bSBram Moolenaar  call assert_equal(last_bufnr + 4, bufnr("Test_sv_2", 1))
4498b244373bSBram Moolenaar  bwipe Test_sv_1
4499b244373bSBram Moolenaar  bwipe Test_sv_2
4500b244373bSBram Moolenaar  new | only
4501b244373bSBram Moolenaar
4502b244373bSBram Moolenaar  " When split opening files from location list window, make sure that two
4503b244373bSBram Moolenaar  " windows doesn't refer to the same location list
4504b244373bSBram Moolenaar  lgetexpr l
4505b244373bSBram Moolenaar  let locid = getloclist(0, {'id' : 0}).id
4506b244373bSBram Moolenaar  lopen
4507b244373bSBram Moolenaar  exe "normal \<C-W>\<CR>"
4508b244373bSBram Moolenaar  call assert_notequal(locid, getloclist(0, {'id' : 0}).id)
4509b244373bSBram Moolenaar  call assert_equal(0, getloclist(0, {'winid' : 0}).winid)
4510b244373bSBram Moolenaar  new | only
4511b244373bSBram Moolenaar
4512b244373bSBram Moolenaar  " When split opening files from a helpgrep location list window, a new help
4513eeb1b9c7SBram Moolenaar  " window should be opened with a copy of the location list.
4514b244373bSBram Moolenaar  lhelpgrep window
4515b244373bSBram Moolenaar  let locid = getloclist(0, {'id' : 0}).id
4516b244373bSBram Moolenaar  lwindow
4517b244373bSBram Moolenaar  exe "normal j\<C-W>\<CR>"
4518b244373bSBram Moolenaar  call assert_notequal(locid, getloclist(0, {'id' : 0}).id)
4519b244373bSBram Moolenaar  call assert_equal(0, getloclist(0, {'winid' : 0}).winid)
4520b244373bSBram Moolenaar  new | only
4521b244373bSBram Moolenaar
4522406cd90fSBram Moolenaar  " Using :split or :vsplit from a quickfix window should behave like a :new
4523406cd90fSBram Moolenaar  " or a :vnew command
4524406cd90fSBram Moolenaar  copen
4525406cd90fSBram Moolenaar  split
4526406cd90fSBram Moolenaar  call assert_equal(3, winnr('$'))
4527406cd90fSBram Moolenaar  let l = getwininfo()
4528406cd90fSBram Moolenaar  call assert_equal([0, 0, 1], [l[0].quickfix, l[1].quickfix, l[2].quickfix])
4529406cd90fSBram Moolenaar  close
4530406cd90fSBram Moolenaar  copen
4531406cd90fSBram Moolenaar  vsplit
4532406cd90fSBram Moolenaar  let l = getwininfo()
4533406cd90fSBram Moolenaar  call assert_equal([0, 0, 1], [l[0].quickfix, l[1].quickfix, l[2].quickfix])
4534406cd90fSBram Moolenaar  new | only
4535406cd90fSBram Moolenaar
4536b244373bSBram Moolenaar  call delete('Xtestfile1')
4537b244373bSBram Moolenaar  call delete('Xtestfile2')
4538b244373bSBram Moolenaarendfunc
4539c45eb770SBram Moolenaar
4540c45eb770SBram Moolenaar" Test for parsing entries using visual screen column
4541c45eb770SBram Moolenaarfunc Test_viscol()
4542c45eb770SBram Moolenaar  enew
4543c45eb770SBram Moolenaar  call writefile(["Col1\tCol2\tCol3"], 'Xfile1')
4544c45eb770SBram Moolenaar  edit Xfile1
4545c45eb770SBram Moolenaar
4546c45eb770SBram Moolenaar  " Use byte offset for column number
4547c45eb770SBram Moolenaar  set efm&
4548c45eb770SBram Moolenaar  cexpr "Xfile1:1:5:XX\nXfile1:1:9:YY\nXfile1:1:20:ZZ"
4549c45eb770SBram Moolenaar  call assert_equal([5, 8], [col('.'), virtcol('.')])
4550c45eb770SBram Moolenaar  cnext
4551c45eb770SBram Moolenaar  call assert_equal([9, 12], [col('.'), virtcol('.')])
4552c45eb770SBram Moolenaar  cnext
4553c45eb770SBram Moolenaar  call assert_equal([14, 20], [col('.'), virtcol('.')])
4554c45eb770SBram Moolenaar
4555c45eb770SBram Moolenaar  " Use screen column offset for column number
4556c45eb770SBram Moolenaar  set efm=%f:%l:%v:%m
4557c45eb770SBram Moolenaar  cexpr "Xfile1:1:8:XX\nXfile1:1:12:YY\nXfile1:1:20:ZZ"
4558c45eb770SBram Moolenaar  call assert_equal([5, 8], [col('.'), virtcol('.')])
4559c45eb770SBram Moolenaar  cnext
4560c45eb770SBram Moolenaar  call assert_equal([9, 12], [col('.'), virtcol('.')])
4561c45eb770SBram Moolenaar  cnext
4562c45eb770SBram Moolenaar  call assert_equal([14, 20], [col('.'), virtcol('.')])
4563c45eb770SBram Moolenaar  cexpr "Xfile1:1:6:XX\nXfile1:1:15:YY\nXfile1:1:24:ZZ"
4564c45eb770SBram Moolenaar  call assert_equal([5, 8], [col('.'), virtcol('.')])
4565c45eb770SBram Moolenaar  cnext
4566c45eb770SBram Moolenaar  call assert_equal([10, 16], [col('.'), virtcol('.')])
4567c45eb770SBram Moolenaar  cnext
4568c45eb770SBram Moolenaar  call assert_equal([14, 20], [col('.'), virtcol('.')])
4569c45eb770SBram Moolenaar
4570c45eb770SBram Moolenaar  enew
4571c45eb770SBram Moolenaar  call writefile(["Col1\täü\töß\tCol4"], 'Xfile1')
4572c45eb770SBram Moolenaar
4573c45eb770SBram Moolenaar  " Use byte offset for column number
4574c45eb770SBram Moolenaar  set efm&
4575c45eb770SBram Moolenaar  cexpr "Xfile1:1:8:XX\nXfile1:1:11:YY\nXfile1:1:16:ZZ"
4576c45eb770SBram Moolenaar  call assert_equal([8, 10], [col('.'), virtcol('.')])
4577c45eb770SBram Moolenaar  cnext
4578c45eb770SBram Moolenaar  call assert_equal([11, 17], [col('.'), virtcol('.')])
4579c45eb770SBram Moolenaar  cnext
4580c45eb770SBram Moolenaar  call assert_equal([16, 25], [col('.'), virtcol('.')])
4581c45eb770SBram Moolenaar
4582c45eb770SBram Moolenaar  " Use screen column offset for column number
4583c45eb770SBram Moolenaar  set efm=%f:%l:%v:%m
4584c45eb770SBram Moolenaar  cexpr "Xfile1:1:10:XX\nXfile1:1:17:YY\nXfile1:1:25:ZZ"
4585c45eb770SBram Moolenaar  call assert_equal([8, 10], [col('.'), virtcol('.')])
4586c45eb770SBram Moolenaar  cnext
4587c45eb770SBram Moolenaar  call assert_equal([11, 17], [col('.'), virtcol('.')])
4588c45eb770SBram Moolenaar  cnext
4589c45eb770SBram Moolenaar  call assert_equal([16, 25], [col('.'), virtcol('.')])
4590c45eb770SBram Moolenaar
4591c95940c0SBram Moolenaar  " Use screen column number with a multi-line error message
4592c95940c0SBram Moolenaar  enew
4593c95940c0SBram Moolenaar  call writefile(["à test"], 'Xfile1')
4594c95940c0SBram Moolenaar  set efm=%E===\ %f\ ===,%C%l:%v,%Z%m
4595c95940c0SBram Moolenaar  cexpr ["=== Xfile1 ===", "1:3", "errormsg"]
4596c95940c0SBram Moolenaar  call assert_equal('Xfile1', @%)
4597c95940c0SBram Moolenaar  call assert_equal([0, 1, 4, 0], getpos('.'))
4598c95940c0SBram Moolenaar
4599c95940c0SBram Moolenaar  " Repeat previous test with byte offset %c: ensure that fix to issue #7145
4600c95940c0SBram Moolenaar  " does not break this
4601c95940c0SBram Moolenaar  set efm=%E===\ %f\ ===,%C%l:%c,%Z%m
4602c95940c0SBram Moolenaar  cexpr ["=== Xfile1 ===", "1:3", "errormsg"]
4603c95940c0SBram Moolenaar  call assert_equal('Xfile1', @%)
4604c95940c0SBram Moolenaar  call assert_equal([0, 1, 3, 0], getpos('.'))
4605c95940c0SBram Moolenaar
4606c45eb770SBram Moolenaar  enew | only
4607c45eb770SBram Moolenaar  set efm&
4608c45eb770SBram Moolenaar  call delete('Xfile1')
4609c45eb770SBram Moolenaarendfunc
4610ee8188fcSBram Moolenaar
4611ee8188fcSBram Moolenaar" Test for the quickfix window buffer
4612ee8188fcSBram Moolenaarfunc Xqfbuf_test(cchar)
4613ee8188fcSBram Moolenaar  call s:setup_commands(a:cchar)
4614ee8188fcSBram Moolenaar
4615ee8188fcSBram Moolenaar  " Quickfix buffer should be reused across closing and opening a quickfix
4616ee8188fcSBram Moolenaar  " window
4617ee8188fcSBram Moolenaar  Xexpr "F1:10:Line10"
4618ee8188fcSBram Moolenaar  Xopen
4619ee8188fcSBram Moolenaar  let qfbnum = bufnr('')
4620ee8188fcSBram Moolenaar  Xclose
4621ee8188fcSBram Moolenaar  " Even after the quickfix window is closed, the buffer should be loaded
4622ee8188fcSBram Moolenaar  call assert_true(bufloaded(qfbnum))
4623647e24baSBram Moolenaar  call assert_true(qfbnum, g:Xgetlist({'qfbufnr' : 0}).qfbufnr)
4624ee8188fcSBram Moolenaar  Xopen
4625ee8188fcSBram Moolenaar  " Buffer should be reused when opening the window again
4626ee8188fcSBram Moolenaar  call assert_equal(qfbnum, bufnr(''))
4627ee8188fcSBram Moolenaar  Xclose
4628ee8188fcSBram Moolenaar
4629ee8188fcSBram Moolenaar  if a:cchar == 'l'
4630ee8188fcSBram Moolenaar    %bwipe
4631ee8188fcSBram Moolenaar    " For a location list, when both the file window and the location list
4632ee8188fcSBram Moolenaar    " window for the list are closed, then the buffer should be freed.
4633ee8188fcSBram Moolenaar    new | only
4634ee8188fcSBram Moolenaar    lexpr "F1:10:Line10"
4635ee8188fcSBram Moolenaar    let wid = win_getid()
4636ee8188fcSBram Moolenaar    lopen
4637ee8188fcSBram Moolenaar    let qfbnum = bufnr('')
4638ee8188fcSBram Moolenaar    call assert_match(qfbnum . ' %a-  "\[Location List]"', execute('ls'))
4639ee8188fcSBram Moolenaar    close
4640ee8188fcSBram Moolenaar    " When the location list window is closed, the buffer name should not
4641ee8188fcSBram Moolenaar    " change to 'Quickfix List'
4642647e24baSBram Moolenaar    call assert_match(qfbnum . 'u h-  "\[Location List]"', execute('ls!'))
4643ee8188fcSBram Moolenaar    call assert_true(bufloaded(qfbnum))
4644ee8188fcSBram Moolenaar
4645d82a81caSBram Moolenaar    " After deleting a location list buffer using ":bdelete", opening the
4646d82a81caSBram Moolenaar    " location list window should mark the buffer as a location list buffer.
4647d82a81caSBram Moolenaar    exe "bdelete " . qfbnum
4648d82a81caSBram Moolenaar    lopen
4649d82a81caSBram Moolenaar    call assert_equal("quickfix", &buftype)
4650d82a81caSBram Moolenaar    call assert_equal(1, getwininfo(win_getid(winnr()))[0].loclist)
4651d82a81caSBram Moolenaar    call assert_equal(wid, getloclist(0, {'filewinid' : 0}).filewinid)
4652d82a81caSBram Moolenaar    call assert_false(&swapfile)
4653d82a81caSBram Moolenaar    lclose
4654d82a81caSBram Moolenaar
4655eeb1b9c7SBram Moolenaar    " When the location list is cleared for the window, the buffer should be
4656eeb1b9c7SBram Moolenaar    " removed
4657eeb1b9c7SBram Moolenaar    call setloclist(0, [], 'f')
4658eeb1b9c7SBram Moolenaar    call assert_false(bufexists(qfbnum))
4659647e24baSBram Moolenaar    call assert_equal(0, getloclist(0, {'qfbufnr' : 0}).qfbufnr)
4660eeb1b9c7SBram Moolenaar
4661eeb1b9c7SBram Moolenaar    " When the location list is freed with the location list window open, the
4662eeb1b9c7SBram Moolenaar    " location list buffer should not be lost. It should be reused when the
4663eeb1b9c7SBram Moolenaar    " location list is again populated.
4664eeb1b9c7SBram Moolenaar    lexpr "F1:10:Line10"
4665eeb1b9c7SBram Moolenaar    lopen
4666eeb1b9c7SBram Moolenaar    let wid = win_getid()
4667eeb1b9c7SBram Moolenaar    let qfbnum = bufnr('')
4668eeb1b9c7SBram Moolenaar    wincmd p
4669eeb1b9c7SBram Moolenaar    call setloclist(0, [], 'f')
4670eeb1b9c7SBram Moolenaar    lexpr "F1:10:Line10"
4671eeb1b9c7SBram Moolenaar    lopen
4672eeb1b9c7SBram Moolenaar    call assert_equal(wid, win_getid())
4673eeb1b9c7SBram Moolenaar    call assert_equal(qfbnum, bufnr(''))
4674eeb1b9c7SBram Moolenaar    lclose
4675eeb1b9c7SBram Moolenaar
4676eeb1b9c7SBram Moolenaar    " When the window with the location list is closed, the buffer should be
4677eeb1b9c7SBram Moolenaar    " removed
4678ee8188fcSBram Moolenaar    new | only
4679eeb1b9c7SBram Moolenaar    call assert_false(bufexists(qfbnum))
4680ee8188fcSBram Moolenaar  endif
4681ee8188fcSBram Moolenaarendfunc
4682ee8188fcSBram Moolenaar
4683ee8188fcSBram Moolenaarfunc Test_qfbuf()
4684ee8188fcSBram Moolenaar  call Xqfbuf_test('c')
4685ee8188fcSBram Moolenaar  call Xqfbuf_test('l')
4686ee8188fcSBram Moolenaarendfunc
4687eeb1b9c7SBram Moolenaar
4688eeb1b9c7SBram Moolenaar" If there is an autocmd to use only one window, then opening the location
4689eeb1b9c7SBram Moolenaar" list window used to crash Vim.
4690eeb1b9c7SBram Moolenaarfunc Test_winonly_autocmd()
4691eeb1b9c7SBram Moolenaar  call s:create_test_file('Xtest1')
4692eeb1b9c7SBram Moolenaar  " Autocmd to show only one Vim window at a time
4693eeb1b9c7SBram Moolenaar  autocmd WinEnter * only
4694eeb1b9c7SBram Moolenaar  new
4695eeb1b9c7SBram Moolenaar  " Load the location list
4696eeb1b9c7SBram Moolenaar  lexpr "Xtest1:5:Line5\nXtest1:10:Line10\nXtest1:15:Line15"
4697eeb1b9c7SBram Moolenaar  let loclistid = getloclist(0, {'id' : 0}).id
4698eeb1b9c7SBram Moolenaar  " Open the location list window. Only this window will be shown and the file
4699eeb1b9c7SBram Moolenaar  " window is closed.
4700eeb1b9c7SBram Moolenaar  lopen
4701eeb1b9c7SBram Moolenaar  call assert_equal(loclistid, getloclist(0, {'id' : 0}).id)
4702eeb1b9c7SBram Moolenaar  " Jump to an entry in the location list and make sure that the cursor is
4703eeb1b9c7SBram Moolenaar  " positioned correctly.
4704eeb1b9c7SBram Moolenaar  ll 3
4705eeb1b9c7SBram Moolenaar  call assert_equal(loclistid, getloclist(0, {'id' : 0}).id)
4706bdd2c290SBram Moolenaar  call assert_equal('Xtest1', @%)
4707eeb1b9c7SBram Moolenaar  call assert_equal(15, line('.'))
4708eeb1b9c7SBram Moolenaar  " Cleanup
4709eeb1b9c7SBram Moolenaar  autocmd! WinEnter
4710eeb1b9c7SBram Moolenaar  new | only
4711eeb1b9c7SBram Moolenaar  call delete('Xtest1')
4712eeb1b9c7SBram Moolenaarendfunc
471339803d82SBram Moolenaar
471439803d82SBram Moolenaar" Test to make sure that an empty quickfix buffer is not reused for loading
471539803d82SBram Moolenaar" a normal buffer.
471639803d82SBram Moolenaarfunc Test_empty_qfbuf()
471739803d82SBram Moolenaar  enew | only
471839803d82SBram Moolenaar  call writefile(["Test"], 'Xfile1')
471939803d82SBram Moolenaar  call setqflist([], 'f')
472039803d82SBram Moolenaar  copen | only
472139803d82SBram Moolenaar  let qfbuf = bufnr('')
472239803d82SBram Moolenaar  edit Xfile1
472339803d82SBram Moolenaar  call assert_notequal(qfbuf, bufnr(''))
472439803d82SBram Moolenaar  enew
472539803d82SBram Moolenaar  call delete('Xfile1')
472639803d82SBram Moolenaarendfunc
47273ff33114SBram Moolenaar
47283ff33114SBram Moolenaar" Test for the :cbelow, :cabove, :lbelow and :labove commands.
4729cf6a55c4SBram Moolenaar" And for the :cafter, :cbefore, :lafter and :lbefore commands.
47303ff33114SBram Moolenaarfunc Xtest_below(cchar)
47313ff33114SBram Moolenaar  call s:setup_commands(a:cchar)
47323ff33114SBram Moolenaar
47333ff33114SBram Moolenaar  " No quickfix/location list
47343ff33114SBram Moolenaar  call assert_fails('Xbelow', 'E42:')
47353ff33114SBram Moolenaar  call assert_fails('Xabove', 'E42:')
4736cf6a55c4SBram Moolenaar  call assert_fails('Xbefore', 'E42:')
4737cf6a55c4SBram Moolenaar  call assert_fails('Xafter', 'E42:')
47383ff33114SBram Moolenaar
47393ff33114SBram Moolenaar  " Empty quickfix/location list
47403ff33114SBram Moolenaar  call g:Xsetlist([])
47413ff33114SBram Moolenaar  call assert_fails('Xbelow', 'E42:')
47423ff33114SBram Moolenaar  call assert_fails('Xabove', 'E42:')
4743cf6a55c4SBram Moolenaar  call assert_fails('Xbefore', 'E42:')
4744cf6a55c4SBram Moolenaar  call assert_fails('Xafter', 'E42:')
47453ff33114SBram Moolenaar
47463ff33114SBram Moolenaar  call s:create_test_file('X1')
47473ff33114SBram Moolenaar  call s:create_test_file('X2')
47483ff33114SBram Moolenaar  call s:create_test_file('X3')
47493ff33114SBram Moolenaar  call s:create_test_file('X4')
47503ff33114SBram Moolenaar
47513ff33114SBram Moolenaar  " Invalid entries
47523ff33114SBram Moolenaar  edit X1
47533ff33114SBram Moolenaar  call g:Xsetlist(["E1", "E2"])
47543ff33114SBram Moolenaar  call assert_fails('Xbelow', 'E42:')
47553ff33114SBram Moolenaar  call assert_fails('Xabove', 'E42:')
47563ff33114SBram Moolenaar  call assert_fails('3Xbelow', 'E42:')
47573ff33114SBram Moolenaar  call assert_fails('4Xabove', 'E42:')
4758cf6a55c4SBram Moolenaar  call assert_fails('Xbefore', 'E42:')
4759cf6a55c4SBram Moolenaar  call assert_fails('Xafter', 'E42:')
4760cf6a55c4SBram Moolenaar  call assert_fails('3Xbefore', 'E42:')
4761cf6a55c4SBram Moolenaar  call assert_fails('4Xafter', 'E42:')
47623ff33114SBram Moolenaar
47633ff33114SBram Moolenaar  " Test the commands with various arguments
4764cf6a55c4SBram Moolenaar  Xexpr ["X1:5:3:L5", "X2:5:2:L5", "X2:10:3:L10", "X2:15:4:L15", "X3:3:5:L3"]
47653ff33114SBram Moolenaar  edit +7 X2
47663ff33114SBram Moolenaar  Xabove
4767bdd2c290SBram Moolenaar  call assert_equal(['X2', 5], [@%, line('.')])
47683ff33114SBram Moolenaar  call assert_fails('Xabove', 'E553:')
4769cf6a55c4SBram Moolenaar  normal 7G
4770cf6a55c4SBram Moolenaar  Xbefore
4771bdd2c290SBram Moolenaar  call assert_equal(['X2', 5, 2], [@%, line('.'), col('.')])
4772cf6a55c4SBram Moolenaar  call assert_fails('Xbefore', 'E553:')
4773cf6a55c4SBram Moolenaar
47743ff33114SBram Moolenaar  normal 2j
47753ff33114SBram Moolenaar  Xbelow
4776bdd2c290SBram Moolenaar  call assert_equal(['X2', 10], [@%, line('.')])
4777cf6a55c4SBram Moolenaar  normal 7G
4778cf6a55c4SBram Moolenaar  Xafter
4779bdd2c290SBram Moolenaar  call assert_equal(['X2', 10, 3], [@%, line('.'), col('.')])
4780cf6a55c4SBram Moolenaar
47813ff33114SBram Moolenaar  " Last error in this file
47823ff33114SBram Moolenaar  Xbelow 99
4783bdd2c290SBram Moolenaar  call assert_equal(['X2', 15], [@%, line('.')])
47843ff33114SBram Moolenaar  call assert_fails('Xbelow', 'E553:')
4785cf6a55c4SBram Moolenaar  normal gg
4786cf6a55c4SBram Moolenaar  Xafter 99
4787bdd2c290SBram Moolenaar  call assert_equal(['X2', 15, 4], [@%, line('.'), col('.')])
4788cf6a55c4SBram Moolenaar  call assert_fails('Xafter', 'E553:')
4789cf6a55c4SBram Moolenaar
47903ff33114SBram Moolenaar  " First error in this file
47913ff33114SBram Moolenaar  Xabove 99
4792bdd2c290SBram Moolenaar  call assert_equal(['X2', 5], [@%, line('.')])
47933ff33114SBram Moolenaar  call assert_fails('Xabove', 'E553:')
4794cf6a55c4SBram Moolenaar  normal G
4795cf6a55c4SBram Moolenaar  Xbefore 99
4796bdd2c290SBram Moolenaar  call assert_equal(['X2', 5, 2], [@%, line('.'), col('.')])
4797cf6a55c4SBram Moolenaar  call assert_fails('Xbefore', 'E553:')
4798cf6a55c4SBram Moolenaar
47993ff33114SBram Moolenaar  normal gg
48003ff33114SBram Moolenaar  Xbelow 2
4801bdd2c290SBram Moolenaar  call assert_equal(['X2', 10], [@%, line('.')])
4802cf6a55c4SBram Moolenaar  normal gg
4803cf6a55c4SBram Moolenaar  Xafter 2
4804bdd2c290SBram Moolenaar  call assert_equal(['X2', 10, 3], [@%, line('.'), col('.')])
4805cf6a55c4SBram Moolenaar
48063ff33114SBram Moolenaar  normal G
48073ff33114SBram Moolenaar  Xabove 2
4808bdd2c290SBram Moolenaar  call assert_equal(['X2', 10], [@%, line('.')])
4809cf6a55c4SBram Moolenaar  normal G
4810cf6a55c4SBram Moolenaar  Xbefore 2
4811bdd2c290SBram Moolenaar  call assert_equal(['X2', 10, 3], [@%, line('.'), col('.')])
4812cf6a55c4SBram Moolenaar
48133ff33114SBram Moolenaar  edit X4
48143ff33114SBram Moolenaar  call assert_fails('Xabove', 'E42:')
48153ff33114SBram Moolenaar  call assert_fails('Xbelow', 'E42:')
4816cf6a55c4SBram Moolenaar  call assert_fails('Xbefore', 'E42:')
4817cf6a55c4SBram Moolenaar  call assert_fails('Xafter', 'E42:')
48183ff33114SBram Moolenaar  if a:cchar == 'l'
48193ff33114SBram Moolenaar    " If a buffer has location list entries from some other window but not
48203ff33114SBram Moolenaar    " from the current window, then the commands should fail.
48213ff33114SBram Moolenaar    edit X1 | split | call setloclist(0, [], 'f')
48223ff33114SBram Moolenaar    call assert_fails('Xabove', 'E776:')
48233ff33114SBram Moolenaar    call assert_fails('Xbelow', 'E776:')
4824cf6a55c4SBram Moolenaar    call assert_fails('Xbefore', 'E776:')
4825cf6a55c4SBram Moolenaar    call assert_fails('Xafter', 'E776:')
48263ff33114SBram Moolenaar    close
48273ff33114SBram Moolenaar  endif
48283ff33114SBram Moolenaar
48293ff33114SBram Moolenaar  " Test for lines with multiple quickfix entries
48303ff33114SBram Moolenaar  Xexpr ["X1:5:L5", "X2:5:1:L5_1", "X2:5:2:L5_2", "X2:5:3:L5_3",
48313ff33114SBram Moolenaar	      \ "X2:10:1:L10_1", "X2:10:2:L10_2", "X2:10:3:L10_3",
48323ff33114SBram Moolenaar	      \ "X2:15:1:L15_1", "X2:15:2:L15_2", "X2:15:3:L15_3", "X3:3:L3"]
48333ff33114SBram Moolenaar  edit +1 X2
48343ff33114SBram Moolenaar  Xbelow 2
4835bdd2c290SBram Moolenaar  call assert_equal(['X2', 10, 1], [@%, line('.'), col('.')])
4836cf6a55c4SBram Moolenaar  normal 1G
4837cf6a55c4SBram Moolenaar  Xafter 2
4838bdd2c290SBram Moolenaar  call assert_equal(['X2', 5, 2], [@%, line('.'), col('.')])
4839cf6a55c4SBram Moolenaar
48403ff33114SBram Moolenaar  normal gg
48413ff33114SBram Moolenaar  Xbelow 99
4842bdd2c290SBram Moolenaar  call assert_equal(['X2', 15, 1], [@%, line('.'), col('.')])
4843cf6a55c4SBram Moolenaar  normal gg
4844cf6a55c4SBram Moolenaar  Xafter 99
4845bdd2c290SBram Moolenaar  call assert_equal(['X2', 15, 3], [@%, line('.'), col('.')])
4846cf6a55c4SBram Moolenaar
48473ff33114SBram Moolenaar  normal G
48483ff33114SBram Moolenaar  Xabove 2
4849bdd2c290SBram Moolenaar  call assert_equal(['X2', 10, 1], [@%, line('.'), col('.')])
48503ff33114SBram Moolenaar  normal G
4851cf6a55c4SBram Moolenaar  Xbefore 2
4852bdd2c290SBram Moolenaar  call assert_equal(['X2', 15, 2], [@%, line('.'), col('.')])
4853cf6a55c4SBram Moolenaar
4854cf6a55c4SBram Moolenaar  normal G
48553ff33114SBram Moolenaar  Xabove 99
4856bdd2c290SBram Moolenaar  call assert_equal(['X2', 5, 1], [@%, line('.'), col('.')])
4857cf6a55c4SBram Moolenaar  normal G
4858cf6a55c4SBram Moolenaar  Xbefore 99
4859bdd2c290SBram Moolenaar  call assert_equal(['X2', 5, 1], [@%, line('.'), col('.')])
4860cf6a55c4SBram Moolenaar
48613ff33114SBram Moolenaar  normal 10G
48623ff33114SBram Moolenaar  Xabove
4863bdd2c290SBram Moolenaar  call assert_equal(['X2', 5, 1], [@%, line('.'), col('.')])
4864cf6a55c4SBram Moolenaar  normal 10G$
4865cf6a55c4SBram Moolenaar  2Xbefore
4866bdd2c290SBram Moolenaar  call assert_equal(['X2', 10, 2], [@%, line('.'), col('.')])
4867cf6a55c4SBram Moolenaar
48683ff33114SBram Moolenaar  normal 10G
48693ff33114SBram Moolenaar  Xbelow
4870bdd2c290SBram Moolenaar  call assert_equal(['X2', 15, 1], [@%, line('.'), col('.')])
4871cf6a55c4SBram Moolenaar  normal 9G
4872cf6a55c4SBram Moolenaar  5Xafter
4873bdd2c290SBram Moolenaar  call assert_equal(['X2', 15, 2], [@%, line('.'), col('.')])
48743ff33114SBram Moolenaar
48753ff33114SBram Moolenaar  " Invalid range
48763ff33114SBram Moolenaar  if a:cchar == 'c'
487725190db2SBram Moolenaar    call assert_fails('-2cbelow', 'E16:')
4878cf6a55c4SBram Moolenaar    call assert_fails('-2cafter', 'E16:')
48793ff33114SBram Moolenaar  else
488025190db2SBram Moolenaar    call assert_fails('-2lbelow', 'E16:')
4881cf6a55c4SBram Moolenaar    call assert_fails('-2lafter', 'E16:')
48823ff33114SBram Moolenaar  endif
48833ff33114SBram Moolenaar
48843ff33114SBram Moolenaar  call delete('X1')
48853ff33114SBram Moolenaar  call delete('X2')
48863ff33114SBram Moolenaar  call delete('X3')
48873ff33114SBram Moolenaar  call delete('X4')
48883ff33114SBram Moolenaarendfunc
48893ff33114SBram Moolenaar
48903ff33114SBram Moolenaarfunc Test_cbelow()
48913ff33114SBram Moolenaar  call Xtest_below('c')
48923ff33114SBram Moolenaar  call Xtest_below('l')
48933ff33114SBram Moolenaarendfunc
489425190db2SBram Moolenaar
489525190db2SBram Moolenaarfunc Test_quickfix_count()
489625190db2SBram Moolenaar  let commands = [
489725190db2SBram Moolenaar	\ 'cNext',
489825190db2SBram Moolenaar	\ 'cNfile',
489925190db2SBram Moolenaar	\ 'cabove',
490025190db2SBram Moolenaar	\ 'cbelow',
490125190db2SBram Moolenaar	\ 'cfirst',
490225190db2SBram Moolenaar	\ 'clast',
490325190db2SBram Moolenaar	\ 'cnewer',
490425190db2SBram Moolenaar	\ 'cnext',
490525190db2SBram Moolenaar	\ 'cnfile',
490625190db2SBram Moolenaar	\ 'colder',
490725190db2SBram Moolenaar	\ 'cprevious',
490825190db2SBram Moolenaar	\ 'crewind',
490925190db2SBram Moolenaar	\
491025190db2SBram Moolenaar	\ 'lNext',
491125190db2SBram Moolenaar	\ 'lNfile',
491225190db2SBram Moolenaar	\ 'labove',
491325190db2SBram Moolenaar	\ 'lbelow',
491425190db2SBram Moolenaar	\ 'lfirst',
491525190db2SBram Moolenaar	\ 'llast',
491625190db2SBram Moolenaar	\ 'lnewer',
491725190db2SBram Moolenaar	\ 'lnext',
491825190db2SBram Moolenaar	\ 'lnfile',
491925190db2SBram Moolenaar	\ 'lolder',
492025190db2SBram Moolenaar	\ 'lprevious',
492125190db2SBram Moolenaar	\ 'lrewind',
492225190db2SBram Moolenaar	\ ]
492325190db2SBram Moolenaar  for cmd in commands
492425190db2SBram Moolenaar    call assert_fails('-1' .. cmd, 'E16:')
492525190db2SBram Moolenaar    call assert_fails('.' .. cmd, 'E16:')
492625190db2SBram Moolenaar    call assert_fails('%' .. cmd, 'E16:')
492725190db2SBram Moolenaar    call assert_fails('$' .. cmd, 'E16:')
492825190db2SBram Moolenaar  endfor
492925190db2SBram Moolenaarendfunc
49306a0cc916SBram Moolenaar
49316a0cc916SBram Moolenaar" Test for aborting quickfix commands using QuickFixCmdPre
49326a0cc916SBram Moolenaarfunc Xtest_qfcmd_abort(cchar)
49336a0cc916SBram Moolenaar  call s:setup_commands(a:cchar)
49346a0cc916SBram Moolenaar
49356a0cc916SBram Moolenaar  call g:Xsetlist([], 'f')
49366a0cc916SBram Moolenaar
49376a0cc916SBram Moolenaar  " cexpr/lexpr
49386a0cc916SBram Moolenaar  let e = ''
49396a0cc916SBram Moolenaar  try
49406a0cc916SBram Moolenaar    Xexpr ["F1:10:Line10", "F2:20:Line20"]
49416a0cc916SBram Moolenaar  catch /.*/
49426a0cc916SBram Moolenaar    let e = v:exception
49436a0cc916SBram Moolenaar  endtry
49446a0cc916SBram Moolenaar  call assert_equal('AbortCmd', e)
49456a0cc916SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
49466a0cc916SBram Moolenaar
49476a0cc916SBram Moolenaar  " cfile/lfile
49486a0cc916SBram Moolenaar  call writefile(["F1:10:Line10", "F2:20:Line20"], 'Xfile1')
49496a0cc916SBram Moolenaar  let e = ''
49506a0cc916SBram Moolenaar  try
49516a0cc916SBram Moolenaar    Xfile Xfile1
49526a0cc916SBram Moolenaar  catch /.*/
49536a0cc916SBram Moolenaar    let e = v:exception
49546a0cc916SBram Moolenaar  endtry
49556a0cc916SBram Moolenaar  call assert_equal('AbortCmd', e)
49566a0cc916SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
49576a0cc916SBram Moolenaar  call delete('Xfile1')
49586a0cc916SBram Moolenaar
49596a0cc916SBram Moolenaar  " cgetbuffer/lgetbuffer
49606a0cc916SBram Moolenaar  enew!
49616a0cc916SBram Moolenaar  call append(0, ["F1:10:Line10", "F2:20:Line20"])
49626a0cc916SBram Moolenaar  let e = ''
49636a0cc916SBram Moolenaar  try
49646a0cc916SBram Moolenaar    Xgetbuffer
49656a0cc916SBram Moolenaar  catch /.*/
49666a0cc916SBram Moolenaar    let e = v:exception
49676a0cc916SBram Moolenaar  endtry
49686a0cc916SBram Moolenaar  call assert_equal('AbortCmd', e)
49696a0cc916SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
49706a0cc916SBram Moolenaar  enew!
49716a0cc916SBram Moolenaar
49726a0cc916SBram Moolenaar  " vimgrep/lvimgrep
49736a0cc916SBram Moolenaar  let e = ''
49746a0cc916SBram Moolenaar  try
49756a0cc916SBram Moolenaar    Xvimgrep /func/ test_quickfix.vim
49766a0cc916SBram Moolenaar  catch /.*/
49776a0cc916SBram Moolenaar    let e = v:exception
49786a0cc916SBram Moolenaar  endtry
49796a0cc916SBram Moolenaar  call assert_equal('AbortCmd', e)
49806a0cc916SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
49816a0cc916SBram Moolenaar
49826a0cc916SBram Moolenaar  " helpgrep/lhelpgrep
49836a0cc916SBram Moolenaar  let e = ''
49846a0cc916SBram Moolenaar  try
49856a0cc916SBram Moolenaar    Xhelpgrep quickfix
49866a0cc916SBram Moolenaar  catch /.*/
49876a0cc916SBram Moolenaar    let e = v:exception
49886a0cc916SBram Moolenaar  endtry
49896a0cc916SBram Moolenaar  call assert_equal('AbortCmd', e)
49906a0cc916SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
49916a0cc916SBram Moolenaar
49926a0cc916SBram Moolenaar  " grep/lgrep
49936a0cc916SBram Moolenaar  if has('unix')
49946a0cc916SBram Moolenaar    let e = ''
49956a0cc916SBram Moolenaar    try
49966a0cc916SBram Moolenaar      silent Xgrep func test_quickfix.vim
49976a0cc916SBram Moolenaar    catch /.*/
49986a0cc916SBram Moolenaar      let e = v:exception
49996a0cc916SBram Moolenaar    endtry
50006a0cc916SBram Moolenaar    call assert_equal('AbortCmd', e)
50016a0cc916SBram Moolenaar    call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
50026a0cc916SBram Moolenaar  endif
50036a0cc916SBram Moolenaarendfunc
50046a0cc916SBram Moolenaar
50056a0cc916SBram Moolenaarfunc Test_qfcmd_abort()
50066a0cc916SBram Moolenaar  augroup QF_Test
50076a0cc916SBram Moolenaar    au!
50086a0cc916SBram Moolenaar    autocmd  QuickFixCmdPre * throw "AbortCmd"
50096a0cc916SBram Moolenaar  augroup END
50106a0cc916SBram Moolenaar
50116a0cc916SBram Moolenaar  call Xtest_qfcmd_abort('c')
50126a0cc916SBram Moolenaar  call Xtest_qfcmd_abort('l')
50136a0cc916SBram Moolenaar
50146a0cc916SBram Moolenaar  augroup QF_Test
50156a0cc916SBram Moolenaar    au!
50166a0cc916SBram Moolenaar  augroup END
50176a0cc916SBram Moolenaarendfunc
50186a0cc916SBram Moolenaar
5019d8a8c4caSBram Moolenaar" Test for using a file in one of the parent directories.
5020d8a8c4caSBram Moolenaarfunc Test_search_in_dirstack()
5021d8a8c4caSBram Moolenaar  call mkdir('Xtestdir/a/b/c', 'p')
5022d8a8c4caSBram Moolenaar  let save_cwd = getcwd()
5023d8a8c4caSBram Moolenaar  call writefile(["X1_L1", "X1_L2"], 'Xtestdir/Xfile1')
5024d8a8c4caSBram Moolenaar  call writefile(["X2_L1", "X2_L2"], 'Xtestdir/a/Xfile2')
5025d8a8c4caSBram Moolenaar  call writefile(["X3_L1", "X3_L2"], 'Xtestdir/a/b/Xfile3')
5026d8a8c4caSBram Moolenaar  call writefile(["X4_L1", "X4_L2"], 'Xtestdir/a/b/c/Xfile4')
5027d8a8c4caSBram Moolenaar
5028d8a8c4caSBram Moolenaar  let lines = "Entering dir Xtestdir\n" .
5029d8a8c4caSBram Moolenaar	      \ "Entering dir a\n" .
5030d8a8c4caSBram Moolenaar	      \ "Entering dir b\n" .
5031d8a8c4caSBram Moolenaar	      \ "Xfile2:2:X2_L2\n" .
5032d8a8c4caSBram Moolenaar	      \ "Leaving dir a\n" .
5033d8a8c4caSBram Moolenaar	      \ "Xfile1:2:X1_L2\n" .
5034d8a8c4caSBram Moolenaar	      \ "Xfile3:1:X3_L1\n" .
5035d8a8c4caSBram Moolenaar	      \ "Entering dir c\n" .
5036d8a8c4caSBram Moolenaar	      \ "Xfile4:2:X4_L2\n" .
503788a3e2b2SBram Moolenaar	      \ "Leaving dir c\n"
5038d8a8c4caSBram Moolenaar  set efm=%DEntering\ dir\ %f,%XLeaving\ dir\ %f,%f:%l:%m
503988a3e2b2SBram Moolenaar  cexpr lines .. "Leaving dir Xtestdir|\n" | let next = 1
5040d8a8c4caSBram Moolenaar  call assert_equal(11, getqflist({'size' : 0}).size)
5041d8a8c4caSBram Moolenaar  call assert_equal(4, getqflist({'idx' : 0}).idx)
5042d8a8c4caSBram Moolenaar  call assert_equal('X2_L2', getline('.'))
504388a3e2b2SBram Moolenaar  call assert_equal(1, next)
5044d8a8c4caSBram Moolenaar  cnext
5045d8a8c4caSBram Moolenaar  call assert_equal(6, getqflist({'idx' : 0}).idx)
5046d8a8c4caSBram Moolenaar  call assert_equal('X1_L2', getline('.'))
5047d8a8c4caSBram Moolenaar  cnext
5048d8a8c4caSBram Moolenaar  call assert_equal(7, getqflist({'idx' : 0}).idx)
5049d8a8c4caSBram Moolenaar  call assert_equal(1, line('$'))
5050d8a8c4caSBram Moolenaar  call assert_equal('', getline(1))
5051d8a8c4caSBram Moolenaar  cnext
5052d8a8c4caSBram Moolenaar  call assert_equal(9, getqflist({'idx' : 0}).idx)
5053d8a8c4caSBram Moolenaar  call assert_equal(1, line('$'))
5054d8a8c4caSBram Moolenaar  call assert_equal('', getline(1))
5055d8a8c4caSBram Moolenaar
5056d8a8c4caSBram Moolenaar  set efm&
5057d8a8c4caSBram Moolenaar  exe 'cd ' . save_cwd
5058d8a8c4caSBram Moolenaar  call delete('Xtestdir', 'rf')
5059d8a8c4caSBram Moolenaarendfunc
5060d8a8c4caSBram Moolenaar
50611860bde9SBram Moolenaar" Test for :cquit
50621860bde9SBram Moolenaarfunc Test_cquit()
50631860bde9SBram Moolenaar  " Exit Vim with a non-zero value
50641860bde9SBram Moolenaar  if RunVim([], ["cquit 7"], '')
50651860bde9SBram Moolenaar    call assert_equal(7, v:shell_error)
50661860bde9SBram Moolenaar  endif
50671860bde9SBram Moolenaar
50681860bde9SBram Moolenaar  if RunVim([], ["50cquit"], '')
50691860bde9SBram Moolenaar    call assert_equal(50, v:shell_error)
50701860bde9SBram Moolenaar  endif
50711860bde9SBram Moolenaar
50721860bde9SBram Moolenaar  " Exit Vim with default value
50731860bde9SBram Moolenaar  if RunVim([], ["cquit"], '')
50741860bde9SBram Moolenaar    call assert_equal(1, v:shell_error)
50751860bde9SBram Moolenaar  endif
50761860bde9SBram Moolenaar
50771860bde9SBram Moolenaar  " Exit Vim with zero value
50781860bde9SBram Moolenaar  if RunVim([], ["cquit 0"], '')
50791860bde9SBram Moolenaar    call assert_equal(0, v:shell_error)
50801860bde9SBram Moolenaar  endif
50811860bde9SBram Moolenaar
50821860bde9SBram Moolenaar  " Exit Vim with negative value
50831860bde9SBram Moolenaar  call assert_fails('-3cquit', 'E16:')
50841860bde9SBram Moolenaarendfunc
50851860bde9SBram Moolenaar
5086858ba06dSBram Moolenaar" Test for getting a specific item from a quickfix list
5087858ba06dSBram Moolenaarfunc Xtest_getqflist_by_idx(cchar)
5088858ba06dSBram Moolenaar  call s:setup_commands(a:cchar)
5089858ba06dSBram Moolenaar  " Empty list
5090858ba06dSBram Moolenaar  call assert_equal([], g:Xgetlist({'idx' : 1, 'items' : 0}).items)
5091858ba06dSBram Moolenaar  Xexpr ['F1:10:L10', 'F1:20:L20']
5092858ba06dSBram Moolenaar  let l = g:Xgetlist({'idx' : 2, 'items' : 0}).items
5093858ba06dSBram Moolenaar  call assert_equal(bufnr('F1'), l[0].bufnr)
5094858ba06dSBram Moolenaar  call assert_equal(20, l[0].lnum)
5095858ba06dSBram Moolenaar  call assert_equal('L20', l[0].text)
5096858ba06dSBram Moolenaar  call assert_equal([], g:Xgetlist({'idx' : -1, 'items' : 0}).items)
5097858ba06dSBram Moolenaar  call assert_equal([], g:Xgetlist({'idx' : 3, 'items' : 0}).items)
5098858ba06dSBram Moolenaar  %bwipe!
5099858ba06dSBram Moolenaarendfunc
5100858ba06dSBram Moolenaar
5101858ba06dSBram Moolenaarfunc Test_getqflist_by_idx()
5102858ba06dSBram Moolenaar  call Xtest_getqflist_by_idx('c')
5103858ba06dSBram Moolenaar  call Xtest_getqflist_by_idx('l')
5104858ba06dSBram Moolenaarendfunc
5105858ba06dSBram Moolenaar
5106858ba06dSBram Moolenaar" Test for the 'quickfixtextfunc' setting
5107858ba06dSBram Moolenaarfunc Tqfexpr(info)
5108858ba06dSBram Moolenaar  if a:info.quickfix
510900e260bbSBram Moolenaar    let qfl = getqflist({'id' : a:info.id, 'items' : 1}).items
5110858ba06dSBram Moolenaar  else
511100e260bbSBram Moolenaar    let qfl = getloclist(a:info.winid, {'id' : a:info.id, 'items' : 1}).items
5112858ba06dSBram Moolenaar  endif
5113858ba06dSBram Moolenaar
511400e260bbSBram Moolenaar  let l = []
511500e260bbSBram Moolenaar  for idx in range(a:info.start_idx - 1, a:info.end_idx - 1)
511600e260bbSBram Moolenaar    let e = qfl[idx]
5117858ba06dSBram Moolenaar    let s = ''
5118858ba06dSBram Moolenaar    if e.bufnr != 0
5119858ba06dSBram Moolenaar      let bname = bufname(e.bufnr)
5120858ba06dSBram Moolenaar      let s ..= fnamemodify(bname, ':.')
5121858ba06dSBram Moolenaar    endif
5122858ba06dSBram Moolenaar    let s ..= '-'
5123858ba06dSBram Moolenaar    let s ..= 'L' .. string(e.lnum) .. 'C' .. string(e.col) .. '-'
5124858ba06dSBram Moolenaar    let s ..= e.text
512500e260bbSBram Moolenaar    call add(l, s)
512600e260bbSBram Moolenaar  endfor
5127858ba06dSBram Moolenaar
512800e260bbSBram Moolenaar  return l
5129858ba06dSBram Moolenaarendfunc
5130858ba06dSBram Moolenaar
5131858ba06dSBram Moolenaarfunc Xtest_qftextfunc(cchar)
5132858ba06dSBram Moolenaar  call s:setup_commands(a:cchar)
5133858ba06dSBram Moolenaar
5134858ba06dSBram Moolenaar  set efm=%f:%l:%c:%m
5135858ba06dSBram Moolenaar  set quickfixtextfunc=Tqfexpr
5136d43906d2SBram Moolenaar  call assert_equal('Tqfexpr', &quickfixtextfunc)
5137d43906d2SBram Moolenaar  call assert_equal('',
5138d43906d2SBram Moolenaar        \ g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc)
51396864efa5Sthinca  call g:Xsetlist([
51406864efa5Sthinca        \ { 'filename': 'F1', 'lnum': 10, 'col': 2,
51416864efa5Sthinca        \   'end_col': 7, 'text': 'green'},
51426864efa5Sthinca        \ { 'filename': 'F1', 'lnum': 20, 'end_lnum': 25, 'col': 4,
51436864efa5Sthinca        \   'end_col': 8, 'text': 'blue'},
51446864efa5Sthinca        \ ])
51456864efa5Sthinca
5146858ba06dSBram Moolenaar  Xwindow
5147858ba06dSBram Moolenaar  call assert_equal('F1-L10C2-green', getline(1))
5148858ba06dSBram Moolenaar  call assert_equal('F1-L20C4-blue', getline(2))
5149858ba06dSBram Moolenaar  Xclose
5150858ba06dSBram Moolenaar  set quickfixtextfunc&vim
5151858ba06dSBram Moolenaar  Xwindow
51526864efa5Sthinca  call assert_equal('F1|10 col 2-7| green', getline(1))
51536864efa5Sthinca  call assert_equal('F1|20-25 col 4-8| blue', getline(2))
5154858ba06dSBram Moolenaar  Xclose
5155858ba06dSBram Moolenaar  set efm&
5156858ba06dSBram Moolenaar  set quickfixtextfunc&
5157858ba06dSBram Moolenaar
5158858ba06dSBram Moolenaar  " Test for per list 'quickfixtextfunc' setting
5159858ba06dSBram Moolenaar  func PerQfText(info)
5160858ba06dSBram Moolenaar    if a:info.quickfix
516100e260bbSBram Moolenaar      let qfl = getqflist({'id' : a:info.id, 'items' : 1}).items
5162858ba06dSBram Moolenaar    else
516300e260bbSBram Moolenaar      let qfl = getloclist(a:info.winid, {'id' : a:info.id, 'items' : 1}).items
5164858ba06dSBram Moolenaar    endif
5165858ba06dSBram Moolenaar    if empty(qfl)
516600e260bbSBram Moolenaar      return []
5167858ba06dSBram Moolenaar    endif
516800e260bbSBram Moolenaar    let l = []
516900e260bbSBram Moolenaar    for idx in range(a:info.start_idx - 1, a:info.end_idx - 1)
517000e260bbSBram Moolenaar      call add(l, 'Line ' .. qfl[idx].lnum .. ', Col ' .. qfl[idx].col)
517100e260bbSBram Moolenaar    endfor
517200e260bbSBram Moolenaar    return l
5173858ba06dSBram Moolenaar  endfunc
5174858ba06dSBram Moolenaar  set quickfixtextfunc=Tqfexpr
5175858ba06dSBram Moolenaar  call g:Xsetlist([], ' ', {'quickfixtextfunc' : "PerQfText"})
5176858ba06dSBram Moolenaar  Xaddexpr ['F1:10:2:green', 'F1:20:4:blue']
5177858ba06dSBram Moolenaar  Xwindow
5178858ba06dSBram Moolenaar  call assert_equal('Line 10, Col 2', getline(1))
5179858ba06dSBram Moolenaar  call assert_equal('Line 20, Col 4', getline(2))
5180858ba06dSBram Moolenaar  Xclose
5181d43906d2SBram Moolenaar  call assert_equal(function('PerQfText'),
5182d43906d2SBram Moolenaar        \ g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc)
51837ba5a7efSBram Moolenaar  " Add entries to the list when the quickfix buffer is hidden
51847ba5a7efSBram Moolenaar  Xaddexpr ['F1:30:6:red']
51857ba5a7efSBram Moolenaar  Xwindow
51867ba5a7efSBram Moolenaar  call assert_equal('Line 30, Col 6', getline(3))
51877ba5a7efSBram Moolenaar  Xclose
5188858ba06dSBram Moolenaar  call g:Xsetlist([], 'r', {'quickfixtextfunc' : ''})
5189d43906d2SBram Moolenaar  call assert_equal('', g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc)
5190858ba06dSBram Moolenaar  set quickfixtextfunc&
5191858ba06dSBram Moolenaar  delfunc PerQfText
5192858ba06dSBram Moolenaar
5193858ba06dSBram Moolenaar  " Non-existing function
5194858ba06dSBram Moolenaar  set quickfixtextfunc=Tabc
5195858ba06dSBram Moolenaar  call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue']", 'E117:')
5196858ba06dSBram Moolenaar  call assert_fails("Xwindow", 'E117:')
5197858ba06dSBram Moolenaar  Xclose
5198858ba06dSBram Moolenaar  set quickfixtextfunc&
5199858ba06dSBram Moolenaar
5200858ba06dSBram Moolenaar  " set option to a non-function
5201858ba06dSBram Moolenaar  set quickfixtextfunc=[10,\ 20]
5202858ba06dSBram Moolenaar  call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue']", 'E117:')
5203858ba06dSBram Moolenaar  call assert_fails("Xwindow", 'E117:')
5204858ba06dSBram Moolenaar  Xclose
5205858ba06dSBram Moolenaar  set quickfixtextfunc&
5206858ba06dSBram Moolenaar
5207858ba06dSBram Moolenaar  " set option to a function with different set of arguments
5208858ba06dSBram Moolenaar  func Xqftext(a, b, c)
5209858ba06dSBram Moolenaar    return a:a .. a:b .. a:c
5210858ba06dSBram Moolenaar  endfunc
5211858ba06dSBram Moolenaar  set quickfixtextfunc=Xqftext
5212858ba06dSBram Moolenaar  call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue']", 'E119:')
5213858ba06dSBram Moolenaar  call assert_fails("Xwindow", 'E119:')
5214858ba06dSBram Moolenaar  Xclose
521500e260bbSBram Moolenaar
521600e260bbSBram Moolenaar  " set option to a function that returns a list with non-strings
521700e260bbSBram Moolenaar  func Xqftext2(d)
521800e260bbSBram Moolenaar    return ['one', [], 'two']
521900e260bbSBram Moolenaar  endfunc
522000e260bbSBram Moolenaar  set quickfixtextfunc=Xqftext2
522100e260bbSBram Moolenaar  call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue', 'F1:30:6:red']",
522200e260bbSBram Moolenaar                                                                  \ 'E730:')
522300e260bbSBram Moolenaar  call assert_fails('Xwindow', 'E730:')
5224d43906d2SBram Moolenaar  call assert_equal(['one', 'F1|20 col 4| blue', 'F1|30 col 6| red'],
5225d43906d2SBram Moolenaar        \ getline(1, '$'))
522600e260bbSBram Moolenaar  Xclose
522700e260bbSBram Moolenaar
5228858ba06dSBram Moolenaar  set quickfixtextfunc&
5229858ba06dSBram Moolenaar  delfunc Xqftext
523000e260bbSBram Moolenaar  delfunc Xqftext2
5231d43906d2SBram Moolenaar
5232d43906d2SBram Moolenaar  " set the global option to a lambda function
5233d43906d2SBram Moolenaar  set quickfixtextfunc={d\ ->\ map(g:Xgetlist({'id'\ :\ d.id,\ 'items'\ :\ 1}).items[d.start_idx-1:d.end_idx-1],\ 'v:val.text')}
5234d43906d2SBram Moolenaar  Xexpr ['F1:10:2:green', 'F1:20:4:blue']
5235d43906d2SBram Moolenaar  Xwindow
5236d43906d2SBram Moolenaar  call assert_equal(['green', 'blue'], getline(1, '$'))
5237d43906d2SBram Moolenaar  Xclose
5238d43906d2SBram 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)
5239d43906d2SBram Moolenaar  set quickfixtextfunc&
5240d43906d2SBram Moolenaar
5241d43906d2SBram Moolenaar  " use a lambda function that returns an empty list
5242d43906d2SBram Moolenaar  set quickfixtextfunc={d\ ->\ []}
5243d43906d2SBram Moolenaar  Xexpr ['F1:10:2:green', 'F1:20:4:blue']
5244d43906d2SBram Moolenaar  Xwindow
5245d43906d2SBram Moolenaar  call assert_equal(['F1|10 col 2| green', 'F1|20 col 4| blue'],
5246d43906d2SBram Moolenaar        \ getline(1, '$'))
5247d43906d2SBram Moolenaar  Xclose
5248d43906d2SBram Moolenaar  set quickfixtextfunc&
5249d43906d2SBram Moolenaar
5250d43906d2SBram Moolenaar  " use a lambda function that returns a list with empty strings
5251d43906d2SBram Moolenaar  set quickfixtextfunc={d\ ->\ ['',\ '']}
5252d43906d2SBram Moolenaar  Xexpr ['F1:10:2:green', 'F1:20:4:blue']
5253d43906d2SBram Moolenaar  Xwindow
5254d43906d2SBram Moolenaar  call assert_equal(['F1|10 col 2| green', 'F1|20 col 4| blue'],
5255d43906d2SBram Moolenaar        \ getline(1, '$'))
5256d43906d2SBram Moolenaar  Xclose
5257d43906d2SBram Moolenaar  set quickfixtextfunc&
5258d43906d2SBram Moolenaar
5259d43906d2SBram Moolenaar  " set the per-quickfix list text function to a lambda function
5260d43906d2SBram Moolenaar  call g:Xsetlist([], ' ',
5261d43906d2SBram Moolenaar        \ {'quickfixtextfunc' :
5262d43906d2SBram Moolenaar        \   {d -> map(g:Xgetlist({'id' : d.id, 'items' : 1}).items[d.start_idx-1:d.end_idx-1],
5263d43906d2SBram Moolenaar        \ "'Line ' .. v:val.lnum .. ', Col ' .. v:val.col")}})
5264d43906d2SBram Moolenaar  Xaddexpr ['F1:10:2:green', 'F1:20:4:blue']
5265d43906d2SBram Moolenaar  Xwindow
5266d43906d2SBram Moolenaar  call assert_equal('Line 10, Col 2', getline(1))
5267d43906d2SBram Moolenaar  call assert_equal('Line 20, Col 4', getline(2))
5268d43906d2SBram Moolenaar  Xclose
5269d43906d2SBram Moolenaar  call assert_match("function('<lambda>\\d\\+')", string(g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc))
5270d43906d2SBram Moolenaar  call g:Xsetlist([], 'f')
5271858ba06dSBram Moolenaarendfunc
5272858ba06dSBram Moolenaar
5273858ba06dSBram Moolenaarfunc Test_qftextfunc()
5274858ba06dSBram Moolenaar  call Xtest_qftextfunc('c')
5275858ba06dSBram Moolenaar  call Xtest_qftextfunc('l')
5276858ba06dSBram Moolenaarendfunc
5277858ba06dSBram Moolenaar
5278ad52f96aSYegappan Lakshmanan" Test for updating a location list for some other window and check that
5279ad52f96aSYegappan Lakshmanan" 'qftextfunc' uses the correct location list.
5280ad52f96aSYegappan Lakshmananfunc Test_qftextfunc_other_loclist()
5281ad52f96aSYegappan Lakshmanan  %bw!
5282ad52f96aSYegappan Lakshmanan  call setloclist(0, [], 'f')
5283ad52f96aSYegappan Lakshmanan
5284ad52f96aSYegappan Lakshmanan  " create a window and a location list for it and open the location list
5285ad52f96aSYegappan Lakshmanan  " window
5286ad52f96aSYegappan Lakshmanan  lexpr ['F1:10:12:one', 'F1:20:14:two']
5287ad52f96aSYegappan Lakshmanan  let w1_id = win_getid()
5288ad52f96aSYegappan Lakshmanan  call setloclist(0, [], ' ',
5289ad52f96aSYegappan Lakshmanan        \ {'lines': ['F1:10:12:one', 'F1:20:14:two'],
5290ad52f96aSYegappan Lakshmanan        \  'quickfixtextfunc':
5291ad52f96aSYegappan Lakshmanan        \    {d -> map(getloclist(d.winid, {'id' : d.id,
5292ad52f96aSYegappan Lakshmanan        \                'items' : 1}).items[d.start_idx-1:d.end_idx-1],
5293ad52f96aSYegappan Lakshmanan        \          "'Line ' .. v:val.lnum .. ', Col ' .. v:val.col")}})
5294ad52f96aSYegappan Lakshmanan  lwindow
5295ad52f96aSYegappan Lakshmanan  let w2_id = win_getid()
5296ad52f96aSYegappan Lakshmanan
5297ad52f96aSYegappan Lakshmanan  " create another window and a location list for it and open the location
5298ad52f96aSYegappan Lakshmanan  " list window
5299ad52f96aSYegappan Lakshmanan  topleft new
5300ad52f96aSYegappan Lakshmanan  let w3_id = win_getid()
5301ad52f96aSYegappan Lakshmanan  call setloclist(0, [], ' ',
5302ad52f96aSYegappan Lakshmanan        \ {'lines': ['F2:30:32:eleven', 'F2:40:34:twelve'],
5303ad52f96aSYegappan Lakshmanan        \  'quickfixtextfunc':
5304ad52f96aSYegappan Lakshmanan        \    {d -> map(getloclist(d.winid, {'id' : d.id,
5305ad52f96aSYegappan Lakshmanan        \                'items' : 1}).items[d.start_idx-1:d.end_idx-1],
5306ad52f96aSYegappan Lakshmanan        \          "'Ligne ' .. v:val.lnum .. ', Colonne ' .. v:val.col")}})
5307ad52f96aSYegappan Lakshmanan  lwindow
5308ad52f96aSYegappan Lakshmanan  let w4_id = win_getid()
5309ad52f96aSYegappan Lakshmanan
5310ad52f96aSYegappan Lakshmanan  topleft new
5311ad52f96aSYegappan Lakshmanan  lexpr ['F3:50:52:green', 'F3:60:54:blue']
5312ad52f96aSYegappan Lakshmanan  let w5_id = win_getid()
5313ad52f96aSYegappan Lakshmanan
5314ad52f96aSYegappan Lakshmanan  " change the location list for some other window
5315ad52f96aSYegappan Lakshmanan  call setloclist(0, [], 'r', {'lines': ['F3:55:56:aaa', 'F3:57:58:bbb']})
5316ad52f96aSYegappan Lakshmanan  call setloclist(w1_id, [], 'r', {'lines': ['F1:62:63:bbb', 'F1:64:65:ccc']})
5317ad52f96aSYegappan Lakshmanan  call setloclist(w3_id, [], 'r', {'lines': ['F2:76:77:ddd', 'F2:78:79:eee']})
5318ad52f96aSYegappan Lakshmanan  call assert_equal(['Line 62, Col 63', 'Line 64, Col 65'],
5319ad52f96aSYegappan Lakshmanan        \ getbufline(winbufnr(w2_id), 1, '$'))
5320ad52f96aSYegappan Lakshmanan  call assert_equal(['Ligne 76, Colonne 77', 'Ligne 78, Colonne 79'],
5321ad52f96aSYegappan Lakshmanan        \ getbufline(winbufnr(w4_id), 1, '$'))
5322ad52f96aSYegappan Lakshmanan  call setloclist(w2_id, [], 'r', {'lines': ['F1:32:33:fff', 'F1:34:35:ggg']})
5323ad52f96aSYegappan Lakshmanan  call setloclist(w4_id, [], 'r', {'lines': ['F2:46:47:hhh', 'F2:48:49:jjj']})
5324ad52f96aSYegappan Lakshmanan  call assert_equal(['Line 32, Col 33', 'Line 34, Col 35'],
5325ad52f96aSYegappan Lakshmanan        \ getbufline(winbufnr(w2_id), 1, '$'))
5326ad52f96aSYegappan Lakshmanan  call assert_equal(['Ligne 46, Colonne 47', 'Ligne 48, Colonne 49'],
5327ad52f96aSYegappan Lakshmanan        \ getbufline(winbufnr(w4_id), 1, '$'))
5328ad52f96aSYegappan Lakshmanan
5329ad52f96aSYegappan Lakshmanan  call win_gotoid(w5_id)
5330ad52f96aSYegappan Lakshmanan  lwindow
5331ad52f96aSYegappan Lakshmanan  call assert_equal(['F3|55 col 56| aaa', 'F3|57 col 58| bbb'],
5332ad52f96aSYegappan Lakshmanan        \ getline(1, '$'))
5333ad52f96aSYegappan Lakshmanan  %bw!
5334ad52f96aSYegappan Lakshmananendfunc
5335ad52f96aSYegappan Lakshmanan
5336ec98e93aSBram Moolenaar" Running :lhelpgrep command more than once in a help window, doesn't jump to
5337ec98e93aSBram Moolenaar" the help topic
5338ec98e93aSBram Moolenaarfunc Test_lhelpgrep_from_help_window()
5339ec98e93aSBram Moolenaar  call mkdir('Xtestdir/doc', 'p')
5340ec98e93aSBram Moolenaar  call writefile(['window'], 'Xtestdir/doc/a.txt')
5341ec98e93aSBram Moolenaar  call writefile(['buffer'], 'Xtestdir/doc/b.txt')
5342ec98e93aSBram Moolenaar  let save_rtp = &rtp
5343ec98e93aSBram Moolenaar  let &rtp = 'Xtestdir'
5344ec98e93aSBram Moolenaar  lhelpgrep window
5345ec98e93aSBram Moolenaar  lhelpgrep buffer
5346ec98e93aSBram Moolenaar  call assert_equal('b.txt', fnamemodify(@%, ":p:t"))
5347ec98e93aSBram Moolenaar  lhelpgrep window
5348ec98e93aSBram Moolenaar  call assert_equal('a.txt', fnamemodify(@%, ":p:t"))
5349ec98e93aSBram Moolenaar  let &rtp = save_rtp
5350ec98e93aSBram Moolenaar  call delete('Xtestdir', 'rf')
5351ec98e93aSBram Moolenaar  new | only!
5352ec98e93aSBram Moolenaarendfunc
5353ec98e93aSBram Moolenaar
5354f7c4d836SBram Moolenaar" Test for the crash fixed by 7.3.715
5355f7c4d836SBram Moolenaarfunc Test_setloclist_crash()
5356f7c4d836SBram Moolenaar  %bw!
5357f7c4d836SBram Moolenaar  let g:BufNum = bufnr()
5358f7c4d836SBram Moolenaar  augroup QF_Test
5359f7c4d836SBram Moolenaar    au!
5360f7c4d836SBram Moolenaar    au BufUnload * call setloclist(0, [{'bufnr':g:BufNum, 'lnum':1, 'col':1, 'text': 'tango down'}])
5361f7c4d836SBram Moolenaar  augroup END
5362f7c4d836SBram Moolenaar
5363f7c4d836SBram Moolenaar  try
5364f7c4d836SBram Moolenaar    lvimgrep /.*/ *.mak
5365f7c4d836SBram Moolenaar  catch /E926:/
5366f7c4d836SBram Moolenaar  endtry
5367f7c4d836SBram Moolenaar  call assert_equal('tango down', getloclist(0, {'items' : 0}).items[0].text)
5368f7c4d836SBram Moolenaar  call assert_equal(1, getloclist(0, {'size' : 0}).size)
5369f7c4d836SBram Moolenaar
5370f7c4d836SBram Moolenaar  augroup QF_Test
5371f7c4d836SBram Moolenaar    au!
5372f7c4d836SBram Moolenaar  augroup END
5373f7c4d836SBram Moolenaar  unlet g:BufNum
5374f7c4d836SBram Moolenaar  %bw!
5375f7c4d836SBram Moolenaarendfunc
5376f7c4d836SBram Moolenaar
53772ce77903SBram Moolenaar" Test for adding an invalid entry with the quickfix window open and making
53782ce77903SBram Moolenaar" sure that the window contents are not changed
53792ce77903SBram Moolenaarfunc Test_add_invalid_entry_with_qf_window()
53802ce77903SBram Moolenaar  call setqflist([], 'f')
53812ce77903SBram Moolenaar  cexpr "Xfile1:10:aa"
53822ce77903SBram Moolenaar  copen
53832ce77903SBram Moolenaar  call setqflist(['bb'], 'a')
53842ce77903SBram Moolenaar  call assert_equal(1, line('$'))
53852ce77903SBram Moolenaar  call assert_equal(['Xfile1|10| aa'], getline(1, '$'))
53866864efa5Sthinca  call assert_equal([{'lnum': 10                    , 'end_lnum': 0    , 'bufnr': bufnr('Xfile1') , 'col': 0   , 'end_col': 0    , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , getqflist())
53870d5e1ec3Sshane.xb.qian
53880d5e1ec3Sshane.xb.qian  call setqflist([{'lnum': 10                                          , 'bufnr': bufnr('Xfile1') , 'col': 0                     , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , 'r')
53890d5e1ec3Sshane.xb.qian  call assert_equal(1                               , line('$'))
53900d5e1ec3Sshane.xb.qian  call assert_equal(['Xfile1|10| aa']               , getline(1        , '$'))
53910d5e1ec3Sshane.xb.qian  call assert_equal([{'lnum': 10                    , 'end_lnum': 0    , 'bufnr': bufnr('Xfile1') , 'col': 0   , 'end_col': 0    , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , getqflist())
53920d5e1ec3Sshane.xb.qian
53930d5e1ec3Sshane.xb.qian  call setqflist([{'lnum': 10                       , 'end_lnum': 0    , 'bufnr': bufnr('Xfile1') , 'col': 0   , 'end_col': 0    , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , 'r')
53940d5e1ec3Sshane.xb.qian  call assert_equal(1                               , line('$'))
53950d5e1ec3Sshane.xb.qian  call assert_equal(['Xfile1|10| aa']               , getline(1        , '$'))
53960d5e1ec3Sshane.xb.qian  call assert_equal([{'lnum': 10                    , 'end_lnum': 0    , 'bufnr': bufnr('Xfile1') , 'col': 0   , 'end_col': 0    , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , getqflist())
53970d5e1ec3Sshane.xb.qian
53980d5e1ec3Sshane.xb.qian  call setqflist([{'lnum': 10                       , 'end_lnum': -123 , 'bufnr': bufnr('Xfile1') , 'col': 0   , 'end_col': -456 , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , 'r')
53990d5e1ec3Sshane.xb.qian  call assert_equal(1                               , line('$'))
54000d5e1ec3Sshane.xb.qian  call assert_equal(['Xfile1|10| aa']               , getline(1        , '$'))
54010d5e1ec3Sshane.xb.qian  call assert_equal([{'lnum': 10                    , 'end_lnum': -123 , 'bufnr': bufnr('Xfile1') , 'col': 0   , 'end_col': -456 , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , getqflist())
54020d5e1ec3Sshane.xb.qian
54030d5e1ec3Sshane.xb.qian  call setqflist([{'lnum': 10                       , 'end_lnum': -123 , 'bufnr': bufnr('Xfile1') , 'col': 666 , 'end_col': 0    , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , 'r')
54040d5e1ec3Sshane.xb.qian  call assert_equal(1                               , line('$'))
54050d5e1ec3Sshane.xb.qian  call assert_equal(['Xfile1|10 col 666| aa']       , getline(1        , '$'))
54060d5e1ec3Sshane.xb.qian  call assert_equal([{'lnum': 10                    , 'end_lnum': -123 , 'bufnr': bufnr('Xfile1') , 'col': 666 , 'end_col': 0    , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , getqflist())
54070d5e1ec3Sshane.xb.qian
54080d5e1ec3Sshane.xb.qian  call setqflist([{'lnum': 10                       , 'end_lnum': -123 , 'bufnr': bufnr('Xfile1') , 'col': 666 , 'end_col': -456 , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , 'r')
54090d5e1ec3Sshane.xb.qian  call assert_equal(1                               , line('$'))
54100d5e1ec3Sshane.xb.qian  call assert_equal(['Xfile1|10 col 666| aa']       , getline(1        , '$'))
54110d5e1ec3Sshane.xb.qian  call assert_equal([{'lnum': 10                    , 'end_lnum': -123 , 'bufnr': bufnr('Xfile1') , 'col': 666 , 'end_col': -456 , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , getqflist())
54120d5e1ec3Sshane.xb.qian
54130d5e1ec3Sshane.xb.qian  call setqflist([{'lnum': 10                       , 'end_lnum': -123 , 'bufnr': bufnr('Xfile1') , 'col': 666 , 'end_col': 222  , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , 'r')
54140d5e1ec3Sshane.xb.qian  call assert_equal(1                               , line('$'))
54150d5e1ec3Sshane.xb.qian  call assert_equal(['Xfile1|10 col 666-222| aa']   , getline(1        , '$'))
54160d5e1ec3Sshane.xb.qian  call assert_equal([{'lnum': 10                    , 'end_lnum': -123 , 'bufnr': bufnr('Xfile1') , 'col': 666 , 'end_col': 222  , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , getqflist())
54170d5e1ec3Sshane.xb.qian
54180d5e1ec3Sshane.xb.qian  call setqflist([{'lnum': 10                       , 'end_lnum': 6 , 'bufnr': bufnr('Xfile1') , 'col': 666 , 'end_col': 222  , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , 'r')
54190d5e1ec3Sshane.xb.qian  call assert_equal(1                               , line('$'))
54200d5e1ec3Sshane.xb.qian  call assert_equal(['Xfile1|10-6 col 666-222| aa'] , getline(1        , '$'))
54210d5e1ec3Sshane.xb.qian  call assert_equal([{'lnum': 10                    , 'end_lnum': 6 , 'bufnr': bufnr('Xfile1') , 'col': 666 , 'end_col': 222  , 'pattern': '' , 'valid': 1 , 'vcol': 0 , 'nr': -1 , 'type': '' , 'module': '' , 'text': 'aa'}] , getqflist())
54222ce77903SBram Moolenaar  cclose
54232ce77903SBram Moolenaarendfunc
54242ce77903SBram Moolenaar
54259e40c4b1SBram Moolenaar" Test for very weird problem: autocommand causes a failure, resulting opening
54269e40c4b1SBram Moolenaar" the quickfix window to fail. This still splits the window, but otherwise
54279e40c4b1SBram Moolenaar" should not mess up buffers.
54289e40c4b1SBram Moolenaarfunc Test_quickfix_window_fails_to_open()
54299e40c4b1SBram Moolenaar  CheckScreendump
54309e40c4b1SBram Moolenaar
54319e40c4b1SBram Moolenaar  let lines =<< trim END
54329e40c4b1SBram Moolenaar      anything
54339e40c4b1SBram Moolenaar      try
54349e40c4b1SBram Moolenaar        anything
54359e40c4b1SBram Moolenaar      endtry
54369e40c4b1SBram Moolenaar  END
54379e40c4b1SBram Moolenaar  call writefile(lines, 'XquickfixFails')
54389e40c4b1SBram Moolenaar
54399e40c4b1SBram Moolenaar  let lines =<< trim END
54409e40c4b1SBram Moolenaar      split XquickfixFails
54419e40c4b1SBram Moolenaar      silent vimgrep anything %
54429e40c4b1SBram Moolenaar      normal o
54439e40c4b1SBram Moolenaar      au BufLeave * ++once source XquickfixFails
54449e40c4b1SBram Moolenaar      " This will trigger the autocommand, which causes an error, what follows
54459e40c4b1SBram Moolenaar      " is aborted but the window was already split.
54469e40c4b1SBram Moolenaar      silent! cwindow
54479e40c4b1SBram Moolenaar  END
54489e40c4b1SBram Moolenaar  call writefile(lines, 'XtestWinFails')
54499e40c4b1SBram Moolenaar  let buf = RunVimInTerminal('-S XtestWinFails', #{rows: 13})
54509e40c4b1SBram Moolenaar  call VerifyScreenDump(buf, 'Test_quickfix_window_fails', {})
54519e40c4b1SBram Moolenaar
54529e40c4b1SBram Moolenaar  " clean up
54539e40c4b1SBram Moolenaar  call term_sendkeys(buf, ":bwipe!\<CR>")
54549e40c4b1SBram Moolenaar  call term_wait(buf)
54559e40c4b1SBram Moolenaar  call StopVimInTerminal(buf)
54569e40c4b1SBram Moolenaar  call delete('XtestWinFails')
54579e40c4b1SBram Moolenaar  call delete('XquickfixFails')
54589e40c4b1SBram Moolenaarendfunc
54599e40c4b1SBram Moolenaar
54602d870f8dSBram Moolenaar" Test for updating the quickfix buffer whenever the associated quickfix list
5461287153c5SBram Moolenaar" is changed.
5462287153c5SBram Moolenaarfunc Xqfbuf_update(cchar)
5463287153c5SBram Moolenaar  call s:setup_commands(a:cchar)
5464287153c5SBram Moolenaar
5465287153c5SBram Moolenaar  Xexpr "F1:1:line1"
5466287153c5SBram Moolenaar  Xopen
5467287153c5SBram Moolenaar  call assert_equal(['F1|1| line1'], getline(1, '$'))
5468287153c5SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
5469287153c5SBram Moolenaar
5470287153c5SBram Moolenaar  " Test setqflist() using the 'lines' key in 'what'
5471287153c5SBram Moolenaar  " add a new entry
5472287153c5SBram Moolenaar  call g:Xsetlist([], 'a', {'lines' : ['F2:2: line2']})
5473287153c5SBram Moolenaar  call assert_equal(['F1|1| line1', 'F2|2| line2'], getline(1, '$'))
5474287153c5SBram Moolenaar  call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
5475287153c5SBram Moolenaar  " replace all the entries with a single entry
5476287153c5SBram Moolenaar  call g:Xsetlist([], 'r', {'lines' : ['F3:3: line3']})
5477287153c5SBram Moolenaar  call assert_equal(['F3|3| line3'], getline(1, '$'))
5478287153c5SBram Moolenaar  call assert_equal(3, g:Xgetlist({'changedtick' : 0}).changedtick)
5479287153c5SBram Moolenaar  " remove all the entries
5480287153c5SBram Moolenaar  call g:Xsetlist([], 'r', {'lines' : []})
5481287153c5SBram Moolenaar  call assert_equal([''], getline(1, '$'))
5482287153c5SBram Moolenaar  call assert_equal(4, g:Xgetlist({'changedtick' : 0}).changedtick)
5483287153c5SBram Moolenaar  " add a new list
5484287153c5SBram Moolenaar  call g:Xsetlist([], ' ', {'lines' : ['F4:4: line4']})
5485287153c5SBram Moolenaar  call assert_equal(['F4|4| line4'], getline(1, '$'))
5486287153c5SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
5487287153c5SBram Moolenaar
5488287153c5SBram Moolenaar  " Test setqflist() using the 'items' key in 'what'
5489287153c5SBram Moolenaar  " add a new entry
5490287153c5SBram Moolenaar  call g:Xsetlist([], 'a', {'items' : [{'filename' : 'F5', 'lnum' : 5, 'text' : 'line5'}]})
5491287153c5SBram Moolenaar  call assert_equal(['F4|4| line4', 'F5|5| line5'], getline(1, '$'))
5492287153c5SBram Moolenaar  call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
5493287153c5SBram Moolenaar  " replace all the entries with a single entry
5494287153c5SBram Moolenaar  call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F6', 'lnum' : 6, 'text' : 'line6'}]})
5495287153c5SBram Moolenaar  call assert_equal(['F6|6| line6'], getline(1, '$'))
5496287153c5SBram Moolenaar  call assert_equal(3, g:Xgetlist({'changedtick' : 0}).changedtick)
5497287153c5SBram Moolenaar  " remove all the entries
5498287153c5SBram Moolenaar  call g:Xsetlist([], 'r', {'items' : []})
5499287153c5SBram Moolenaar  call assert_equal([''], getline(1, '$'))
5500287153c5SBram Moolenaar  call assert_equal(4, g:Xgetlist({'changedtick' : 0}).changedtick)
5501287153c5SBram Moolenaar  " add a new list
5502287153c5SBram Moolenaar  call g:Xsetlist([], ' ', {'items' : [{'filename' : 'F7', 'lnum' : 7, 'text' : 'line7'}]})
5503287153c5SBram Moolenaar  call assert_equal(['F7|7| line7'], getline(1, '$'))
5504287153c5SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
5505287153c5SBram Moolenaar
5506287153c5SBram Moolenaar  call g:Xsetlist([], ' ', {})
5507287153c5SBram Moolenaar  call assert_equal([''], getline(1, '$'))
5508287153c5SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
5509287153c5SBram Moolenaar
5510287153c5SBram Moolenaar  Xclose
5511287153c5SBram Moolenaarendfunc
5512287153c5SBram Moolenaar
5513287153c5SBram Moolenaarfunc Test_qfbuf_update()
5514287153c5SBram Moolenaar  call Xqfbuf_update('c')
5515287153c5SBram Moolenaar  call Xqfbuf_update('l')
5516287153c5SBram Moolenaarendfunc
5517287153c5SBram Moolenaar
55188c801b37SBram Moolenaarfunc Test_vimgrep_noswapfile()
55198c801b37SBram Moolenaar  set noswapfile
55208c801b37SBram Moolenaar  call writefile(['one', 'two', 'three'], 'Xgreppie')
55218c801b37SBram Moolenaar  vimgrep two Xgreppie
55228c801b37SBram Moolenaar  call assert_equal('two', getline('.'))
55238c801b37SBram Moolenaar
55248c801b37SBram Moolenaar  call delete('Xgreppie')
55258c801b37SBram Moolenaar  set swapfile
55268c801b37SBram Moolenaarendfunc
55278c801b37SBram Moolenaar
5528bb01a1efSYegappan Lakshmanan" Test for the :vimgrep 'f' flag (fuzzy match)
5529bb01a1efSYegappan Lakshmananfunc Xvimgrep_fuzzy_match(cchar)
5530bb01a1efSYegappan Lakshmanan  call s:setup_commands(a:cchar)
5531bb01a1efSYegappan Lakshmanan
5532bb01a1efSYegappan Lakshmanan  Xvimgrep /three one/f Xfile*
5533bb01a1efSYegappan Lakshmanan  let l = g:Xgetlist()
5534bb01a1efSYegappan Lakshmanan  call assert_equal(2, len(l))
5535bb01a1efSYegappan Lakshmanan  call assert_equal(['Xfile1', 1, 9, 'one two three'],
5536bb01a1efSYegappan Lakshmanan        \ [bufname(l[0].bufnr), l[0].lnum, l[0].col, l[0].text])
5537bb01a1efSYegappan Lakshmanan  call assert_equal(['Xfile2', 2, 1, 'three one two'],
5538bb01a1efSYegappan Lakshmanan        \ [bufname(l[1].bufnr), l[1].lnum, l[1].col, l[1].text])
5539bb01a1efSYegappan Lakshmanan
5540bb01a1efSYegappan Lakshmanan  Xvimgrep /the/f Xfile*
5541bb01a1efSYegappan Lakshmanan  let l = g:Xgetlist()
5542bb01a1efSYegappan Lakshmanan  call assert_equal(3, len(l))
5543bb01a1efSYegappan Lakshmanan  call assert_equal(['Xfile1', 1, 9, 'one two three'],
5544bb01a1efSYegappan Lakshmanan        \ [bufname(l[0].bufnr), l[0].lnum, l[0].col, l[0].text])
5545bb01a1efSYegappan Lakshmanan  call assert_equal(['Xfile2', 2, 1, 'three one two'],
5546bb01a1efSYegappan Lakshmanan        \ [bufname(l[1].bufnr), l[1].lnum, l[1].col, l[1].text])
5547bb01a1efSYegappan Lakshmanan  call assert_equal(['Xfile2', 4, 4, 'aaathreeaaa'],
5548bb01a1efSYegappan Lakshmanan        \ [bufname(l[2].bufnr), l[2].lnum, l[2].col, l[2].text])
5549bb01a1efSYegappan Lakshmanan
5550bb01a1efSYegappan Lakshmanan  Xvimgrep /aaa/fg Xfile*
5551bb01a1efSYegappan Lakshmanan  let l = g:Xgetlist()
5552bb01a1efSYegappan Lakshmanan  call assert_equal(4, len(l))
5553bb01a1efSYegappan Lakshmanan  call assert_equal(['Xfile1', 2, 1, 'aaaaaa'],
5554bb01a1efSYegappan Lakshmanan        \ [bufname(l[0].bufnr), l[0].lnum, l[0].col, l[0].text])
5555bb01a1efSYegappan Lakshmanan  call assert_equal(['Xfile1', 2, 4, 'aaaaaa'],
5556bb01a1efSYegappan Lakshmanan        \ [bufname(l[1].bufnr), l[1].lnum, l[1].col, l[1].text])
5557bb01a1efSYegappan Lakshmanan  call assert_equal(['Xfile2', 4, 1, 'aaathreeaaa'],
5558bb01a1efSYegappan Lakshmanan        \ [bufname(l[2].bufnr), l[2].lnum, l[2].col, l[2].text])
5559bb01a1efSYegappan Lakshmanan  call assert_equal(['Xfile2', 4, 9, 'aaathreeaaa'],
5560bb01a1efSYegappan Lakshmanan        \ [bufname(l[3].bufnr), l[3].lnum, l[3].col, l[3].text])
5561bb01a1efSYegappan Lakshmanan
5562bb01a1efSYegappan Lakshmanan  call assert_fails('Xvimgrep /xyz/fg Xfile*', 'E480:')
5563bb01a1efSYegappan Lakshmananendfunc
5564bb01a1efSYegappan Lakshmanan
5565bb01a1efSYegappan Lakshmananfunc Test_vimgrep_fuzzy_match()
5566bb01a1efSYegappan Lakshmanan  call writefile(['one two three', 'aaaaaa'], 'Xfile1')
5567bb01a1efSYegappan Lakshmanan  call writefile(['one', 'three one two', 'two', 'aaathreeaaa'], 'Xfile2')
5568bb01a1efSYegappan Lakshmanan  call Xvimgrep_fuzzy_match('c')
5569bb01a1efSYegappan Lakshmanan  call Xvimgrep_fuzzy_match('l')
5570bb01a1efSYegappan Lakshmanan  call delete('Xfile1')
5571bb01a1efSYegappan Lakshmanan  call delete('Xfile2')
5572bb01a1efSYegappan Lakshmananendfunc
5573bb01a1efSYegappan Lakshmanan
55741557b16dSWei-Chung Wenfunc Test_locationlist_open_in_newtab()
55751557b16dSWei-Chung Wen  call s:create_test_file('Xqftestfile1')
55761557b16dSWei-Chung Wen  call s:create_test_file('Xqftestfile2')
55771557b16dSWei-Chung Wen  call s:create_test_file('Xqftestfile3')
55781557b16dSWei-Chung Wen
55791557b16dSWei-Chung Wen  %bwipe!
55801557b16dSWei-Chung Wen
55811557b16dSWei-Chung Wen  lgetexpr ['Xqftestfile1:5:Line5',
55821557b16dSWei-Chung Wen		\ 'Xqftestfile2:10:Line10',
55831557b16dSWei-Chung Wen		\ 'Xqftestfile3:16:Line16']
55841557b16dSWei-Chung Wen
55851557b16dSWei-Chung Wen  silent! llast
55861557b16dSWei-Chung Wen  call assert_equal(1, tabpagenr('$'))
55871557b16dSWei-Chung Wen  call assert_equal('Xqftestfile3', bufname())
55881557b16dSWei-Chung Wen
55891557b16dSWei-Chung Wen  set switchbuf=newtab
55901557b16dSWei-Chung Wen
55911557b16dSWei-Chung Wen  silent! lfirst
55921557b16dSWei-Chung Wen  call assert_equal(2, tabpagenr('$'))
55931557b16dSWei-Chung Wen  call assert_equal('Xqftestfile1', bufname())
55941557b16dSWei-Chung Wen
55951557b16dSWei-Chung Wen  silent! lnext
55961557b16dSWei-Chung Wen  call assert_equal(3, tabpagenr('$'))
55971557b16dSWei-Chung Wen  call assert_equal('Xqftestfile2', bufname())
55981557b16dSWei-Chung Wen
55991557b16dSWei-Chung Wen  call delete('Xqftestfile1')
56001557b16dSWei-Chung Wen  call delete('Xqftestfile2')
56011557b16dSWei-Chung Wen  call delete('Xqftestfile3')
56021557b16dSWei-Chung Wen  set switchbuf&vim
56031557b16dSWei-Chung Wen
56041557b16dSWei-Chung Wen  %bwipe!
56051557b16dSWei-Chung Wenendfunc
56061557b16dSWei-Chung Wen
560728d8421bSYegappan Lakshmanan" Test for win_gettype() in quickfix and location list windows
560828d8421bSYegappan Lakshmananfunc Test_win_gettype()
560928d8421bSYegappan Lakshmanan  copen
561028d8421bSYegappan Lakshmanan  call assert_equal("quickfix", win_gettype())
561128d8421bSYegappan Lakshmanan  let wid = win_getid()
561228d8421bSYegappan Lakshmanan  wincmd p
561328d8421bSYegappan Lakshmanan  call assert_equal("quickfix", win_gettype(wid))
561428d8421bSYegappan Lakshmanan  cclose
561528d8421bSYegappan Lakshmanan  lexpr ''
561628d8421bSYegappan Lakshmanan  lopen
561728d8421bSYegappan Lakshmanan  call assert_equal("loclist", win_gettype())
561828d8421bSYegappan Lakshmanan  let wid = win_getid()
561928d8421bSYegappan Lakshmanan  wincmd p
562028d8421bSYegappan Lakshmanan  call assert_equal("loclist", win_gettype(wid))
562128d8421bSYegappan Lakshmanan  lclose
562228d8421bSYegappan Lakshmananendfunc
562328d8421bSYegappan Lakshmanan
56246a0cc916SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
5625