1da59dd5dSBram Moolenaar" Test for the quickfix commands.
2da59dd5dSBram Moolenaar
3da59dd5dSBram Moolenaarif !has('quickfix')
4da59dd5dSBram Moolenaar  finish
5da59dd5dSBram Moolenaarendif
6da59dd5dSBram Moolenaar
77eba3d2cSBram Moolenaarset encoding=utf-8
87eba3d2cSBram Moolenaar
92b946c9fSBram Moolenaarfunc s:setup_commands(cchar)
103ef5bf7dSBram Moolenaar  if a:cchar == 'c'
113ef5bf7dSBram Moolenaar    command! -nargs=* -bang Xlist <mods>clist<bang> <args>
123ef5bf7dSBram Moolenaar    command! -nargs=* Xgetexpr <mods>cgetexpr <args>
13361c8f0eSBram Moolenaar    command! -nargs=* Xaddexpr <mods>caddexpr <args>
1455b69264SBram Moolenaar    command! -nargs=* -count Xolder <mods><count>colder <args>
153ef5bf7dSBram Moolenaar    command! -nargs=* Xnewer <mods>cnewer <args>
163ef5bf7dSBram Moolenaar    command! -nargs=* Xopen <mods>copen <args>
173ef5bf7dSBram Moolenaar    command! -nargs=* Xwindow <mods>cwindow <args>
18537ef084SBram Moolenaar    command! -nargs=* Xbottom <mods>cbottom <args>
193ef5bf7dSBram Moolenaar    command! -nargs=* Xclose <mods>cclose <args>
203ef5bf7dSBram Moolenaar    command! -nargs=* -bang Xfile <mods>cfile<bang> <args>
213ef5bf7dSBram Moolenaar    command! -nargs=* Xgetfile <mods>cgetfile <args>
223ef5bf7dSBram Moolenaar    command! -nargs=* Xaddfile <mods>caddfile <args>
233ef5bf7dSBram Moolenaar    command! -nargs=* -bang Xbuffer <mods>cbuffer<bang> <args>
243ef5bf7dSBram Moolenaar    command! -nargs=* Xgetbuffer <mods>cgetbuffer <args>
253ef5bf7dSBram Moolenaar    command! -nargs=* Xaddbuffer <mods>caddbuffer <args>
263ef5bf7dSBram Moolenaar    command! -nargs=* Xrewind <mods>crewind <args>
2799895eacSBram Moolenaar    command! -count -nargs=* -bang Xnext <mods><count>cnext<bang> <args>
2899895eacSBram Moolenaar    command! -count -nargs=* -bang Xprev <mods><count>cprev<bang> <args>
290fcc7c6dSBram Moolenaar    command! -nargs=* -bang Xfirst <mods>cfirst<bang> <args>
300fcc7c6dSBram Moolenaar    command! -nargs=* -bang Xlast <mods>clast<bang> <args>
3174240d3fSBram Moolenaar    command! -nargs=* -bang -range Xnfile <mods><count>cnfile<bang> <args>
320fcc7c6dSBram Moolenaar    command! -nargs=* -bang Xpfile <mods>cpfile<bang> <args>
333ef5bf7dSBram Moolenaar    command! -nargs=* Xexpr <mods>cexpr <args>
34ee85df37SBram Moolenaar    command! -range -nargs=* Xvimgrep <mods><count>vimgrep <args>
35ee85df37SBram Moolenaar    command! -nargs=* Xvimgrepadd <mods>vimgrepadd <args>
36049cba9eSBram Moolenaar    command! -nargs=* Xgrep <mods> grep <args>
37049cba9eSBram Moolenaar    command! -nargs=* Xgrepadd <mods> grepadd <args>
38049cba9eSBram Moolenaar    command! -nargs=* Xhelpgrep helpgrep <args>
3974240d3fSBram Moolenaar    command! -nargs=0 -count Xcc <count>cc
403ef5bf7dSBram Moolenaar    let g:Xgetlist = function('getqflist')
413ef5bf7dSBram Moolenaar    let g:Xsetlist = function('setqflist')
42b6fa30ccSBram Moolenaar    call setqflist([], 'f')
433ef5bf7dSBram Moolenaar  else
443ef5bf7dSBram Moolenaar    command! -nargs=* -bang Xlist <mods>llist<bang> <args>
453ef5bf7dSBram Moolenaar    command! -nargs=* Xgetexpr <mods>lgetexpr <args>
46361c8f0eSBram Moolenaar    command! -nargs=* Xaddexpr <mods>laddexpr <args>
4755b69264SBram Moolenaar    command! -nargs=* -count Xolder <mods><count>lolder <args>
483ef5bf7dSBram Moolenaar    command! -nargs=* Xnewer <mods>lnewer <args>
493ef5bf7dSBram Moolenaar    command! -nargs=* Xopen <mods>lopen <args>
503ef5bf7dSBram Moolenaar    command! -nargs=* Xwindow <mods>lwindow <args>
51537ef084SBram Moolenaar    command! -nargs=* Xbottom <mods>lbottom <args>
523ef5bf7dSBram Moolenaar    command! -nargs=* Xclose <mods>lclose <args>
533ef5bf7dSBram Moolenaar    command! -nargs=* -bang Xfile <mods>lfile<bang> <args>
543ef5bf7dSBram Moolenaar    command! -nargs=* Xgetfile <mods>lgetfile <args>
553ef5bf7dSBram Moolenaar    command! -nargs=* Xaddfile <mods>laddfile <args>
563ef5bf7dSBram Moolenaar    command! -nargs=* -bang Xbuffer <mods>lbuffer<bang> <args>
573ef5bf7dSBram Moolenaar    command! -nargs=* Xgetbuffer <mods>lgetbuffer <args>
583ef5bf7dSBram Moolenaar    command! -nargs=* Xaddbuffer <mods>laddbuffer <args>
593ef5bf7dSBram Moolenaar    command! -nargs=* Xrewind <mods>lrewind <args>
6099895eacSBram Moolenaar    command! -count -nargs=* -bang Xnext <mods><count>lnext<bang> <args>
6199895eacSBram Moolenaar    command! -count -nargs=* -bang Xprev <mods><count>lprev<bang> <args>
620fcc7c6dSBram Moolenaar    command! -nargs=* -bang Xfirst <mods>lfirst<bang> <args>
630fcc7c6dSBram Moolenaar    command! -nargs=* -bang Xlast <mods>llast<bang> <args>
6474240d3fSBram Moolenaar    command! -nargs=* -bang -range Xnfile <mods><count>lnfile<bang> <args>
650fcc7c6dSBram Moolenaar    command! -nargs=* -bang Xpfile <mods>lpfile<bang> <args>
663ef5bf7dSBram Moolenaar    command! -nargs=* Xexpr <mods>lexpr <args>
67ee85df37SBram Moolenaar    command! -range -nargs=* Xvimgrep <mods><count>lvimgrep <args>
68ee85df37SBram Moolenaar    command! -nargs=* Xvimgrepadd <mods>lvimgrepadd <args>
69049cba9eSBram Moolenaar    command! -nargs=* Xgrep <mods> lgrep <args>
70049cba9eSBram Moolenaar    command! -nargs=* Xgrepadd <mods> lgrepadd <args>
71049cba9eSBram Moolenaar    command! -nargs=* Xhelpgrep lhelpgrep <args>
7274240d3fSBram Moolenaar    command! -nargs=0 -count Xcc <count>ll
733ef5bf7dSBram Moolenaar    let g:Xgetlist = function('getloclist', [0])
743ef5bf7dSBram Moolenaar    let g:Xsetlist = function('setloclist', [0])
75b6fa30ccSBram Moolenaar    call setloclist(0, [], 'f')
763ef5bf7dSBram Moolenaar  endif
772b946c9fSBram Moolenaarendfunc
783ef5bf7dSBram Moolenaar
79da59dd5dSBram Moolenaar" Tests for the :clist and :llist commands
802b946c9fSBram Moolenaarfunc XlistTests(cchar)
813ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
82da59dd5dSBram Moolenaar
83b6fa30ccSBram Moolenaar  if a:cchar == 'l'
84b6fa30ccSBram Moolenaar      call assert_fails('llist', 'E776:')
85b6fa30ccSBram Moolenaar  endif
86da59dd5dSBram Moolenaar  " With an empty list, command should return error
873ef5bf7dSBram Moolenaar  Xgetexpr []
883ef5bf7dSBram Moolenaar  silent! Xlist
89da59dd5dSBram Moolenaar  call assert_true(v:errmsg ==# 'E42: No Errors')
90da59dd5dSBram Moolenaar
91da59dd5dSBram Moolenaar  " Populate the list and then try
923ef5bf7dSBram Moolenaar  Xgetexpr ['non-error 1', 'Xtestfile1:1:3:Line1',
93da59dd5dSBram Moolenaar		  \ 'non-error 2', 'Xtestfile2:2:2:Line2',
943ef5bf7dSBram Moolenaar		  \ 'non-error 3', 'Xtestfile3:3:1:Line3']
95da59dd5dSBram Moolenaar
96da59dd5dSBram Moolenaar  " List only valid entries
97ee85df37SBram Moolenaar  let l = split(execute('Xlist', ''), "\n")
98da59dd5dSBram Moolenaar  call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
99da59dd5dSBram Moolenaar		   \ ' 4 Xtestfile2:2 col 2: Line2',
100da59dd5dSBram Moolenaar		   \ ' 6 Xtestfile3:3 col 1: Line3'], l)
101da59dd5dSBram Moolenaar
102da59dd5dSBram Moolenaar  " List all the entries
103ee85df37SBram Moolenaar  let l = split(execute('Xlist!', ''), "\n")
104da59dd5dSBram Moolenaar  call assert_equal([' 1: non-error 1', ' 2 Xtestfile1:1 col 3: Line1',
105da59dd5dSBram Moolenaar		   \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2',
106da59dd5dSBram Moolenaar		   \ ' 5: non-error 3', ' 6 Xtestfile3:3 col 1: Line3'], l)
107da59dd5dSBram Moolenaar
108da59dd5dSBram Moolenaar  " List a range of errors
109ee85df37SBram Moolenaar  let l = split(execute('Xlist 3,6', ''), "\n")
110da59dd5dSBram Moolenaar  call assert_equal([' 4 Xtestfile2:2 col 2: Line2',
111da59dd5dSBram Moolenaar		   \ ' 6 Xtestfile3:3 col 1: Line3'], l)
112da59dd5dSBram Moolenaar
113ee85df37SBram Moolenaar  let l = split(execute('Xlist! 3,4', ''), "\n")
114da59dd5dSBram Moolenaar  call assert_equal([' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
115da59dd5dSBram Moolenaar
116ee85df37SBram Moolenaar  let l = split(execute('Xlist -6,-4', ''), "\n")
117da59dd5dSBram Moolenaar  call assert_equal([' 2 Xtestfile1:1 col 3: Line1'], l)
118da59dd5dSBram Moolenaar
119ee85df37SBram Moolenaar  let l = split(execute('Xlist! -5,-3', ''), "\n")
120da59dd5dSBram Moolenaar  call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
121da59dd5dSBram Moolenaar		   \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
122391b1dd0SBram Moolenaar
123391b1dd0SBram Moolenaar  " Test for '+'
124ee85df37SBram Moolenaar  let l = split(execute('Xlist! +2', ''), "\n")
125391b1dd0SBram Moolenaar  call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
126391b1dd0SBram Moolenaar		   \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
127ee85df37SBram Moolenaar
128ee85df37SBram Moolenaar  " Different types of errors
129ee85df37SBram Moolenaar  call g:Xsetlist([{'lnum':10,'col':5,'type':'W', 'text':'Warning','nr':11},
130ee85df37SBram Moolenaar	      \ {'lnum':20,'col':10,'type':'e','text':'Error','nr':22},
131ee85df37SBram Moolenaar	      \ {'lnum':30,'col':15,'type':'i','text':'Info','nr':33},
132ee85df37SBram Moolenaar	      \ {'lnum':40,'col':20,'type':'x', 'text':'Other','nr':44},
133ee85df37SBram Moolenaar	      \ {'lnum':50,'col':25,'type':"\<C-A>",'text':'one','nr':55}])
134ee85df37SBram Moolenaar  let l = split(execute('Xlist', ""), "\n")
135ee85df37SBram Moolenaar  call assert_equal([' 1:10 col 5 warning  11: Warning',
136ee85df37SBram Moolenaar	      \ ' 2:20 col 10 error  22: Error',
137ee85df37SBram Moolenaar	      \ ' 3:30 col 15 info  33: Info',
138ee85df37SBram Moolenaar	      \ ' 4:40 col 20 x  44: Other',
139ee85df37SBram Moolenaar	      \ ' 5:50 col 25  55: one'], l)
140ee85df37SBram Moolenaar
141ee85df37SBram Moolenaar  " Error cases
142ee85df37SBram Moolenaar  call assert_fails('Xlist abc', 'E488:')
1432b946c9fSBram Moolenaarendfunc
144da59dd5dSBram Moolenaar
1452b946c9fSBram Moolenaarfunc Test_clist()
146da59dd5dSBram Moolenaar  call XlistTests('c')
147da59dd5dSBram Moolenaar  call XlistTests('l')
1482b946c9fSBram Moolenaarendfunc
149da59dd5dSBram Moolenaar
150da59dd5dSBram Moolenaar" Tests for the :colder, :cnewer, :lolder and :lnewer commands
151da59dd5dSBram Moolenaar" Note that this test assumes that a quickfix/location list is
152cfc0a350SBram Moolenaar" already set by the caller.
1532b946c9fSBram Moolenaarfunc XageTests(cchar)
1543ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
155da59dd5dSBram Moolenaar
156cf1ba35fSBram Moolenaar  let list = [{'bufnr': bufnr('%'), 'lnum': 1}]
157b6fa30ccSBram Moolenaar  call g:Xsetlist(list)
158b6fa30ccSBram Moolenaar
159da59dd5dSBram Moolenaar  " Jumping to a non existent list should return error
1603ef5bf7dSBram Moolenaar  silent! Xolder 99
161da59dd5dSBram Moolenaar  call assert_true(v:errmsg ==# 'E380: At bottom of quickfix stack')
162da59dd5dSBram Moolenaar
1633ef5bf7dSBram Moolenaar  silent! Xnewer 99
164da59dd5dSBram Moolenaar  call assert_true(v:errmsg ==# 'E381: At top of quickfix stack')
165da59dd5dSBram Moolenaar
166da59dd5dSBram Moolenaar  " Add three quickfix/location lists
1673ef5bf7dSBram Moolenaar  Xgetexpr ['Xtestfile1:1:3:Line1']
1683ef5bf7dSBram Moolenaar  Xgetexpr ['Xtestfile2:2:2:Line2']
1693ef5bf7dSBram Moolenaar  Xgetexpr ['Xtestfile3:3:1:Line3']
170da59dd5dSBram Moolenaar
171da59dd5dSBram Moolenaar  " Go back two lists
1723ef5bf7dSBram Moolenaar  Xolder
1733ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
174da59dd5dSBram Moolenaar  call assert_equal('Line2', l[0].text)
175da59dd5dSBram Moolenaar
176da59dd5dSBram Moolenaar  " Go forward two lists
1773ef5bf7dSBram Moolenaar  Xnewer
1783ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
179da59dd5dSBram Moolenaar  call assert_equal('Line3', l[0].text)
180da59dd5dSBram Moolenaar
181da59dd5dSBram Moolenaar  " Test for the optional count argument
1823ef5bf7dSBram Moolenaar  Xolder 2
1833ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
184da59dd5dSBram Moolenaar  call assert_equal('Line1', l[0].text)
185da59dd5dSBram Moolenaar
1863ef5bf7dSBram Moolenaar  Xnewer 2
1873ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
188da59dd5dSBram Moolenaar  call assert_equal('Line3', l[0].text)
1892b946c9fSBram Moolenaarendfunc
190da59dd5dSBram Moolenaar
1912b946c9fSBram Moolenaarfunc Test_cage()
192da59dd5dSBram Moolenaar  call XageTests('c')
193da59dd5dSBram Moolenaar  call XageTests('l')
1942b946c9fSBram Moolenaarendfunc
195da59dd5dSBram Moolenaar
196da59dd5dSBram Moolenaar" Tests for the :cwindow, :lwindow :cclose, :lclose, :copen and :lopen
197da59dd5dSBram Moolenaar" commands
1982b946c9fSBram Moolenaarfunc XwindowTests(cchar)
1993ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
200da59dd5dSBram Moolenaar
201b6fa30ccSBram Moolenaar  " Opening the location list window without any errors should fail
202b6fa30ccSBram Moolenaar  if a:cchar == 'l'
203b6fa30ccSBram Moolenaar      call assert_fails('lopen', 'E776:')
204b6fa30ccSBram Moolenaar  endif
205b6fa30ccSBram Moolenaar
206da59dd5dSBram Moolenaar  " Create a list with no valid entries
2073ef5bf7dSBram Moolenaar  Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
208da59dd5dSBram Moolenaar
209da59dd5dSBram Moolenaar  " Quickfix/Location window should not open with no valid errors
2103ef5bf7dSBram Moolenaar  Xwindow
211da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 1)
212da59dd5dSBram Moolenaar
213da59dd5dSBram Moolenaar  " Create a list with valid entries
2143ef5bf7dSBram Moolenaar  Xgetexpr ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2',
2153ef5bf7dSBram Moolenaar		  \ 'Xtestfile3:3:1:Line3']
216da59dd5dSBram Moolenaar
217da59dd5dSBram Moolenaar  " Open the window
2183ef5bf7dSBram Moolenaar  Xwindow
219da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 2 && winnr() == 2 &&
220da59dd5dSBram Moolenaar	\ getline('.') ==# 'Xtestfile1|1 col 3| Line1')
221537ef084SBram Moolenaar  redraw!
222da59dd5dSBram Moolenaar
223da59dd5dSBram Moolenaar  " Close the window
2243ef5bf7dSBram Moolenaar  Xclose
225da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 1)
226da59dd5dSBram Moolenaar
227da59dd5dSBram Moolenaar  " Create a list with no valid entries
2283ef5bf7dSBram Moolenaar  Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
229da59dd5dSBram Moolenaar
230da59dd5dSBram Moolenaar  " Open the window
2313ef5bf7dSBram Moolenaar  Xopen 5
232da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 2 && getline('.') ==# '|| non-error 1'
233da59dd5dSBram Moolenaar		      \  && winheight('.') == 5)
234da59dd5dSBram Moolenaar
235da59dd5dSBram Moolenaar  " Opening the window again, should move the cursor to that window
236da59dd5dSBram Moolenaar  wincmd t
2373ef5bf7dSBram Moolenaar  Xopen 7
238da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 2 && winnr() == 2 &&
239da59dd5dSBram Moolenaar	\ winheight('.') == 7 &&
240da59dd5dSBram Moolenaar	\ getline('.') ==# '|| non-error 1')
241da59dd5dSBram Moolenaar
242da59dd5dSBram Moolenaar
243da59dd5dSBram Moolenaar  " Calling cwindow should close the quickfix window with no valid errors
2443ef5bf7dSBram Moolenaar  Xwindow
245da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 1)
246b6fa30ccSBram Moolenaar
247b6fa30ccSBram Moolenaar  if a:cchar == 'c'
248b6fa30ccSBram Moolenaar      " Opening the quickfix window in multiple tab pages should reuse the
249b6fa30ccSBram Moolenaar      " quickfix buffer
250b6fa30ccSBram Moolenaar      Xgetexpr ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2',
251b6fa30ccSBram Moolenaar		  \ 'Xtestfile3:3:1:Line3']
252b6fa30ccSBram Moolenaar      Xopen
253b6fa30ccSBram Moolenaar      let qfbufnum = bufnr('%')
254b6fa30ccSBram Moolenaar      tabnew
255b6fa30ccSBram Moolenaar      Xopen
256b6fa30ccSBram Moolenaar      call assert_equal(qfbufnum, bufnr('%'))
257b6fa30ccSBram Moolenaar      new | only | tabonly
258b6fa30ccSBram Moolenaar  endif
2592b946c9fSBram Moolenaarendfunc
260da59dd5dSBram Moolenaar
2612b946c9fSBram Moolenaarfunc Test_cwindow()
262da59dd5dSBram Moolenaar  call XwindowTests('c')
263da59dd5dSBram Moolenaar  call XwindowTests('l')
2642b946c9fSBram Moolenaarendfunc
265da59dd5dSBram Moolenaar
266da59dd5dSBram Moolenaar" Tests for the :cfile, :lfile, :caddfile, :laddfile, :cgetfile and :lgetfile
267da59dd5dSBram Moolenaar" commands.
2682b946c9fSBram Moolenaarfunc XfileTests(cchar)
2693ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
270da59dd5dSBram Moolenaar
271da59dd5dSBram Moolenaar  call writefile(['Xtestfile1:700:10:Line 700',
272da59dd5dSBram Moolenaar	\ 'Xtestfile2:800:15:Line 800'], 'Xqftestfile1')
273da59dd5dSBram Moolenaar
274da59dd5dSBram Moolenaar  enew!
2753ef5bf7dSBram Moolenaar  Xfile Xqftestfile1
2763ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
277da59dd5dSBram Moolenaar  call assert_true(len(l) == 2 &&
278da59dd5dSBram Moolenaar	\ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
279da59dd5dSBram Moolenaar	\ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
280da59dd5dSBram Moolenaar
281049cba9eSBram Moolenaar  " Test with a non existent file
282049cba9eSBram Moolenaar  call assert_fails('Xfile non_existent_file', 'E40')
283049cba9eSBram Moolenaar
284da59dd5dSBram Moolenaar  " Run cfile/lfile from a modified buffer
285da59dd5dSBram Moolenaar  enew!
286da59dd5dSBram Moolenaar  silent! put ='Quickfix'
2873ef5bf7dSBram Moolenaar  silent! Xfile Xqftestfile1
288da59dd5dSBram Moolenaar  call assert_true(v:errmsg ==# 'E37: No write since last change (add ! to override)')
289da59dd5dSBram Moolenaar
290da59dd5dSBram Moolenaar  call writefile(['Xtestfile3:900:30:Line 900'], 'Xqftestfile1')
2913ef5bf7dSBram Moolenaar  Xaddfile Xqftestfile1
2923ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
293da59dd5dSBram Moolenaar  call assert_true(len(l) == 3 &&
294da59dd5dSBram Moolenaar	\ l[2].lnum == 900 && l[2].col == 30 && l[2].text ==# 'Line 900')
295da59dd5dSBram Moolenaar
296da59dd5dSBram Moolenaar  call writefile(['Xtestfile1:222:77:Line 222',
297da59dd5dSBram Moolenaar	\ 'Xtestfile2:333:88:Line 333'], 'Xqftestfile1')
298da59dd5dSBram Moolenaar
299da59dd5dSBram Moolenaar  enew!
3003ef5bf7dSBram Moolenaar  Xgetfile Xqftestfile1
3013ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
302da59dd5dSBram Moolenaar  call assert_true(len(l) == 2 &&
303da59dd5dSBram Moolenaar	\ l[0].lnum == 222 && l[0].col == 77 && l[0].text ==# 'Line 222' &&
304da59dd5dSBram Moolenaar	\ l[1].lnum == 333 && l[1].col == 88 && l[1].text ==# 'Line 333')
305da59dd5dSBram Moolenaar
306da59dd5dSBram Moolenaar  call delete('Xqftestfile1')
3072b946c9fSBram Moolenaarendfunc
308da59dd5dSBram Moolenaar
3092b946c9fSBram Moolenaarfunc Test_cfile()
310da59dd5dSBram Moolenaar  call XfileTests('c')
311da59dd5dSBram Moolenaar  call XfileTests('l')
3122b946c9fSBram Moolenaarendfunc
313da59dd5dSBram Moolenaar
314da59dd5dSBram Moolenaar" Tests for the :cbuffer, :lbuffer, :caddbuffer, :laddbuffer, :cgetbuffer and
315da59dd5dSBram Moolenaar" :lgetbuffer commands.
3162b946c9fSBram Moolenaarfunc XbufferTests(cchar)
3173ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
318da59dd5dSBram Moolenaar
319da59dd5dSBram Moolenaar  enew!
320da59dd5dSBram Moolenaar  silent! call setline(1, ['Xtestfile7:700:10:Line 700',
321da59dd5dSBram Moolenaar	\ 'Xtestfile8:800:15:Line 800'])
3223ef5bf7dSBram Moolenaar  Xbuffer!
3233ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
324da59dd5dSBram Moolenaar  call assert_true(len(l) == 2 &&
325da59dd5dSBram Moolenaar	\ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
326da59dd5dSBram Moolenaar	\ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
327da59dd5dSBram Moolenaar
328da59dd5dSBram Moolenaar  enew!
329da59dd5dSBram Moolenaar  silent! call setline(1, ['Xtestfile9:900:55:Line 900',
330da59dd5dSBram Moolenaar	\ 'Xtestfile10:950:66:Line 950'])
3313ef5bf7dSBram Moolenaar  Xgetbuffer
3323ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
333da59dd5dSBram Moolenaar  call assert_true(len(l) == 2 &&
334da59dd5dSBram Moolenaar	\ l[0].lnum == 900 && l[0].col == 55 && l[0].text ==# 'Line 900' &&
335da59dd5dSBram Moolenaar	\ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950')
336da59dd5dSBram Moolenaar
337da59dd5dSBram Moolenaar  enew!
338da59dd5dSBram Moolenaar  silent! call setline(1, ['Xtestfile11:700:20:Line 700',
339da59dd5dSBram Moolenaar	\ 'Xtestfile12:750:25:Line 750'])
3403ef5bf7dSBram Moolenaar  Xaddbuffer
3413ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
342da59dd5dSBram Moolenaar  call assert_true(len(l) == 4 &&
343da59dd5dSBram Moolenaar	\ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950' &&
344da59dd5dSBram Moolenaar	\ l[2].lnum == 700 && l[2].col == 20 && l[2].text ==# 'Line 700' &&
345da59dd5dSBram Moolenaar	\ l[3].lnum == 750 && l[3].col == 25 && l[3].text ==# 'Line 750')
346ab47c61fSBram Moolenaar  enew!
347da59dd5dSBram Moolenaar
348ee85df37SBram Moolenaar  " Check for invalid buffer
349ee85df37SBram Moolenaar  call assert_fails('Xbuffer 199', 'E474:')
350ee85df37SBram Moolenaar
351ee85df37SBram Moolenaar  " Check for unloaded buffer
352ee85df37SBram Moolenaar  edit Xtestfile1
353ee85df37SBram Moolenaar  let bnr = bufnr('%')
354ee85df37SBram Moolenaar  enew!
355ee85df37SBram Moolenaar  call assert_fails('Xbuffer ' . bnr, 'E681:')
356ee85df37SBram Moolenaar
357ee85df37SBram Moolenaar  " Check for invalid range
358ee85df37SBram Moolenaar  " Using Xbuffer will not run the range check in the cbuffer/lbuffer
359ee85df37SBram Moolenaar  " commands. So directly call the commands.
360ee85df37SBram Moolenaar  if (a:cchar == 'c')
361ee85df37SBram Moolenaar      call assert_fails('900,999cbuffer', 'E16:')
362ee85df37SBram Moolenaar  else
363ee85df37SBram Moolenaar      call assert_fails('900,999lbuffer', 'E16:')
364ee85df37SBram Moolenaar  endif
3652b946c9fSBram Moolenaarendfunc
366da59dd5dSBram Moolenaar
3672b946c9fSBram Moolenaarfunc Test_cbuffer()
368da59dd5dSBram Moolenaar  call XbufferTests('c')
369da59dd5dSBram Moolenaar  call XbufferTests('l')
3702b946c9fSBram Moolenaarendfunc
371da59dd5dSBram Moolenaar
3722b946c9fSBram Moolenaarfunc XexprTests(cchar)
3730fcc7c6dSBram Moolenaar  call s:setup_commands(a:cchar)
3740fcc7c6dSBram Moolenaar
3750fcc7c6dSBram Moolenaar  call assert_fails('Xexpr 10', 'E777:')
3762b946c9fSBram Moolenaarendfunc
3770fcc7c6dSBram Moolenaar
3782b946c9fSBram Moolenaarfunc Test_cexpr()
3790fcc7c6dSBram Moolenaar  call XexprTests('c')
3800fcc7c6dSBram Moolenaar  call XexprTests('l')
3812b946c9fSBram Moolenaarendfunc
3820fcc7c6dSBram Moolenaar
3830fcc7c6dSBram Moolenaar" Tests for :cnext, :cprev, :cfirst, :clast commands
3842b946c9fSBram Moolenaarfunc Xtest_browse(cchar)
3850fcc7c6dSBram Moolenaar  call s:setup_commands(a:cchar)
3860fcc7c6dSBram Moolenaar
38774240d3fSBram Moolenaar  call g:Xsetlist([], 'f')
388b6fa30ccSBram Moolenaar  " Jumping to first or next location list entry without any error should
389b6fa30ccSBram Moolenaar  " result in failure
39074240d3fSBram Moolenaar  if a:cchar == 'c'
39174240d3fSBram Moolenaar    let err = 'E42:'
39274240d3fSBram Moolenaar  else
39374240d3fSBram Moolenaar    let err = 'E776:'
394b6fa30ccSBram Moolenaar  endif
39574240d3fSBram Moolenaar  call assert_fails('Xnext', err)
39674240d3fSBram Moolenaar  call assert_fails('Xprev', err)
39774240d3fSBram Moolenaar  call assert_fails('Xnfile', err)
39874240d3fSBram Moolenaar  call assert_fails('Xpfile', err)
399b6fa30ccSBram Moolenaar
4000fcc7c6dSBram Moolenaar  call s:create_test_file('Xqftestfile1')
4010fcc7c6dSBram Moolenaar  call s:create_test_file('Xqftestfile2')
4020fcc7c6dSBram Moolenaar
4030fcc7c6dSBram Moolenaar  Xgetexpr ['Xqftestfile1:5:Line5',
4040fcc7c6dSBram Moolenaar		\ 'Xqftestfile1:6:Line6',
4050fcc7c6dSBram Moolenaar		\ 'Xqftestfile2:10:Line10',
40699895eacSBram Moolenaar		\ 'Xqftestfile2:11:Line11',
40799895eacSBram Moolenaar		\ 'RegularLine1',
40899895eacSBram Moolenaar		\ 'RegularLine2']
4090fcc7c6dSBram Moolenaar
4100fcc7c6dSBram Moolenaar  Xfirst
4110fcc7c6dSBram Moolenaar  call assert_fails('Xprev', 'E553')
4120fcc7c6dSBram Moolenaar  call assert_fails('Xpfile', 'E553')
4130fcc7c6dSBram Moolenaar  Xnfile
4140fcc7c6dSBram Moolenaar  call assert_equal('Xqftestfile2', bufname('%'))
4150fcc7c6dSBram Moolenaar  call assert_equal(10, line('.'))
4160fcc7c6dSBram Moolenaar  Xpfile
4170fcc7c6dSBram Moolenaar  call assert_equal('Xqftestfile1', bufname('%'))
4180fcc7c6dSBram Moolenaar  call assert_equal(6, line('.'))
41974240d3fSBram Moolenaar  5Xcc
42074240d3fSBram Moolenaar  call assert_equal(5, g:Xgetlist({'idx':0}).idx)
42174240d3fSBram Moolenaar  2Xcc
42274240d3fSBram Moolenaar  call assert_equal(2, g:Xgetlist({'idx':0}).idx)
42374240d3fSBram Moolenaar  10Xcc
42474240d3fSBram Moolenaar  call assert_equal(6, g:Xgetlist({'idx':0}).idx)
4250fcc7c6dSBram Moolenaar  Xlast
42699895eacSBram Moolenaar  Xprev
4270fcc7c6dSBram Moolenaar  call assert_equal('Xqftestfile2', bufname('%'))
4280fcc7c6dSBram Moolenaar  call assert_equal(11, line('.'))
4290fcc7c6dSBram Moolenaar  call assert_fails('Xnext', 'E553')
4300fcc7c6dSBram Moolenaar  call assert_fails('Xnfile', 'E553')
4310fcc7c6dSBram Moolenaar  Xrewind
4320fcc7c6dSBram Moolenaar  call assert_equal('Xqftestfile1', bufname('%'))
4330fcc7c6dSBram Moolenaar  call assert_equal(5, line('.'))
4340fcc7c6dSBram Moolenaar
43599895eacSBram Moolenaar  10Xnext
43699895eacSBram Moolenaar  call assert_equal('Xqftestfile2', bufname('%'))
43799895eacSBram Moolenaar  call assert_equal(11, line('.'))
43899895eacSBram Moolenaar  10Xprev
43999895eacSBram Moolenaar  call assert_equal('Xqftestfile1', bufname('%'))
44099895eacSBram Moolenaar  call assert_equal(5, line('.'))
44199895eacSBram Moolenaar
44274240d3fSBram Moolenaar  " Jumping to an error from the error window using cc command
44374240d3fSBram Moolenaar  Xgetexpr ['Xqftestfile1:5:Line5',
44474240d3fSBram Moolenaar		\ 'Xqftestfile1:6:Line6',
44574240d3fSBram Moolenaar		\ 'Xqftestfile2:10:Line10',
44674240d3fSBram Moolenaar		\ 'Xqftestfile2:11:Line11']
44774240d3fSBram Moolenaar  Xopen
44874240d3fSBram Moolenaar  10Xcc
44974240d3fSBram Moolenaar  call assert_equal(11, line('.'))
45074240d3fSBram Moolenaar  call assert_equal('Xqftestfile2', bufname('%'))
45174240d3fSBram Moolenaar
45274240d3fSBram Moolenaar  " Jumping to an error from the error window (when only the error window is
45374240d3fSBram Moolenaar  " present)
45474240d3fSBram Moolenaar  Xopen | only
45574240d3fSBram Moolenaar  Xlast 1
45674240d3fSBram Moolenaar  call assert_equal(5, line('.'))
45774240d3fSBram Moolenaar  call assert_equal('Xqftestfile1', bufname('%'))
45874240d3fSBram Moolenaar
459ee85df37SBram Moolenaar  Xexpr ""
460ee85df37SBram Moolenaar  call assert_fails('Xnext', 'E42:')
461ee85df37SBram Moolenaar
4620fcc7c6dSBram Moolenaar  call delete('Xqftestfile1')
4630fcc7c6dSBram Moolenaar  call delete('Xqftestfile2')
464fc2b270cSBram Moolenaar
465fc2b270cSBram Moolenaar  " Should be able to use next/prev with invalid entries
466fc2b270cSBram Moolenaar  Xexpr ""
467fc2b270cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
468fc2b270cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'size' : 0}).size)
469fc2b270cSBram Moolenaar  Xaddexpr ['foo', 'bar', 'baz', 'quux', 'shmoo']
470fc2b270cSBram Moolenaar  call assert_equal(5, g:Xgetlist({'size' : 0}).size)
471fc2b270cSBram Moolenaar  Xlast
472fc2b270cSBram Moolenaar  call assert_equal(5, g:Xgetlist({'idx' : 0}).idx)
473fc2b270cSBram Moolenaar  Xfirst
474fc2b270cSBram Moolenaar  call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
475fc2b270cSBram Moolenaar  2Xnext
476fc2b270cSBram Moolenaar  call assert_equal(3, g:Xgetlist({'idx' : 0}).idx)
4772b946c9fSBram Moolenaarendfunc
4780fcc7c6dSBram Moolenaar
4792b946c9fSBram Moolenaarfunc Test_browse()
4800fcc7c6dSBram Moolenaar  call Xtest_browse('c')
4810fcc7c6dSBram Moolenaar  call Xtest_browse('l')
4822b946c9fSBram Moolenaarendfunc
4830fcc7c6dSBram Moolenaar
4842b946c9fSBram Moolenaarfunc Test_nomem()
4858e8df251SBram Moolenaar  call test_alloc_fail(GetAllocId('qf_dirname_start'), 0, 0)
486a260b87dSBram Moolenaar  call assert_fails('vimgrep vim runtest.vim', 'E342:')
48775bdf6aaSBram Moolenaar
4888e8df251SBram Moolenaar  call test_alloc_fail(GetAllocId('qf_dirname_now'), 0, 0)
489a260b87dSBram Moolenaar  call assert_fails('vimgrep vim runtest.vim', 'E342:')
49075bdf6aaSBram Moolenaar
4918e8df251SBram Moolenaar  call test_alloc_fail(GetAllocId('qf_namebuf'), 0, 0)
492a260b87dSBram Moolenaar  call assert_fails('cfile runtest.vim', 'E342:')
49375bdf6aaSBram Moolenaar
4948e8df251SBram Moolenaar  call test_alloc_fail(GetAllocId('qf_errmsg'), 0, 0)
495a260b87dSBram Moolenaar  call assert_fails('cfile runtest.vim', 'E342:')
49675bdf6aaSBram Moolenaar
4978e8df251SBram Moolenaar  call test_alloc_fail(GetAllocId('qf_pattern'), 0, 0)
498a260b87dSBram Moolenaar  call assert_fails('cfile runtest.vim', 'E342:')
49975bdf6aaSBram Moolenaar
50075bdf6aaSBram Moolenaarendfunc
50175bdf6aaSBram Moolenaar
5022b946c9fSBram Moolenaarfunc s:test_xhelpgrep(cchar)
503049cba9eSBram Moolenaar  call s:setup_commands(a:cchar)
504049cba9eSBram Moolenaar  Xhelpgrep quickfix
505049cba9eSBram Moolenaar  Xopen
506049cba9eSBram Moolenaar  if a:cchar == 'c'
507049cba9eSBram Moolenaar    let title_text = ':helpgrep quickfix'
508049cba9eSBram Moolenaar  else
509049cba9eSBram Moolenaar    let title_text = ':lhelpgrep quickfix'
510049cba9eSBram Moolenaar  endif
511049cba9eSBram Moolenaar  call assert_true(w:quickfix_title =~ title_text, w:quickfix_title)
51299895eacSBram Moolenaar
51399895eacSBram Moolenaar  " Jumping to a help topic should open the help window
51499895eacSBram Moolenaar  only
51599895eacSBram Moolenaar  Xnext
51699895eacSBram Moolenaar  call assert_true(&buftype == 'help')
51799895eacSBram Moolenaar  call assert_true(winnr('$') == 2)
51899895eacSBram Moolenaar  " Jumping to the next match should reuse the help window
51999895eacSBram Moolenaar  Xnext
52099895eacSBram Moolenaar  call assert_true(&buftype == 'help')
52199895eacSBram Moolenaar  call assert_true(winnr() == 1)
52299895eacSBram Moolenaar  call assert_true(winnr('$') == 2)
52399895eacSBram Moolenaar  " Jumping to the next match from the quickfix window should reuse the help
52499895eacSBram Moolenaar  " window
52599895eacSBram Moolenaar  Xopen
52699895eacSBram Moolenaar  Xnext
52799895eacSBram Moolenaar  call assert_true(&buftype == 'help')
52899895eacSBram Moolenaar  call assert_true(winnr() == 1)
52999895eacSBram Moolenaar  call assert_true(winnr('$') == 2)
53099895eacSBram Moolenaar
53162ef7974SBram Moolenaar  " This wipes out the buffer, make sure that doesn't cause trouble.
532049cba9eSBram Moolenaar  Xclose
533ee85df37SBram Moolenaar
534b4d5fbabSBram Moolenaar  if a:cchar == 'l'
535b4d5fbabSBram Moolenaar      " When a help window is present, running :lhelpgrep should reuse the
536b4d5fbabSBram Moolenaar      " help window and not the current window
537b4d5fbabSBram Moolenaar      new | only
538b4d5fbabSBram Moolenaar      call g:Xsetlist([], 'f')
539b4d5fbabSBram Moolenaar      help index.txt
540b4d5fbabSBram Moolenaar      wincmd w
541b4d5fbabSBram Moolenaar      lhelpgrep quickfix
542b4d5fbabSBram Moolenaar      call assert_equal(1, winnr())
543b4d5fbabSBram Moolenaar      call assert_notequal([], getloclist(1))
544b4d5fbabSBram Moolenaar      call assert_equal([], getloclist(2))
545b4d5fbabSBram Moolenaar  endif
546b4d5fbabSBram Moolenaar
54799895eacSBram Moolenaar  new | only
54899895eacSBram Moolenaar
549ee85df37SBram Moolenaar  " Search for non existing help string
550ee85df37SBram Moolenaar  call assert_fails('Xhelpgrep a1b2c3', 'E480:')
5512b946c9fSBram Moolenaarendfunc
552049cba9eSBram Moolenaar
5532b946c9fSBram Moolenaarfunc Test_helpgrep()
554049cba9eSBram Moolenaar  call s:test_xhelpgrep('c')
555cf25fdb8SBram Moolenaar  helpclose
556049cba9eSBram Moolenaar  call s:test_xhelpgrep('l')
55762ef7974SBram Moolenaarendfunc
55875bdf6aaSBram Moolenaar
5596920c72dSBram Moolenaarfunc Test_errortitle()
5606920c72dSBram Moolenaar  augroup QfBufWinEnter
5616920c72dSBram Moolenaar    au!
5626920c72dSBram Moolenaar    au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
5636920c72dSBram Moolenaar  augroup END
5646920c72dSBram Moolenaar  copen
5656920c72dSBram 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'')'}]
5666920c72dSBram Moolenaar  call setqflist(a)
5676920c72dSBram Moolenaar  call assert_equal(':setqflist()', g:a)
5686920c72dSBram Moolenaar  augroup QfBufWinEnter
5696920c72dSBram Moolenaar    au!
5706920c72dSBram Moolenaar  augroup END
5716920c72dSBram Moolenaar  augroup! QfBufWinEnter
5726920c72dSBram Moolenaarendfunc
573e27dba49SBram Moolenaar
5745584df65SBram Moolenaarfunc Test_vimgreptitle()
5755584df65SBram Moolenaar  augroup QfBufWinEnter
5765584df65SBram Moolenaar    au!
5775584df65SBram Moolenaar    au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
5785584df65SBram Moolenaar  augroup END
5795584df65SBram Moolenaar  try
5805584df65SBram Moolenaar    vimgrep /pattern/j file
5815584df65SBram Moolenaar  catch /E480/
5825584df65SBram Moolenaar  endtry
5835584df65SBram Moolenaar  copen
5845584df65SBram Moolenaar  call assert_equal(':    vimgrep /pattern/j file', g:a)
5855584df65SBram Moolenaar  augroup QfBufWinEnter
5865584df65SBram Moolenaar    au!
5875584df65SBram Moolenaar  augroup END
5885584df65SBram Moolenaar  augroup! QfBufWinEnter
5895584df65SBram Moolenaarendfunc
5905584df65SBram Moolenaar
5912b946c9fSBram Moolenaarfunc XqfTitleTests(cchar)
5923ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
593e27dba49SBram Moolenaar
5943ef5bf7dSBram Moolenaar  Xgetexpr ['file:1:1:message']
5953ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
596e27dba49SBram Moolenaar  if a:cchar == 'c'
597e27dba49SBram Moolenaar    call setqflist(l, 'r')
598e27dba49SBram Moolenaar  else
599e27dba49SBram Moolenaar    call setloclist(0, l, 'r')
600e27dba49SBram Moolenaar  endif
601e27dba49SBram Moolenaar
6023ef5bf7dSBram Moolenaar  Xopen
603e27dba49SBram Moolenaar  if a:cchar == 'c'
604e27dba49SBram Moolenaar    let title = ':setqflist()'
605e27dba49SBram Moolenaar  else
606e27dba49SBram Moolenaar    let title = ':setloclist()'
607e27dba49SBram Moolenaar  endif
608e27dba49SBram Moolenaar  call assert_equal(title, w:quickfix_title)
6093ef5bf7dSBram Moolenaar  Xclose
6102b946c9fSBram Moolenaarendfunc
611e27dba49SBram Moolenaar
612e27dba49SBram Moolenaar" Tests for quickfix window's title
6132b946c9fSBram Moolenaarfunc Test_qf_title()
614e27dba49SBram Moolenaar  call XqfTitleTests('c')
615e27dba49SBram Moolenaar  call XqfTitleTests('l')
6162b946c9fSBram Moolenaarendfunc
617e27dba49SBram Moolenaar
618e27dba49SBram Moolenaar" Tests for 'errorformat'
6192b946c9fSBram Moolenaarfunc Test_efm()
620e27dba49SBram Moolenaar  let save_efm = &efm
621e27dba49SBram Moolenaar  set efm=%EEEE%m,%WWWW%m,%+CCCC%.%#,%-GGGG%.%#
622e27dba49SBram Moolenaar  cgetexpr ['WWWW', 'EEEE', 'CCCC']
623e27dba49SBram Moolenaar  let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
624e27dba49SBram Moolenaar  call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
625e27dba49SBram Moolenaar  cgetexpr ['WWWW', 'GGGG', 'EEEE', 'CCCC']
626e27dba49SBram Moolenaar  let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
627e27dba49SBram Moolenaar  call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
628e27dba49SBram Moolenaar  cgetexpr ['WWWW', 'GGGG', 'ZZZZ', 'EEEE', 'CCCC', 'YYYY']
629e27dba49SBram Moolenaar  let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
630e27dba49SBram Moolenaar  call assert_equal("[['W', 1], ['ZZZZ', 0], ['E^@CCCC', 1], ['YYYY', 0]]", l)
631e27dba49SBram Moolenaar  let &efm = save_efm
6322b946c9fSBram Moolenaarendfunc
6331ff2b64bSBram Moolenaar
6341ff2b64bSBram Moolenaar" This will test for problems in quickfix:
6351ff2b64bSBram Moolenaar" A. incorrectly copying location lists which caused the location list to show
6361ff2b64bSBram Moolenaar"    a different name than the file that was actually being displayed.
6371ff2b64bSBram Moolenaar" B. not reusing the window for which the location list window is opened but
6381ff2b64bSBram Moolenaar"    instead creating new windows.
6391ff2b64bSBram Moolenaar" C. make sure that the location list window is not reused instead of the
6401ff2b64bSBram Moolenaar"    window it belongs to.
6411ff2b64bSBram Moolenaar"
6421ff2b64bSBram Moolenaar" Set up the test environment:
6432b946c9fSBram Moolenaarfunc ReadTestProtocol(name)
6441ff2b64bSBram Moolenaar  let base = substitute(a:name, '\v^test://(.*)%(\.[^.]+)?', '\1', '')
6451ff2b64bSBram Moolenaar  let word = substitute(base, '\v(.*)\..*', '\1', '')
6461ff2b64bSBram Moolenaar
6471ff2b64bSBram Moolenaar  setl modifiable
6481ff2b64bSBram Moolenaar  setl noreadonly
6491ff2b64bSBram Moolenaar  setl noswapfile
6501ff2b64bSBram Moolenaar  setl bufhidden=delete
6511ff2b64bSBram Moolenaar  %del _
6521ff2b64bSBram Moolenaar  " For problem 2:
6531ff2b64bSBram Moolenaar  " 'buftype' has to be set to reproduce the constant opening of new windows
6541ff2b64bSBram Moolenaar  setl buftype=nofile
6551ff2b64bSBram Moolenaar
6561ff2b64bSBram Moolenaar  call setline(1, word)
6571ff2b64bSBram Moolenaar
6581ff2b64bSBram Moolenaar  setl nomodified
6591ff2b64bSBram Moolenaar  setl nomodifiable
6601ff2b64bSBram Moolenaar  setl readonly
6611ff2b64bSBram Moolenaar  exe 'doautocmd BufRead ' . substitute(a:name, '\v^test://(.*)', '\1', '')
6622b946c9fSBram Moolenaarendfunc
6631ff2b64bSBram Moolenaar
6642b946c9fSBram Moolenaarfunc Test_locationlist()
6651ff2b64bSBram Moolenaar    enew
6661ff2b64bSBram Moolenaar
6671ff2b64bSBram Moolenaar    augroup testgroup
6681ff2b64bSBram Moolenaar      au!
6691ff2b64bSBram Moolenaar      autocmd BufReadCmd test://* call ReadTestProtocol(expand("<amatch>"))
6701ff2b64bSBram Moolenaar    augroup END
6711ff2b64bSBram Moolenaar
6721ff2b64bSBram Moolenaar    let words = [ "foo", "bar", "baz", "quux", "shmoo", "spam", "eggs" ]
6731ff2b64bSBram Moolenaar
6741ff2b64bSBram Moolenaar    let qflist = []
6751ff2b64bSBram Moolenaar    for word in words
6761ff2b64bSBram Moolenaar      call add(qflist, {'filename': 'test://' . word . '.txt', 'text': 'file ' . word . '.txt', })
6771ff2b64bSBram Moolenaar      " NOTE: problem 1:
6781ff2b64bSBram Moolenaar      " intentionally not setting 'lnum' so that the quickfix entries are not
6791ff2b64bSBram Moolenaar      " valid
6801ff2b64bSBram Moolenaar      call setloclist(0, qflist, ' ')
6811ff2b64bSBram Moolenaar    endfor
6821ff2b64bSBram Moolenaar
6831ff2b64bSBram Moolenaar    " Test A
6841ff2b64bSBram Moolenaar    lrewind
6851ff2b64bSBram Moolenaar    enew
6861ff2b64bSBram Moolenaar    lopen
68799895eacSBram Moolenaar    4lnext
6881ff2b64bSBram Moolenaar    vert split
6891ff2b64bSBram Moolenaar    wincmd L
6901ff2b64bSBram Moolenaar    lopen
6911ff2b64bSBram Moolenaar    wincmd p
6921ff2b64bSBram Moolenaar    lnext
6931ff2b64bSBram Moolenaar    let fileName = expand("%")
6941ff2b64bSBram Moolenaar    wincmd p
6951ff2b64bSBram Moolenaar    let locationListFileName = substitute(getline(line('.')), '\([^|]*\)|.*', '\1', '')
6961ff2b64bSBram Moolenaar    let fileName = substitute(fileName, '\\', '/', 'g')
6971ff2b64bSBram Moolenaar    let locationListFileName = substitute(locationListFileName, '\\', '/', 'g')
6981ff2b64bSBram Moolenaar    call assert_equal("test://bar.txt", fileName)
6991ff2b64bSBram Moolenaar    call assert_equal("test://bar.txt", locationListFileName)
7001ff2b64bSBram Moolenaar
7011ff2b64bSBram Moolenaar    wincmd n | only
7021ff2b64bSBram Moolenaar
7031ff2b64bSBram Moolenaar    " Test B:
7041ff2b64bSBram Moolenaar    lrewind
7051ff2b64bSBram Moolenaar    lopen
7061ff2b64bSBram Moolenaar    2
7071ff2b64bSBram Moolenaar    exe "normal \<CR>"
7081ff2b64bSBram Moolenaar    wincmd p
7091ff2b64bSBram Moolenaar    3
7101ff2b64bSBram Moolenaar    exe "normal \<CR>"
7111ff2b64bSBram Moolenaar    wincmd p
7121ff2b64bSBram Moolenaar    4
7131ff2b64bSBram Moolenaar    exe "normal \<CR>"
7141ff2b64bSBram Moolenaar    call assert_equal(2, winnr('$'))
7151ff2b64bSBram Moolenaar    wincmd n | only
7161ff2b64bSBram Moolenaar
7171ff2b64bSBram Moolenaar    " Test C:
7181ff2b64bSBram Moolenaar    lrewind
7191ff2b64bSBram Moolenaar    lopen
7201ff2b64bSBram Moolenaar    " Let's move the location list window to the top to check whether it (the
7211ff2b64bSBram Moolenaar    " first window found) will be reused when we try to open new windows:
7221ff2b64bSBram Moolenaar    wincmd K
7231ff2b64bSBram Moolenaar    2
7241ff2b64bSBram Moolenaar    exe "normal \<CR>"
7251ff2b64bSBram Moolenaar    wincmd p
7261ff2b64bSBram Moolenaar    3
7271ff2b64bSBram Moolenaar    exe "normal \<CR>"
7281ff2b64bSBram Moolenaar    wincmd p
7291ff2b64bSBram Moolenaar    4
7301ff2b64bSBram Moolenaar    exe "normal \<CR>"
7311ff2b64bSBram Moolenaar    1wincmd w
7321ff2b64bSBram Moolenaar    call assert_equal('quickfix', &buftype)
7331ff2b64bSBram Moolenaar    2wincmd w
7341ff2b64bSBram Moolenaar    let bufferName = expand("%")
7351ff2b64bSBram Moolenaar    let bufferName = substitute(bufferName, '\\', '/', 'g')
7361ff2b64bSBram Moolenaar    call assert_equal('test://quux.txt', bufferName)
7371ff2b64bSBram Moolenaar
7381ff2b64bSBram Moolenaar    wincmd n | only
7391ff2b64bSBram Moolenaar
7401ff2b64bSBram Moolenaar    augroup! testgroup
7412b946c9fSBram Moolenaarendfunc
7420899d698SBram Moolenaar
7432b946c9fSBram Moolenaarfunc Test_locationlist_curwin_was_closed()
7440899d698SBram Moolenaar    augroup testgroup
7450899d698SBram Moolenaar      au!
746d106e5baSBram Moolenaar      autocmd BufReadCmd test_curwin.txt call R(expand("<amatch>"))
7470899d698SBram Moolenaar    augroup END
7480899d698SBram Moolenaar
7492b946c9fSBram Moolenaar    func! R(n)
7500899d698SBram Moolenaar      quit
7510899d698SBram Moolenaar    endfunc
7520899d698SBram Moolenaar
7530899d698SBram Moolenaar    new
7540899d698SBram Moolenaar    let q = []
755d106e5baSBram Moolenaar    call add(q, {'filename': 'test_curwin.txt' })
7560899d698SBram Moolenaar    call setloclist(0, q)
7570899d698SBram Moolenaar    call assert_fails('lrewind', 'E924:')
7580899d698SBram Moolenaar
7590899d698SBram Moolenaar    augroup! testgroup
7602b946c9fSBram Moolenaarendfunc
7617eba3d2cSBram Moolenaar
7622b946c9fSBram Moolenaarfunc Test_locationlist_cross_tab_jump()
7630a9046fbSBram Moolenaar  call writefile(['loclistfoo'], 'loclistfoo')
7640a9046fbSBram Moolenaar  call writefile(['loclistbar'], 'loclistbar')
7650a9046fbSBram Moolenaar  set switchbuf=usetab
7660a9046fbSBram Moolenaar
7670a9046fbSBram Moolenaar  edit loclistfoo
7680a9046fbSBram Moolenaar  tabedit loclistbar
7690a9046fbSBram Moolenaar  silent lgrep loclistfoo loclist*
7700a9046fbSBram Moolenaar  call assert_equal(1, tabpagenr())
7710a9046fbSBram Moolenaar
7720a9046fbSBram Moolenaar  enew | only | tabonly
7730a9046fbSBram Moolenaar  set switchbuf&vim
7740a9046fbSBram Moolenaar  call delete('loclistfoo')
7750a9046fbSBram Moolenaar  call delete('loclistbar')
7762b946c9fSBram Moolenaarendfunc
7770a9046fbSBram Moolenaar
7787eba3d2cSBram Moolenaar" More tests for 'errorformat'
7792b946c9fSBram Moolenaarfunc Test_efm1()
7807eba3d2cSBram Moolenaar    if !has('unix')
7817eba3d2cSBram Moolenaar	" The 'errorformat' setting is different on non-Unix systems.
7827eba3d2cSBram Moolenaar	" This test works only on Unix-like systems.
7837eba3d2cSBram Moolenaar	return
7847eba3d2cSBram Moolenaar    endif
7857eba3d2cSBram Moolenaar
7867eba3d2cSBram Moolenaar    let l = [
7877eba3d2cSBram Moolenaar      \ '"Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set.',
7887eba3d2cSBram Moolenaar      \ '"Xtestfile", line 6 col 19; this is an error',
7897eba3d2cSBram Moolenaar      \ 'gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include  version.c',
7907eba3d2cSBram Moolenaar      \ 'Xtestfile:9: parse error before `asd''',
7917eba3d2cSBram Moolenaar      \ 'make: *** [vim] Error 1',
7927eba3d2cSBram Moolenaar      \ 'in file "Xtestfile" linenr 10: there is an error',
7937eba3d2cSBram Moolenaar      \ '',
7947eba3d2cSBram Moolenaar      \ '2 returned',
7957eba3d2cSBram Moolenaar      \ '"Xtestfile", line 11 col 1; this is an error',
7967eba3d2cSBram Moolenaar      \ '"Xtestfile", line 12 col 2; this is another error',
7977eba3d2cSBram Moolenaar      \ '"Xtestfile", line 14:10; this is an error in column 10',
7987eba3d2cSBram Moolenaar      \ '=Xtestfile=, line 15:10; this is another error, but in vcol 10 this time',
7997eba3d2cSBram Moolenaar      \ '"Xtestfile", linenr 16: yet another problem',
8007eba3d2cSBram Moolenaar      \ 'Error in "Xtestfile" at line 17:',
8017eba3d2cSBram Moolenaar      \ 'x should be a dot',
8027eba3d2cSBram Moolenaar      \ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 17',
8037eba3d2cSBram Moolenaar      \ '            ^',
8047eba3d2cSBram Moolenaar      \ 'Error in "Xtestfile" at line 18:',
8057eba3d2cSBram Moolenaar      \ 'x should be a dot',
8067eba3d2cSBram Moolenaar      \ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 18',
8077eba3d2cSBram Moolenaar      \ '.............^',
8087eba3d2cSBram Moolenaar      \ 'Error in "Xtestfile" at line 19:',
8097eba3d2cSBram Moolenaar      \ 'x should be a dot',
8107eba3d2cSBram Moolenaar      \ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 19',
8117eba3d2cSBram Moolenaar      \ '--------------^',
8127eba3d2cSBram Moolenaar      \ 'Error in "Xtestfile" at line 20:',
8137eba3d2cSBram Moolenaar      \ 'x should be a dot',
8147eba3d2cSBram Moolenaar      \ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 20',
8157eba3d2cSBram Moolenaar      \ '	       ^',
8167eba3d2cSBram Moolenaar      \ '',
8177eba3d2cSBram Moolenaar      \ 'Does anyone know what is the problem and how to correction it?',
8187eba3d2cSBram Moolenaar      \ '"Xtestfile", line 21 col 9: What is the title of the quickfix window?',
8197eba3d2cSBram Moolenaar      \ '"Xtestfile", line 22 col 9: What is the title of the quickfix window?'
8207eba3d2cSBram Moolenaar      \ ]
8217eba3d2cSBram Moolenaar
8227eba3d2cSBram Moolenaar    call writefile(l, 'Xerrorfile1')
8237eba3d2cSBram Moolenaar    call writefile(l[:-2], 'Xerrorfile2')
8247eba3d2cSBram Moolenaar
8257eba3d2cSBram Moolenaar    let m = [
8267eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  2',
8277eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  3',
8287eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  4',
8297eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  5',
8307eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  6',
8317eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  7',
8327eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  8',
8337eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  9',
8347eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 10',
8357eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 11',
8367eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 12',
8377eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 13',
8387eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 14',
8397eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 15',
8407eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 16',
8417eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 17',
8427eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 18',
8437eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 19',
8447eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 20',
8457eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 21',
8467eba3d2cSBram Moolenaar	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 22'
8477eba3d2cSBram Moolenaar	\ ]
8487eba3d2cSBram Moolenaar    call writefile(m, 'Xtestfile')
8497eba3d2cSBram Moolenaar
8507eba3d2cSBram Moolenaar    let save_efm = &efm
8517eba3d2cSBram Moolenaar    set efm+==%f=\\,\ line\ %l%*\\D%v%*[^\ ]\ %m
8527eba3d2cSBram Moolenaar    set efm^=%AError\ in\ \"%f\"\ at\ line\ %l:,%Z%p^,%C%m
8537eba3d2cSBram Moolenaar
8547eba3d2cSBram Moolenaar    exe 'cf Xerrorfile2'
8557eba3d2cSBram Moolenaar    clast
8567eba3d2cSBram Moolenaar    copen
8577eba3d2cSBram Moolenaar    call assert_equal(':cf Xerrorfile2', w:quickfix_title)
8587eba3d2cSBram Moolenaar    wincmd p
8597eba3d2cSBram Moolenaar
8607eba3d2cSBram Moolenaar    exe 'cf Xerrorfile1'
8617eba3d2cSBram Moolenaar    call assert_equal([4, 12], [line('.'), col('.')])
8627eba3d2cSBram Moolenaar    cn
8637eba3d2cSBram Moolenaar    call assert_equal([6, 19], [line('.'), col('.')])
8647eba3d2cSBram Moolenaar    cn
8657eba3d2cSBram Moolenaar    call assert_equal([9, 2], [line('.'), col('.')])
8667eba3d2cSBram Moolenaar    cn
8677eba3d2cSBram Moolenaar    call assert_equal([10, 2], [line('.'), col('.')])
8687eba3d2cSBram Moolenaar    cn
8697eba3d2cSBram Moolenaar    call assert_equal([11, 1], [line('.'), col('.')])
8707eba3d2cSBram Moolenaar    cn
8717eba3d2cSBram Moolenaar    call assert_equal([12, 2], [line('.'), col('.')])
8727eba3d2cSBram Moolenaar    cn
8737eba3d2cSBram Moolenaar    call assert_equal([14, 10], [line('.'), col('.')])
8747eba3d2cSBram Moolenaar    cn
8757eba3d2cSBram Moolenaar    call assert_equal([15, 3, 10], [line('.'), col('.'), virtcol('.')])
8767eba3d2cSBram Moolenaar    cn
8777eba3d2cSBram Moolenaar    call assert_equal([16, 2], [line('.'), col('.')])
8787eba3d2cSBram Moolenaar    cn
8797eba3d2cSBram Moolenaar    call assert_equal([17, 6], [line('.'), col('.')])
8807eba3d2cSBram Moolenaar    cn
8817eba3d2cSBram Moolenaar    call assert_equal([18, 7], [line('.'), col('.')])
8827eba3d2cSBram Moolenaar    cn
8837eba3d2cSBram Moolenaar    call assert_equal([19, 8], [line('.'), col('.')])
8847eba3d2cSBram Moolenaar    cn
8857eba3d2cSBram Moolenaar    call assert_equal([20, 9], [line('.'), col('.')])
8867eba3d2cSBram Moolenaar    clast
8877eba3d2cSBram Moolenaar    cprev
8887eba3d2cSBram Moolenaar    cprev
8897eba3d2cSBram Moolenaar    wincmd w
8907eba3d2cSBram Moolenaar    call assert_equal(':cf Xerrorfile1', w:quickfix_title)
8917eba3d2cSBram Moolenaar    wincmd p
8927eba3d2cSBram Moolenaar
8937eba3d2cSBram Moolenaar    let &efm = save_efm
8947eba3d2cSBram Moolenaar    call delete('Xerrorfile1')
8957eba3d2cSBram Moolenaar    call delete('Xerrorfile2')
8967eba3d2cSBram Moolenaar    call delete('Xtestfile')
8972b946c9fSBram Moolenaarendfunc
898ffec3c53SBram Moolenaar
899ab47c61fSBram Moolenaar" Test for quickfix directory stack support
9002b946c9fSBram Moolenaarfunc s:dir_stack_tests(cchar)
90138df43bdSBram Moolenaar  call s:setup_commands(a:cchar)
90238df43bdSBram Moolenaar
903ab47c61fSBram Moolenaar  let save_efm=&efm
904ab47c61fSBram Moolenaar  set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
905ab47c61fSBram Moolenaar
906361c8f0eSBram Moolenaar  let lines = ["Entering dir 'dir1/a'",
907361c8f0eSBram Moolenaar		\ 'habits2.txt:1:Nine Healthy Habits',
908361c8f0eSBram Moolenaar		\ "Entering dir 'b'",
909361c8f0eSBram Moolenaar		\ 'habits3.txt:2:0 Hours of television',
910361c8f0eSBram Moolenaar		\ 'habits2.txt:7:5 Small meals',
911361c8f0eSBram Moolenaar		\ "Entering dir 'dir1/c'",
912361c8f0eSBram Moolenaar		\ 'habits4.txt:3:1 Hour of exercise',
913361c8f0eSBram Moolenaar		\ "Leaving dir 'dir1/c'",
914361c8f0eSBram Moolenaar		\ "Leaving dir 'dir1/a'",
915361c8f0eSBram Moolenaar		\ 'habits1.txt:4:2 Liters of water',
916361c8f0eSBram Moolenaar		\ "Entering dir 'dir2'",
917361c8f0eSBram Moolenaar		\ 'habits5.txt:5:3 Cups of hot green tea',
918361c8f0eSBram Moolenaar		\ "Leaving dir 'dir2'"
919361c8f0eSBram Moolenaar		\]
920ab47c61fSBram Moolenaar
921361c8f0eSBram Moolenaar  Xexpr ""
922361c8f0eSBram Moolenaar  for l in lines
923361c8f0eSBram Moolenaar      Xaddexpr l
924361c8f0eSBram Moolenaar  endfor
925ab47c61fSBram Moolenaar
9263ef5bf7dSBram Moolenaar  let qf = g:Xgetlist()
927ab47c61fSBram Moolenaar
928ab47c61fSBram Moolenaar  call assert_equal('dir1/a/habits2.txt', bufname(qf[1].bufnr))
929ab47c61fSBram Moolenaar  call assert_equal(1, qf[1].lnum)
930ab47c61fSBram Moolenaar  call assert_equal('dir1/a/b/habits3.txt', bufname(qf[3].bufnr))
931ab47c61fSBram Moolenaar  call assert_equal(2, qf[3].lnum)
932ab47c61fSBram Moolenaar  call assert_equal('dir1/a/habits2.txt', bufname(qf[4].bufnr))
933ab47c61fSBram Moolenaar  call assert_equal(7, qf[4].lnum)
934ab47c61fSBram Moolenaar  call assert_equal('dir1/c/habits4.txt', bufname(qf[6].bufnr))
935ab47c61fSBram Moolenaar  call assert_equal(3, qf[6].lnum)
936ab47c61fSBram Moolenaar  call assert_equal('habits1.txt', bufname(qf[9].bufnr))
937ab47c61fSBram Moolenaar  call assert_equal(4, qf[9].lnum)
938ab47c61fSBram Moolenaar  call assert_equal('dir2/habits5.txt', bufname(qf[11].bufnr))
939ab47c61fSBram Moolenaar  call assert_equal(5, qf[11].lnum)
940ab47c61fSBram Moolenaar
941ab47c61fSBram Moolenaar  let &efm=save_efm
9422b946c9fSBram Moolenaarendfunc
943ab47c61fSBram Moolenaar
944ab47c61fSBram Moolenaar" Tests for %D and %X errorformat options
9452b946c9fSBram Moolenaarfunc Test_efm_dirstack()
946ab47c61fSBram Moolenaar  " Create the directory stack and files
947ab47c61fSBram Moolenaar  call mkdir('dir1')
948ab47c61fSBram Moolenaar  call mkdir('dir1/a')
949ab47c61fSBram Moolenaar  call mkdir('dir1/a/b')
950ab47c61fSBram Moolenaar  call mkdir('dir1/c')
951ab47c61fSBram Moolenaar  call mkdir('dir2')
952ab47c61fSBram Moolenaar
953ab47c61fSBram Moolenaar  let lines = ["Nine Healthy Habits",
954ab47c61fSBram Moolenaar		\ "0 Hours of television",
955ab47c61fSBram Moolenaar		\ "1 Hour of exercise",
956ab47c61fSBram Moolenaar		\ "2 Liters of water",
957ab47c61fSBram Moolenaar		\ "3 Cups of hot green tea",
958ab47c61fSBram Moolenaar		\ "4 Short mental breaks",
959ab47c61fSBram Moolenaar		\ "5 Small meals",
960ab47c61fSBram Moolenaar		\ "6 AM wake up time",
961ab47c61fSBram Moolenaar		\ "7 Minutes of laughter",
962ab47c61fSBram Moolenaar		\ "8 Hours of sleep (at least)",
963ab47c61fSBram Moolenaar		\ "9 PM end of the day and off to bed"
964ab47c61fSBram Moolenaar		\ ]
965ab47c61fSBram Moolenaar  call writefile(lines, 'habits1.txt')
966ab47c61fSBram Moolenaar  call writefile(lines, 'dir1/a/habits2.txt')
967ab47c61fSBram Moolenaar  call writefile(lines, 'dir1/a/b/habits3.txt')
968ab47c61fSBram Moolenaar  call writefile(lines, 'dir1/c/habits4.txt')
969ab47c61fSBram Moolenaar  call writefile(lines, 'dir2/habits5.txt')
970ab47c61fSBram Moolenaar
971ab47c61fSBram Moolenaar  call s:dir_stack_tests('c')
972ab47c61fSBram Moolenaar  call s:dir_stack_tests('l')
973ab47c61fSBram Moolenaar
974ab47c61fSBram Moolenaar  call delete('dir1', 'rf')
975ab47c61fSBram Moolenaar  call delete('dir2', 'rf')
976ab47c61fSBram Moolenaar  call delete('habits1.txt')
9772b946c9fSBram Moolenaarendfunc
978ab47c61fSBram Moolenaar
9799b457948SBram Moolenaar" Test for resync after continuing an ignored message
9802b946c9fSBram Moolenaarfunc Xefm_ignore_continuations(cchar)
9819b457948SBram Moolenaar  call s:setup_commands(a:cchar)
9829b457948SBram Moolenaar
9839b457948SBram Moolenaar  let save_efm = &efm
9849b457948SBram Moolenaar
9859b457948SBram Moolenaar  let &efm =
9869b457948SBram Moolenaar	\ '%Eerror %m %l,' .
9879b457948SBram Moolenaar	\ '%-Wignored %m %l,' .
9889b457948SBram Moolenaar	\ '%+Cmore ignored %m %l,' .
9899b457948SBram Moolenaar	\ '%Zignored end'
9909b457948SBram Moolenaar  Xgetexpr ['ignored warning 1', 'more ignored continuation 2', 'ignored end', 'error resync 4']
9919b457948SBram Moolenaar  let l = map(g:Xgetlist(), '[v:val.text, v:val.valid, v:val.lnum, v:val.type]')
9929b457948SBram Moolenaar  call assert_equal([['resync', 1, 4, 'E']], l)
9939b457948SBram Moolenaar
9949b457948SBram Moolenaar  let &efm = save_efm
9952b946c9fSBram Moolenaarendfunc
9969b457948SBram Moolenaar
9972b946c9fSBram Moolenaarfunc Test_efm_ignore_continuations()
9989b457948SBram Moolenaar  call Xefm_ignore_continuations('c')
9999b457948SBram Moolenaar  call Xefm_ignore_continuations('l')
10002b946c9fSBram Moolenaarendfunc
10019b457948SBram Moolenaar
10020fcc7c6dSBram Moolenaar" Tests for invalid error format specifies
10032b946c9fSBram Moolenaarfunc Xinvalid_efm_Tests(cchar)
10040fcc7c6dSBram Moolenaar  call s:setup_commands(a:cchar)
10050fcc7c6dSBram Moolenaar
1006049cba9eSBram Moolenaar  let save_efm = &efm
1007049cba9eSBram Moolenaar
10080fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%f:%l:%m
10090fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E372:')
10100fcc7c6dSBram Moolenaar
10110fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%l:%r:%m
10120fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
10130fcc7c6dSBram Moolenaar
10140fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%O:%f:%l:%m
10150fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
10160fcc7c6dSBram Moolenaar
10170fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%l:%*[^a-z
10180fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E374:')
10190fcc7c6dSBram Moolenaar
10200fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%l:%*c
10210fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E375:')
10220fcc7c6dSBram Moolenaar
10230fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%L%M%N
10240fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E376:')
10250fcc7c6dSBram Moolenaar
10260fcc7c6dSBram Moolenaar  set efm=%f:%l:%m,%f:%l:%m:%R
10270fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E377:')
10280fcc7c6dSBram Moolenaar
10290fcc7c6dSBram Moolenaar  set efm=
10300fcc7c6dSBram Moolenaar  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E378:')
10310fcc7c6dSBram Moolenaar
10320fcc7c6dSBram Moolenaar  set efm=%DEntering\ dir\ abc,%f:%l:%m
10330fcc7c6dSBram Moolenaar  call assert_fails('Xexpr ["Entering dir abc", "abc.txt:1:Hello world"]', 'E379:')
10340fcc7c6dSBram Moolenaar
10350fcc7c6dSBram Moolenaar  let &efm = save_efm
10362b946c9fSBram Moolenaarendfunc
10370fcc7c6dSBram Moolenaar
10382b946c9fSBram Moolenaarfunc Test_invalid_efm()
10390fcc7c6dSBram Moolenaar  call Xinvalid_efm_Tests('c')
10400fcc7c6dSBram Moolenaar  call Xinvalid_efm_Tests('l')
10412b946c9fSBram Moolenaarendfunc
10420fcc7c6dSBram Moolenaar
10430fcc7c6dSBram Moolenaar" TODO:
10440fcc7c6dSBram Moolenaar" Add tests for the following formats in 'errorformat'
10450fcc7c6dSBram Moolenaar"	%r  %O
10462b946c9fSBram Moolenaarfunc Test_efm2()
10470fcc7c6dSBram Moolenaar  let save_efm = &efm
1048049cba9eSBram Moolenaar
1049049cba9eSBram Moolenaar  " Test for %s format in efm
1050049cba9eSBram Moolenaar  set efm=%f:%s
1051049cba9eSBram Moolenaar  cexpr 'Xtestfile:Line search text'
1052049cba9eSBram Moolenaar  let l = getqflist()
1053049cba9eSBram Moolenaar  call assert_equal(l[0].pattern, '^\VLine search text\$')
1054049cba9eSBram Moolenaar  call assert_equal(l[0].lnum, 0)
1055049cba9eSBram Moolenaar
1056ee85df37SBram Moolenaar  let l = split(execute('clist', ''), "\n")
1057ee85df37SBram Moolenaar  call assert_equal([' 1 Xtestfile:^\VLine search text\$:  '], l)
1058ee85df37SBram Moolenaar
10590fcc7c6dSBram Moolenaar  " Test for %P, %Q and %t format specifiers
1060049cba9eSBram Moolenaar  let lines=["[Xtestfile1]",
1061049cba9eSBram Moolenaar	      \ "(1,17)  error: ';' missing",
1062049cba9eSBram Moolenaar	      \ "(21,2)  warning: variable 'z' not defined",
1063049cba9eSBram Moolenaar	      \ "(67,3)  error: end of file found before string ended",
1064ee85df37SBram Moolenaar	      \ "--",
1065049cba9eSBram Moolenaar	      \ "",
1066049cba9eSBram Moolenaar	      \ "[Xtestfile2]",
1067ee85df37SBram Moolenaar	      \ "--",
1068049cba9eSBram Moolenaar	      \ "",
1069049cba9eSBram Moolenaar	      \ "[Xtestfile3]",
1070049cba9eSBram Moolenaar	      \ "NEW compiler v1.1",
1071049cba9eSBram Moolenaar	      \ "(2,2)   warning: variable 'x' not defined",
1072ee85df37SBram Moolenaar	      \ "(67,3)  warning: 's' already defined",
1073ee85df37SBram Moolenaar	      \ "--"
1074049cba9eSBram Moolenaar	      \]
1075ee85df37SBram Moolenaar  set efm=%+P[%f]%r,(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%+Q--%r
1076391b1dd0SBram Moolenaar  " To exercise the push/pop file functionality in quickfix, the test files
1077391b1dd0SBram Moolenaar  " need to be created.
1078391b1dd0SBram Moolenaar  call writefile(['Line1'], 'Xtestfile1')
1079391b1dd0SBram Moolenaar  call writefile(['Line2'], 'Xtestfile2')
1080391b1dd0SBram Moolenaar  call writefile(['Line3'], 'Xtestfile3')
1081361c8f0eSBram Moolenaar  cexpr ""
1082361c8f0eSBram Moolenaar  for l in lines
1083361c8f0eSBram Moolenaar      caddexpr l
1084361c8f0eSBram Moolenaar  endfor
1085049cba9eSBram Moolenaar  let l = getqflist()
1086ee85df37SBram Moolenaar  call assert_equal(12, len(l))
1087049cba9eSBram Moolenaar  call assert_equal(21, l[2].lnum)
1088049cba9eSBram Moolenaar  call assert_equal(2, l[2].col)
10890fcc7c6dSBram Moolenaar  call assert_equal('w', l[2].type)
10900fcc7c6dSBram Moolenaar  call assert_equal('e', l[3].type)
1091391b1dd0SBram Moolenaar  call delete('Xtestfile1')
1092391b1dd0SBram Moolenaar  call delete('Xtestfile2')
1093391b1dd0SBram Moolenaar  call delete('Xtestfile3')
10940fcc7c6dSBram Moolenaar
10950fcc7c6dSBram Moolenaar  " Tests for %E, %C and %Z format specifiers
10960fcc7c6dSBram Moolenaar  let lines = ["Error 275",
10970fcc7c6dSBram Moolenaar	      \ "line 42",
10980fcc7c6dSBram Moolenaar	      \ "column 3",
10990fcc7c6dSBram Moolenaar	      \ "' ' expected after '--'"
11000fcc7c6dSBram Moolenaar	      \]
11010fcc7c6dSBram Moolenaar  set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m
11020fcc7c6dSBram Moolenaar  cgetexpr lines
11030fcc7c6dSBram Moolenaar  let l = getqflist()
11040fcc7c6dSBram Moolenaar  call assert_equal(275, l[0].nr)
11050fcc7c6dSBram Moolenaar  call assert_equal(42, l[0].lnum)
11060fcc7c6dSBram Moolenaar  call assert_equal(3, l[0].col)
11070fcc7c6dSBram Moolenaar  call assert_equal('E', l[0].type)
11080fcc7c6dSBram Moolenaar  call assert_equal("\n' ' expected after '--'", l[0].text)
11090fcc7c6dSBram Moolenaar
11100fcc7c6dSBram Moolenaar  " Test for %>
11110fcc7c6dSBram Moolenaar  let lines = ["Error in line 147 of foo.c:",
11120fcc7c6dSBram Moolenaar	      \"unknown variable 'i'"
11130fcc7c6dSBram Moolenaar	      \]
11140fcc7c6dSBram Moolenaar  set efm=unknown\ variable\ %m,%E%>Error\ in\ line\ %l\ of\ %f:,%Z%m
11150fcc7c6dSBram Moolenaar  cgetexpr lines
11160fcc7c6dSBram Moolenaar  let l = getqflist()
11170fcc7c6dSBram Moolenaar  call assert_equal(147, l[0].lnum)
11180fcc7c6dSBram Moolenaar  call assert_equal('E', l[0].type)
11190fcc7c6dSBram Moolenaar  call assert_equal("\nunknown variable 'i'", l[0].text)
1120049cba9eSBram Moolenaar
1121e87e6dddSBram Moolenaar  " Test for %A, %C and other formats
1122e87e6dddSBram Moolenaar  let lines = [
1123e87e6dddSBram Moolenaar	  \"==============================================================",
1124e87e6dddSBram Moolenaar	  \"FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest)",
1125e87e6dddSBram Moolenaar	  \"--------------------------------------------------------------",
1126e87e6dddSBram Moolenaar	  \"Traceback (most recent call last):",
1127e87e6dddSBram Moolenaar	  \'  File "unittests/dbfacadeTest.py", line 89, in testFoo',
1128e87e6dddSBram Moolenaar	  \"    self.assertEquals(34, dtid)",
1129e87e6dddSBram Moolenaar	  \'  File "/usr/lib/python2.2/unittest.py", line 286, in',
1130e87e6dddSBram Moolenaar	  \" failUnlessEqual",
1131e87e6dddSBram Moolenaar	  \"    raise self.failureException, \\",
1132e87e6dddSBram Moolenaar	  \"AssertionError: 34 != 33",
1133e87e6dddSBram Moolenaar	  \"",
1134e87e6dddSBram Moolenaar	  \"--------------------------------------------------------------",
1135e87e6dddSBram Moolenaar	  \"Ran 27 tests in 0.063s"
1136e87e6dddSBram Moolenaar	  \]
1137e87e6dddSBram Moolenaar  set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m
1138e87e6dddSBram Moolenaar  cgetexpr lines
1139e87e6dddSBram Moolenaar  let l = getqflist()
1140e87e6dddSBram Moolenaar  call assert_equal(8, len(l))
1141e87e6dddSBram Moolenaar  call assert_equal(89, l[4].lnum)
1142e87e6dddSBram Moolenaar  call assert_equal(1, l[4].valid)
1143e87e6dddSBram Moolenaar  call assert_equal('unittests/dbfacadeTest.py', bufname(l[4].bufnr))
1144e87e6dddSBram Moolenaar
114599895eacSBram Moolenaar  " The following sequence of commands used to crash Vim
114699895eacSBram Moolenaar  set efm=%W%m
114799895eacSBram Moolenaar  cgetexpr ['msg1']
114899895eacSBram Moolenaar  let l = getqflist()
114999895eacSBram Moolenaar  call assert_equal(1, len(l), string(l))
115099895eacSBram Moolenaar  call assert_equal('msg1', l[0].text)
115199895eacSBram Moolenaar  set efm=%C%m
115299895eacSBram Moolenaar  lexpr 'msg2'
115399895eacSBram Moolenaar  let l = getloclist(0)
115499895eacSBram Moolenaar  call assert_equal(1, len(l), string(l))
115599895eacSBram Moolenaar  call assert_equal('msg2', l[0].text)
115699895eacSBram Moolenaar  lopen
115799895eacSBram Moolenaar  call setqflist([], 'r')
115899895eacSBram Moolenaar  caddbuf
115999895eacSBram Moolenaar  let l = getqflist()
116099895eacSBram Moolenaar  call assert_equal(1, len(l), string(l))
116199895eacSBram Moolenaar  call assert_equal('|| msg2', l[0].text)
116299895eacSBram Moolenaar
116399895eacSBram Moolenaar  new | only
1164049cba9eSBram Moolenaar  let &efm = save_efm
11652b946c9fSBram Moolenaarendfunc
1166049cba9eSBram Moolenaar
11672b946c9fSBram Moolenaarfunc XquickfixChangedByAutocmd(cchar)
11683ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
1169ffec3c53SBram Moolenaar  if a:cchar == 'c'
1170ffec3c53SBram Moolenaar    let ErrorNr = 'E925'
11712b946c9fSBram Moolenaar    func! ReadFunc()
1172ffec3c53SBram Moolenaar      colder
1173ffec3c53SBram Moolenaar      cgetexpr []
1174ffec3c53SBram Moolenaar    endfunc
1175ffec3c53SBram Moolenaar  else
1176ffec3c53SBram Moolenaar    let ErrorNr = 'E926'
11772b946c9fSBram Moolenaar    func! ReadFunc()
1178ffec3c53SBram Moolenaar      lolder
1179ffec3c53SBram Moolenaar      lgetexpr []
1180ffec3c53SBram Moolenaar    endfunc
1181ffec3c53SBram Moolenaar  endif
1182ffec3c53SBram Moolenaar
1183ffec3c53SBram Moolenaar  augroup testgroup
1184ffec3c53SBram Moolenaar    au!
1185d106e5baSBram Moolenaar    autocmd BufReadCmd test_changed.txt call ReadFunc()
1186ffec3c53SBram Moolenaar  augroup END
1187ffec3c53SBram Moolenaar
1188d106e5baSBram Moolenaar  new | only
1189ffec3c53SBram Moolenaar  let words = [ "a", "b" ]
1190ffec3c53SBram Moolenaar  let qflist = []
1191ffec3c53SBram Moolenaar  for word in words
1192d106e5baSBram Moolenaar    call add(qflist, {'filename': 'test_changed.txt'})
11933ef5bf7dSBram Moolenaar    call g:Xsetlist(qflist, ' ')
1194ffec3c53SBram Moolenaar  endfor
11953ef5bf7dSBram Moolenaar  call assert_fails('Xrewind', ErrorNr . ':')
1196ffec3c53SBram Moolenaar
1197ffec3c53SBram Moolenaar  augroup! testgroup
1198ffec3c53SBram Moolenaarendfunc
1199ffec3c53SBram Moolenaar
12002b946c9fSBram Moolenaarfunc Test_quickfix_was_changed_by_autocmd()
1201ffec3c53SBram Moolenaar  call XquickfixChangedByAutocmd('c')
1202ffec3c53SBram Moolenaar  call XquickfixChangedByAutocmd('l')
12032b946c9fSBram Moolenaarendfunc
12048b20179cSBram Moolenaar
12058b20179cSBram Moolenaarfunc Test_caddbuffer_to_empty()
12068b20179cSBram Moolenaar  helpgr quickfix
12078b20179cSBram Moolenaar  call setqflist([], 'r')
12088b20179cSBram Moolenaar  cad
1209f68f1d70SBram Moolenaar  try
1210f68f1d70SBram Moolenaar    cn
1211f68f1d70SBram Moolenaar  catch
1212f68f1d70SBram Moolenaar    " number of matches is unknown
1213f68f1d70SBram Moolenaar    call assert_true(v:exception =~ 'E553:')
1214f68f1d70SBram Moolenaar  endtry
12158b20179cSBram Moolenaar  quit!
12168b20179cSBram Moolenaarendfunc
121789c64d55SBram Moolenaar
121889c64d55SBram Moolenaarfunc Test_cgetexpr_works()
121989c64d55SBram Moolenaar  " this must not crash Vim
122089c64d55SBram Moolenaar  cgetexpr [$x]
12213ef5bf7dSBram Moolenaar  lgetexpr [$x]
122289c64d55SBram Moolenaarendfunc
1223c1808d58SBram Moolenaar
1224c1808d58SBram Moolenaar" Tests for the setqflist() and setloclist() functions
12252b946c9fSBram Moolenaarfunc SetXlistTests(cchar, bnum)
12263ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
1227c1808d58SBram Moolenaar
12283ef5bf7dSBram Moolenaar  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 1},
1229c1808d58SBram Moolenaar	      \  {'bufnr': a:bnum, 'lnum': 2}])
12303ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
1231c1808d58SBram Moolenaar  call assert_equal(2, len(l))
1232c1808d58SBram Moolenaar  call assert_equal(2, l[1].lnum)
1233c1808d58SBram Moolenaar
12343ef5bf7dSBram Moolenaar  Xnext
12353ef5bf7dSBram Moolenaar  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3}], 'a')
12363ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
1237c1808d58SBram Moolenaar  call assert_equal(3, len(l))
12383ef5bf7dSBram Moolenaar  Xnext
1239c1808d58SBram Moolenaar  call assert_equal(3, line('.'))
1240c1808d58SBram Moolenaar
12412b2b8ae5SBram Moolenaar  " Appending entries to the list should not change the cursor position
12422b2b8ae5SBram Moolenaar  " in the quickfix window
12433ef5bf7dSBram Moolenaar  Xwindow
12442b2b8ae5SBram Moolenaar  1
12453ef5bf7dSBram Moolenaar  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 4},
12462b2b8ae5SBram Moolenaar	      \  {'bufnr': a:bnum, 'lnum': 5}], 'a')
12472b2b8ae5SBram Moolenaar  call assert_equal(1, line('.'))
12482b2b8ae5SBram Moolenaar  close
12492b2b8ae5SBram Moolenaar
12503ef5bf7dSBram Moolenaar  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3},
1251c1808d58SBram Moolenaar	      \  {'bufnr': a:bnum, 'lnum': 4},
1252c1808d58SBram Moolenaar	      \  {'bufnr': a:bnum, 'lnum': 5}], 'r')
12533ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
1254c1808d58SBram Moolenaar  call assert_equal(3, len(l))
1255c1808d58SBram Moolenaar  call assert_equal(5, l[2].lnum)
1256c1808d58SBram Moolenaar
12573ef5bf7dSBram Moolenaar  call g:Xsetlist([])
12583ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
1259c1808d58SBram Moolenaar  call assert_equal(0, len(l))
1260ee85df37SBram Moolenaar
1261f1d21c8cSBram Moolenaar  " Tests for setting the 'valid' flag
1262f1d21c8cSBram Moolenaar  call g:Xsetlist([{'bufnr':a:bnum, 'lnum':4, 'valid':0}])
1263f1d21c8cSBram Moolenaar  Xwindow
1264f1d21c8cSBram Moolenaar  call assert_equal(1, winnr('$'))
1265f1d21c8cSBram Moolenaar  let l = g:Xgetlist()
1266f1d21c8cSBram Moolenaar  call g:Xsetlist(l)
1267f1d21c8cSBram Moolenaar  call assert_equal(0, g:Xgetlist()[0].valid)
1268f1d21c8cSBram Moolenaar  call g:Xsetlist([{'text':'Text1', 'valid':1}])
1269f1d21c8cSBram Moolenaar  Xwindow
1270f1d21c8cSBram Moolenaar  call assert_equal(2, winnr('$'))
1271f1d21c8cSBram Moolenaar  Xclose
1272f1d21c8cSBram Moolenaar  let save_efm = &efm
1273f1d21c8cSBram Moolenaar  set efm=%m
1274f1d21c8cSBram Moolenaar  Xgetexpr 'TestMessage'
1275f1d21c8cSBram Moolenaar  let l = g:Xgetlist()
1276f1d21c8cSBram Moolenaar  call g:Xsetlist(l)
1277f1d21c8cSBram Moolenaar  call assert_equal(1, g:Xgetlist()[0].valid)
1278f1d21c8cSBram Moolenaar  let &efm = save_efm
1279f1d21c8cSBram Moolenaar
1280ee85df37SBram Moolenaar  " Error cases:
1281ee85df37SBram Moolenaar  " Refer to a non-existing buffer and pass a non-dictionary type
1282ee85df37SBram Moolenaar  call assert_fails("call g:Xsetlist([{'bufnr':998, 'lnum':4}," .
1283ee85df37SBram Moolenaar	      \ " {'bufnr':999, 'lnum':5}])", 'E92:')
1284ee85df37SBram Moolenaar  call g:Xsetlist([[1, 2,3]])
1285ee85df37SBram Moolenaar  call assert_equal(0, len(g:Xgetlist()))
12862b946c9fSBram Moolenaarendfunc
1287c1808d58SBram Moolenaar
12882b946c9fSBram Moolenaarfunc Test_setqflist()
1289c1808d58SBram Moolenaar  new Xtestfile | only
1290c1808d58SBram Moolenaar  let bnum = bufnr('%')
1291c1808d58SBram Moolenaar  call setline(1, range(1,5))
1292c1808d58SBram Moolenaar
1293c1808d58SBram Moolenaar  call SetXlistTests('c', bnum)
1294c1808d58SBram Moolenaar  call SetXlistTests('l', bnum)
1295c1808d58SBram Moolenaar
12961cee693bSBram Moolenaar  enew!
1297c1808d58SBram Moolenaar  call delete('Xtestfile')
12982b946c9fSBram Moolenaarendfunc
1299d106e5baSBram Moolenaar
13002b946c9fSBram Moolenaarfunc Xlist_empty_middle(cchar)
13013ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
13023ef5bf7dSBram Moolenaar
13031cee693bSBram Moolenaar  " create three quickfix lists
1304ee85df37SBram Moolenaar  let @/ = 'Test_'
1305ee85df37SBram Moolenaar  Xvimgrep // test_quickfix.vim
13063ef5bf7dSBram Moolenaar  let testlen = len(g:Xgetlist())
13071cee693bSBram Moolenaar  call assert_true(testlen > 0)
13083ef5bf7dSBram Moolenaar  Xvimgrep empty test_quickfix.vim
13093ef5bf7dSBram Moolenaar  call assert_true(len(g:Xgetlist()) > 0)
13103ef5bf7dSBram Moolenaar  Xvimgrep matches test_quickfix.vim
13113ef5bf7dSBram Moolenaar  let matchlen = len(g:Xgetlist())
13121cee693bSBram Moolenaar  call assert_true(matchlen > 0)
13133ef5bf7dSBram Moolenaar  Xolder
13141cee693bSBram Moolenaar  " make the middle list empty
13153ef5bf7dSBram Moolenaar  call g:Xsetlist([], 'r')
13163ef5bf7dSBram Moolenaar  call assert_true(len(g:Xgetlist()) == 0)
13173ef5bf7dSBram Moolenaar  Xolder
13183ef5bf7dSBram Moolenaar  call assert_equal(testlen, len(g:Xgetlist()))
13193ef5bf7dSBram Moolenaar  Xnewer
13203ef5bf7dSBram Moolenaar  Xnewer
13213ef5bf7dSBram Moolenaar  call assert_equal(matchlen, len(g:Xgetlist()))
13221cee693bSBram Moolenaarendfunc
13231cee693bSBram Moolenaar
13242b946c9fSBram Moolenaarfunc Test_setqflist_empty_middle()
13253ef5bf7dSBram Moolenaar  call Xlist_empty_middle('c')
13263ef5bf7dSBram Moolenaar  call Xlist_empty_middle('l')
13272b946c9fSBram Moolenaarendfunc
13283ef5bf7dSBram Moolenaar
13292b946c9fSBram Moolenaarfunc Xlist_empty_older(cchar)
13303ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
13313ef5bf7dSBram Moolenaar
13321cee693bSBram Moolenaar  " create three quickfix lists
13333ef5bf7dSBram Moolenaar  Xvimgrep one test_quickfix.vim
13343ef5bf7dSBram Moolenaar  let onelen = len(g:Xgetlist())
13351cee693bSBram Moolenaar  call assert_true(onelen > 0)
13363ef5bf7dSBram Moolenaar  Xvimgrep two test_quickfix.vim
13373ef5bf7dSBram Moolenaar  let twolen = len(g:Xgetlist())
13381cee693bSBram Moolenaar  call assert_true(twolen > 0)
13393ef5bf7dSBram Moolenaar  Xvimgrep three test_quickfix.vim
13403ef5bf7dSBram Moolenaar  let threelen = len(g:Xgetlist())
13411cee693bSBram Moolenaar  call assert_true(threelen > 0)
13423ef5bf7dSBram Moolenaar  Xolder 2
13431cee693bSBram Moolenaar  " make the first list empty, check the others didn't change
13443ef5bf7dSBram Moolenaar  call g:Xsetlist([], 'r')
13453ef5bf7dSBram Moolenaar  call assert_true(len(g:Xgetlist()) == 0)
13463ef5bf7dSBram Moolenaar  Xnewer
13473ef5bf7dSBram Moolenaar  call assert_equal(twolen, len(g:Xgetlist()))
13483ef5bf7dSBram Moolenaar  Xnewer
13493ef5bf7dSBram Moolenaar  call assert_equal(threelen, len(g:Xgetlist()))
13502b946c9fSBram Moolenaarendfunc
13513ef5bf7dSBram Moolenaar
13522b946c9fSBram Moolenaarfunc Test_setqflist_empty_older()
13533ef5bf7dSBram Moolenaar  call Xlist_empty_older('c')
13543ef5bf7dSBram Moolenaar  call Xlist_empty_older('l')
13552b946c9fSBram Moolenaarendfunc
13561cee693bSBram Moolenaar
13572b946c9fSBram Moolenaarfunc XquickfixSetListWithAct(cchar)
13583ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
13593ef5bf7dSBram Moolenaar
1360d106e5baSBram Moolenaar  let list1 = [{'filename': 'fnameA', 'text': 'A'},
1361d106e5baSBram Moolenaar          \    {'filename': 'fnameB', 'text': 'B'}]
1362d106e5baSBram Moolenaar  let list2 = [{'filename': 'fnameC', 'text': 'C'},
1363d106e5baSBram Moolenaar          \    {'filename': 'fnameD', 'text': 'D'},
1364d106e5baSBram Moolenaar          \    {'filename': 'fnameE', 'text': 'E'}]
1365d106e5baSBram Moolenaar
1366d106e5baSBram Moolenaar  " {action} is unspecified.  Same as specifing ' '.
1367d106e5baSBram Moolenaar  new | only
13683ef5bf7dSBram Moolenaar  silent! Xnewer 99
13693ef5bf7dSBram Moolenaar  call g:Xsetlist(list1)
13703ef5bf7dSBram Moolenaar  call g:Xsetlist(list2)
13713ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1372d106e5baSBram Moolenaar  call assert_equal(3, len(li))
1373d106e5baSBram Moolenaar  call assert_equal('C', li[0]['text'])
1374d106e5baSBram Moolenaar  call assert_equal('D', li[1]['text'])
1375d106e5baSBram Moolenaar  call assert_equal('E', li[2]['text'])
13763ef5bf7dSBram Moolenaar  silent! Xolder
13773ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1378d106e5baSBram Moolenaar  call assert_equal(2, len(li))
1379d106e5baSBram Moolenaar  call assert_equal('A', li[0]['text'])
1380d106e5baSBram Moolenaar  call assert_equal('B', li[1]['text'])
1381d106e5baSBram Moolenaar
1382d106e5baSBram Moolenaar  " {action} is specified ' '.
1383d106e5baSBram Moolenaar  new | only
13843ef5bf7dSBram Moolenaar  silent! Xnewer 99
13853ef5bf7dSBram Moolenaar  call g:Xsetlist(list1)
13863ef5bf7dSBram Moolenaar  call g:Xsetlist(list2, ' ')
13873ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1388d106e5baSBram Moolenaar  call assert_equal(3, len(li))
1389d106e5baSBram Moolenaar  call assert_equal('C', li[0]['text'])
1390d106e5baSBram Moolenaar  call assert_equal('D', li[1]['text'])
1391d106e5baSBram Moolenaar  call assert_equal('E', li[2]['text'])
13923ef5bf7dSBram Moolenaar  silent! Xolder
13933ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1394d106e5baSBram Moolenaar  call assert_equal(2, len(li))
1395d106e5baSBram Moolenaar  call assert_equal('A', li[0]['text'])
1396d106e5baSBram Moolenaar  call assert_equal('B', li[1]['text'])
1397d106e5baSBram Moolenaar
1398d106e5baSBram Moolenaar  " {action} is specified 'a'.
1399d106e5baSBram Moolenaar  new | only
14003ef5bf7dSBram Moolenaar  silent! Xnewer 99
14013ef5bf7dSBram Moolenaar  call g:Xsetlist(list1)
14023ef5bf7dSBram Moolenaar  call g:Xsetlist(list2, 'a')
14033ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1404d106e5baSBram Moolenaar  call assert_equal(5, len(li))
1405d106e5baSBram Moolenaar  call assert_equal('A', li[0]['text'])
1406d106e5baSBram Moolenaar  call assert_equal('B', li[1]['text'])
1407d106e5baSBram Moolenaar  call assert_equal('C', li[2]['text'])
1408d106e5baSBram Moolenaar  call assert_equal('D', li[3]['text'])
1409d106e5baSBram Moolenaar  call assert_equal('E', li[4]['text'])
1410d106e5baSBram Moolenaar
1411d106e5baSBram Moolenaar  " {action} is specified 'r'.
1412d106e5baSBram Moolenaar  new | only
14133ef5bf7dSBram Moolenaar  silent! Xnewer 99
14143ef5bf7dSBram Moolenaar  call g:Xsetlist(list1)
14153ef5bf7dSBram Moolenaar  call g:Xsetlist(list2, 'r')
14163ef5bf7dSBram Moolenaar  let li = g:Xgetlist()
1417d106e5baSBram Moolenaar  call assert_equal(3, len(li))
1418d106e5baSBram Moolenaar  call assert_equal('C', li[0]['text'])
1419d106e5baSBram Moolenaar  call assert_equal('D', li[1]['text'])
1420d106e5baSBram Moolenaar  call assert_equal('E', li[2]['text'])
1421d106e5baSBram Moolenaar
1422d106e5baSBram Moolenaar  " Test for wrong value.
1423d106e5baSBram Moolenaar  new | only
14243ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(0)", 'E714:')
14253ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(list1, '')", 'E927:')
14263ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(list1, 'aa')", 'E927:')
14273ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(list1, ' a')", 'E927:')
14283ef5bf7dSBram Moolenaar  call assert_fails("call g:Xsetlist(list1, 0)", 'E928:')
1429d106e5baSBram Moolenaarendfunc
1430d106e5baSBram Moolenaar
1431a0ca7d00SBram Moolenaarfunc Test_setqflist_invalid_nr()
1432a0ca7d00SBram Moolenaar  " The following command used to crash Vim
1433a0ca7d00SBram Moolenaar  call setqflist([], ' ', {'nr' : $XXX_DOES_NOT_EXIST})
1434a0ca7d00SBram Moolenaarendfunc
1435a0ca7d00SBram Moolenaar
14362b946c9fSBram Moolenaarfunc Test_quickfix_set_list_with_act()
1437d106e5baSBram Moolenaar  call XquickfixSetListWithAct('c')
1438d106e5baSBram Moolenaar  call XquickfixSetListWithAct('l')
14392b946c9fSBram Moolenaarendfunc
14406be8c8e1SBram Moolenaar
14412b946c9fSBram Moolenaarfunc XLongLinesTests(cchar)
14423ef5bf7dSBram Moolenaar  let l = g:Xgetlist()
14436be8c8e1SBram Moolenaar
1444049cba9eSBram Moolenaar  call assert_equal(4, len(l))
14456be8c8e1SBram Moolenaar  call assert_equal(1, l[0].lnum)
14466be8c8e1SBram Moolenaar  call assert_equal(1, l[0].col)
1447049cba9eSBram Moolenaar  call assert_equal(1975, len(l[0].text))
14486be8c8e1SBram Moolenaar  call assert_equal(2, l[1].lnum)
14496be8c8e1SBram Moolenaar  call assert_equal(1, l[1].col)
14506be8c8e1SBram Moolenaar  call assert_equal(4070, len(l[1].text))
14516be8c8e1SBram Moolenaar  call assert_equal(3, l[2].lnum)
14526be8c8e1SBram Moolenaar  call assert_equal(1, l[2].col)
1453049cba9eSBram Moolenaar  call assert_equal(4070, len(l[2].text))
1454049cba9eSBram Moolenaar  call assert_equal(4, l[3].lnum)
1455049cba9eSBram Moolenaar  call assert_equal(1, l[3].col)
1456049cba9eSBram Moolenaar  call assert_equal(10, len(l[3].text))
14576be8c8e1SBram Moolenaar
14583ef5bf7dSBram Moolenaar  call g:Xsetlist([], 'r')
14592b946c9fSBram Moolenaarendfunc
14606be8c8e1SBram Moolenaar
14612b946c9fSBram Moolenaarfunc s:long_lines_tests(cchar)
14623ef5bf7dSBram Moolenaar  call s:setup_commands(a:cchar)
14633ef5bf7dSBram Moolenaar
14646be8c8e1SBram Moolenaar  let testfile = 'samples/quickfix.txt'
14656be8c8e1SBram Moolenaar
14666be8c8e1SBram Moolenaar  " file
14673ef5bf7dSBram Moolenaar  exe 'Xgetfile' testfile
14683ef5bf7dSBram Moolenaar  call XLongLinesTests(a:cchar)
14696be8c8e1SBram Moolenaar
14706be8c8e1SBram Moolenaar  " list
14713ef5bf7dSBram Moolenaar  Xexpr readfile(testfile)
14723ef5bf7dSBram Moolenaar  call XLongLinesTests(a:cchar)
14736be8c8e1SBram Moolenaar
14746be8c8e1SBram Moolenaar  " string
14753ef5bf7dSBram Moolenaar  Xexpr join(readfile(testfile), "\n")
14763ef5bf7dSBram Moolenaar  call XLongLinesTests(a:cchar)
14776be8c8e1SBram Moolenaar
14786be8c8e1SBram Moolenaar  " buffer
14793ef5bf7dSBram Moolenaar  exe 'edit' testfile
14803ef5bf7dSBram Moolenaar  exe 'Xbuffer' bufnr('%')
1481f50df392SBram Moolenaar  call XLongLinesTests(a:cchar)
14822b946c9fSBram Moolenaarendfunc
14833ef5bf7dSBram Moolenaar
14842b946c9fSBram Moolenaarfunc Test_long_lines()
14853ef5bf7dSBram Moolenaar  call s:long_lines_tests('c')
14863ef5bf7dSBram Moolenaar  call s:long_lines_tests('l')
14872b946c9fSBram Moolenaarendfunc
1488049cba9eSBram Moolenaar
14892b946c9fSBram Moolenaarfunc s:create_test_file(filename)
1490049cba9eSBram Moolenaar  let l = []
1491049cba9eSBram Moolenaar  for i in range(1, 20)
1492049cba9eSBram Moolenaar      call add(l, 'Line' . i)
1493049cba9eSBram Moolenaar  endfor
1494049cba9eSBram Moolenaar  call writefile(l, a:filename)
14952b946c9fSBram Moolenaarendfunc
1496049cba9eSBram Moolenaar
14972b946c9fSBram Moolenaarfunc Test_switchbuf()
1498049cba9eSBram Moolenaar  call s:create_test_file('Xqftestfile1')
1499049cba9eSBram Moolenaar  call s:create_test_file('Xqftestfile2')
1500049cba9eSBram Moolenaar  call s:create_test_file('Xqftestfile3')
1501049cba9eSBram Moolenaar
1502049cba9eSBram Moolenaar  new | only
1503049cba9eSBram Moolenaar  edit Xqftestfile1
1504049cba9eSBram Moolenaar  let file1_winid = win_getid()
1505049cba9eSBram Moolenaar  new Xqftestfile2
1506049cba9eSBram Moolenaar  let file2_winid = win_getid()
1507049cba9eSBram Moolenaar  cgetexpr ['Xqftestfile1:5:Line5',
1508049cba9eSBram Moolenaar		\ 'Xqftestfile1:6:Line6',
1509049cba9eSBram Moolenaar		\ 'Xqftestfile2:10:Line10',
1510049cba9eSBram Moolenaar		\ 'Xqftestfile2:11:Line11',
1511049cba9eSBram Moolenaar		\ 'Xqftestfile3:15:Line15',
1512049cba9eSBram Moolenaar		\ 'Xqftestfile3:16:Line16']
1513049cba9eSBram Moolenaar
1514049cba9eSBram Moolenaar  new
1515049cba9eSBram Moolenaar  let winid = win_getid()
1516049cba9eSBram Moolenaar  cfirst | cnext
1517049cba9eSBram Moolenaar  call assert_equal(winid, win_getid())
151899895eacSBram Moolenaar  2cnext
1519049cba9eSBram Moolenaar  call assert_equal(winid, win_getid())
152099895eacSBram Moolenaar  2cnext
1521049cba9eSBram Moolenaar  call assert_equal(winid, win_getid())
1522049cba9eSBram Moolenaar  enew
1523049cba9eSBram Moolenaar
1524049cba9eSBram Moolenaar  set switchbuf=useopen
1525049cba9eSBram Moolenaar  cfirst | cnext
1526049cba9eSBram Moolenaar  call assert_equal(file1_winid, win_getid())
152799895eacSBram Moolenaar  2cnext
1528049cba9eSBram Moolenaar  call assert_equal(file2_winid, win_getid())
152999895eacSBram Moolenaar  2cnext
1530049cba9eSBram Moolenaar  call assert_equal(file2_winid, win_getid())
1531049cba9eSBram Moolenaar
1532049cba9eSBram Moolenaar  enew | only
1533049cba9eSBram Moolenaar  set switchbuf=usetab
1534049cba9eSBram Moolenaar  tabedit Xqftestfile1
1535049cba9eSBram Moolenaar  tabedit Xqftestfile2
153674240d3fSBram Moolenaar  tabedit Xqftestfile3
1537049cba9eSBram Moolenaar  tabfirst
1538049cba9eSBram Moolenaar  cfirst | cnext
1539049cba9eSBram Moolenaar  call assert_equal(2, tabpagenr())
154099895eacSBram Moolenaar  2cnext
1541049cba9eSBram Moolenaar  call assert_equal(3, tabpagenr())
154274240d3fSBram Moolenaar  6cnext
154374240d3fSBram Moolenaar  call assert_equal(4, tabpagenr())
154474240d3fSBram Moolenaar  2cpfile
154574240d3fSBram Moolenaar  call assert_equal(2, tabpagenr())
154674240d3fSBram Moolenaar  2cnfile
154774240d3fSBram Moolenaar  call assert_equal(4, tabpagenr())
1548049cba9eSBram Moolenaar  tabfirst | tabonly | enew
1549049cba9eSBram Moolenaar
1550049cba9eSBram Moolenaar  set switchbuf=split
1551049cba9eSBram Moolenaar  cfirst | cnext
1552049cba9eSBram Moolenaar  call assert_equal(1, winnr('$'))
1553049cba9eSBram Moolenaar  cnext | cnext
1554049cba9eSBram Moolenaar  call assert_equal(2, winnr('$'))
1555049cba9eSBram Moolenaar  cnext | cnext
1556049cba9eSBram Moolenaar  call assert_equal(3, winnr('$'))
1557049cba9eSBram Moolenaar  enew | only
1558049cba9eSBram Moolenaar
1559049cba9eSBram Moolenaar  set switchbuf=newtab
1560049cba9eSBram Moolenaar  cfirst | cnext
1561049cba9eSBram Moolenaar  call assert_equal(1, tabpagenr('$'))
1562049cba9eSBram Moolenaar  cnext | cnext
1563049cba9eSBram Moolenaar  call assert_equal(2, tabpagenr('$'))
1564049cba9eSBram Moolenaar  cnext | cnext
1565049cba9eSBram Moolenaar  call assert_equal(3, tabpagenr('$'))
1566049cba9eSBram Moolenaar  tabfirst | enew | tabonly | only
1567049cba9eSBram Moolenaar
1568049cba9eSBram Moolenaar  set switchbuf=
1569049cba9eSBram Moolenaar  edit Xqftestfile1
1570049cba9eSBram Moolenaar  let file1_winid = win_getid()
1571049cba9eSBram Moolenaar  new Xqftestfile2
1572049cba9eSBram Moolenaar  let file2_winid = win_getid()
1573049cba9eSBram Moolenaar  copen
1574049cba9eSBram Moolenaar  exe "normal 1G\<CR>"
1575049cba9eSBram Moolenaar  call assert_equal(file1_winid, win_getid())
1576049cba9eSBram Moolenaar  copen
1577049cba9eSBram Moolenaar  exe "normal 3G\<CR>"
1578049cba9eSBram Moolenaar  call assert_equal(file2_winid, win_getid())
1579049cba9eSBram Moolenaar  copen | only
1580049cba9eSBram Moolenaar  exe "normal 5G\<CR>"
1581049cba9eSBram Moolenaar  call assert_equal(2, winnr('$'))
1582049cba9eSBram Moolenaar  call assert_equal(1, bufwinnr('Xqftestfile3'))
1583049cba9eSBram Moolenaar
1584391b1dd0SBram Moolenaar  " If only quickfix window is open in the current tabpage, jumping to an
1585391b1dd0SBram Moolenaar  " entry with 'switchubf' set to 'usetab' should search in other tabpages.
1586049cba9eSBram Moolenaar  enew | only
1587391b1dd0SBram Moolenaar  set switchbuf=usetab
1588391b1dd0SBram Moolenaar  tabedit Xqftestfile1
1589391b1dd0SBram Moolenaar  tabedit Xqftestfile2
1590391b1dd0SBram Moolenaar  tabedit Xqftestfile3
1591391b1dd0SBram Moolenaar  tabfirst
1592391b1dd0SBram Moolenaar  copen | only
1593391b1dd0SBram Moolenaar  clast
1594391b1dd0SBram Moolenaar  call assert_equal(4, tabpagenr())
1595391b1dd0SBram Moolenaar  tabfirst | tabonly | enew | only
1596049cba9eSBram Moolenaar
1597049cba9eSBram Moolenaar  call delete('Xqftestfile1')
1598049cba9eSBram Moolenaar  call delete('Xqftestfile2')
1599049cba9eSBram Moolenaar  call delete('Xqftestfile3')
1600391b1dd0SBram Moolenaar  set switchbuf&vim
1601391b1dd0SBram Moolenaar
1602391b1dd0SBram Moolenaar  enew | only
16032b946c9fSBram Moolenaarendfunc
1604049cba9eSBram Moolenaar
16052b946c9fSBram Moolenaarfunc Xadjust_qflnum(cchar)
1606049cba9eSBram Moolenaar  call s:setup_commands(a:cchar)
1607049cba9eSBram Moolenaar
1608049cba9eSBram Moolenaar  enew | only
1609049cba9eSBram Moolenaar
1610c1542744SBram Moolenaar  let fname = 'Xqftestfile' . a:cchar
1611c1542744SBram Moolenaar  call s:create_test_file(fname)
1612c1542744SBram Moolenaar  exe 'edit ' . fname
1613049cba9eSBram Moolenaar
1614c1542744SBram Moolenaar  Xgetexpr [fname . ':5:Line5',
1615c1542744SBram Moolenaar	      \ fname . ':10:Line10',
1616c1542744SBram Moolenaar	      \ fname . ':15:Line15',
1617c1542744SBram Moolenaar	      \ fname . ':20:Line20']
1618049cba9eSBram Moolenaar
1619049cba9eSBram Moolenaar  6,14delete
1620049cba9eSBram Moolenaar  call append(6, ['Buffer', 'Window'])
1621049cba9eSBram Moolenaar
1622049cba9eSBram Moolenaar  let l = g:Xgetlist()
1623049cba9eSBram Moolenaar
1624049cba9eSBram Moolenaar  call assert_equal(5, l[0].lnum)
1625049cba9eSBram Moolenaar  call assert_equal(6, l[2].lnum)
1626049cba9eSBram Moolenaar  call assert_equal(13, l[3].lnum)
1627049cba9eSBram Moolenaar
1628049cba9eSBram Moolenaar  enew!
1629c1542744SBram Moolenaar  call delete(fname)
16302b946c9fSBram Moolenaarendfunc
1631049cba9eSBram Moolenaar
16322b946c9fSBram Moolenaarfunc Test_adjust_lnum()
1633c1542744SBram Moolenaar  call setloclist(0, [])
1634049cba9eSBram Moolenaar  call Xadjust_qflnum('c')
1635c1542744SBram Moolenaar  call setqflist([])
1636049cba9eSBram Moolenaar  call Xadjust_qflnum('l')
16372b946c9fSBram Moolenaarendfunc
1638049cba9eSBram Moolenaar
1639049cba9eSBram Moolenaar" Tests for the :grep/:lgrep and :grepadd/:lgrepadd commands
16402b946c9fSBram Moolenaarfunc s:test_xgrep(cchar)
1641049cba9eSBram Moolenaar  call s:setup_commands(a:cchar)
1642049cba9eSBram Moolenaar
1643049cba9eSBram Moolenaar  " The following lines are used for the grep test. Don't remove.
1644049cba9eSBram Moolenaar  " Grep_Test_Text: Match 1
1645049cba9eSBram Moolenaar  " Grep_Test_Text: Match 2
1646049cba9eSBram Moolenaar  " GrepAdd_Test_Text: Match 1
1647049cba9eSBram Moolenaar  " GrepAdd_Test_Text: Match 2
1648049cba9eSBram Moolenaar  enew! | only
1649049cba9eSBram Moolenaar  set makeef&vim
1650049cba9eSBram Moolenaar  silent Xgrep Grep_Test_Text: test_quickfix.vim
1651049cba9eSBram Moolenaar  call assert_true(len(g:Xgetlist()) == 3)
1652049cba9eSBram Moolenaar  Xopen
1653049cba9eSBram Moolenaar  call assert_true(w:quickfix_title =~ '^:grep')
1654049cba9eSBram Moolenaar  Xclose
1655049cba9eSBram Moolenaar  enew
1656049cba9eSBram Moolenaar  set makeef=Temp_File_##
1657049cba9eSBram Moolenaar  silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
1658049cba9eSBram Moolenaar  call assert_true(len(g:Xgetlist()) == 6)
16592b946c9fSBram Moolenaarendfunc
1660049cba9eSBram Moolenaar
16612b946c9fSBram Moolenaarfunc Test_grep()
1662049cba9eSBram Moolenaar  if !has('unix')
1663049cba9eSBram Moolenaar    " The grepprg may not be set on non-Unix systems
1664049cba9eSBram Moolenaar    return
1665049cba9eSBram Moolenaar  endif
1666049cba9eSBram Moolenaar
1667049cba9eSBram Moolenaar  call s:test_xgrep('c')
1668049cba9eSBram Moolenaar  call s:test_xgrep('l')
16692b946c9fSBram Moolenaarendfunc
1670361c8f0eSBram Moolenaar
16712b946c9fSBram Moolenaarfunc Test_two_windows()
1672361c8f0eSBram Moolenaar  " Use one 'errorformat' for two windows.  Add an expression to each of them,
1673361c8f0eSBram Moolenaar  " make sure they each keep their own state.
1674361c8f0eSBram Moolenaar  set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
1675361c8f0eSBram Moolenaar  call mkdir('Xone/a', 'p')
1676361c8f0eSBram Moolenaar  call mkdir('Xtwo/a', 'p')
1677361c8f0eSBram Moolenaar  let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
1678361c8f0eSBram Moolenaar  call writefile(lines, 'Xone/a/one.txt')
1679361c8f0eSBram Moolenaar  call writefile(lines, 'Xtwo/a/two.txt')
1680361c8f0eSBram Moolenaar
1681361c8f0eSBram Moolenaar  new one
1682361c8f0eSBram Moolenaar  let one_id = win_getid()
1683361c8f0eSBram Moolenaar  lexpr ""
1684361c8f0eSBram Moolenaar  new two
1685361c8f0eSBram Moolenaar  let two_id = win_getid()
1686361c8f0eSBram Moolenaar  lexpr ""
1687361c8f0eSBram Moolenaar
1688361c8f0eSBram Moolenaar  laddexpr "Entering dir 'Xtwo/a'"
1689361c8f0eSBram Moolenaar  call win_gotoid(one_id)
1690361c8f0eSBram Moolenaar  laddexpr "Entering dir 'Xone/a'"
1691361c8f0eSBram Moolenaar  call win_gotoid(two_id)
1692361c8f0eSBram Moolenaar  laddexpr 'two.txt:5:two two two'
1693361c8f0eSBram Moolenaar  call win_gotoid(one_id)
1694361c8f0eSBram Moolenaar  laddexpr 'one.txt:3:one one one'
1695361c8f0eSBram Moolenaar
1696361c8f0eSBram Moolenaar  let loc_one = getloclist(one_id)
1697361c8f0eSBram Moolenaar  call assert_equal('Xone/a/one.txt', bufname(loc_one[1].bufnr))
1698361c8f0eSBram Moolenaar  call assert_equal(3, loc_one[1].lnum)
1699361c8f0eSBram Moolenaar
1700361c8f0eSBram Moolenaar  let loc_two = getloclist(two_id)
1701361c8f0eSBram Moolenaar  call assert_equal('Xtwo/a/two.txt', bufname(loc_two[1].bufnr))
1702361c8f0eSBram Moolenaar  call assert_equal(5, loc_two[1].lnum)
1703361c8f0eSBram Moolenaar
1704361c8f0eSBram Moolenaar  call win_gotoid(one_id)
1705361c8f0eSBram Moolenaar  bwipe!
1706361c8f0eSBram Moolenaar  call win_gotoid(two_id)
1707361c8f0eSBram Moolenaar  bwipe!
1708361c8f0eSBram Moolenaar  call delete('Xone', 'rf')
1709361c8f0eSBram Moolenaar  call delete('Xtwo', 'rf')
1710361c8f0eSBram Moolenaarendfunc
1711dcb17001SBram Moolenaar
17122b946c9fSBram Moolenaarfunc XbottomTests(cchar)
1713537ef084SBram Moolenaar  call s:setup_commands(a:cchar)
1714537ef084SBram Moolenaar
1715b6fa30ccSBram Moolenaar  " Calling lbottom without any errors should fail
1716b6fa30ccSBram Moolenaar  if a:cchar == 'l'
1717b6fa30ccSBram Moolenaar      call assert_fails('lbottom', 'E776:')
1718b6fa30ccSBram Moolenaar  endif
1719b6fa30ccSBram Moolenaar
1720537ef084SBram Moolenaar  call g:Xsetlist([{'filename': 'foo', 'lnum': 42}])
1721537ef084SBram Moolenaar  Xopen
1722dcb17001SBram Moolenaar  let wid = win_getid()
1723dcb17001SBram Moolenaar  call assert_equal(1, line('.'))
1724dcb17001SBram Moolenaar  wincmd w
1725537ef084SBram Moolenaar  call g:Xsetlist([{'filename': 'var', 'lnum': 24}], 'a')
1726537ef084SBram Moolenaar  Xbottom
1727dcb17001SBram Moolenaar  call win_gotoid(wid)
1728dcb17001SBram Moolenaar  call assert_equal(2, line('.'))
1729537ef084SBram Moolenaar  Xclose
1730dcb17001SBram Moolenaarendfunc
1731537ef084SBram Moolenaar
1732537ef084SBram Moolenaar" Tests for the :cbottom and :lbottom commands
17332b946c9fSBram Moolenaarfunc Test_cbottom()
1734537ef084SBram Moolenaar  call XbottomTests('c')
1735537ef084SBram Moolenaar  call XbottomTests('l')
17362b946c9fSBram Moolenaarendfunc
1737f6acffbeSBram Moolenaar
17382b946c9fSBram Moolenaarfunc HistoryTest(cchar)
1739f6acffbeSBram Moolenaar  call s:setup_commands(a:cchar)
1740f6acffbeSBram Moolenaar
1741f6acffbeSBram Moolenaar  " clear all lists after the first one, then replace the first one.
1742f6acffbeSBram Moolenaar  call g:Xsetlist([])
1743b6fa30ccSBram Moolenaar  call assert_fails('Xolder 99', 'E380:')
1744f6acffbeSBram Moolenaar  let entry = {'filename': 'foo', 'lnum': 42}
1745f6acffbeSBram Moolenaar  call g:Xsetlist([entry], 'r')
1746f6acffbeSBram Moolenaar  call g:Xsetlist([entry, entry])
1747f6acffbeSBram Moolenaar  call g:Xsetlist([entry, entry, entry])
1748f6acffbeSBram Moolenaar  let res = split(execute(a:cchar . 'hist'), "\n")
1749f6acffbeSBram Moolenaar  call assert_equal(3, len(res))
1750f6acffbeSBram Moolenaar  let common = 'errors     :set' . (a:cchar == 'c' ? 'qf' : 'loc') . 'list()'
1751f6acffbeSBram Moolenaar  call assert_equal('  error list 1 of 3; 1 ' . common, res[0])
1752f6acffbeSBram Moolenaar  call assert_equal('  error list 2 of 3; 2 ' . common, res[1])
1753f6acffbeSBram Moolenaar  call assert_equal('> error list 3 of 3; 3 ' . common, res[2])
1754b4d5fbabSBram Moolenaar
1755b4d5fbabSBram Moolenaar  call g:Xsetlist([], 'f')
1756b4d5fbabSBram Moolenaar  let l = split(execute(a:cchar . 'hist'), "\n")
1757b4d5fbabSBram Moolenaar  call assert_equal('No entries', l[0])
1758f6acffbeSBram Moolenaarendfunc
1759f6acffbeSBram Moolenaar
1760f6acffbeSBram Moolenaarfunc Test_history()
1761f6acffbeSBram Moolenaar  call HistoryTest('c')
1762f6acffbeSBram Moolenaar  call HistoryTest('l')
1763f6acffbeSBram Moolenaarendfunc
1764015102e9SBram Moolenaar
1765015102e9SBram Moolenaarfunc Test_duplicate_buf()
1766015102e9SBram Moolenaar  " make sure we can get the highest buffer number
1767015102e9SBram Moolenaar  edit DoesNotExist
1768015102e9SBram Moolenaar  edit DoesNotExist2
1769015102e9SBram Moolenaar  let last_buffer = bufnr("$")
1770015102e9SBram Moolenaar
1771015102e9SBram Moolenaar  " make sure only one buffer is created
1772015102e9SBram Moolenaar  call writefile(['this one', 'that one'], 'Xgrepthis')
1773015102e9SBram Moolenaar  vimgrep one Xgrepthis
1774015102e9SBram Moolenaar  vimgrep one Xgrepthis
1775015102e9SBram Moolenaar  call assert_equal(last_buffer + 1, bufnr("$"))
1776015102e9SBram Moolenaar
1777015102e9SBram Moolenaar  call delete('Xgrepthis')
1778015102e9SBram Moolenaarendfunc
1779d823fa91SBram Moolenaar
1780d823fa91SBram Moolenaar" Quickfix/Location list set/get properties tests
17812b946c9fSBram Moolenaarfunc Xproperty_tests(cchar)
1782d823fa91SBram Moolenaar    call s:setup_commands(a:cchar)
1783d823fa91SBram Moolenaar
1784d823fa91SBram Moolenaar    " Error cases
1785d823fa91SBram Moolenaar    call assert_fails('call g:Xgetlist(99)', 'E715:')
1786d823fa91SBram Moolenaar    call assert_fails('call g:Xsetlist(99)', 'E714:')
1787d823fa91SBram Moolenaar    call assert_fails('call g:Xsetlist([], "a", [])', 'E715:')
1788d823fa91SBram Moolenaar
1789d823fa91SBram Moolenaar    " Set and get the title
1790b6fa30ccSBram Moolenaar    call g:Xsetlist([])
1791d823fa91SBram Moolenaar    Xopen
1792d823fa91SBram Moolenaar    wincmd p
1793d823fa91SBram Moolenaar    call g:Xsetlist([{'filename':'foo', 'lnum':27}])
179486f100dcSBram Moolenaar    let s = g:Xsetlist([], 'a', {'title' : 'Sample'})
179586f100dcSBram Moolenaar    call assert_equal(0, s)
1796d823fa91SBram Moolenaar    let d = g:Xgetlist({"title":1})
1797d823fa91SBram Moolenaar    call assert_equal('Sample', d.title)
1798*a2aa8a2bSBram Moolenaar    " Try setting title to a non-string value
1799*a2aa8a2bSBram Moolenaar    call assert_equal(-1, g:Xsetlist([], 'a', {'title' : ['Test']}))
1800*a2aa8a2bSBram Moolenaar    call assert_equal('Sample', g:Xgetlist({"title":1}).title)
1801d823fa91SBram Moolenaar
1802d823fa91SBram Moolenaar    Xopen
1803d823fa91SBram Moolenaar    call assert_equal('Sample', w:quickfix_title)
1804d823fa91SBram Moolenaar    Xclose
1805d823fa91SBram Moolenaar
18062b529bb6SBram Moolenaar    " Tests for action argument
18072b529bb6SBram Moolenaar    silent! Xolder 999
18082b529bb6SBram Moolenaar    let qfnr = g:Xgetlist({'all':1}).nr
18092b529bb6SBram Moolenaar    call g:Xsetlist([], 'r', {'title' : 'N1'})
18102b529bb6SBram Moolenaar    call assert_equal('N1', g:Xgetlist({'all':1}).title)
18112b529bb6SBram Moolenaar    call g:Xsetlist([], ' ', {'title' : 'N2'})
18122b529bb6SBram Moolenaar    call assert_equal(qfnr + 1, g:Xgetlist({'all':1}).nr)
1813890680caSBram Moolenaar
1814890680caSBram Moolenaar    let res = g:Xgetlist({'nr': 0})
1815890680caSBram Moolenaar    call assert_equal(qfnr + 1, res.nr)
1816890680caSBram Moolenaar    call assert_equal(['nr'], keys(res))
1817890680caSBram Moolenaar
18182b529bb6SBram Moolenaar    call g:Xsetlist([], ' ', {'title' : 'N3'})
18192b529bb6SBram Moolenaar    call assert_equal('N2', g:Xgetlist({'nr':2, 'title':1}).title)
18202b529bb6SBram Moolenaar
1821ee85df37SBram Moolenaar    " Changing the title of an earlier quickfix list
182255b69264SBram Moolenaar    call g:Xsetlist([], 'r', {'title' : 'NewTitle', 'nr' : 2})
1823ee85df37SBram Moolenaar    call assert_equal('NewTitle', g:Xgetlist({'nr':2, 'title':1}).title)
1824ee85df37SBram Moolenaar
1825ee85df37SBram Moolenaar    " Changing the title of an invalid quickfix list
1826ee85df37SBram Moolenaar    call assert_equal(-1, g:Xsetlist([], ' ',
1827ee85df37SBram Moolenaar		\ {'title' : 'SomeTitle', 'nr' : 99}))
1828ee85df37SBram Moolenaar    call assert_equal(-1, g:Xsetlist([], ' ',
1829ee85df37SBram Moolenaar		\ {'title' : 'SomeTitle', 'nr' : 'abc'}))
1830ee85df37SBram Moolenaar
1831ee85df37SBram Moolenaar    if a:cchar == 'c'
1832ee85df37SBram Moolenaar	copen
1833ee85df37SBram Moolenaar	call assert_equal({'winid':win_getid()}, getqflist({'winid':1}))
1834ee85df37SBram Moolenaar	cclose
1835ee85df37SBram Moolenaar    endif
1836ee85df37SBram Moolenaar
1837d823fa91SBram Moolenaar    " Invalid arguments
1838d823fa91SBram Moolenaar    call assert_fails('call g:Xgetlist([])', 'E715')
1839d823fa91SBram Moolenaar    call assert_fails('call g:Xsetlist([], "a", [])', 'E715')
1840d823fa91SBram Moolenaar    let s = g:Xsetlist([], 'a', {'abc':1})
1841d823fa91SBram Moolenaar    call assert_equal(-1, s)
1842d823fa91SBram Moolenaar
1843d823fa91SBram Moolenaar    call assert_equal({}, g:Xgetlist({'abc':1}))
1844a6d4849cSBram Moolenaar    call assert_equal('', g:Xgetlist({'nr':99, 'title':1}).title)
1845a6d4849cSBram Moolenaar    call assert_equal('', g:Xgetlist({'nr':[], 'title':1}).title)
1846d823fa91SBram Moolenaar
1847d823fa91SBram Moolenaar    if a:cchar == 'l'
1848890680caSBram Moolenaar	call assert_equal({}, getloclist(99, {'title': 1}))
1849d823fa91SBram Moolenaar    endif
18508f77c5a4SBram Moolenaar
18518f77c5a4SBram Moolenaar    " Context related tests
185286f100dcSBram Moolenaar    let s = g:Xsetlist([], 'a', {'context':[1,2,3]})
185386f100dcSBram Moolenaar    call assert_equal(0, s)
18548f77c5a4SBram Moolenaar    call test_garbagecollect_now()
18558f77c5a4SBram Moolenaar    let d = g:Xgetlist({'context':1})
18568f77c5a4SBram Moolenaar    call assert_equal([1,2,3], d.context)
18578f77c5a4SBram Moolenaar    call g:Xsetlist([], 'a', {'context':{'color':'green'}})
18588f77c5a4SBram Moolenaar    let d = g:Xgetlist({'context':1})
18598f77c5a4SBram Moolenaar    call assert_equal({'color':'green'}, d.context)
18608f77c5a4SBram Moolenaar    call g:Xsetlist([], 'a', {'context':"Context info"})
18618f77c5a4SBram Moolenaar    let d = g:Xgetlist({'context':1})
18628f77c5a4SBram Moolenaar    call assert_equal("Context info", d.context)
18638f77c5a4SBram Moolenaar    call g:Xsetlist([], 'a', {'context':246})
18648f77c5a4SBram Moolenaar    let d = g:Xgetlist({'context':1})
18658f77c5a4SBram Moolenaar    call assert_equal(246, d.context)
18668f77c5a4SBram Moolenaar    if a:cchar == 'l'
18678f77c5a4SBram Moolenaar	" Test for copying context across two different location lists
18688f77c5a4SBram Moolenaar	new | only
18698f77c5a4SBram Moolenaar	let w1_id = win_getid()
18708f77c5a4SBram Moolenaar	let l = [1]
18718f77c5a4SBram Moolenaar	call setloclist(0, [], 'a', {'context':l})
18728f77c5a4SBram Moolenaar	new
18738f77c5a4SBram Moolenaar	let w2_id = win_getid()
18748f77c5a4SBram Moolenaar	call add(l, 2)
18758f77c5a4SBram Moolenaar	call assert_equal([1, 2], getloclist(w1_id, {'context':1}).context)
18768f77c5a4SBram Moolenaar	call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
18778f77c5a4SBram Moolenaar	unlet! l
18788f77c5a4SBram Moolenaar	call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
18798f77c5a4SBram Moolenaar	only
18808f77c5a4SBram Moolenaar	call setloclist(0, [], 'f')
1881a6d4849cSBram Moolenaar	call assert_equal('', getloclist(0, {'context':1}).context)
18828f77c5a4SBram Moolenaar    endif
18836e62da3eSBram Moolenaar
18846e62da3eSBram Moolenaar    " Test for changing the context of previous quickfix lists
18856e62da3eSBram Moolenaar    call g:Xsetlist([], 'f')
18866e62da3eSBram Moolenaar    Xexpr "One"
18876e62da3eSBram Moolenaar    Xexpr "Two"
18886e62da3eSBram Moolenaar    Xexpr "Three"
188955b69264SBram Moolenaar    call g:Xsetlist([], 'r', {'context' : [1], 'nr' : 1})
189055b69264SBram Moolenaar    call g:Xsetlist([], 'a', {'context' : [2], 'nr' : 2})
18916e62da3eSBram Moolenaar    " Also, check for setting the context using quickfix list number zero.
189255b69264SBram Moolenaar    call g:Xsetlist([], 'r', {'context' : [3], 'nr' : 0})
18936e62da3eSBram Moolenaar    call test_garbagecollect_now()
18946e62da3eSBram Moolenaar    let l = g:Xgetlist({'nr' : 1, 'context' : 1})
18956e62da3eSBram Moolenaar    call assert_equal([1], l.context)
18966e62da3eSBram Moolenaar    let l = g:Xgetlist({'nr' : 2, 'context' : 1})
18976e62da3eSBram Moolenaar    call assert_equal([2], l.context)
18986e62da3eSBram Moolenaar    let l = g:Xgetlist({'nr' : 3, 'context' : 1})
18996e62da3eSBram Moolenaar    call assert_equal([3], l.context)
19006e62da3eSBram Moolenaar
19016e62da3eSBram Moolenaar    " Test for changing the context through reference and for garbage
19026e62da3eSBram Moolenaar    " collection of quickfix context
19036e62da3eSBram Moolenaar    let l = ["red"]
19046e62da3eSBram Moolenaar    call g:Xsetlist([], ' ', {'context' : l})
19056e62da3eSBram Moolenaar    call add(l, "blue")
19066e62da3eSBram Moolenaar    let x = g:Xgetlist({'context' : 1})
19076e62da3eSBram Moolenaar    call add(x.context, "green")
19086e62da3eSBram Moolenaar    call assert_equal(["red", "blue", "green"], l)
19096e62da3eSBram Moolenaar    call assert_equal(["red", "blue", "green"], x.context)
19106e62da3eSBram Moolenaar    unlet l
19116e62da3eSBram Moolenaar    call test_garbagecollect_now()
19126e62da3eSBram Moolenaar    let m = g:Xgetlist({'context' : 1})
19136e62da3eSBram Moolenaar    call assert_equal(["red", "blue", "green"], m.context)
19146a8958dbSBram Moolenaar
19156a8958dbSBram Moolenaar    " Test for setting/getting items
19166a8958dbSBram Moolenaar    Xexpr ""
19176a8958dbSBram Moolenaar    let qfprev = g:Xgetlist({'nr':0})
191886f100dcSBram Moolenaar    let s = g:Xsetlist([], ' ', {'title':'Green',
19196a8958dbSBram Moolenaar		\ 'items' : [{'filename':'F1', 'lnum':10}]})
192086f100dcSBram Moolenaar    call assert_equal(0, s)
19216a8958dbSBram Moolenaar    let qfcur = g:Xgetlist({'nr':0})
19226a8958dbSBram Moolenaar    call assert_true(qfcur.nr == qfprev.nr + 1)
19236a8958dbSBram Moolenaar    let l = g:Xgetlist({'items':1})
19246a8958dbSBram Moolenaar    call assert_equal('F1', bufname(l.items[0].bufnr))
19256a8958dbSBram Moolenaar    call assert_equal(10, l.items[0].lnum)
19266a8958dbSBram Moolenaar    call g:Xsetlist([], 'a', {'items' : [{'filename':'F2', 'lnum':20},
19276a8958dbSBram Moolenaar		\  {'filename':'F2', 'lnum':30}]})
19286a8958dbSBram Moolenaar    let l = g:Xgetlist({'items':1})
19296a8958dbSBram Moolenaar    call assert_equal('F2', bufname(l.items[2].bufnr))
19306a8958dbSBram Moolenaar    call assert_equal(30, l.items[2].lnum)
19316a8958dbSBram Moolenaar    call g:Xsetlist([], 'r', {'items' : [{'filename':'F3', 'lnum':40}]})
19326a8958dbSBram Moolenaar    let l = g:Xgetlist({'items':1})
19336a8958dbSBram Moolenaar    call assert_equal('F3', bufname(l.items[0].bufnr))
19346a8958dbSBram Moolenaar    call assert_equal(40, l.items[0].lnum)
19356a8958dbSBram Moolenaar    call g:Xsetlist([], 'r', {'items' : []})
19366a8958dbSBram Moolenaar    let l = g:Xgetlist({'items':1})
19376a8958dbSBram Moolenaar    call assert_equal(0, len(l.items))
19386a8958dbSBram Moolenaar
1939b4d5fbabSBram Moolenaar    call g:Xsetlist([], 'r', {'title' : 'TestTitle'})
1940b4d5fbabSBram Moolenaar    call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]})
1941b4d5fbabSBram Moolenaar    call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]})
1942b4d5fbabSBram Moolenaar    call assert_equal('TestTitle', g:Xgetlist({'title' : 1}).title)
1943b4d5fbabSBram Moolenaar
1944ae338338SBram Moolenaar    " The following used to crash Vim with address sanitizer
1945ae338338SBram Moolenaar    call g:Xsetlist([], 'f')
1946ae338338SBram Moolenaar    call g:Xsetlist([], 'a', {'items' : [{'filename':'F1', 'lnum':10}]})
1947ae338338SBram Moolenaar    call assert_equal(10, g:Xgetlist({'items':1}).items[0].lnum)
1948ae338338SBram Moolenaar
1949*a2aa8a2bSBram Moolenaar    " Try setting the items using a string
1950*a2aa8a2bSBram Moolenaar    call assert_equal(-1, g:Xsetlist([], ' ', {'items' : 'Test'}))
1951*a2aa8a2bSBram Moolenaar
19526a8958dbSBram Moolenaar    " Save and restore the quickfix stack
19536a8958dbSBram Moolenaar    call g:Xsetlist([], 'f')
19546a8958dbSBram Moolenaar    call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
19556a8958dbSBram Moolenaar    Xexpr "File1:10:Line1"
19566a8958dbSBram Moolenaar    Xexpr "File2:20:Line2"
19576a8958dbSBram Moolenaar    Xexpr "File3:30:Line3"
19586a8958dbSBram Moolenaar    let last_qf = g:Xgetlist({'nr':'$'}).nr
19596a8958dbSBram Moolenaar    call assert_equal(3, last_qf)
19606a8958dbSBram Moolenaar    let qstack = []
19616a8958dbSBram Moolenaar    for i in range(1, last_qf)
19626a8958dbSBram Moolenaar	let qstack = add(qstack, g:Xgetlist({'nr':i, 'all':1}))
19636a8958dbSBram Moolenaar    endfor
19646a8958dbSBram Moolenaar    call g:Xsetlist([], 'f')
19656a8958dbSBram Moolenaar    for i in range(len(qstack))
19666a8958dbSBram Moolenaar	call g:Xsetlist([], ' ', qstack[i])
19676a8958dbSBram Moolenaar    endfor
19686a8958dbSBram Moolenaar    call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
19696a8958dbSBram Moolenaar    call assert_equal(10, g:Xgetlist({'nr':1, 'items':1}).items[0].lnum)
19706a8958dbSBram Moolenaar    call assert_equal(20, g:Xgetlist({'nr':2, 'items':1}).items[0].lnum)
19716a8958dbSBram Moolenaar    call assert_equal(30, g:Xgetlist({'nr':3, 'items':1}).items[0].lnum)
19726a8958dbSBram Moolenaar    call g:Xsetlist([], 'f')
19736a8958dbSBram Moolenaar
19746a8958dbSBram Moolenaar    " Swap two quickfix lists
19756a8958dbSBram Moolenaar    Xexpr "File1:10:Line10"
19766a8958dbSBram Moolenaar    Xexpr "File2:20:Line20"
19776a8958dbSBram Moolenaar    Xexpr "File3:30:Line30"
19786a8958dbSBram Moolenaar    call g:Xsetlist([], 'r', {'nr':1,'title':'Colors','context':['Colors']})
19796a8958dbSBram Moolenaar    call g:Xsetlist([], 'r', {'nr':2,'title':'Fruits','context':['Fruits']})
19806a8958dbSBram Moolenaar    let l1=g:Xgetlist({'nr':1,'all':1})
19816a8958dbSBram Moolenaar    let l2=g:Xgetlist({'nr':2,'all':1})
1982a539f4f1SBram Moolenaar    let save_id = l1.id
1983a539f4f1SBram Moolenaar    let l1.id=l2.id
1984a539f4f1SBram Moolenaar    let l2.id=save_id
19856a8958dbSBram Moolenaar    call g:Xsetlist([], 'r', l1)
19866a8958dbSBram Moolenaar    call g:Xsetlist([], 'r', l2)
19876a8958dbSBram Moolenaar    let newl1=g:Xgetlist({'nr':1,'all':1})
19886a8958dbSBram Moolenaar    let newl2=g:Xgetlist({'nr':2,'all':1})
1989b4d5fbabSBram Moolenaar    call assert_equal('Fruits', newl1.title)
19906a8958dbSBram Moolenaar    call assert_equal(['Fruits'], newl1.context)
19916a8958dbSBram Moolenaar    call assert_equal('Line20', newl1.items[0].text)
1992b4d5fbabSBram Moolenaar    call assert_equal('Colors', newl2.title)
19936a8958dbSBram Moolenaar    call assert_equal(['Colors'], newl2.context)
19946a8958dbSBram Moolenaar    call assert_equal('Line10', newl2.items[0].text)
19956a8958dbSBram Moolenaar    call g:Xsetlist([], 'f')
19962b946c9fSBram Moolenaarendfunc
1997d823fa91SBram Moolenaar
19982b946c9fSBram Moolenaarfunc Test_qf_property()
1999d823fa91SBram Moolenaar    call Xproperty_tests('c')
2000d823fa91SBram Moolenaar    call Xproperty_tests('l')
20012b946c9fSBram Moolenaarendfunc
200204c4ce65SBram Moolenaar
200304c4ce65SBram Moolenaar" Tests for the QuickFixCmdPre/QuickFixCmdPost autocommands
20042b946c9fSBram Moolenaarfunc QfAutoCmdHandler(loc, cmd)
200504c4ce65SBram Moolenaar  call add(g:acmds, a:loc . a:cmd)
20062b946c9fSBram Moolenaarendfunc
200704c4ce65SBram Moolenaar
20082b946c9fSBram Moolenaarfunc Test_Autocmd()
200904c4ce65SBram Moolenaar  autocmd QuickFixCmdPre * call QfAutoCmdHandler('pre', expand('<amatch>'))
201004c4ce65SBram Moolenaar  autocmd QuickFixCmdPost * call QfAutoCmdHandler('post', expand('<amatch>'))
201104c4ce65SBram Moolenaar
201204c4ce65SBram Moolenaar  let g:acmds = []
201304c4ce65SBram Moolenaar  cexpr "F1:10:Line 10"
201404c4ce65SBram Moolenaar  caddexpr "F1:20:Line 20"
201504c4ce65SBram Moolenaar  cgetexpr "F1:30:Line 30"
20161ed2276fSBram Moolenaar  cexpr ""
20171ed2276fSBram Moolenaar  caddexpr ""
20181ed2276fSBram Moolenaar  cgetexpr ""
20191ed2276fSBram Moolenaar  silent! cexpr non_existing_func()
20201ed2276fSBram Moolenaar  silent! caddexpr non_existing_func()
20211ed2276fSBram Moolenaar  silent! cgetexpr non_existing_func()
202204c4ce65SBram Moolenaar  let l = ['precexpr',
202304c4ce65SBram Moolenaar	      \ 'postcexpr',
202404c4ce65SBram Moolenaar	      \ 'precaddexpr',
202504c4ce65SBram Moolenaar	      \ 'postcaddexpr',
202604c4ce65SBram Moolenaar	      \ 'precgetexpr',
202704c4ce65SBram Moolenaar	      \ 'postcgetexpr',
20281ed2276fSBram Moolenaar	      \ 'precexpr',
20291ed2276fSBram Moolenaar	      \ 'postcexpr',
20301ed2276fSBram Moolenaar	      \ 'precaddexpr',
20311ed2276fSBram Moolenaar	      \ 'postcaddexpr',
20321ed2276fSBram Moolenaar	      \ 'precgetexpr',
20331ed2276fSBram Moolenaar	      \ 'postcgetexpr',
20341ed2276fSBram Moolenaar	      \ 'precexpr',
20351ed2276fSBram Moolenaar	      \ 'precaddexpr',
20361ed2276fSBram Moolenaar	      \ 'precgetexpr']
20371ed2276fSBram Moolenaar  call assert_equal(l, g:acmds)
20381ed2276fSBram Moolenaar
20391ed2276fSBram Moolenaar  let g:acmds = []
20401ed2276fSBram Moolenaar  enew! | call append(0, "F2:10:Line 10")
20411ed2276fSBram Moolenaar  cbuffer!
20421ed2276fSBram Moolenaar  enew! | call append(0, "F2:20:Line 20")
20431ed2276fSBram Moolenaar  cgetbuffer
20441ed2276fSBram Moolenaar  enew! | call append(0, "F2:30:Line 30")
20451ed2276fSBram Moolenaar  caddbuffer
20461ed2276fSBram Moolenaar  new
20471ed2276fSBram Moolenaar  let bnum = bufnr('%')
20481ed2276fSBram Moolenaar  bunload
20491ed2276fSBram Moolenaar  exe 'silent! cbuffer! ' . bnum
20501ed2276fSBram Moolenaar  exe 'silent! cgetbuffer ' . bnum
20511ed2276fSBram Moolenaar  exe 'silent! caddbuffer ' . bnum
20521ed2276fSBram Moolenaar  enew!
20531ed2276fSBram Moolenaar  let l = ['precbuffer',
205404c4ce65SBram Moolenaar	      \ 'postcbuffer',
205504c4ce65SBram Moolenaar	      \ 'precgetbuffer',
205604c4ce65SBram Moolenaar	      \ 'postcgetbuffer',
205704c4ce65SBram Moolenaar	      \ 'precaddbuffer',
20581ed2276fSBram Moolenaar	      \ 'postcaddbuffer',
20591ed2276fSBram Moolenaar	      \ 'precbuffer',
20601ed2276fSBram Moolenaar	      \ 'precgetbuffer',
20611ed2276fSBram Moolenaar	      \ 'precaddbuffer']
206204c4ce65SBram Moolenaar  call assert_equal(l, g:acmds)
20631ed2276fSBram Moolenaar
20641ed2276fSBram Moolenaar  call writefile(['Xtest:1:Line1'], 'Xtest')
20651ed2276fSBram Moolenaar  call writefile([], 'Xempty')
20661ed2276fSBram Moolenaar  let g:acmds = []
20671ed2276fSBram Moolenaar  cfile Xtest
20681ed2276fSBram Moolenaar  caddfile Xtest
20691ed2276fSBram Moolenaar  cgetfile Xtest
20701ed2276fSBram Moolenaar  cfile Xempty
20711ed2276fSBram Moolenaar  caddfile Xempty
20721ed2276fSBram Moolenaar  cgetfile Xempty
20731ed2276fSBram Moolenaar  silent! cfile do_not_exist
20741ed2276fSBram Moolenaar  silent! caddfile do_not_exist
20751ed2276fSBram Moolenaar  silent! cgetfile do_not_exist
20761ed2276fSBram Moolenaar  let l = ['precfile',
20771ed2276fSBram Moolenaar	      \ 'postcfile',
20781ed2276fSBram Moolenaar	      \ 'precaddfile',
20791ed2276fSBram Moolenaar	      \ 'postcaddfile',
20801ed2276fSBram Moolenaar	      \ 'precgetfile',
20811ed2276fSBram Moolenaar	      \ 'postcgetfile',
20821ed2276fSBram Moolenaar	      \ 'precfile',
20831ed2276fSBram Moolenaar	      \ 'postcfile',
20841ed2276fSBram Moolenaar	      \ 'precaddfile',
20851ed2276fSBram Moolenaar	      \ 'postcaddfile',
20861ed2276fSBram Moolenaar	      \ 'precgetfile',
20871ed2276fSBram Moolenaar	      \ 'postcgetfile',
20881ed2276fSBram Moolenaar	      \ 'precfile',
20891ed2276fSBram Moolenaar	      \ 'postcfile',
20901ed2276fSBram Moolenaar	      \ 'precaddfile',
20911ed2276fSBram Moolenaar	      \ 'postcaddfile',
20921ed2276fSBram Moolenaar	      \ 'precgetfile',
20931ed2276fSBram Moolenaar	      \ 'postcgetfile']
20941ed2276fSBram Moolenaar  call assert_equal(l, g:acmds)
20951ed2276fSBram Moolenaar
20961ed2276fSBram Moolenaar  let g:acmds = []
20971ed2276fSBram Moolenaar  helpgrep quickfix
20981ed2276fSBram Moolenaar  silent! helpgrep non_existing_help_topic
20991ed2276fSBram Moolenaar  vimgrep test Xtest
21001ed2276fSBram Moolenaar  vimgrepadd test Xtest
21011ed2276fSBram Moolenaar  silent! vimgrep non_existing_test Xtest
21021ed2276fSBram Moolenaar  silent! vimgrepadd non_existing_test Xtest
21031ed2276fSBram Moolenaar  set makeprg=
21041ed2276fSBram Moolenaar  silent! make
21051ed2276fSBram Moolenaar  set makeprg&
21061ed2276fSBram Moolenaar  let l = ['prehelpgrep',
21071ed2276fSBram Moolenaar	      \ 'posthelpgrep',
21081ed2276fSBram Moolenaar	      \ 'prehelpgrep',
21091ed2276fSBram Moolenaar	      \ 'posthelpgrep',
21101ed2276fSBram Moolenaar	      \ 'previmgrep',
21111ed2276fSBram Moolenaar	      \ 'postvimgrep',
21121ed2276fSBram Moolenaar	      \ 'previmgrepadd',
21131ed2276fSBram Moolenaar	      \ 'postvimgrepadd',
21141ed2276fSBram Moolenaar	      \ 'previmgrep',
21151ed2276fSBram Moolenaar	      \ 'postvimgrep',
21161ed2276fSBram Moolenaar	      \ 'previmgrepadd',
21171ed2276fSBram Moolenaar	      \ 'postvimgrepadd',
21181ed2276fSBram Moolenaar	      \ 'premake',
21191ed2276fSBram Moolenaar	      \ 'postmake']
21201ed2276fSBram Moolenaar  call assert_equal(l, g:acmds)
21211ed2276fSBram Moolenaar
21221ed2276fSBram Moolenaar  if has('unix')
21231ed2276fSBram Moolenaar    " Run this test only on Unix-like systems. The grepprg may not be set on
21241ed2276fSBram Moolenaar    " non-Unix systems.
21251ed2276fSBram Moolenaar    " The following lines are used for the grep test. Don't remove.
21261ed2276fSBram Moolenaar    " Grep_Autocmd_Text: Match 1
21271ed2276fSBram Moolenaar    " GrepAdd_Autocmd_Text: Match 2
21281ed2276fSBram Moolenaar    let g:acmds = []
21291ed2276fSBram Moolenaar    silent grep Grep_Autocmd_Text test_quickfix.vim
21301ed2276fSBram Moolenaar    silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim
21311ed2276fSBram Moolenaar    silent grep abc123def Xtest
21321ed2276fSBram Moolenaar    silent grepadd abc123def Xtest
21331ed2276fSBram Moolenaar    let l = ['pregrep',
21341ed2276fSBram Moolenaar		\ 'postgrep',
21351ed2276fSBram Moolenaar		\ 'pregrepadd',
21361ed2276fSBram Moolenaar		\ 'postgrepadd',
21371ed2276fSBram Moolenaar		\ 'pregrep',
21381ed2276fSBram Moolenaar		\ 'postgrep',
21391ed2276fSBram Moolenaar		\ 'pregrepadd',
21401ed2276fSBram Moolenaar		\ 'postgrepadd']
21411ed2276fSBram Moolenaar    call assert_equal(l, g:acmds)
21421ed2276fSBram Moolenaar  endif
21431ed2276fSBram Moolenaar
21441ed2276fSBram Moolenaar  call delete('Xtest')
21451ed2276fSBram Moolenaar  call delete('Xempty')
2146b254af31SBram Moolenaar  au! QuickFixCmdPre
2147b254af31SBram Moolenaar  au! QuickFixCmdPost
21482b946c9fSBram Moolenaarendfunc
214921662be2SBram Moolenaar
21502b946c9fSBram Moolenaarfunc Test_Autocmd_Exception()
215121662be2SBram Moolenaar  set efm=%m
215221662be2SBram Moolenaar  lgetexpr '?'
215321662be2SBram Moolenaar
215421662be2SBram Moolenaar  try
215521662be2SBram Moolenaar    call DoesNotExit()
215621662be2SBram Moolenaar  catch
215721662be2SBram Moolenaar    lgetexpr '1'
215821662be2SBram Moolenaar  finally
215921662be2SBram Moolenaar    lgetexpr '1'
216021662be2SBram Moolenaar  endtry
216121662be2SBram Moolenaar
216221662be2SBram Moolenaar  call assert_equal('1', getloclist(0)[0].text)
216321662be2SBram Moolenaar
216421662be2SBram Moolenaar  set efm&vim
21652b946c9fSBram Moolenaarendfunc
216663bed3d3SBram Moolenaar
21672b946c9fSBram Moolenaarfunc Test_caddbuffer_wrong()
21682b946c9fSBram Moolenaar  " This used to cause a memory access in freed memory.
216963bed3d3SBram Moolenaar  let save_efm = &efm
217063bed3d3SBram Moolenaar  set efm=%EEEE%m,%WWWW,%+CCCC%>%#,%GGGG%.#
217163bed3d3SBram Moolenaar  cgetexpr ['WWWW', 'EEEE', 'CCCC']
217263bed3d3SBram Moolenaar  let &efm = save_efm
21732b946c9fSBram Moolenaar  caddbuffer
217463bed3d3SBram Moolenaar  bwipe!
217563bed3d3SBram Moolenaarendfunc
21762b946c9fSBram Moolenaar
21772b946c9fSBram Moolenaarfunc Test_caddexpr_wrong()
21782b946c9fSBram Moolenaar  " This used to cause a memory access in freed memory.
21792b946c9fSBram Moolenaar  cbuffer
21802b946c9fSBram Moolenaar  cbuffer
21812b946c9fSBram Moolenaar  copen
21822b946c9fSBram Moolenaar  let save_efm = &efm
21832b946c9fSBram Moolenaar  set efm=%
21842b946c9fSBram Moolenaar  call assert_fails('caddexpr ""', 'E376:')
21852b946c9fSBram Moolenaar  let &efm = save_efm
21862b946c9fSBram Moolenaarendfunc
21877618e00dSBram Moolenaar
21887618e00dSBram Moolenaarfunc Test_dirstack_cleanup()
21897618e00dSBram Moolenaar  " This used to cause a memory access in freed memory.
21907618e00dSBram Moolenaar  let save_efm = &efm
21917618e00dSBram Moolenaar  lexpr '0'
21927618e00dSBram Moolenaar  lopen
21937618e00dSBram Moolenaar  fun X(c)
21947618e00dSBram Moolenaar    let save_efm=&efm
21957618e00dSBram Moolenaar    set efm=%D%f
21967618e00dSBram Moolenaar    if a:c == 'c'
21977618e00dSBram Moolenaar      caddexpr '::'
21987618e00dSBram Moolenaar    else
21997618e00dSBram Moolenaar      laddexpr ':0:0'
22007618e00dSBram Moolenaar    endif
22017618e00dSBram Moolenaar    let &efm=save_efm
22027618e00dSBram Moolenaar  endfun
22037618e00dSBram Moolenaar  call X('c')
22047618e00dSBram Moolenaar  call X('l')
22057618e00dSBram Moolenaar  call setqflist([], 'r')
22067618e00dSBram Moolenaar  caddbuffer
22077618e00dSBram Moolenaar  let &efm = save_efm
22087618e00dSBram Moolenaarendfunc
2209391b1dd0SBram Moolenaar
2210391b1dd0SBram Moolenaar" Tests for jumping to entries from the location list window and quickfix
2211391b1dd0SBram Moolenaar" window
2212391b1dd0SBram Moolenaarfunc Test_cwindow_jump()
2213391b1dd0SBram Moolenaar  set efm=%f%%%l%%%m
2214391b1dd0SBram Moolenaar  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2215391b1dd0SBram Moolenaar  lopen | only
2216391b1dd0SBram Moolenaar  lfirst
2217391b1dd0SBram Moolenaar  call assert_true(winnr('$') == 2)
2218391b1dd0SBram Moolenaar  call assert_true(winnr() == 1)
2219391b1dd0SBram Moolenaar  " Location list for the new window should be set
2220391b1dd0SBram Moolenaar  call assert_true(getloclist(0)[2].text == 'Line 30')
2221391b1dd0SBram Moolenaar
2222391b1dd0SBram Moolenaar  " Open a scratch buffer
2223391b1dd0SBram Moolenaar  " Open a new window and create a location list
2224391b1dd0SBram Moolenaar  " Open the location list window and close the other window
2225391b1dd0SBram Moolenaar  " Jump to an entry.
2226391b1dd0SBram Moolenaar  " Should create a new window and jump to the entry. The scrtach buffer
2227391b1dd0SBram Moolenaar  " should not be used.
2228391b1dd0SBram Moolenaar  enew | only
2229391b1dd0SBram Moolenaar  set buftype=nofile
2230391b1dd0SBram Moolenaar  below new
2231391b1dd0SBram Moolenaar  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2232391b1dd0SBram Moolenaar  lopen
2233391b1dd0SBram Moolenaar  2wincmd c
2234391b1dd0SBram Moolenaar  lnext
2235391b1dd0SBram Moolenaar  call assert_true(winnr('$') == 3)
2236391b1dd0SBram Moolenaar  call assert_true(winnr() == 2)
2237391b1dd0SBram Moolenaar
2238391b1dd0SBram Moolenaar  " Open two windows with two different location lists
2239391b1dd0SBram Moolenaar  " Open the location list window and close the previous window
2240391b1dd0SBram Moolenaar  " Jump to an entry in the location list window
2241391b1dd0SBram Moolenaar  " Should open the file in the first window and not set the location list.
2242391b1dd0SBram Moolenaar  enew | only
2243391b1dd0SBram Moolenaar  lgetexpr ["F1%5%Line 5"]
2244391b1dd0SBram Moolenaar  below new
2245391b1dd0SBram Moolenaar  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2246391b1dd0SBram Moolenaar  lopen
2247391b1dd0SBram Moolenaar  2wincmd c
2248391b1dd0SBram Moolenaar  lnext
2249391b1dd0SBram Moolenaar  call assert_true(winnr() == 1)
2250391b1dd0SBram Moolenaar  call assert_true(getloclist(0)[0].text == 'Line 5')
2251391b1dd0SBram Moolenaar
2252391b1dd0SBram Moolenaar  enew | only
2253391b1dd0SBram Moolenaar  cgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2254391b1dd0SBram Moolenaar  copen
2255391b1dd0SBram Moolenaar  cnext
2256391b1dd0SBram Moolenaar  call assert_true(winnr('$') == 2)
2257391b1dd0SBram Moolenaar  call assert_true(winnr() == 1)
2258391b1dd0SBram Moolenaar
2259391b1dd0SBram Moolenaar  enew | only
2260391b1dd0SBram Moolenaar  set efm&vim
2261391b1dd0SBram Moolenaarendfunc
2262ee85df37SBram Moolenaar
2263ee85df37SBram Moolenaarfunc XvimgrepTests(cchar)
2264ee85df37SBram Moolenaar  call s:setup_commands(a:cchar)
2265ee85df37SBram Moolenaar
2266ee85df37SBram Moolenaar  call writefile(['Editor:VIM vim',
2267ee85df37SBram Moolenaar	      \ 'Editor:Emacs EmAcS',
2268ee85df37SBram Moolenaar	      \ 'Editor:Notepad NOTEPAD'], 'Xtestfile1')
2269ee85df37SBram Moolenaar  call writefile(['Linux', 'MacOS', 'MS-Windows'], 'Xtestfile2')
2270ee85df37SBram Moolenaar
2271ee85df37SBram Moolenaar  " Error cases
2272ee85df37SBram Moolenaar  call assert_fails('Xvimgrep /abc *', 'E682:')
2273ee85df37SBram Moolenaar
2274ee85df37SBram Moolenaar  let @/=''
2275ee85df37SBram Moolenaar  call assert_fails('Xvimgrep // *', 'E35:')
2276ee85df37SBram Moolenaar
2277ee85df37SBram Moolenaar  call assert_fails('Xvimgrep abc', 'E683:')
2278ee85df37SBram Moolenaar  call assert_fails('Xvimgrep a1b2c3 Xtestfile1', 'E480:')
2279ee85df37SBram Moolenaar  call assert_fails('Xvimgrep pat Xa1b2c3', 'E480:')
2280ee85df37SBram Moolenaar
2281ee85df37SBram Moolenaar  Xexpr ""
2282ee85df37SBram Moolenaar  Xvimgrepadd Notepad Xtestfile1
2283ee85df37SBram Moolenaar  Xvimgrepadd MacOS Xtestfile2
2284ee85df37SBram Moolenaar  let l = g:Xgetlist()
2285ee85df37SBram Moolenaar  call assert_equal(2, len(l))
2286ee85df37SBram Moolenaar  call assert_equal('Editor:Notepad NOTEPAD', l[0].text)
2287ee85df37SBram Moolenaar
2288ee85df37SBram Moolenaar  Xvimgrep #\cvim#g Xtestfile?
2289ee85df37SBram Moolenaar  let l = g:Xgetlist()
2290ee85df37SBram Moolenaar  call assert_equal(2, len(l))
2291ee85df37SBram Moolenaar  call assert_equal(8, l[0].col)
2292ee85df37SBram Moolenaar  call assert_equal(12, l[1].col)
2293ee85df37SBram Moolenaar
2294ee85df37SBram Moolenaar  1Xvimgrep ?Editor? Xtestfile*
2295ee85df37SBram Moolenaar  let l = g:Xgetlist()
2296ee85df37SBram Moolenaar  call assert_equal(1, len(l))
2297ee85df37SBram Moolenaar  call assert_equal('Editor:VIM vim', l[0].text)
2298ee85df37SBram Moolenaar
2299ee85df37SBram Moolenaar  edit +3 Xtestfile2
2300ee85df37SBram Moolenaar  Xvimgrep +\cemacs+j Xtestfile1
2301ee85df37SBram Moolenaar  let l = g:Xgetlist()
2302ee85df37SBram Moolenaar  call assert_equal('Xtestfile2', bufname(''))
2303ee85df37SBram Moolenaar  call assert_equal('Editor:Emacs EmAcS', l[0].text)
2304ee85df37SBram Moolenaar
2305ee85df37SBram Moolenaar  call delete('Xtestfile1')
2306ee85df37SBram Moolenaar  call delete('Xtestfile2')
2307ee85df37SBram Moolenaarendfunc
2308ee85df37SBram Moolenaar
2309ee85df37SBram Moolenaar" Tests for the :vimgrep command
2310ee85df37SBram Moolenaarfunc Test_vimgrep()
2311ee85df37SBram Moolenaar  call XvimgrepTests('c')
2312ee85df37SBram Moolenaar  call XvimgrepTests('l')
2313ee85df37SBram Moolenaarendfunc
231469f40be6SBram Moolenaar
231569f40be6SBram Moolenaarfunc XfreeTests(cchar)
231669f40be6SBram Moolenaar  call s:setup_commands(a:cchar)
231769f40be6SBram Moolenaar
231869f40be6SBram Moolenaar  enew | only
231969f40be6SBram Moolenaar
232069f40be6SBram Moolenaar  " Deleting the quickfix stack should work even When the current list is
232169f40be6SBram Moolenaar  " somewhere in the middle of the stack
232269f40be6SBram Moolenaar  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
232369f40be6SBram Moolenaar  Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
232469f40be6SBram Moolenaar  Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
232569f40be6SBram Moolenaar  Xolder
232669f40be6SBram Moolenaar  call g:Xsetlist([], 'f')
232769f40be6SBram Moolenaar  call assert_equal(0, len(g:Xgetlist()))
232869f40be6SBram Moolenaar
232969f40be6SBram Moolenaar  " After deleting the stack, adding a new list should create a stack with a
233069f40be6SBram Moolenaar  " single list.
233169f40be6SBram Moolenaar  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
233269f40be6SBram Moolenaar  call assert_equal(1, g:Xgetlist({'all':1}).nr)
233369f40be6SBram Moolenaar
233469f40be6SBram Moolenaar  " Deleting the stack from a quickfix window should update/clear the
233569f40be6SBram Moolenaar  " quickfix/location list window.
233669f40be6SBram Moolenaar  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
233769f40be6SBram Moolenaar  Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
233869f40be6SBram Moolenaar  Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
233969f40be6SBram Moolenaar  Xolder
234069f40be6SBram Moolenaar  Xwindow
234169f40be6SBram Moolenaar  call g:Xsetlist([], 'f')
234269f40be6SBram Moolenaar  call assert_equal(2, winnr('$'))
234369f40be6SBram Moolenaar  call assert_equal(1, line('$'))
234469f40be6SBram Moolenaar  Xclose
234569f40be6SBram Moolenaar
234669f40be6SBram Moolenaar  " Deleting the stack from a non-quickfix window should update/clear the
234769f40be6SBram Moolenaar  " quickfix/location list window.
234869f40be6SBram Moolenaar  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
234969f40be6SBram Moolenaar  Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
235069f40be6SBram Moolenaar  Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
235169f40be6SBram Moolenaar  Xolder
235269f40be6SBram Moolenaar  Xwindow
235369f40be6SBram Moolenaar  wincmd p
235469f40be6SBram Moolenaar  call g:Xsetlist([], 'f')
235569f40be6SBram Moolenaar  call assert_equal(0, len(g:Xgetlist()))
235669f40be6SBram Moolenaar  wincmd p
235769f40be6SBram Moolenaar  call assert_equal(2, winnr('$'))
235869f40be6SBram Moolenaar  call assert_equal(1, line('$'))
235969f40be6SBram Moolenaar
236069f40be6SBram Moolenaar  " After deleting the location list stack, if the location list window is
236169f40be6SBram Moolenaar  " opened, then a new location list should be created. So opening the
236269f40be6SBram Moolenaar  " location list window again should not create a new window.
236369f40be6SBram Moolenaar  if a:cchar == 'l'
236469f40be6SBram Moolenaar      lexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
236569f40be6SBram Moolenaar      wincmd p
236669f40be6SBram Moolenaar      lopen
236769f40be6SBram Moolenaar      call assert_equal(2, winnr('$'))
236869f40be6SBram Moolenaar  endif
236969f40be6SBram Moolenaar  Xclose
237069f40be6SBram Moolenaarendfunc
237169f40be6SBram Moolenaar
237274240d3fSBram Moolenaar" Tests for the quickfix free functionality
237369f40be6SBram Moolenaarfunc Test_qf_free()
237469f40be6SBram Moolenaar  call XfreeTests('c')
237569f40be6SBram Moolenaar  call XfreeTests('l')
237669f40be6SBram Moolenaarendfunc
23776e62da3eSBram Moolenaar
23786e62da3eSBram Moolenaar" Test for buffer overflow when parsing lines and adding new entries to
23796e62da3eSBram Moolenaar" the quickfix list.
23806e62da3eSBram Moolenaarfunc Test_bufoverflow()
23816e62da3eSBram Moolenaar  set efm=%f:%l:%m
23826e62da3eSBram Moolenaar  cgetexpr ['File1:100:' . repeat('x', 1025)]
23836e62da3eSBram Moolenaar
23846e62da3eSBram Moolenaar  set efm=%+GCompiler:\ %.%#,%f:%l:%m
23856e62da3eSBram Moolenaar  cgetexpr ['Compiler: ' . repeat('a', 1015), 'File1:10:Hello World']
23866e62da3eSBram Moolenaar
23876e62da3eSBram Moolenaar  set efm=%DEntering\ directory\ %f,%f:%l:%m
23886e62da3eSBram Moolenaar  cgetexpr ['Entering directory ' . repeat('a', 1006),
23896e62da3eSBram Moolenaar	      \ 'File1:10:Hello World']
23906e62da3eSBram Moolenaar  set efm&vim
23916e62da3eSBram Moolenaarendfunc
23926e62da3eSBram Moolenaar
2393875feea6SBram Moolenaar" Tests for getting the quickfix stack size
2394875feea6SBram Moolenaarfunc XsizeTests(cchar)
2395875feea6SBram Moolenaar  call s:setup_commands(a:cchar)
2396875feea6SBram Moolenaar
2397875feea6SBram Moolenaar  call g:Xsetlist([], 'f')
2398875feea6SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
2399a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'nr':'$', 'all':1}).title)
2400a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr':0}).nr)
2401875feea6SBram Moolenaar
2402875feea6SBram Moolenaar  Xexpr "File1:10:Line1"
2403875feea6SBram Moolenaar  Xexpr "File2:20:Line2"
2404875feea6SBram Moolenaar  Xexpr "File3:30:Line3"
2405875feea6SBram Moolenaar  Xolder | Xolder
2406875feea6SBram Moolenaar  call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
2407875feea6SBram Moolenaar  call g:Xsetlist([], 'f')
2408875feea6SBram Moolenaar
2409875feea6SBram Moolenaar  Xexpr "File1:10:Line1"
2410875feea6SBram Moolenaar  Xexpr "File2:20:Line2"
2411875feea6SBram Moolenaar  Xexpr "File3:30:Line3"
2412875feea6SBram Moolenaar  Xolder | Xolder
2413875feea6SBram Moolenaar  call g:Xsetlist([], 'a', {'nr':'$', 'title':'Compiler'})
2414875feea6SBram Moolenaar  call assert_equal('Compiler', g:Xgetlist({'nr':3, 'all':1}).title)
2415875feea6SBram Moolenaarendfunc
2416875feea6SBram Moolenaar
2417875feea6SBram Moolenaarfunc Test_Qf_Size()
2418875feea6SBram Moolenaar  call XsizeTests('c')
2419875feea6SBram Moolenaar  call XsizeTests('l')
2420875feea6SBram Moolenaarendfunc
24211814183bSBram Moolenaar
24229c4fefffSBram Moolenaarfunc Test_cclose_from_copen()
24239c4fefffSBram Moolenaar    augroup QF_Test
24249c4fefffSBram Moolenaar	au!
24259c4fefffSBram Moolenaar        au FileType qf :call assert_fails(':cclose', 'E788')
24269c4fefffSBram Moolenaar    augroup END
24279c4fefffSBram Moolenaar    copen
24289c4fefffSBram Moolenaar    augroup QF_Test
24299c4fefffSBram Moolenaar	au!
24309c4fefffSBram Moolenaar    augroup END
24319c4fefffSBram Moolenaar    augroup! QF_Test
24329c4fefffSBram Moolenaarendfunc
24339c4fefffSBram Moolenaar
24341814183bSBram Moolenaarfunc Test_cclose_in_autocmd()
24351814183bSBram Moolenaar  " Problem is only triggered if "starting" is zero, so that the OptionsSet
24361814183bSBram Moolenaar  " event will be triggered.
24371814183bSBram Moolenaar  call test_override('starting', 1)
24381814183bSBram Moolenaar  augroup QF_Test
24391814183bSBram Moolenaar    au!
24401814183bSBram Moolenaar    au FileType qf :call assert_fails(':cclose', 'E788')
24411814183bSBram Moolenaar  augroup END
24421814183bSBram Moolenaar  copen
24431814183bSBram Moolenaar  augroup QF_Test
24441814183bSBram Moolenaar    au!
24451814183bSBram Moolenaar  augroup END
24461814183bSBram Moolenaar  augroup! QF_Test
24471814183bSBram Moolenaar  call test_override('starting', 0)
24481814183bSBram Moolenaarendfunc
24499c4fefffSBram Moolenaar
24509c4fefffSBram Moolenaarfunc Test_resize_from_copen()
24519c4fefffSBram Moolenaar    augroup QF_Test
24529c4fefffSBram Moolenaar	au!
24539c4fefffSBram Moolenaar        au FileType qf resize 5
24549c4fefffSBram Moolenaar    augroup END
24559c4fefffSBram Moolenaar    try
24569c4fefffSBram Moolenaar	" This should succeed without any exception.  No other buffers are
24579c4fefffSBram Moolenaar	" involved in the autocmd.
24589c4fefffSBram Moolenaar	copen
24599c4fefffSBram Moolenaar    finally
24609c4fefffSBram Moolenaar	augroup QF_Test
24619c4fefffSBram Moolenaar	    au!
24629c4fefffSBram Moolenaar	augroup END
24639c4fefffSBram Moolenaar	augroup! QF_Test
24649c4fefffSBram Moolenaar    endtry
24659c4fefffSBram Moolenaarendfunc
2466a8788f4dSBram Moolenaar
2467a8788f4dSBram Moolenaar" Tests for the quickfix buffer b:changedtick variable
2468a8788f4dSBram Moolenaarfunc Xchangedtick_tests(cchar)
2469a8788f4dSBram Moolenaar  call s:setup_commands(a:cchar)
2470a8788f4dSBram Moolenaar
2471a8788f4dSBram Moolenaar  new | only
2472a8788f4dSBram Moolenaar
2473a8788f4dSBram Moolenaar  Xexpr "" | Xexpr "" | Xexpr ""
2474a8788f4dSBram Moolenaar
2475a8788f4dSBram Moolenaar  Xopen
2476a8788f4dSBram Moolenaar  Xolder
2477a8788f4dSBram Moolenaar  Xolder
2478a8788f4dSBram Moolenaar  Xaddexpr "F1:10:Line10"
2479a8788f4dSBram Moolenaar  Xaddexpr "F2:20:Line20"
2480a8788f4dSBram Moolenaar  call g:Xsetlist([{"filename":"F3", "lnum":30, "text":"Line30"}], 'a')
2481a8788f4dSBram Moolenaar  call g:Xsetlist([], 'f')
2482a8788f4dSBram Moolenaar  call assert_equal(8, getbufvar('%', 'changedtick'))
2483a8788f4dSBram Moolenaar  Xclose
2484a8788f4dSBram Moolenaarendfunc
2485a8788f4dSBram Moolenaar
2486a8788f4dSBram Moolenaarfunc Test_changedtick()
2487a8788f4dSBram Moolenaar  call Xchangedtick_tests('c')
2488a8788f4dSBram Moolenaar  call Xchangedtick_tests('l')
2489a8788f4dSBram Moolenaarendfunc
2490d28cc3f5SBram Moolenaar
2491ae338338SBram Moolenaar" Tests for parsing an expression using setqflist()
2492ae338338SBram Moolenaarfunc Xsetexpr_tests(cchar)
2493ae338338SBram Moolenaar  call s:setup_commands(a:cchar)
2494ae338338SBram Moolenaar
2495ae338338SBram Moolenaar  let t = ["File1:10:Line10", "File1:20:Line20"]
24962c809b7cSBram Moolenaar  call g:Xsetlist([], ' ', {'lines' : t})
24972c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'lines' : ["File1:30:Line30"]})
2498ae338338SBram Moolenaar
2499ae338338SBram Moolenaar  let l = g:Xgetlist()
2500ae338338SBram Moolenaar  call assert_equal(3, len(l))
2501ae338338SBram Moolenaar  call assert_equal(20, l[1].lnum)
2502ae338338SBram Moolenaar  call assert_equal('Line30', l[2].text)
25032c809b7cSBram Moolenaar  call g:Xsetlist([], 'r', {'lines' : ["File2:5:Line5"]})
2504ae338338SBram Moolenaar  let l = g:Xgetlist()
2505ae338338SBram Moolenaar  call assert_equal(1, len(l))
2506ae338338SBram Moolenaar  call assert_equal('Line5', l[0].text)
25072c809b7cSBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : 10}))
25082c809b7cSBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : "F1:10:L10"}))
2509ae338338SBram Moolenaar
2510ae338338SBram Moolenaar  call g:Xsetlist([], 'f')
2511ae338338SBram Moolenaar  " Add entries to multiple lists
25122c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:10:Line10"]})
25132c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:20:Line20"]})
25142c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:15:Line15"]})
25152c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:25:Line25"]})
2516ae338338SBram Moolenaar  call assert_equal('Line15', g:Xgetlist({'nr':1, 'items':1}).items[1].text)
2517ae338338SBram Moolenaar  call assert_equal('Line25', g:Xgetlist({'nr':2, 'items':1}).items[1].text)
251836538225SBram Moolenaar
251936538225SBram Moolenaar  " Adding entries using a custom efm
252036538225SBram Moolenaar  set efm&
252136538225SBram Moolenaar  call g:Xsetlist([], ' ', {'efm' : '%f#%l#%m',
252236538225SBram Moolenaar				\ 'lines' : ["F1#10#L10", "F2#20#L20"]})
252336538225SBram Moolenaar  call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
252436538225SBram Moolenaar  call g:Xsetlist([], 'a', {'efm' : '%f#%l#%m', 'lines' : ["F3:30:L30"]})
252536538225SBram Moolenaar  call assert_equal('F3:30:L30', g:Xgetlist({'items':1}).items[2].text)
252636538225SBram Moolenaar  call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
252736538225SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'efm' : [],
252836538225SBram Moolenaar				\ 'lines' : ['F1:10:L10']}))
2529ae338338SBram Moolenaarendfunc
2530ae338338SBram Moolenaar
2531ae338338SBram Moolenaarfunc Test_setexpr()
2532ae338338SBram Moolenaar  call Xsetexpr_tests('c')
2533ae338338SBram Moolenaar  call Xsetexpr_tests('l')
2534ae338338SBram Moolenaarendfunc
2535ae338338SBram Moolenaar
2536ae338338SBram Moolenaar" Tests for per quickfix/location list directory stack
2537ae338338SBram Moolenaarfunc Xmultidirstack_tests(cchar)
2538ae338338SBram Moolenaar  call s:setup_commands(a:cchar)
2539ae338338SBram Moolenaar
2540ae338338SBram Moolenaar  call g:Xsetlist([], 'f')
2541ae338338SBram Moolenaar  Xexpr "" | Xexpr ""
2542ae338338SBram Moolenaar
25432c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["Entering dir 'Xone/a'"]})
25442c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["Entering dir 'Xtwo/a'"]})
25452c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["one.txt:3:one one one"]})
25462c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["two.txt:5:two two two"]})
2547ae338338SBram Moolenaar
2548ae338338SBram Moolenaar  let l1 = g:Xgetlist({'nr':1, 'items':1})
2549ae338338SBram Moolenaar  let l2 = g:Xgetlist({'nr':2, 'items':1})
2550ae338338SBram Moolenaar  call assert_equal('Xone/a/one.txt', bufname(l1.items[1].bufnr))
2551ae338338SBram Moolenaar  call assert_equal(3, l1.items[1].lnum)
2552ae338338SBram Moolenaar  call assert_equal('Xtwo/a/two.txt', bufname(l2.items[1].bufnr))
2553ae338338SBram Moolenaar  call assert_equal(5, l2.items[1].lnum)
2554ae338338SBram Moolenaarendfunc
2555ae338338SBram Moolenaar
2556ae338338SBram Moolenaarfunc Test_multidirstack()
2557ae338338SBram Moolenaar  call mkdir('Xone/a', 'p')
2558ae338338SBram Moolenaar  call mkdir('Xtwo/a', 'p')
2559ae338338SBram Moolenaar  let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
2560ae338338SBram Moolenaar  call writefile(lines, 'Xone/a/one.txt')
2561ae338338SBram Moolenaar  call writefile(lines, 'Xtwo/a/two.txt')
2562ae338338SBram Moolenaar  let save_efm = &efm
2563ae338338SBram Moolenaar  set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
2564ae338338SBram Moolenaar
2565ae338338SBram Moolenaar  call Xmultidirstack_tests('c')
2566ae338338SBram Moolenaar  call Xmultidirstack_tests('l')
2567ae338338SBram Moolenaar
2568ae338338SBram Moolenaar  let &efm = save_efm
2569ae338338SBram Moolenaar  call delete('Xone', 'rf')
2570ae338338SBram Moolenaar  call delete('Xtwo', 'rf')
2571ae338338SBram Moolenaarendfunc
2572ae338338SBram Moolenaar
2573ae338338SBram Moolenaar" Tests for per quickfix/location list file stack
2574ae338338SBram Moolenaarfunc Xmultifilestack_tests(cchar)
2575ae338338SBram Moolenaar  call s:setup_commands(a:cchar)
2576ae338338SBram Moolenaar
2577ae338338SBram Moolenaar  call g:Xsetlist([], 'f')
2578ae338338SBram Moolenaar  Xexpr "" | Xexpr ""
2579ae338338SBram Moolenaar
25802c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["[one.txt]"]})
25812c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["[two.txt]"]})
25822c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["(3,5) one one one"]})
25832c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["(5,9) two two two"]})
2584ae338338SBram Moolenaar
2585ae338338SBram Moolenaar  let l1 = g:Xgetlist({'nr':1, 'items':1})
2586ae338338SBram Moolenaar  let l2 = g:Xgetlist({'nr':2, 'items':1})
2587ae338338SBram Moolenaar  call assert_equal('one.txt', bufname(l1.items[1].bufnr))
2588ae338338SBram Moolenaar  call assert_equal(3, l1.items[1].lnum)
2589ae338338SBram Moolenaar  call assert_equal('two.txt', bufname(l2.items[1].bufnr))
2590ae338338SBram Moolenaar  call assert_equal(5, l2.items[1].lnum)
2591e333e79fSBram Moolenaar
2592e333e79fSBram Moolenaar  " Test for start of a new error line in the same line where a previous
2593e333e79fSBram Moolenaar  " error line ends with a file stack.
2594e333e79fSBram Moolenaar  let efm_val = 'Error\ l%l\ in\ %f,'
2595e333e79fSBram Moolenaar  let efm_val .= '%-P%>(%f%r,Error\ l%l\ in\ %m,%-Q)%r'
2596e333e79fSBram Moolenaar  let l = g:Xgetlist({'lines' : [
2597e333e79fSBram Moolenaar	      \ '(one.txt',
2598e333e79fSBram Moolenaar	      \ 'Error l4 in one.txt',
2599e333e79fSBram Moolenaar	      \ ') (two.txt',
2600e333e79fSBram Moolenaar	      \ 'Error l6 in two.txt',
2601e333e79fSBram Moolenaar	      \ ')',
2602e333e79fSBram Moolenaar	      \ 'Error l8 in one.txt'
2603e333e79fSBram Moolenaar	      \ ], 'efm' : efm_val})
2604e333e79fSBram Moolenaar  call assert_equal(3, len(l.items))
2605e333e79fSBram Moolenaar  call assert_equal('one.txt', bufname(l.items[0].bufnr))
2606e333e79fSBram Moolenaar  call assert_equal(4, l.items[0].lnum)
2607e333e79fSBram Moolenaar  call assert_equal('one.txt', l.items[0].text)
2608e333e79fSBram Moolenaar  call assert_equal('two.txt', bufname(l.items[1].bufnr))
2609e333e79fSBram Moolenaar  call assert_equal(6, l.items[1].lnum)
2610e333e79fSBram Moolenaar  call assert_equal('two.txt', l.items[1].text)
2611e333e79fSBram Moolenaar  call assert_equal('one.txt', bufname(l.items[2].bufnr))
2612e333e79fSBram Moolenaar  call assert_equal(8, l.items[2].lnum)
2613e333e79fSBram Moolenaar  call assert_equal('', l.items[2].text)
2614ae338338SBram Moolenaarendfunc
2615ae338338SBram Moolenaar
2616ae338338SBram Moolenaarfunc Test_multifilestack()
2617ae338338SBram Moolenaar  let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
2618ae338338SBram Moolenaar  call writefile(lines, 'one.txt')
2619ae338338SBram Moolenaar  call writefile(lines, 'two.txt')
2620ae338338SBram Moolenaar  let save_efm = &efm
2621ae338338SBram Moolenaar  set efm=%+P[%f],(%l\\,%c)\ %m,%-Q
2622ae338338SBram Moolenaar
2623ae338338SBram Moolenaar  call Xmultifilestack_tests('c')
2624ae338338SBram Moolenaar  call Xmultifilestack_tests('l')
2625ae338338SBram Moolenaar
2626ae338338SBram Moolenaar  let &efm = save_efm
2627ae338338SBram Moolenaar  call delete('one.txt')
2628ae338338SBram Moolenaar  call delete('two.txt')
2629ae338338SBram Moolenaarendfunc
2630ae338338SBram Moolenaar
2631ae338338SBram Moolenaar" Tests for per buffer 'efm' setting
2632ae338338SBram Moolenaarfunc Test_perbuf_efm()
2633ae338338SBram Moolenaar  call writefile(["File1-10-Line10"], 'one.txt')
2634ae338338SBram Moolenaar  call writefile(["File2#20#Line20"], 'two.txt')
2635ae338338SBram Moolenaar  set efm=%f#%l#%m
2636ae338338SBram Moolenaar  new | only
2637ae338338SBram Moolenaar  new
2638ae338338SBram Moolenaar  setlocal efm=%f-%l-%m
2639ae338338SBram Moolenaar  cfile one.txt
2640ae338338SBram Moolenaar  wincmd w
2641ae338338SBram Moolenaar  caddfile two.txt
2642ae338338SBram Moolenaar
2643ae338338SBram Moolenaar  let l = getqflist()
2644ae338338SBram Moolenaar  call assert_equal(10, l[0].lnum)
2645ae338338SBram Moolenaar  call assert_equal('Line20', l[1].text)
2646ae338338SBram Moolenaar
2647ae338338SBram Moolenaar  set efm&
2648ae338338SBram Moolenaar  new | only
2649ae338338SBram Moolenaar  call delete('one.txt')
2650ae338338SBram Moolenaar  call delete('two.txt')
2651ae338338SBram Moolenaarendfunc
2652ae338338SBram Moolenaar
2653d28cc3f5SBram Moolenaar" Open multiple help windows using ":lhelpgrep
2654d28cc3f5SBram Moolenaar" This test used to crash Vim
2655d28cc3f5SBram Moolenaarfunc Test_Multi_LL_Help()
2656d28cc3f5SBram Moolenaar    new | only
2657d28cc3f5SBram Moolenaar    lhelpgrep window
2658d28cc3f5SBram Moolenaar    lopen
2659d28cc3f5SBram Moolenaar    e#
2660d28cc3f5SBram Moolenaar    lhelpgrep buffer
2661d28cc3f5SBram Moolenaar    call assert_equal(3, winnr('$'))
2662d28cc3f5SBram Moolenaar    call assert_true(len(getloclist(1)) != 0)
2663d28cc3f5SBram Moolenaar    call assert_true(len(getloclist(2)) != 0)
2664d28cc3f5SBram Moolenaar    new | only
2665d28cc3f5SBram Moolenaarendfunc
266655b69264SBram Moolenaar
266755b69264SBram Moolenaar" Tests for adding new quickfix lists using setqflist()
266855b69264SBram Moolenaarfunc XaddQf_tests(cchar)
266955b69264SBram Moolenaar  call s:setup_commands(a:cchar)
267055b69264SBram Moolenaar
267155b69264SBram Moolenaar  " Create a new list using ' ' for action
267255b69264SBram Moolenaar  call g:Xsetlist([], 'f')
267355b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'title' : 'Test1'})
267455b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
267555b69264SBram Moolenaar  call assert_equal(1, l.nr)
267655b69264SBram Moolenaar  call assert_equal('Test1', l.title)
267755b69264SBram Moolenaar
267855b69264SBram Moolenaar  " Create a new list using ' ' for action and '$' for 'nr'
267955b69264SBram Moolenaar  call g:Xsetlist([], 'f')
268055b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'title' : 'Test2', 'nr' : '$'})
268155b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
268255b69264SBram Moolenaar  call assert_equal(1, l.nr)
268355b69264SBram Moolenaar  call assert_equal('Test2', l.title)
268455b69264SBram Moolenaar
268555b69264SBram Moolenaar  " Create a new list using 'a' for action
268655b69264SBram Moolenaar  call g:Xsetlist([], 'f')
268755b69264SBram Moolenaar  call g:Xsetlist([], 'a', {'title' : 'Test3'})
268855b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
268955b69264SBram Moolenaar  call assert_equal(1, l.nr)
269055b69264SBram Moolenaar  call assert_equal('Test3', l.title)
269155b69264SBram Moolenaar
269255b69264SBram Moolenaar  " Create a new list using 'a' for action and '$' for 'nr'
269355b69264SBram Moolenaar  call g:Xsetlist([], 'f')
269455b69264SBram Moolenaar  call g:Xsetlist([], 'a', {'title' : 'Test3', 'nr' : '$'})
269555b69264SBram Moolenaar  call g:Xsetlist([], 'a', {'title' : 'Test4'})
269655b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
269755b69264SBram Moolenaar  call assert_equal(1, l.nr)
269855b69264SBram Moolenaar  call assert_equal('Test4', l.title)
269955b69264SBram Moolenaar
270055b69264SBram Moolenaar  " Adding a quickfix list should remove all the lists following the current
270155b69264SBram Moolenaar  " list.
270255b69264SBram Moolenaar  Xexpr "" | Xexpr "" | Xexpr ""
270355b69264SBram Moolenaar  silent! 10Xolder
270455b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'title' : 'Test5'})
270555b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
270655b69264SBram Moolenaar  call assert_equal(2, l.nr)
270755b69264SBram Moolenaar  call assert_equal('Test5', l.title)
270855b69264SBram Moolenaar
270955b69264SBram Moolenaar  " Add a quickfix list using '$' as the list number.
271055b69264SBram Moolenaar  let lastqf = g:Xgetlist({'nr':'$'}).nr
271155b69264SBram Moolenaar  silent! 99Xolder
271255b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test6'})
271355b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
271455b69264SBram Moolenaar  call assert_equal(lastqf + 1, l.nr)
271555b69264SBram Moolenaar  call assert_equal('Test6', l.title)
271655b69264SBram Moolenaar
271755b69264SBram Moolenaar  " Add a quickfix list using 'nr' set to one more than the quickfix
271855b69264SBram Moolenaar  " list size.
271955b69264SBram Moolenaar  let lastqf = g:Xgetlist({'nr':'$'}).nr
272055b69264SBram Moolenaar  silent! 99Xolder
272155b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'nr' : lastqf + 1, 'title' : 'Test7'})
272255b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
272355b69264SBram Moolenaar  call assert_equal(lastqf + 1, l.nr)
272455b69264SBram Moolenaar  call assert_equal('Test7', l.title)
272555b69264SBram Moolenaar
272655b69264SBram Moolenaar  " Add a quickfix list to a stack with 10 lists using 'nr' set to '$'
272755b69264SBram Moolenaar  exe repeat('Xexpr "" |', 9) . 'Xexpr ""'
272855b69264SBram Moolenaar  silent! 99Xolder
272955b69264SBram Moolenaar  call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test8'})
273055b69264SBram Moolenaar  let l = g:Xgetlist({'nr' : '$', 'all' : 1})
273155b69264SBram Moolenaar  call assert_equal(10, l.nr)
273255b69264SBram Moolenaar  call assert_equal('Test8', l.title)
273355b69264SBram Moolenaar
273455b69264SBram Moolenaar  " Add a quickfix list using 'nr' set to a value greater than 10
273555b69264SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 12, 'title' : 'Test9'}))
273655b69264SBram Moolenaar
273755b69264SBram Moolenaar  " Try adding a quickfix list with 'nr' set to a value greater than the
273855b69264SBram Moolenaar  " quickfix list size but less than 10.
273955b69264SBram Moolenaar  call g:Xsetlist([], 'f')
274055b69264SBram Moolenaar  Xexpr "" | Xexpr "" | Xexpr ""
274155b69264SBram Moolenaar  silent! 99Xolder
274255b69264SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 8, 'title' : 'Test10'}))
274355b69264SBram Moolenaar
274455b69264SBram Moolenaar  " Add a quickfix list using 'nr' set to a some string or list
274555b69264SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : [1,2], 'title' : 'Test11'}))
274655b69264SBram Moolenaarendfunc
274755b69264SBram Moolenaar
274855b69264SBram Moolenaarfunc Test_add_qf()
274955b69264SBram Moolenaar  call XaddQf_tests('c')
275055b69264SBram Moolenaar  call XaddQf_tests('l')
275155b69264SBram Moolenaarendfunc
27527adf06f4SBram Moolenaar
27537adf06f4SBram Moolenaar" Test for getting the quickfix list items from some text without modifying
27547adf06f4SBram Moolenaar" the quickfix stack
27552c809b7cSBram Moolenaarfunc XgetListFromLines(cchar)
27567adf06f4SBram Moolenaar  call s:setup_commands(a:cchar)
27577adf06f4SBram Moolenaar  call g:Xsetlist([], 'f')
27587adf06f4SBram Moolenaar
27592c809b7cSBram Moolenaar  let l = g:Xgetlist({'lines' : ["File2:20:Line20", "File2:30:Line30"]}).items
27607adf06f4SBram Moolenaar  call assert_equal(2, len(l))
27617adf06f4SBram Moolenaar  call assert_equal(30, l[1].lnum)
27627adf06f4SBram Moolenaar
27632c809b7cSBram Moolenaar  call assert_equal({}, g:Xgetlist({'lines' : 10}))
27642c809b7cSBram Moolenaar  call assert_equal({}, g:Xgetlist({'lines' : 'File1:10:Line10'}))
27652c809b7cSBram Moolenaar  call assert_equal([], g:Xgetlist({'lines' : []}).items)
27662c809b7cSBram Moolenaar  call assert_equal([], g:Xgetlist({'lines' : [10, 20]}).items)
27677adf06f4SBram Moolenaar
276836538225SBram Moolenaar  " Parse text using a custom efm
276936538225SBram Moolenaar  set efm&
277036538225SBram Moolenaar  let l = g:Xgetlist({'lines':['File3#30#Line30'], 'efm' : '%f#%l#%m'}).items
277136538225SBram Moolenaar  call assert_equal('Line30', l[0].text)
277236538225SBram Moolenaar  let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : '%f-%l-%m'}).items
277336538225SBram Moolenaar  call assert_equal('File3:30:Line30', l[0].text)
277436538225SBram Moolenaar  let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : [1,2]})
277536538225SBram Moolenaar  call assert_equal({}, l)
277636538225SBram Moolenaar  call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':'%2'})", 'E376:')
277736538225SBram Moolenaar  call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':''})", 'E378:')
277836538225SBram Moolenaar
27797adf06f4SBram Moolenaar  " Make sure that the quickfix stack is not modified
27807adf06f4SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
27817adf06f4SBram Moolenaarendfunc
27827adf06f4SBram Moolenaar
27832c809b7cSBram Moolenaarfunc Test_get_list_from_lines()
27842c809b7cSBram Moolenaar  call XgetListFromLines('c')
27852c809b7cSBram Moolenaar  call XgetListFromLines('l')
27867adf06f4SBram Moolenaarendfunc
2787a539f4f1SBram Moolenaar
2788a539f4f1SBram Moolenaar" Tests for the quickfix list id
2789a539f4f1SBram Moolenaarfunc Xqfid_tests(cchar)
2790a539f4f1SBram Moolenaar  call s:setup_commands(a:cchar)
2791a539f4f1SBram Moolenaar
2792a539f4f1SBram Moolenaar  call g:Xsetlist([], 'f')
2793a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':0}).id)
2794a539f4f1SBram Moolenaar  Xexpr ''
2795a539f4f1SBram Moolenaar  let start_id = g:Xgetlist({'id' : 0}).id
2796a539f4f1SBram Moolenaar  Xexpr '' | Xexpr ''
2797a539f4f1SBram Moolenaar  Xolder
2798a539f4f1SBram Moolenaar  call assert_equal(start_id, g:Xgetlist({'id':0, 'nr':1}).id)
2799a539f4f1SBram Moolenaar  call assert_equal(start_id + 1, g:Xgetlist({'id':0, 'nr':0}).id)
2800a539f4f1SBram Moolenaar  call assert_equal(start_id + 2, g:Xgetlist({'id':0, 'nr':'$'}).id)
2801a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':0, 'nr':99}).id)
2802a539f4f1SBram Moolenaar  call assert_equal(2, g:Xgetlist({'id':start_id + 1, 'nr':0}).nr)
2803a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':99, 'nr':0}).id)
2804a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':"abc", 'nr':0}).id)
2805a539f4f1SBram Moolenaar
2806a539f4f1SBram Moolenaar  call g:Xsetlist([], 'a', {'id':start_id, 'context':[1,2]})
2807a539f4f1SBram Moolenaar  call assert_equal([1,2], g:Xgetlist({'nr':1, 'context':1}).context)
28082c809b7cSBram Moolenaar  call g:Xsetlist([], 'a', {'id':start_id+1, 'lines':['F1:10:L10']})
2809a539f4f1SBram Moolenaar  call assert_equal('L10', g:Xgetlist({'nr':2, 'items':1}).items[0].text)
2810a539f4f1SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'id':999, 'title':'Vim'}))
2811a539f4f1SBram Moolenaar  call assert_equal(-1, g:Xsetlist([], 'a', {'id':'abc', 'title':'Vim'}))
2812a539f4f1SBram Moolenaar
2813a539f4f1SBram Moolenaar  let qfid = g:Xgetlist({'id':0, 'nr':0})
2814a539f4f1SBram Moolenaar  call g:Xsetlist([], 'f')
2815a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id':qfid, 'nr':0}).id)
2816a539f4f1SBram Moolenaarendfunc
2817a539f4f1SBram Moolenaar
2818a539f4f1SBram Moolenaarfunc Test_qf_id()
2819a539f4f1SBram Moolenaar  call Xqfid_tests('c')
2820a539f4f1SBram Moolenaar  call Xqfid_tests('l')
2821a539f4f1SBram Moolenaarendfunc
282274240d3fSBram Moolenaar
282374240d3fSBram Moolenaarfunc Xqfjump_tests(cchar)
282474240d3fSBram Moolenaar  call s:setup_commands(a:cchar)
282574240d3fSBram Moolenaar
282674240d3fSBram Moolenaar  call writefile(["Line1\tFoo", "Line2"], 'F1')
282774240d3fSBram Moolenaar  call writefile(["Line1\tBar", "Line2"], 'F2')
282874240d3fSBram Moolenaar  call writefile(["Line1\tBaz", "Line2"], 'F3')
282974240d3fSBram Moolenaar
283074240d3fSBram Moolenaar  call g:Xsetlist([], 'f')
283174240d3fSBram Moolenaar
283274240d3fSBram Moolenaar  " Tests for
283374240d3fSBram Moolenaar  "   Jumping to a line using a pattern
283474240d3fSBram Moolenaar  "   Jumping to a column greater than the last column in a line
283574240d3fSBram Moolenaar  "   Jumping to a line greater than the last line in the file
283674240d3fSBram Moolenaar  let l = []
283774240d3fSBram Moolenaar  for i in range(1, 7)
283874240d3fSBram Moolenaar    call add(l, {})
283974240d3fSBram Moolenaar  endfor
284074240d3fSBram Moolenaar  let l[0].filename='F1'
284174240d3fSBram Moolenaar  let l[0].pattern='Line1'
284274240d3fSBram Moolenaar  let l[1].filename='F2'
284374240d3fSBram Moolenaar  let l[1].pattern='Line1'
284474240d3fSBram Moolenaar  let l[2].filename='F3'
284574240d3fSBram Moolenaar  let l[2].pattern='Line1'
284674240d3fSBram Moolenaar  let l[3].filename='F3'
284774240d3fSBram Moolenaar  let l[3].lnum=1
284874240d3fSBram Moolenaar  let l[3].col=9
284974240d3fSBram Moolenaar  let l[3].vcol=1
285074240d3fSBram Moolenaar  let l[4].filename='F3'
285174240d3fSBram Moolenaar  let l[4].lnum=99
285274240d3fSBram Moolenaar  let l[5].filename='F3'
285374240d3fSBram Moolenaar  let l[5].lnum=1
285474240d3fSBram Moolenaar  let l[5].col=99
285574240d3fSBram Moolenaar  let l[5].vcol=1
285674240d3fSBram Moolenaar  let l[6].filename='F3'
285774240d3fSBram Moolenaar  let l[6].pattern='abcxyz'
285874240d3fSBram Moolenaar
285974240d3fSBram Moolenaar  call g:Xsetlist([], ' ', {'items' : l})
286074240d3fSBram Moolenaar  Xopen | only
286174240d3fSBram Moolenaar  2Xnext
286274240d3fSBram Moolenaar  call assert_equal(3, g:Xgetlist({'idx' : 0}).idx)
286374240d3fSBram Moolenaar  call assert_equal('F3', bufname('%'))
286474240d3fSBram Moolenaar  Xnext
286574240d3fSBram Moolenaar  call assert_equal(7, col('.'))
286674240d3fSBram Moolenaar  Xnext
286774240d3fSBram Moolenaar  call assert_equal(2, line('.'))
286874240d3fSBram Moolenaar  Xnext
286974240d3fSBram Moolenaar  call assert_equal(9, col('.'))
287074240d3fSBram Moolenaar  2
287174240d3fSBram Moolenaar  Xnext
287274240d3fSBram Moolenaar  call assert_equal(2, line('.'))
287374240d3fSBram Moolenaar
287474240d3fSBram Moolenaar  if a:cchar == 'l'
287574240d3fSBram Moolenaar    " When jumping to a location list entry in the location list window and
287674240d3fSBram Moolenaar    " no usable windows are available, then a new window should be opened.
287774240d3fSBram Moolenaar    enew! | new | only
287874240d3fSBram Moolenaar    call g:Xsetlist([], 'f')
287974240d3fSBram Moolenaar    setlocal buftype=nofile
288074240d3fSBram Moolenaar    new
288174240d3fSBram 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']})
288274240d3fSBram Moolenaar    Xopen
288374240d3fSBram Moolenaar    let winid = win_getid()
288474240d3fSBram Moolenaar    wincmd p
288574240d3fSBram Moolenaar    close
288674240d3fSBram Moolenaar    call win_gotoid(winid)
288774240d3fSBram Moolenaar    Xnext
288874240d3fSBram Moolenaar    call assert_equal(3, winnr('$'))
288974240d3fSBram Moolenaar    call assert_equal(1, winnr())
289074240d3fSBram Moolenaar    call assert_equal(2, line('.'))
289174240d3fSBram Moolenaar
289274240d3fSBram Moolenaar    " When jumping to an entry in the location list window and the window
289374240d3fSBram Moolenaar    " associated with the location list is not present and a window containing
289474240d3fSBram Moolenaar    " the file is already present, then that window should be used.
289574240d3fSBram Moolenaar    close
289674240d3fSBram Moolenaar    belowright new
289774240d3fSBram Moolenaar    call g:Xsetlist([], 'f')
289874240d3fSBram Moolenaar    edit F3
289974240d3fSBram Moolenaar    call win_gotoid(winid)
290074240d3fSBram Moolenaar    Xlast
290174240d3fSBram Moolenaar    call assert_equal(3, winnr())
290274240d3fSBram Moolenaar    call assert_equal(6, g:Xgetlist({'size' : 1}).size)
290374240d3fSBram Moolenaar    call assert_equal(winid, g:Xgetlist({'winid' : 1}).winid)
290474240d3fSBram Moolenaar  endif
290574240d3fSBram Moolenaar
290674240d3fSBram Moolenaar  " Cleanup
290774240d3fSBram Moolenaar  enew!
290874240d3fSBram Moolenaar  new | only
290974240d3fSBram Moolenaar
291074240d3fSBram Moolenaar  call delete('F1')
291174240d3fSBram Moolenaar  call delete('F2')
291274240d3fSBram Moolenaar  call delete('F3')
291374240d3fSBram Moolenaarendfunc
291474240d3fSBram Moolenaar
291574240d3fSBram Moolenaarfunc Test_qfjump()
291674240d3fSBram Moolenaar  call Xqfjump_tests('c')
291774240d3fSBram Moolenaar  call Xqfjump_tests('l')
291874240d3fSBram Moolenaarendfunc
2919a6d4849cSBram Moolenaar
2920a6d4849cSBram Moolenaar" Tests for the getqflist() and getloclist() functions when the list is not
2921a6d4849cSBram Moolenaar" present or is empty
2922a6d4849cSBram Moolenaarfunc Xgetlist_empty_tests(cchar)
2923a6d4849cSBram Moolenaar  call s:setup_commands(a:cchar)
2924a6d4849cSBram Moolenaar
2925a6d4849cSBram Moolenaar  " Empty quickfix stack
2926a6d4849cSBram Moolenaar  call g:Xsetlist([], 'f')
2927a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'context' : 0}).context)
2928a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : 0}).id)
2929a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
2930a6d4849cSBram Moolenaar  call assert_equal([], g:Xgetlist({'items' : 0}).items)
2931a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 0}).nr)
2932a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'size' : 0}).size)
2933a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'title' : 0}).title)
2934a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
2935b254af31SBram Moolenaar  call assert_equal(0, g:Xgetlist({'changedtick' : 0}).changedtick)
2936b254af31SBram Moolenaar  call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0, 'changedtick': 0}, g:Xgetlist({'all' : 0}))
2937a6d4849cSBram Moolenaar
29382ec364e9SBram Moolenaar  " Quickfix window with empty stack
29392ec364e9SBram Moolenaar  silent! Xopen
29402ec364e9SBram Moolenaar  let qfwinid = (a:cchar == 'c') ? win_getid() : 0
29412ec364e9SBram Moolenaar  call assert_equal(qfwinid, g:Xgetlist({'winid' : 0}).winid)
29422ec364e9SBram Moolenaar  Xclose
29432ec364e9SBram Moolenaar
2944a6d4849cSBram Moolenaar  " Empty quickfix list
2945a6d4849cSBram Moolenaar  Xexpr ""
2946a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'context' : 0}).context)
2947a6d4849cSBram Moolenaar  call assert_notequal(0, g:Xgetlist({'id' : 0}).id)
2948a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
2949a6d4849cSBram Moolenaar  call assert_equal([], g:Xgetlist({'items' : 0}).items)
2950a6d4849cSBram Moolenaar  call assert_notequal(0, g:Xgetlist({'nr' : 0}).nr)
2951a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'size' : 0}).size)
2952a6d4849cSBram Moolenaar  call assert_notequal('', g:Xgetlist({'title' : 0}).title)
2953a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
2954b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
2955a6d4849cSBram Moolenaar
2956a6d4849cSBram Moolenaar  let qfid = g:Xgetlist({'id' : 0}).id
2957a6d4849cSBram Moolenaar  call g:Xsetlist([], 'f')
2958a6d4849cSBram Moolenaar
2959a6d4849cSBram Moolenaar  " Non-existing quickfix identifier
2960a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'id' : qfid, 'context' : 0}).context)
2961a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid}).id)
2962a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'idx' : 0}).idx)
2963a6d4849cSBram Moolenaar  call assert_equal([], g:Xgetlist({'id' : qfid, 'items' : 0}).items)
2964a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'nr' : 0}).nr)
2965a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'size' : 0}).size)
2966a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'id' : qfid, 'title' : 0}).title)
2967a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'winid' : 0}).winid)
2968b254af31SBram Moolenaar  call assert_equal(0, g:Xgetlist({'id' : qfid, 'changedtick' : 0}).changedtick)
2969b254af31SBram Moolenaar  call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0, 'changedtick' : 0}, g:Xgetlist({'id' : qfid, 'all' : 0}))
2970a6d4849cSBram Moolenaar
2971a6d4849cSBram Moolenaar  " Non-existing quickfix list number
2972a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'nr' : 5, 'context' : 0}).context)
2973a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5}).nr)
2974a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'idx' : 0}).idx)
2975a6d4849cSBram Moolenaar  call assert_equal([], g:Xgetlist({'nr' : 5, 'items' : 0}).items)
2976a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'id' : 0}).id)
2977a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'size' : 0}).size)
2978a6d4849cSBram Moolenaar  call assert_equal('', g:Xgetlist({'nr' : 5, 'title' : 0}).title)
2979a6d4849cSBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'winid' : 0}).winid)
2980b254af31SBram Moolenaar  call assert_equal(0, g:Xgetlist({'nr' : 5, 'changedtick' : 0}).changedtick)
2981b254af31SBram Moolenaar  call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0, 'changedtick' : 0}, g:Xgetlist({'nr' : 5, 'all' : 0}))
2982a6d4849cSBram Moolenaarendfunc
2983a6d4849cSBram Moolenaar
2984a6d4849cSBram Moolenaarfunc Test_getqflist()
2985a6d4849cSBram Moolenaar  call Xgetlist_empty_tests('c')
2986a6d4849cSBram Moolenaar  call Xgetlist_empty_tests('l')
2987a6d4849cSBram Moolenaarendfunc
2988b254af31SBram Moolenaar
2989a0ca7d00SBram Moolenaarfunc Test_getqflist_invalid_nr()
2990a0ca7d00SBram Moolenaar  " The following commands used to crash Vim
2991a0ca7d00SBram Moolenaar  cexpr ""
2992a0ca7d00SBram Moolenaar  call getqflist({'nr' : $XXX_DOES_NOT_EXIST_XXX})
2993a0ca7d00SBram Moolenaar
2994a0ca7d00SBram Moolenaar  " Cleanup
2995a0ca7d00SBram Moolenaar  call setqflist([], 'r')
2996a0ca7d00SBram Moolenaarendfunc
2997a0ca7d00SBram Moolenaar
2998b254af31SBram Moolenaar" Tests for the quickfix/location list changedtick
2999b254af31SBram Moolenaarfunc Xqftick_tests(cchar)
3000b254af31SBram Moolenaar  call s:setup_commands(a:cchar)
3001b254af31SBram Moolenaar
3002b254af31SBram Moolenaar  call g:Xsetlist([], 'f')
3003b254af31SBram Moolenaar
3004b254af31SBram Moolenaar  Xexpr "F1:10:Line10"
3005b254af31SBram Moolenaar  let qfid = g:Xgetlist({'id' : 0}).id
3006b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3007b254af31SBram Moolenaar  Xaddexpr "F2:20:Line20\nF2:21:Line21"
3008b254af31SBram Moolenaar  call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3009b254af31SBram Moolenaar  call g:Xsetlist([], 'a', {'lines' : ["F3:30:Line30", "F3:31:Line31"]})
3010b254af31SBram Moolenaar  call assert_equal(3, g:Xgetlist({'changedtick' : 0}).changedtick)
3011b254af31SBram Moolenaar  call g:Xsetlist([], 'r', {'lines' : ["F4:40:Line40"]})
3012b254af31SBram Moolenaar  call assert_equal(4, g:Xgetlist({'changedtick' : 0}).changedtick)
3013b254af31SBram Moolenaar  call g:Xsetlist([], 'a', {'title' : 'New Title'})
3014b254af31SBram Moolenaar  call assert_equal(5, g:Xgetlist({'changedtick' : 0}).changedtick)
3015b254af31SBram Moolenaar
3016b254af31SBram Moolenaar  enew!
3017b254af31SBram Moolenaar  call append(0, ["F5:50:L50", "F6:60:L60"])
3018b254af31SBram Moolenaar  Xaddbuffer
3019b254af31SBram Moolenaar  call assert_equal(6, g:Xgetlist({'changedtick' : 0}).changedtick)
3020b254af31SBram Moolenaar  enew!
3021b254af31SBram Moolenaar
3022b254af31SBram Moolenaar  call g:Xsetlist([], 'a', {'context' : {'bus' : 'pci'}})
3023b254af31SBram Moolenaar  call assert_equal(7, g:Xgetlist({'changedtick' : 0}).changedtick)
3024b254af31SBram Moolenaar  call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3025b254af31SBram Moolenaar	      \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'a')
3026b254af31SBram Moolenaar  call assert_equal(8, g:Xgetlist({'changedtick' : 0}).changedtick)
3027b254af31SBram Moolenaar  call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3028b254af31SBram Moolenaar	      \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], ' ')
3029b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3030b254af31SBram Moolenaar  call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3031b254af31SBram Moolenaar	      \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'r')
3032b254af31SBram Moolenaar  call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3033b254af31SBram Moolenaar
3034b254af31SBram Moolenaar  call writefile(["F8:80:L80", "F8:81:L81"], "Xone")
3035b254af31SBram Moolenaar  Xfile Xone
3036b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3037b254af31SBram Moolenaar  Xaddfile Xone
3038b254af31SBram Moolenaar  call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3039b254af31SBram Moolenaar
3040b254af31SBram Moolenaar  " Test case for updating a non-current quickfix list
3041b254af31SBram Moolenaar  call g:Xsetlist([], 'f')
3042b254af31SBram Moolenaar  Xexpr "F1:1:L1"
3043b254af31SBram Moolenaar  Xexpr "F2:2:L2"
3044b254af31SBram Moolenaar  call g:Xsetlist([], 'a', {'nr' : 1, "lines" : ["F10:10:L10"]})
3045b254af31SBram Moolenaar  call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3046b254af31SBram Moolenaar  call assert_equal(2, g:Xgetlist({'nr' : 1, 'changedtick' : 0}).changedtick)
3047b254af31SBram Moolenaar
3048b254af31SBram Moolenaar  call delete("Xone")
3049b254af31SBram Moolenaarendfunc
3050b254af31SBram Moolenaar
3051b254af31SBram Moolenaarfunc Test_qf_tick()
3052b254af31SBram Moolenaar  call Xqftick_tests('c')
3053b254af31SBram Moolenaar  call Xqftick_tests('l')
3054b254af31SBram Moolenaarendfunc
305512237448SBram Moolenaar
305612237448SBram Moolenaar" The following test used to crash Vim.
305712237448SBram Moolenaar" Open the location list window and close the regular window associated with
305812237448SBram Moolenaar" the location list. When the garbage collection runs now, it incorrectly
305912237448SBram Moolenaar" marks the location list context as not in use and frees the context.
306012237448SBram Moolenaarfunc Test_ll_window_ctx()
306112237448SBram Moolenaar  call setloclist(0, [], 'f')
306212237448SBram Moolenaar  call setloclist(0, [], 'a', {'context' : []})
306312237448SBram Moolenaar  lopen | only
306412237448SBram Moolenaar  call test_garbagecollect_now()
306512237448SBram Moolenaar  echo getloclist(0, {'context' : 1}).context
306612237448SBram Moolenaar  enew | only
306712237448SBram Moolenaarendfunc
306812237448SBram Moolenaar
306914a4deb0SBram Moolenaar" The following test used to crash vim
307014a4deb0SBram Moolenaarfunc Test_lfile_crash()
307114a4deb0SBram Moolenaar  sp Xtest
307214a4deb0SBram Moolenaar  au QuickFixCmdPre * bw
307314a4deb0SBram Moolenaar  call assert_fails('lfile', 'E40')
307414a4deb0SBram Moolenaar  au! QuickFixCmdPre
307514a4deb0SBram Moolenaarendfunc
30763c097226SBram Moolenaar
30773c097226SBram Moolenaar" The following test used to crash vim
30783c097226SBram Moolenaarfunc Test_lbuffer_crash()
30793c097226SBram Moolenaar  sv Xtest
30803c097226SBram Moolenaar  augroup QF_Test
30813c097226SBram Moolenaar    au!
30823c097226SBram Moolenaar    au * * bw
30833c097226SBram Moolenaar  augroup END
30843c097226SBram Moolenaar  lbuffer
30853c097226SBram Moolenaar  augroup QF_Test
30863c097226SBram Moolenaar    au!
30873c097226SBram Moolenaar  augroup END
30883c097226SBram Moolenaarendfunc
30893c097226SBram Moolenaar
30903c097226SBram Moolenaar" The following test used to crash vim
30913c097226SBram Moolenaarfunc Test_lexpr_crash()
30923c097226SBram Moolenaar  augroup QF_Test
30933c097226SBram Moolenaar    au!
30943c097226SBram Moolenaar    au * * call setloclist(0, [], 'f')
30953c097226SBram Moolenaar  augroup END
30963c097226SBram Moolenaar  lexpr ""
30973c097226SBram Moolenaar  augroup QF_Test
30983c097226SBram Moolenaar    au!
30993c097226SBram Moolenaar  augroup END
31003c097226SBram Moolenaar  enew | only
31013c097226SBram Moolenaarendfunc
31023c097226SBram Moolenaar
31033c097226SBram Moolenaar" The following test used to crash Vim
31043c097226SBram Moolenaarfunc Test_lvimgrep_crash()
31053c097226SBram Moolenaar  sv Xtest
31063c097226SBram Moolenaar  augroup QF_Test
31073c097226SBram Moolenaar    au!
31083c097226SBram Moolenaar    au * * call setloclist(0, [], 'f')
31093c097226SBram Moolenaar  augroup END
31103c097226SBram Moolenaar  lvimgrep quickfix test_quickfix.vim
31113c097226SBram Moolenaar  augroup QF_Test
31123c097226SBram Moolenaar    au!
31133c097226SBram Moolenaar  augroup END
31143c097226SBram Moolenaar  enew | only
31153c097226SBram Moolenaarendfunc
3116de04654dSBram Moolenaar
3117de04654dSBram Moolenaar" Test for the position of the quickfix and location list window
3118de04654dSBram Moolenaarfunc Test_qfwin_pos()
3119de04654dSBram Moolenaar  " Open two windows
3120de04654dSBram Moolenaar  new | only
3121de04654dSBram Moolenaar  new
3122de04654dSBram Moolenaar  cexpr ['F1:10:L10']
3123de04654dSBram Moolenaar  copen
3124de04654dSBram Moolenaar  " Quickfix window should be the bottom most window
3125de04654dSBram Moolenaar  call assert_equal(3, winnr())
3126de04654dSBram Moolenaar  close
3127de04654dSBram Moolenaar  " Open at the very top
3128de04654dSBram Moolenaar  wincmd t
3129de04654dSBram Moolenaar  topleft copen
3130de04654dSBram Moolenaar  call assert_equal(1, winnr())
3131de04654dSBram Moolenaar  close
3132de04654dSBram Moolenaar  " open left of the current window
3133de04654dSBram Moolenaar  wincmd t
3134de04654dSBram Moolenaar  below new
3135de04654dSBram Moolenaar  leftabove copen
3136de04654dSBram Moolenaar  call assert_equal(2, winnr())
3137de04654dSBram Moolenaar  close
3138de04654dSBram Moolenaar  " open right of the current window
3139de04654dSBram Moolenaar  rightbelow copen
3140de04654dSBram Moolenaar  call assert_equal(3, winnr())
3141de04654dSBram Moolenaar  close
3142de04654dSBram Moolenaarendfunc
3143e1bb879fSBram Moolenaar
3144e1bb879fSBram Moolenaar" Tests for quickfix/location lists changed by autocommands when
3145e1bb879fSBram Moolenaar" :vimgrep/:lvimgrep commands are running.
3146e1bb879fSBram Moolenaarfunc Test_vimgrep_autocmd()
3147e1bb879fSBram Moolenaar  call setqflist([], 'f')
3148e1bb879fSBram Moolenaar  call writefile(['stars'], 'Xtest1.txt')
3149e1bb879fSBram Moolenaar  call writefile(['stars'], 'Xtest2.txt')
3150e1bb879fSBram Moolenaar
3151e1bb879fSBram Moolenaar  " Test 1:
3152e1bb879fSBram Moolenaar  " When searching for a pattern using :vimgrep, if the quickfix list is
3153e1bb879fSBram Moolenaar  " changed by an autocmd, the results should be added to the correct quickfix
3154e1bb879fSBram Moolenaar  " list.
3155e1bb879fSBram Moolenaar  autocmd BufRead Xtest2.txt cexpr '' | cexpr ''
3156e1bb879fSBram Moolenaar  silent vimgrep stars Xtest*.txt
3157e1bb879fSBram Moolenaar  call assert_equal(1, getqflist({'nr' : 0}).nr)
3158e1bb879fSBram Moolenaar  call assert_equal(3, getqflist({'nr' : '$'}).nr)
3159e1bb879fSBram Moolenaar  call assert_equal('Xtest2.txt', bufname(getqflist()[1].bufnr))
3160e1bb879fSBram Moolenaar  au! BufRead Xtest2.txt
3161e1bb879fSBram Moolenaar
3162e1bb879fSBram Moolenaar  " Test 2:
3163e1bb879fSBram Moolenaar  " When searching for a pattern using :vimgrep, if the quickfix list is
3164e1bb879fSBram Moolenaar  " freed, then a error should be given.
3165e1bb879fSBram Moolenaar  silent! %bwipe!
3166e1bb879fSBram Moolenaar  call setqflist([], 'f')
3167e1bb879fSBram Moolenaar  autocmd BufRead Xtest2.txt for i in range(10) | cexpr '' | endfor
3168e1bb879fSBram Moolenaar  call assert_fails('vimgrep stars Xtest*.txt', 'E925:')
3169e1bb879fSBram Moolenaar  au! BufRead Xtest2.txt
3170e1bb879fSBram Moolenaar
3171e1bb879fSBram Moolenaar  " Test 3:
3172e1bb879fSBram Moolenaar  " When searching for a pattern using :lvimgrep, if the location list is
3173e1bb879fSBram Moolenaar  " freed, then the command should error out.
3174e1bb879fSBram Moolenaar  silent! %bwipe!
3175e1bb879fSBram Moolenaar  let g:save_winid = win_getid()
3176e1bb879fSBram Moolenaar  autocmd BufRead Xtest2.txt call setloclist(g:save_winid, [], 'f')
3177e1bb879fSBram Moolenaar  call assert_fails('lvimgrep stars Xtest*.txt', 'E926:')
3178e1bb879fSBram Moolenaar  au! BufRead Xtest2.txt
3179e1bb879fSBram Moolenaar
3180e1bb879fSBram Moolenaar  call delete('Xtest1.txt')
3181e1bb879fSBram Moolenaar  call delete('Xtest2.txt')
3182e1bb879fSBram Moolenaar  call setqflist([], 'f')
3183e1bb879fSBram Moolenaarendfunc
31843b9474b4SBram Moolenaar
31853b9474b4SBram Moolenaar" The following test used to crash Vim
31863b9474b4SBram Moolenaarfunc Test_lhelpgrep_autocmd()
31873b9474b4SBram Moolenaar  lhelpgrep quickfix
31883b9474b4SBram Moolenaar  autocmd QuickFixCmdPost * call setloclist(0, [], 'f')
31893b9474b4SBram Moolenaar  lhelpgrep buffer
31903b9474b4SBram Moolenaar  call assert_equal('help', &filetype)
31913b9474b4SBram Moolenaar  call assert_equal(0, getloclist(0, {'nr' : '$'}).nr)
31923b9474b4SBram Moolenaar  lhelpgrep tabpage
31933b9474b4SBram Moolenaar  call assert_equal('help', &filetype)
31943b9474b4SBram Moolenaar  call assert_equal(1, getloclist(0, {'nr' : '$'}).nr)
31953b9474b4SBram Moolenaar  au! QuickFixCmdPost
31963b9474b4SBram Moolenaar  new | only
31973b9474b4SBram Moolenaarendfunc
3198