1" Test for the quickfix commands.
2
3if !has('quickfix')
4  finish
5endif
6
7set encoding=utf-8
8
9func s:setup_commands(cchar)
10  if a:cchar == 'c'
11    command! -nargs=* -bang Xlist <mods>clist<bang> <args>
12    command! -nargs=* Xgetexpr <mods>cgetexpr <args>
13    command! -nargs=* Xaddexpr <mods>caddexpr <args>
14    command! -nargs=* Xolder <mods>colder <args>
15    command! -nargs=* Xnewer <mods>cnewer <args>
16    command! -nargs=* Xopen <mods>copen <args>
17    command! -nargs=* Xwindow <mods>cwindow <args>
18    command! -nargs=* Xbottom <mods>cbottom <args>
19    command! -nargs=* Xclose <mods>cclose <args>
20    command! -nargs=* -bang Xfile <mods>cfile<bang> <args>
21    command! -nargs=* Xgetfile <mods>cgetfile <args>
22    command! -nargs=* Xaddfile <mods>caddfile <args>
23    command! -nargs=* -bang Xbuffer <mods>cbuffer<bang> <args>
24    command! -nargs=* Xgetbuffer <mods>cgetbuffer <args>
25    command! -nargs=* Xaddbuffer <mods>caddbuffer <args>
26    command! -nargs=* Xrewind <mods>crewind <args>
27    command! -nargs=* -bang Xnext <mods>cnext<bang> <args>
28    command! -nargs=* -bang Xprev <mods>cprev<bang> <args>
29    command! -nargs=* -bang Xfirst <mods>cfirst<bang> <args>
30    command! -nargs=* -bang Xlast <mods>clast<bang> <args>
31    command! -nargs=* -bang Xnfile <mods>cnfile<bang> <args>
32    command! -nargs=* -bang Xpfile <mods>cpfile<bang> <args>
33    command! -nargs=* Xexpr <mods>cexpr <args>
34    command! -range -nargs=* Xvimgrep <mods><count>vimgrep <args>
35    command! -nargs=* Xvimgrepadd <mods>vimgrepadd <args>
36    command! -nargs=* Xgrep <mods> grep <args>
37    command! -nargs=* Xgrepadd <mods> grepadd <args>
38    command! -nargs=* Xhelpgrep helpgrep <args>
39    let g:Xgetlist = function('getqflist')
40    let g:Xsetlist = function('setqflist')
41    call setqflist([], 'f')
42  else
43    command! -nargs=* -bang Xlist <mods>llist<bang> <args>
44    command! -nargs=* Xgetexpr <mods>lgetexpr <args>
45    command! -nargs=* Xaddexpr <mods>laddexpr <args>
46    command! -nargs=* Xolder <mods>lolder <args>
47    command! -nargs=* Xnewer <mods>lnewer <args>
48    command! -nargs=* Xopen <mods>lopen <args>
49    command! -nargs=* Xwindow <mods>lwindow <args>
50    command! -nargs=* Xbottom <mods>lbottom <args>
51    command! -nargs=* Xclose <mods>lclose <args>
52    command! -nargs=* -bang Xfile <mods>lfile<bang> <args>
53    command! -nargs=* Xgetfile <mods>lgetfile <args>
54    command! -nargs=* Xaddfile <mods>laddfile <args>
55    command! -nargs=* -bang Xbuffer <mods>lbuffer<bang> <args>
56    command! -nargs=* Xgetbuffer <mods>lgetbuffer <args>
57    command! -nargs=* Xaddbuffer <mods>laddbuffer <args>
58    command! -nargs=* Xrewind <mods>lrewind <args>
59    command! -nargs=* -bang Xnext <mods>lnext<bang> <args>
60    command! -nargs=* -bang Xprev <mods>lprev<bang> <args>
61    command! -nargs=* -bang Xfirst <mods>lfirst<bang> <args>
62    command! -nargs=* -bang Xlast <mods>llast<bang> <args>
63    command! -nargs=* -bang Xnfile <mods>lnfile<bang> <args>
64    command! -nargs=* -bang Xpfile <mods>lpfile<bang> <args>
65    command! -nargs=* Xexpr <mods>lexpr <args>
66    command! -range -nargs=* Xvimgrep <mods><count>lvimgrep <args>
67    command! -nargs=* Xvimgrepadd <mods>lvimgrepadd <args>
68    command! -nargs=* Xgrep <mods> lgrep <args>
69    command! -nargs=* Xgrepadd <mods> lgrepadd <args>
70    command! -nargs=* Xhelpgrep lhelpgrep <args>
71    let g:Xgetlist = function('getloclist', [0])
72    let g:Xsetlist = function('setloclist', [0])
73    call setloclist(0, [], 'f')
74  endif
75endfunc
76
77" Tests for the :clist and :llist commands
78func XlistTests(cchar)
79  call s:setup_commands(a:cchar)
80
81  if a:cchar == 'l'
82      call assert_fails('llist', 'E776:')
83  endif
84  " With an empty list, command should return error
85  Xgetexpr []
86  silent! Xlist
87  call assert_true(v:errmsg ==# 'E42: No Errors')
88
89  " Populate the list and then try
90  Xgetexpr ['non-error 1', 'Xtestfile1:1:3:Line1',
91		  \ 'non-error 2', 'Xtestfile2:2:2:Line2',
92		  \ 'non-error 3', 'Xtestfile3:3:1:Line3']
93
94  " List only valid entries
95  let l = split(execute('Xlist', ''), "\n")
96  call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
97		   \ ' 4 Xtestfile2:2 col 2: Line2',
98		   \ ' 6 Xtestfile3:3 col 1: Line3'], l)
99
100  " List all the entries
101  let l = split(execute('Xlist!', ''), "\n")
102  call assert_equal([' 1: non-error 1', ' 2 Xtestfile1:1 col 3: Line1',
103		   \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2',
104		   \ ' 5: non-error 3', ' 6 Xtestfile3:3 col 1: Line3'], l)
105
106  " List a range of errors
107  let l = split(execute('Xlist 3,6', ''), "\n")
108  call assert_equal([' 4 Xtestfile2:2 col 2: Line2',
109		   \ ' 6 Xtestfile3:3 col 1: Line3'], l)
110
111  let l = split(execute('Xlist! 3,4', ''), "\n")
112  call assert_equal([' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
113
114  let l = split(execute('Xlist -6,-4', ''), "\n")
115  call assert_equal([' 2 Xtestfile1:1 col 3: Line1'], l)
116
117  let l = split(execute('Xlist! -5,-3', ''), "\n")
118  call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
119		   \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
120
121  " Test for '+'
122  let l = split(execute('Xlist! +2', ''), "\n")
123  call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
124		   \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
125
126  " Different types of errors
127  call g:Xsetlist([{'lnum':10,'col':5,'type':'W', 'text':'Warning','nr':11},
128	      \ {'lnum':20,'col':10,'type':'e','text':'Error','nr':22},
129	      \ {'lnum':30,'col':15,'type':'i','text':'Info','nr':33},
130	      \ {'lnum':40,'col':20,'type':'x', 'text':'Other','nr':44},
131	      \ {'lnum':50,'col':25,'type':"\<C-A>",'text':'one','nr':55}])
132  let l = split(execute('Xlist', ""), "\n")
133  call assert_equal([' 1:10 col 5 warning  11: Warning',
134	      \ ' 2:20 col 10 error  22: Error',
135	      \ ' 3:30 col 15 info  33: Info',
136	      \ ' 4:40 col 20 x  44: Other',
137	      \ ' 5:50 col 25  55: one'], l)
138
139  " Error cases
140  call assert_fails('Xlist abc', 'E488:')
141endfunc
142
143func Test_clist()
144  call XlistTests('c')
145  call XlistTests('l')
146endfunc
147
148" Tests for the :colder, :cnewer, :lolder and :lnewer commands
149" Note that this test assumes that a quickfix/location list is
150" already set by the caller.
151func XageTests(cchar)
152  call s:setup_commands(a:cchar)
153
154  let list = [{'bufnr': 1, 'lnum': 1}]
155  call g:Xsetlist(list)
156
157  " Jumping to a non existent list should return error
158  silent! Xolder 99
159  call assert_true(v:errmsg ==# 'E380: At bottom of quickfix stack')
160
161  silent! Xnewer 99
162  call assert_true(v:errmsg ==# 'E381: At top of quickfix stack')
163
164  " Add three quickfix/location lists
165  Xgetexpr ['Xtestfile1:1:3:Line1']
166  Xgetexpr ['Xtestfile2:2:2:Line2']
167  Xgetexpr ['Xtestfile3:3:1:Line3']
168
169  " Go back two lists
170  Xolder
171  let l = g:Xgetlist()
172  call assert_equal('Line2', l[0].text)
173
174  " Go forward two lists
175  Xnewer
176  let l = g:Xgetlist()
177  call assert_equal('Line3', l[0].text)
178
179  " Test for the optional count argument
180  Xolder 2
181  let l = g:Xgetlist()
182  call assert_equal('Line1', l[0].text)
183
184  Xnewer 2
185  let l = g:Xgetlist()
186  call assert_equal('Line3', l[0].text)
187endfunc
188
189func Test_cage()
190  call XageTests('c')
191  call XageTests('l')
192endfunc
193
194" Tests for the :cwindow, :lwindow :cclose, :lclose, :copen and :lopen
195" commands
196func XwindowTests(cchar)
197  call s:setup_commands(a:cchar)
198
199  " Opening the location list window without any errors should fail
200  if a:cchar == 'l'
201      call assert_fails('lopen', 'E776:')
202  endif
203
204  " Create a list with no valid entries
205  Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
206
207  " Quickfix/Location window should not open with no valid errors
208  Xwindow
209  call assert_true(winnr('$') == 1)
210
211  " Create a list with valid entries
212  Xgetexpr ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2',
213		  \ 'Xtestfile3:3:1:Line3']
214
215  " Open the window
216  Xwindow
217  call assert_true(winnr('$') == 2 && winnr() == 2 &&
218	\ getline('.') ==# 'Xtestfile1|1 col 3| Line1')
219  redraw!
220
221  " Close the window
222  Xclose
223  call assert_true(winnr('$') == 1)
224
225  " Create a list with no valid entries
226  Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
227
228  " Open the window
229  Xopen 5
230  call assert_true(winnr('$') == 2 && getline('.') ==# '|| non-error 1'
231		      \  && winheight('.') == 5)
232
233  " Opening the window again, should move the cursor to that window
234  wincmd t
235  Xopen 7
236  call assert_true(winnr('$') == 2 && winnr() == 2 &&
237	\ winheight('.') == 7 &&
238	\ getline('.') ==# '|| non-error 1')
239
240
241  " Calling cwindow should close the quickfix window with no valid errors
242  Xwindow
243  call assert_true(winnr('$') == 1)
244
245  if a:cchar == 'c'
246      " Opening the quickfix window in multiple tab pages should reuse the
247      " quickfix buffer
248      Xgetexpr ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2',
249		  \ 'Xtestfile3:3:1:Line3']
250      Xopen
251      let qfbufnum = bufnr('%')
252      tabnew
253      Xopen
254      call assert_equal(qfbufnum, bufnr('%'))
255      new | only | tabonly
256  endif
257endfunc
258
259func Test_cwindow()
260  call XwindowTests('c')
261  call XwindowTests('l')
262endfunc
263
264" Tests for the :cfile, :lfile, :caddfile, :laddfile, :cgetfile and :lgetfile
265" commands.
266func XfileTests(cchar)
267  call s:setup_commands(a:cchar)
268
269  call writefile(['Xtestfile1:700:10:Line 700',
270	\ 'Xtestfile2:800:15:Line 800'], 'Xqftestfile1')
271
272  enew!
273  Xfile Xqftestfile1
274  let l = g:Xgetlist()
275  call assert_true(len(l) == 2 &&
276	\ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
277	\ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
278
279  " Test with a non existent file
280  call assert_fails('Xfile non_existent_file', 'E40')
281
282  " Run cfile/lfile from a modified buffer
283  enew!
284  silent! put ='Quickfix'
285  silent! Xfile Xqftestfile1
286  call assert_true(v:errmsg ==# 'E37: No write since last change (add ! to override)')
287
288  call writefile(['Xtestfile3:900:30:Line 900'], 'Xqftestfile1')
289  Xaddfile Xqftestfile1
290  let l = g:Xgetlist()
291  call assert_true(len(l) == 3 &&
292	\ l[2].lnum == 900 && l[2].col == 30 && l[2].text ==# 'Line 900')
293
294  call writefile(['Xtestfile1:222:77:Line 222',
295	\ 'Xtestfile2:333:88:Line 333'], 'Xqftestfile1')
296
297  enew!
298  Xgetfile Xqftestfile1
299  let l = g:Xgetlist()
300  call assert_true(len(l) == 2 &&
301	\ l[0].lnum == 222 && l[0].col == 77 && l[0].text ==# 'Line 222' &&
302	\ l[1].lnum == 333 && l[1].col == 88 && l[1].text ==# 'Line 333')
303
304  call delete('Xqftestfile1')
305endfunc
306
307func Test_cfile()
308  call XfileTests('c')
309  call XfileTests('l')
310endfunc
311
312" Tests for the :cbuffer, :lbuffer, :caddbuffer, :laddbuffer, :cgetbuffer and
313" :lgetbuffer commands.
314func XbufferTests(cchar)
315  call s:setup_commands(a:cchar)
316
317  enew!
318  silent! call setline(1, ['Xtestfile7:700:10:Line 700',
319	\ 'Xtestfile8:800:15:Line 800'])
320  Xbuffer!
321  let l = g:Xgetlist()
322  call assert_true(len(l) == 2 &&
323	\ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
324	\ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
325
326  enew!
327  silent! call setline(1, ['Xtestfile9:900:55:Line 900',
328	\ 'Xtestfile10:950:66:Line 950'])
329  Xgetbuffer
330  let l = g:Xgetlist()
331  call assert_true(len(l) == 2 &&
332	\ l[0].lnum == 900 && l[0].col == 55 && l[0].text ==# 'Line 900' &&
333	\ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950')
334
335  enew!
336  silent! call setline(1, ['Xtestfile11:700:20:Line 700',
337	\ 'Xtestfile12:750:25:Line 750'])
338  Xaddbuffer
339  let l = g:Xgetlist()
340  call assert_true(len(l) == 4 &&
341	\ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950' &&
342	\ l[2].lnum == 700 && l[2].col == 20 && l[2].text ==# 'Line 700' &&
343	\ l[3].lnum == 750 && l[3].col == 25 && l[3].text ==# 'Line 750')
344  enew!
345
346  " Check for invalid buffer
347  call assert_fails('Xbuffer 199', 'E474:')
348
349  " Check for unloaded buffer
350  edit Xtestfile1
351  let bnr = bufnr('%')
352  enew!
353  call assert_fails('Xbuffer ' . bnr, 'E681:')
354
355  " Check for invalid range
356  " Using Xbuffer will not run the range check in the cbuffer/lbuffer
357  " commands. So directly call the commands.
358  if (a:cchar == 'c')
359      call assert_fails('900,999cbuffer', 'E16:')
360  else
361      call assert_fails('900,999lbuffer', 'E16:')
362  endif
363endfunc
364
365func Test_cbuffer()
366  call XbufferTests('c')
367  call XbufferTests('l')
368endfunc
369
370func XexprTests(cchar)
371  call s:setup_commands(a:cchar)
372
373  call assert_fails('Xexpr 10', 'E777:')
374endfunc
375
376func Test_cexpr()
377  call XexprTests('c')
378  call XexprTests('l')
379endfunc
380
381" Tests for :cnext, :cprev, :cfirst, :clast commands
382func Xtest_browse(cchar)
383  call s:setup_commands(a:cchar)
384
385  " Jumping to first or next location list entry without any error should
386  " result in failure
387  if a:cchar == 'l'
388      call assert_fails('lfirst', 'E776:')
389      call assert_fails('lnext', 'E776:')
390  endif
391
392  call s:create_test_file('Xqftestfile1')
393  call s:create_test_file('Xqftestfile2')
394
395  Xgetexpr ['Xqftestfile1:5:Line5',
396		\ 'Xqftestfile1:6:Line6',
397		\ 'Xqftestfile2:10:Line10',
398		\ 'Xqftestfile2:11:Line11']
399
400  Xfirst
401  call assert_fails('Xprev', 'E553')
402  call assert_fails('Xpfile', 'E553')
403  Xnfile
404  call assert_equal('Xqftestfile2', bufname('%'))
405  call assert_equal(10, line('.'))
406  Xpfile
407  call assert_equal('Xqftestfile1', bufname('%'))
408  call assert_equal(6, line('.'))
409  Xlast
410  call assert_equal('Xqftestfile2', bufname('%'))
411  call assert_equal(11, line('.'))
412  call assert_fails('Xnext', 'E553')
413  call assert_fails('Xnfile', 'E553')
414  Xrewind
415  call assert_equal('Xqftestfile1', bufname('%'))
416  call assert_equal(5, line('.'))
417
418  Xexpr ""
419  call assert_fails('Xnext', 'E42:')
420
421  call delete('Xqftestfile1')
422  call delete('Xqftestfile2')
423endfunc
424
425func Test_browse()
426  call Xtest_browse('c')
427  call Xtest_browse('l')
428endfunc
429
430func Test_nomem()
431  call test_alloc_fail(GetAllocId('qf_dirname_start'), 0, 0)
432  call assert_fails('vimgrep vim runtest.vim', 'E342:')
433
434  call test_alloc_fail(GetAllocId('qf_dirname_now'), 0, 0)
435  call assert_fails('vimgrep vim runtest.vim', 'E342:')
436
437  call test_alloc_fail(GetAllocId('qf_namebuf'), 0, 0)
438  call assert_fails('cfile runtest.vim', 'E342:')
439
440  call test_alloc_fail(GetAllocId('qf_errmsg'), 0, 0)
441  call assert_fails('cfile runtest.vim', 'E342:')
442
443  call test_alloc_fail(GetAllocId('qf_pattern'), 0, 0)
444  call assert_fails('cfile runtest.vim', 'E342:')
445
446endfunc
447
448func s:test_xhelpgrep(cchar)
449  call s:setup_commands(a:cchar)
450  Xhelpgrep quickfix
451  Xopen
452  if a:cchar == 'c'
453    let title_text = ':helpgrep quickfix'
454  else
455    let title_text = ':lhelpgrep quickfix'
456  endif
457  call assert_true(w:quickfix_title =~ title_text, w:quickfix_title)
458  " This wipes out the buffer, make sure that doesn't cause trouble.
459  Xclose
460
461  " Search for non existing help string
462  call assert_fails('Xhelpgrep a1b2c3', 'E480:')
463endfunc
464
465func Test_helpgrep()
466  call s:test_xhelpgrep('c')
467  helpclose
468  call s:test_xhelpgrep('l')
469endfunc
470
471func Test_errortitle()
472  augroup QfBufWinEnter
473    au!
474    au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
475  augroup END
476  copen
477  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'')'}]
478  call setqflist(a)
479  call assert_equal(':setqflist()', g:a)
480  augroup QfBufWinEnter
481    au!
482  augroup END
483  augroup! QfBufWinEnter
484endfunc
485
486func Test_vimgreptitle()
487  augroup QfBufWinEnter
488    au!
489    au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
490  augroup END
491  try
492    vimgrep /pattern/j file
493  catch /E480/
494  endtry
495  copen
496  call assert_equal(':    vimgrep /pattern/j file', g:a)
497  augroup QfBufWinEnter
498    au!
499  augroup END
500  augroup! QfBufWinEnter
501endfunc
502
503func XqfTitleTests(cchar)
504  call s:setup_commands(a:cchar)
505
506  Xgetexpr ['file:1:1:message']
507  let l = g:Xgetlist()
508  if a:cchar == 'c'
509    call setqflist(l, 'r')
510  else
511    call setloclist(0, l, 'r')
512  endif
513
514  Xopen
515  if a:cchar == 'c'
516    let title = ':setqflist()'
517  else
518    let title = ':setloclist()'
519  endif
520  call assert_equal(title, w:quickfix_title)
521  Xclose
522endfunc
523
524" Tests for quickfix window's title
525func Test_qf_title()
526  call XqfTitleTests('c')
527  call XqfTitleTests('l')
528endfunc
529
530" Tests for 'errorformat'
531func Test_efm()
532  let save_efm = &efm
533  set efm=%EEEE%m,%WWWW%m,%+CCCC%.%#,%-GGGG%.%#
534  cgetexpr ['WWWW', 'EEEE', 'CCCC']
535  let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
536  call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
537  cgetexpr ['WWWW', 'GGGG', 'EEEE', 'CCCC']
538  let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
539  call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
540  cgetexpr ['WWWW', 'GGGG', 'ZZZZ', 'EEEE', 'CCCC', 'YYYY']
541  let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
542  call assert_equal("[['W', 1], ['ZZZZ', 0], ['E^@CCCC', 1], ['YYYY', 0]]", l)
543  let &efm = save_efm
544endfunc
545
546" This will test for problems in quickfix:
547" A. incorrectly copying location lists which caused the location list to show
548"    a different name than the file that was actually being displayed.
549" B. not reusing the window for which the location list window is opened but
550"    instead creating new windows.
551" C. make sure that the location list window is not reused instead of the
552"    window it belongs to.
553"
554" Set up the test environment:
555func ReadTestProtocol(name)
556  let base = substitute(a:name, '\v^test://(.*)%(\.[^.]+)?', '\1', '')
557  let word = substitute(base, '\v(.*)\..*', '\1', '')
558
559  setl modifiable
560  setl noreadonly
561  setl noswapfile
562  setl bufhidden=delete
563  %del _
564  " For problem 2:
565  " 'buftype' has to be set to reproduce the constant opening of new windows
566  setl buftype=nofile
567
568  call setline(1, word)
569
570  setl nomodified
571  setl nomodifiable
572  setl readonly
573  exe 'doautocmd BufRead ' . substitute(a:name, '\v^test://(.*)', '\1', '')
574endfunc
575
576func Test_locationlist()
577    enew
578
579    augroup testgroup
580      au!
581      autocmd BufReadCmd test://* call ReadTestProtocol(expand("<amatch>"))
582    augroup END
583
584    let words = [ "foo", "bar", "baz", "quux", "shmoo", "spam", "eggs" ]
585
586    let qflist = []
587    for word in words
588      call add(qflist, {'filename': 'test://' . word . '.txt', 'text': 'file ' . word . '.txt', })
589      " NOTE: problem 1:
590      " intentionally not setting 'lnum' so that the quickfix entries are not
591      " valid
592      call setloclist(0, qflist, ' ')
593    endfor
594
595    " Test A
596    lrewind
597    enew
598    lopen
599    lnext
600    lnext
601    lnext
602    lnext
603    vert split
604    wincmd L
605    lopen
606    wincmd p
607    lnext
608    let fileName = expand("%")
609    wincmd p
610    let locationListFileName = substitute(getline(line('.')), '\([^|]*\)|.*', '\1', '')
611    let fileName = substitute(fileName, '\\', '/', 'g')
612    let locationListFileName = substitute(locationListFileName, '\\', '/', 'g')
613    call assert_equal("test://bar.txt", fileName)
614    call assert_equal("test://bar.txt", locationListFileName)
615
616    wincmd n | only
617
618    " Test B:
619    lrewind
620    lopen
621    2
622    exe "normal \<CR>"
623    wincmd p
624    3
625    exe "normal \<CR>"
626    wincmd p
627    4
628    exe "normal \<CR>"
629    call assert_equal(2, winnr('$'))
630    wincmd n | only
631
632    " Test C:
633    lrewind
634    lopen
635    " Let's move the location list window to the top to check whether it (the
636    " first window found) will be reused when we try to open new windows:
637    wincmd K
638    2
639    exe "normal \<CR>"
640    wincmd p
641    3
642    exe "normal \<CR>"
643    wincmd p
644    4
645    exe "normal \<CR>"
646    1wincmd w
647    call assert_equal('quickfix', &buftype)
648    2wincmd w
649    let bufferName = expand("%")
650    let bufferName = substitute(bufferName, '\\', '/', 'g')
651    call assert_equal('test://quux.txt', bufferName)
652
653    wincmd n | only
654
655    augroup! testgroup
656endfunc
657
658func Test_locationlist_curwin_was_closed()
659    augroup testgroup
660      au!
661      autocmd BufReadCmd test_curwin.txt call R(expand("<amatch>"))
662    augroup END
663
664    func! R(n)
665      quit
666    endfunc
667
668    new
669    let q = []
670    call add(q, {'filename': 'test_curwin.txt' })
671    call setloclist(0, q)
672    call assert_fails('lrewind', 'E924:')
673
674    augroup! testgroup
675endfunc
676
677func Test_locationlist_cross_tab_jump()
678  call writefile(['loclistfoo'], 'loclistfoo')
679  call writefile(['loclistbar'], 'loclistbar')
680  set switchbuf=usetab
681
682  edit loclistfoo
683  tabedit loclistbar
684  silent lgrep loclistfoo loclist*
685  call assert_equal(1, tabpagenr())
686
687  enew | only | tabonly
688  set switchbuf&vim
689  call delete('loclistfoo')
690  call delete('loclistbar')
691endfunc
692
693" More tests for 'errorformat'
694func Test_efm1()
695    if !has('unix')
696	" The 'errorformat' setting is different on non-Unix systems.
697	" This test works only on Unix-like systems.
698	return
699    endif
700
701    let l = [
702      \ '"Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set.',
703      \ '"Xtestfile", line 6 col 19; this is an error',
704      \ 'gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include  version.c',
705      \ 'Xtestfile:9: parse error before `asd''',
706      \ 'make: *** [vim] Error 1',
707      \ 'in file "Xtestfile" linenr 10: there is an error',
708      \ '',
709      \ '2 returned',
710      \ '"Xtestfile", line 11 col 1; this is an error',
711      \ '"Xtestfile", line 12 col 2; this is another error',
712      \ '"Xtestfile", line 14:10; this is an error in column 10',
713      \ '=Xtestfile=, line 15:10; this is another error, but in vcol 10 this time',
714      \ '"Xtestfile", linenr 16: yet another problem',
715      \ 'Error in "Xtestfile" at line 17:',
716      \ 'x should be a dot',
717      \ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 17',
718      \ '            ^',
719      \ 'Error in "Xtestfile" at line 18:',
720      \ 'x should be a dot',
721      \ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 18',
722      \ '.............^',
723      \ 'Error in "Xtestfile" at line 19:',
724      \ 'x should be a dot',
725      \ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 19',
726      \ '--------------^',
727      \ 'Error in "Xtestfile" at line 20:',
728      \ 'x should be a dot',
729      \ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 20',
730      \ '	       ^',
731      \ '',
732      \ 'Does anyone know what is the problem and how to correction it?',
733      \ '"Xtestfile", line 21 col 9: What is the title of the quickfix window?',
734      \ '"Xtestfile", line 22 col 9: What is the title of the quickfix window?'
735      \ ]
736
737    call writefile(l, 'Xerrorfile1')
738    call writefile(l[:-2], 'Xerrorfile2')
739
740    let m = [
741	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  2',
742	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  3',
743	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  4',
744	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  5',
745	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  6',
746	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  7',
747	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  8',
748	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  9',
749	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 10',
750	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 11',
751	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 12',
752	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 13',
753	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 14',
754	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 15',
755	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 16',
756	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 17',
757	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 18',
758	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 19',
759	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 20',
760	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 21',
761	\ '	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 22'
762	\ ]
763    call writefile(m, 'Xtestfile')
764
765    let save_efm = &efm
766    set efm+==%f=\\,\ line\ %l%*\\D%v%*[^\ ]\ %m
767    set efm^=%AError\ in\ \"%f\"\ at\ line\ %l:,%Z%p^,%C%m
768
769    exe 'cf Xerrorfile2'
770    clast
771    copen
772    call assert_equal(':cf Xerrorfile2', w:quickfix_title)
773    wincmd p
774
775    exe 'cf Xerrorfile1'
776    call assert_equal([4, 12], [line('.'), col('.')])
777    cn
778    call assert_equal([6, 19], [line('.'), col('.')])
779    cn
780    call assert_equal([9, 2], [line('.'), col('.')])
781    cn
782    call assert_equal([10, 2], [line('.'), col('.')])
783    cn
784    call assert_equal([11, 1], [line('.'), col('.')])
785    cn
786    call assert_equal([12, 2], [line('.'), col('.')])
787    cn
788    call assert_equal([14, 10], [line('.'), col('.')])
789    cn
790    call assert_equal([15, 3, 10], [line('.'), col('.'), virtcol('.')])
791    cn
792    call assert_equal([16, 2], [line('.'), col('.')])
793    cn
794    call assert_equal([17, 6], [line('.'), col('.')])
795    cn
796    call assert_equal([18, 7], [line('.'), col('.')])
797    cn
798    call assert_equal([19, 8], [line('.'), col('.')])
799    cn
800    call assert_equal([20, 9], [line('.'), col('.')])
801    clast
802    cprev
803    cprev
804    wincmd w
805    call assert_equal(':cf Xerrorfile1', w:quickfix_title)
806    wincmd p
807
808    let &efm = save_efm
809    call delete('Xerrorfile1')
810    call delete('Xerrorfile2')
811    call delete('Xtestfile')
812endfunc
813
814" Test for quickfix directory stack support
815func s:dir_stack_tests(cchar)
816  call s:setup_commands(a:cchar)
817
818  let save_efm=&efm
819  set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
820
821  let lines = ["Entering dir 'dir1/a'",
822		\ 'habits2.txt:1:Nine Healthy Habits',
823		\ "Entering dir 'b'",
824		\ 'habits3.txt:2:0 Hours of television',
825		\ 'habits2.txt:7:5 Small meals',
826		\ "Entering dir 'dir1/c'",
827		\ 'habits4.txt:3:1 Hour of exercise',
828		\ "Leaving dir 'dir1/c'",
829		\ "Leaving dir 'dir1/a'",
830		\ 'habits1.txt:4:2 Liters of water',
831		\ "Entering dir 'dir2'",
832		\ 'habits5.txt:5:3 Cups of hot green tea',
833		\ "Leaving dir 'dir2'"
834		\]
835
836  Xexpr ""
837  for l in lines
838      Xaddexpr l
839  endfor
840
841  let qf = g:Xgetlist()
842
843  call assert_equal('dir1/a/habits2.txt', bufname(qf[1].bufnr))
844  call assert_equal(1, qf[1].lnum)
845  call assert_equal('dir1/a/b/habits3.txt', bufname(qf[3].bufnr))
846  call assert_equal(2, qf[3].lnum)
847  call assert_equal('dir1/a/habits2.txt', bufname(qf[4].bufnr))
848  call assert_equal(7, qf[4].lnum)
849  call assert_equal('dir1/c/habits4.txt', bufname(qf[6].bufnr))
850  call assert_equal(3, qf[6].lnum)
851  call assert_equal('habits1.txt', bufname(qf[9].bufnr))
852  call assert_equal(4, qf[9].lnum)
853  call assert_equal('dir2/habits5.txt', bufname(qf[11].bufnr))
854  call assert_equal(5, qf[11].lnum)
855
856  let &efm=save_efm
857endfunc
858
859" Tests for %D and %X errorformat options
860func Test_efm_dirstack()
861  " Create the directory stack and files
862  call mkdir('dir1')
863  call mkdir('dir1/a')
864  call mkdir('dir1/a/b')
865  call mkdir('dir1/c')
866  call mkdir('dir2')
867
868  let lines = ["Nine Healthy Habits",
869		\ "0 Hours of television",
870		\ "1 Hour of exercise",
871		\ "2 Liters of water",
872		\ "3 Cups of hot green tea",
873		\ "4 Short mental breaks",
874		\ "5 Small meals",
875		\ "6 AM wake up time",
876		\ "7 Minutes of laughter",
877		\ "8 Hours of sleep (at least)",
878		\ "9 PM end of the day and off to bed"
879		\ ]
880  call writefile(lines, 'habits1.txt')
881  call writefile(lines, 'dir1/a/habits2.txt')
882  call writefile(lines, 'dir1/a/b/habits3.txt')
883  call writefile(lines, 'dir1/c/habits4.txt')
884  call writefile(lines, 'dir2/habits5.txt')
885
886  call s:dir_stack_tests('c')
887  call s:dir_stack_tests('l')
888
889  call delete('dir1', 'rf')
890  call delete('dir2', 'rf')
891  call delete('habits1.txt')
892endfunc
893
894" Test for resync after continuing an ignored message
895func Xefm_ignore_continuations(cchar)
896  call s:setup_commands(a:cchar)
897
898  let save_efm = &efm
899
900  let &efm =
901	\ '%Eerror %m %l,' .
902	\ '%-Wignored %m %l,' .
903	\ '%+Cmore ignored %m %l,' .
904	\ '%Zignored end'
905  Xgetexpr ['ignored warning 1', 'more ignored continuation 2', 'ignored end', 'error resync 4']
906  let l = map(g:Xgetlist(), '[v:val.text, v:val.valid, v:val.lnum, v:val.type]')
907  call assert_equal([['resync', 1, 4, 'E']], l)
908
909  let &efm = save_efm
910endfunc
911
912func Test_efm_ignore_continuations()
913  call Xefm_ignore_continuations('c')
914  call Xefm_ignore_continuations('l')
915endfunc
916
917" Tests for invalid error format specifies
918func Xinvalid_efm_Tests(cchar)
919  call s:setup_commands(a:cchar)
920
921  let save_efm = &efm
922
923  set efm=%f:%l:%m,%f:%f:%l:%m
924  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E372:')
925
926  set efm=%f:%l:%m,%f:%l:%r:%m
927  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
928
929  set efm=%f:%l:%m,%O:%f:%l:%m
930  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
931
932  set efm=%f:%l:%m,%f:%l:%*[^a-z
933  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E374:')
934
935  set efm=%f:%l:%m,%f:%l:%*c
936  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E375:')
937
938  set efm=%f:%l:%m,%L%M%N
939  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E376:')
940
941  set efm=%f:%l:%m,%f:%l:%m:%R
942  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E377:')
943
944  set efm=
945  call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E378:')
946
947  set efm=%DEntering\ dir\ abc,%f:%l:%m
948  call assert_fails('Xexpr ["Entering dir abc", "abc.txt:1:Hello world"]', 'E379:')
949
950  let &efm = save_efm
951endfunc
952
953func Test_invalid_efm()
954  call Xinvalid_efm_Tests('c')
955  call Xinvalid_efm_Tests('l')
956endfunc
957
958" TODO:
959" Add tests for the following formats in 'errorformat'
960"	%r  %O
961func Test_efm2()
962  let save_efm = &efm
963
964  " Test for %s format in efm
965  set efm=%f:%s
966  cexpr 'Xtestfile:Line search text'
967  let l = getqflist()
968  call assert_equal(l[0].pattern, '^\VLine search text\$')
969  call assert_equal(l[0].lnum, 0)
970
971  let l = split(execute('clist', ''), "\n")
972  call assert_equal([' 1 Xtestfile:^\VLine search text\$:  '], l)
973
974  " Test for %P, %Q and %t format specifiers
975  let lines=["[Xtestfile1]",
976	      \ "(1,17)  error: ';' missing",
977	      \ "(21,2)  warning: variable 'z' not defined",
978	      \ "(67,3)  error: end of file found before string ended",
979	      \ "--",
980	      \ "",
981	      \ "[Xtestfile2]",
982	      \ "--",
983	      \ "",
984	      \ "[Xtestfile3]",
985	      \ "NEW compiler v1.1",
986	      \ "(2,2)   warning: variable 'x' not defined",
987	      \ "(67,3)  warning: 's' already defined",
988	      \ "--"
989	      \]
990  set efm=%+P[%f]%r,(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%+Q--%r
991  " To exercise the push/pop file functionality in quickfix, the test files
992  " need to be created.
993  call writefile(['Line1'], 'Xtestfile1')
994  call writefile(['Line2'], 'Xtestfile2')
995  call writefile(['Line3'], 'Xtestfile3')
996  cexpr ""
997  for l in lines
998      caddexpr l
999  endfor
1000  let l = getqflist()
1001  call assert_equal(12, len(l))
1002  call assert_equal(21, l[2].lnum)
1003  call assert_equal(2, l[2].col)
1004  call assert_equal('w', l[2].type)
1005  call assert_equal('e', l[3].type)
1006  call delete('Xtestfile1')
1007  call delete('Xtestfile2')
1008  call delete('Xtestfile3')
1009
1010  " Tests for %E, %C and %Z format specifiers
1011  let lines = ["Error 275",
1012	      \ "line 42",
1013	      \ "column 3",
1014	      \ "' ' expected after '--'"
1015	      \]
1016  set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m
1017  cgetexpr lines
1018  let l = getqflist()
1019  call assert_equal(275, l[0].nr)
1020  call assert_equal(42, l[0].lnum)
1021  call assert_equal(3, l[0].col)
1022  call assert_equal('E', l[0].type)
1023  call assert_equal("\n' ' expected after '--'", l[0].text)
1024
1025  " Test for %>
1026  let lines = ["Error in line 147 of foo.c:",
1027	      \"unknown variable 'i'"
1028	      \]
1029  set efm=unknown\ variable\ %m,%E%>Error\ in\ line\ %l\ of\ %f:,%Z%m
1030  cgetexpr lines
1031  let l = getqflist()
1032  call assert_equal(147, l[0].lnum)
1033  call assert_equal('E', l[0].type)
1034  call assert_equal("\nunknown variable 'i'", l[0].text)
1035
1036  " Test for %A, %C and other formats
1037  let lines = [
1038	  \"==============================================================",
1039	  \"FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest)",
1040	  \"--------------------------------------------------------------",
1041	  \"Traceback (most recent call last):",
1042	  \'  File "unittests/dbfacadeTest.py", line 89, in testFoo',
1043	  \"    self.assertEquals(34, dtid)",
1044	  \'  File "/usr/lib/python2.2/unittest.py", line 286, in',
1045	  \" failUnlessEqual",
1046	  \"    raise self.failureException, \\",
1047	  \"AssertionError: 34 != 33",
1048	  \"",
1049	  \"--------------------------------------------------------------",
1050	  \"Ran 27 tests in 0.063s"
1051	  \]
1052  set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m
1053  cgetexpr lines
1054  let l = getqflist()
1055  call assert_equal(8, len(l))
1056  call assert_equal(89, l[4].lnum)
1057  call assert_equal(1, l[4].valid)
1058  call assert_equal('unittests/dbfacadeTest.py', bufname(l[4].bufnr))
1059
1060  let &efm = save_efm
1061endfunc
1062
1063func XquickfixChangedByAutocmd(cchar)
1064  call s:setup_commands(a:cchar)
1065  if a:cchar == 'c'
1066    let ErrorNr = 'E925'
1067    func! ReadFunc()
1068      colder
1069      cgetexpr []
1070    endfunc
1071  else
1072    let ErrorNr = 'E926'
1073    func! ReadFunc()
1074      lolder
1075      lgetexpr []
1076    endfunc
1077  endif
1078
1079  augroup testgroup
1080    au!
1081    autocmd BufReadCmd test_changed.txt call ReadFunc()
1082  augroup END
1083
1084  new | only
1085  let words = [ "a", "b" ]
1086  let qflist = []
1087  for word in words
1088    call add(qflist, {'filename': 'test_changed.txt'})
1089    call g:Xsetlist(qflist, ' ')
1090  endfor
1091  call assert_fails('Xrewind', ErrorNr . ':')
1092
1093  augroup! testgroup
1094endfunc
1095
1096func Test_quickfix_was_changed_by_autocmd()
1097  call XquickfixChangedByAutocmd('c')
1098  call XquickfixChangedByAutocmd('l')
1099endfunc
1100
1101func Test_caddbuffer_to_empty()
1102  helpgr quickfix
1103  call setqflist([], 'r')
1104  cad
1105  try
1106    cn
1107  catch
1108    " number of matches is unknown
1109    call assert_true(v:exception =~ 'E553:')
1110  endtry
1111  quit!
1112endfunc
1113
1114func Test_cgetexpr_works()
1115  " this must not crash Vim
1116  cgetexpr [$x]
1117  lgetexpr [$x]
1118endfunc
1119
1120" Tests for the setqflist() and setloclist() functions
1121func SetXlistTests(cchar, bnum)
1122  call s:setup_commands(a:cchar)
1123
1124  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 1},
1125	      \  {'bufnr': a:bnum, 'lnum': 2}])
1126  let l = g:Xgetlist()
1127  call assert_equal(2, len(l))
1128  call assert_equal(2, l[1].lnum)
1129
1130  Xnext
1131  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3}], 'a')
1132  let l = g:Xgetlist()
1133  call assert_equal(3, len(l))
1134  Xnext
1135  call assert_equal(3, line('.'))
1136
1137  " Appending entries to the list should not change the cursor position
1138  " in the quickfix window
1139  Xwindow
1140  1
1141  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 4},
1142	      \  {'bufnr': a:bnum, 'lnum': 5}], 'a')
1143  call assert_equal(1, line('.'))
1144  close
1145
1146  call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3},
1147	      \  {'bufnr': a:bnum, 'lnum': 4},
1148	      \  {'bufnr': a:bnum, 'lnum': 5}], 'r')
1149  let l = g:Xgetlist()
1150  call assert_equal(3, len(l))
1151  call assert_equal(5, l[2].lnum)
1152
1153  call g:Xsetlist([])
1154  let l = g:Xgetlist()
1155  call assert_equal(0, len(l))
1156
1157  " Error cases:
1158  " Refer to a non-existing buffer and pass a non-dictionary type
1159  call assert_fails("call g:Xsetlist([{'bufnr':998, 'lnum':4}," .
1160	      \ " {'bufnr':999, 'lnum':5}])", 'E92:')
1161  call g:Xsetlist([[1, 2,3]])
1162  call assert_equal(0, len(g:Xgetlist()))
1163endfunc
1164
1165func Test_setqflist()
1166  new Xtestfile | only
1167  let bnum = bufnr('%')
1168  call setline(1, range(1,5))
1169
1170  call SetXlistTests('c', bnum)
1171  call SetXlistTests('l', bnum)
1172
1173  enew!
1174  call delete('Xtestfile')
1175endfunc
1176
1177func Xlist_empty_middle(cchar)
1178  call s:setup_commands(a:cchar)
1179
1180  " create three quickfix lists
1181  let @/ = 'Test_'
1182  Xvimgrep // test_quickfix.vim
1183  let testlen = len(g:Xgetlist())
1184  call assert_true(testlen > 0)
1185  Xvimgrep empty test_quickfix.vim
1186  call assert_true(len(g:Xgetlist()) > 0)
1187  Xvimgrep matches test_quickfix.vim
1188  let matchlen = len(g:Xgetlist())
1189  call assert_true(matchlen > 0)
1190  Xolder
1191  " make the middle list empty
1192  call g:Xsetlist([], 'r')
1193  call assert_true(len(g:Xgetlist()) == 0)
1194  Xolder
1195  call assert_equal(testlen, len(g:Xgetlist()))
1196  Xnewer
1197  Xnewer
1198  call assert_equal(matchlen, len(g:Xgetlist()))
1199endfunc
1200
1201func Test_setqflist_empty_middle()
1202  call Xlist_empty_middle('c')
1203  call Xlist_empty_middle('l')
1204endfunc
1205
1206func Xlist_empty_older(cchar)
1207  call s:setup_commands(a:cchar)
1208
1209  " create three quickfix lists
1210  Xvimgrep one test_quickfix.vim
1211  let onelen = len(g:Xgetlist())
1212  call assert_true(onelen > 0)
1213  Xvimgrep two test_quickfix.vim
1214  let twolen = len(g:Xgetlist())
1215  call assert_true(twolen > 0)
1216  Xvimgrep three test_quickfix.vim
1217  let threelen = len(g:Xgetlist())
1218  call assert_true(threelen > 0)
1219  Xolder 2
1220  " make the first list empty, check the others didn't change
1221  call g:Xsetlist([], 'r')
1222  call assert_true(len(g:Xgetlist()) == 0)
1223  Xnewer
1224  call assert_equal(twolen, len(g:Xgetlist()))
1225  Xnewer
1226  call assert_equal(threelen, len(g:Xgetlist()))
1227endfunc
1228
1229func Test_setqflist_empty_older()
1230  call Xlist_empty_older('c')
1231  call Xlist_empty_older('l')
1232endfunc
1233
1234func XquickfixSetListWithAct(cchar)
1235  call s:setup_commands(a:cchar)
1236
1237  let list1 = [{'filename': 'fnameA', 'text': 'A'},
1238          \    {'filename': 'fnameB', 'text': 'B'}]
1239  let list2 = [{'filename': 'fnameC', 'text': 'C'},
1240          \    {'filename': 'fnameD', 'text': 'D'},
1241          \    {'filename': 'fnameE', 'text': 'E'}]
1242
1243  " {action} is unspecified.  Same as specifing ' '.
1244  new | only
1245  silent! Xnewer 99
1246  call g:Xsetlist(list1)
1247  call g:Xsetlist(list2)
1248  let li = g:Xgetlist()
1249  call assert_equal(3, len(li))
1250  call assert_equal('C', li[0]['text'])
1251  call assert_equal('D', li[1]['text'])
1252  call assert_equal('E', li[2]['text'])
1253  silent! Xolder
1254  let li = g:Xgetlist()
1255  call assert_equal(2, len(li))
1256  call assert_equal('A', li[0]['text'])
1257  call assert_equal('B', li[1]['text'])
1258
1259  " {action} is specified ' '.
1260  new | only
1261  silent! Xnewer 99
1262  call g:Xsetlist(list1)
1263  call g:Xsetlist(list2, ' ')
1264  let li = g:Xgetlist()
1265  call assert_equal(3, len(li))
1266  call assert_equal('C', li[0]['text'])
1267  call assert_equal('D', li[1]['text'])
1268  call assert_equal('E', li[2]['text'])
1269  silent! Xolder
1270  let li = g:Xgetlist()
1271  call assert_equal(2, len(li))
1272  call assert_equal('A', li[0]['text'])
1273  call assert_equal('B', li[1]['text'])
1274
1275  " {action} is specified 'a'.
1276  new | only
1277  silent! Xnewer 99
1278  call g:Xsetlist(list1)
1279  call g:Xsetlist(list2, 'a')
1280  let li = g:Xgetlist()
1281  call assert_equal(5, len(li))
1282  call assert_equal('A', li[0]['text'])
1283  call assert_equal('B', li[1]['text'])
1284  call assert_equal('C', li[2]['text'])
1285  call assert_equal('D', li[3]['text'])
1286  call assert_equal('E', li[4]['text'])
1287
1288  " {action} is specified 'r'.
1289  new | only
1290  silent! Xnewer 99
1291  call g:Xsetlist(list1)
1292  call g:Xsetlist(list2, 'r')
1293  let li = g:Xgetlist()
1294  call assert_equal(3, len(li))
1295  call assert_equal('C', li[0]['text'])
1296  call assert_equal('D', li[1]['text'])
1297  call assert_equal('E', li[2]['text'])
1298
1299  " Test for wrong value.
1300  new | only
1301  call assert_fails("call g:Xsetlist(0)", 'E714:')
1302  call assert_fails("call g:Xsetlist(list1, '')", 'E927:')
1303  call assert_fails("call g:Xsetlist(list1, 'aa')", 'E927:')
1304  call assert_fails("call g:Xsetlist(list1, ' a')", 'E927:')
1305  call assert_fails("call g:Xsetlist(list1, 0)", 'E928:')
1306endfunc
1307
1308func Test_quickfix_set_list_with_act()
1309  call XquickfixSetListWithAct('c')
1310  call XquickfixSetListWithAct('l')
1311endfunc
1312
1313func XLongLinesTests(cchar)
1314  let l = g:Xgetlist()
1315
1316  call assert_equal(4, len(l))
1317  call assert_equal(1, l[0].lnum)
1318  call assert_equal(1, l[0].col)
1319  call assert_equal(1975, len(l[0].text))
1320  call assert_equal(2, l[1].lnum)
1321  call assert_equal(1, l[1].col)
1322  call assert_equal(4070, len(l[1].text))
1323  call assert_equal(3, l[2].lnum)
1324  call assert_equal(1, l[2].col)
1325  call assert_equal(4070, len(l[2].text))
1326  call assert_equal(4, l[3].lnum)
1327  call assert_equal(1, l[3].col)
1328  call assert_equal(10, len(l[3].text))
1329
1330  call g:Xsetlist([], 'r')
1331endfunc
1332
1333func s:long_lines_tests(cchar)
1334  call s:setup_commands(a:cchar)
1335
1336  let testfile = 'samples/quickfix.txt'
1337
1338  " file
1339  exe 'Xgetfile' testfile
1340  call XLongLinesTests(a:cchar)
1341
1342  " list
1343  Xexpr readfile(testfile)
1344  call XLongLinesTests(a:cchar)
1345
1346  " string
1347  Xexpr join(readfile(testfile), "\n")
1348  call XLongLinesTests(a:cchar)
1349
1350  " buffer
1351  exe 'edit' testfile
1352  exe 'Xbuffer' bufnr('%')
1353  call XLongLinesTests(a:cchar)
1354endfunc
1355
1356func Test_long_lines()
1357  call s:long_lines_tests('c')
1358  call s:long_lines_tests('l')
1359endfunc
1360
1361func s:create_test_file(filename)
1362  let l = []
1363  for i in range(1, 20)
1364      call add(l, 'Line' . i)
1365  endfor
1366  call writefile(l, a:filename)
1367endfunc
1368
1369func Test_switchbuf()
1370  call s:create_test_file('Xqftestfile1')
1371  call s:create_test_file('Xqftestfile2')
1372  call s:create_test_file('Xqftestfile3')
1373
1374  new | only
1375  edit Xqftestfile1
1376  let file1_winid = win_getid()
1377  new Xqftestfile2
1378  let file2_winid = win_getid()
1379  cgetexpr ['Xqftestfile1:5:Line5',
1380		\ 'Xqftestfile1:6:Line6',
1381		\ 'Xqftestfile2:10:Line10',
1382		\ 'Xqftestfile2:11:Line11',
1383		\ 'Xqftestfile3:15:Line15',
1384		\ 'Xqftestfile3:16:Line16']
1385
1386  new
1387  let winid = win_getid()
1388  cfirst | cnext
1389  call assert_equal(winid, win_getid())
1390  cnext | cnext
1391  call assert_equal(winid, win_getid())
1392  cnext | cnext
1393  call assert_equal(winid, win_getid())
1394  enew
1395
1396  set switchbuf=useopen
1397  cfirst | cnext
1398  call assert_equal(file1_winid, win_getid())
1399  cnext | cnext
1400  call assert_equal(file2_winid, win_getid())
1401  cnext | cnext
1402  call assert_equal(file2_winid, win_getid())
1403
1404  enew | only
1405  set switchbuf=usetab
1406  tabedit Xqftestfile1
1407  tabedit Xqftestfile2
1408  tabfirst
1409  cfirst | cnext
1410  call assert_equal(2, tabpagenr())
1411  cnext | cnext
1412  call assert_equal(3, tabpagenr())
1413  cnext | cnext
1414  call assert_equal(3, tabpagenr())
1415  tabfirst | tabonly | enew
1416
1417  set switchbuf=split
1418  cfirst | cnext
1419  call assert_equal(1, winnr('$'))
1420  cnext | cnext
1421  call assert_equal(2, winnr('$'))
1422  cnext | cnext
1423  call assert_equal(3, winnr('$'))
1424  enew | only
1425
1426  set switchbuf=newtab
1427  cfirst | cnext
1428  call assert_equal(1, tabpagenr('$'))
1429  cnext | cnext
1430  call assert_equal(2, tabpagenr('$'))
1431  cnext | cnext
1432  call assert_equal(3, tabpagenr('$'))
1433  tabfirst | enew | tabonly | only
1434
1435  set switchbuf=
1436  edit Xqftestfile1
1437  let file1_winid = win_getid()
1438  new Xqftestfile2
1439  let file2_winid = win_getid()
1440  copen
1441  exe "normal 1G\<CR>"
1442  call assert_equal(file1_winid, win_getid())
1443  copen
1444  exe "normal 3G\<CR>"
1445  call assert_equal(file2_winid, win_getid())
1446  copen | only
1447  exe "normal 5G\<CR>"
1448  call assert_equal(2, winnr('$'))
1449  call assert_equal(1, bufwinnr('Xqftestfile3'))
1450
1451  " If only quickfix window is open in the current tabpage, jumping to an
1452  " entry with 'switchubf' set to 'usetab' should search in other tabpages.
1453  enew | only
1454  set switchbuf=usetab
1455  tabedit Xqftestfile1
1456  tabedit Xqftestfile2
1457  tabedit Xqftestfile3
1458  tabfirst
1459  copen | only
1460  clast
1461  call assert_equal(4, tabpagenr())
1462  tabfirst | tabonly | enew | only
1463
1464  call delete('Xqftestfile1')
1465  call delete('Xqftestfile2')
1466  call delete('Xqftestfile3')
1467  set switchbuf&vim
1468
1469  enew | only
1470endfunc
1471
1472func Xadjust_qflnum(cchar)
1473  call s:setup_commands(a:cchar)
1474
1475  enew | only
1476
1477  let fname = 'Xqftestfile' . a:cchar
1478  call s:create_test_file(fname)
1479  exe 'edit ' . fname
1480
1481  Xgetexpr [fname . ':5:Line5',
1482	      \ fname . ':10:Line10',
1483	      \ fname . ':15:Line15',
1484	      \ fname . ':20:Line20']
1485
1486  6,14delete
1487  call append(6, ['Buffer', 'Window'])
1488
1489  let l = g:Xgetlist()
1490
1491  call assert_equal(5, l[0].lnum)
1492  call assert_equal(6, l[2].lnum)
1493  call assert_equal(13, l[3].lnum)
1494
1495  enew!
1496  call delete(fname)
1497endfunc
1498
1499func Test_adjust_lnum()
1500  call setloclist(0, [])
1501  call Xadjust_qflnum('c')
1502  call setqflist([])
1503  call Xadjust_qflnum('l')
1504endfunc
1505
1506" Tests for the :grep/:lgrep and :grepadd/:lgrepadd commands
1507func s:test_xgrep(cchar)
1508  call s:setup_commands(a:cchar)
1509
1510  " The following lines are used for the grep test. Don't remove.
1511  " Grep_Test_Text: Match 1
1512  " Grep_Test_Text: Match 2
1513  " GrepAdd_Test_Text: Match 1
1514  " GrepAdd_Test_Text: Match 2
1515  enew! | only
1516  set makeef&vim
1517  silent Xgrep Grep_Test_Text: test_quickfix.vim
1518  call assert_true(len(g:Xgetlist()) == 3)
1519  Xopen
1520  call assert_true(w:quickfix_title =~ '^:grep')
1521  Xclose
1522  enew
1523  set makeef=Temp_File_##
1524  silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
1525  call assert_true(len(g:Xgetlist()) == 6)
1526endfunc
1527
1528func Test_grep()
1529  if !has('unix')
1530    " The grepprg may not be set on non-Unix systems
1531    return
1532  endif
1533
1534  call s:test_xgrep('c')
1535  call s:test_xgrep('l')
1536endfunc
1537
1538func Test_two_windows()
1539  " Use one 'errorformat' for two windows.  Add an expression to each of them,
1540  " make sure they each keep their own state.
1541  set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
1542  call mkdir('Xone/a', 'p')
1543  call mkdir('Xtwo/a', 'p')
1544  let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
1545  call writefile(lines, 'Xone/a/one.txt')
1546  call writefile(lines, 'Xtwo/a/two.txt')
1547
1548  new one
1549  let one_id = win_getid()
1550  lexpr ""
1551  new two
1552  let two_id = win_getid()
1553  lexpr ""
1554
1555  laddexpr "Entering dir 'Xtwo/a'"
1556  call win_gotoid(one_id)
1557  laddexpr "Entering dir 'Xone/a'"
1558  call win_gotoid(two_id)
1559  laddexpr 'two.txt:5:two two two'
1560  call win_gotoid(one_id)
1561  laddexpr 'one.txt:3:one one one'
1562
1563  let loc_one = getloclist(one_id)
1564  call assert_equal('Xone/a/one.txt', bufname(loc_one[1].bufnr))
1565  call assert_equal(3, loc_one[1].lnum)
1566
1567  let loc_two = getloclist(two_id)
1568  call assert_equal('Xtwo/a/two.txt', bufname(loc_two[1].bufnr))
1569  call assert_equal(5, loc_two[1].lnum)
1570
1571  call win_gotoid(one_id)
1572  bwipe!
1573  call win_gotoid(two_id)
1574  bwipe!
1575  call delete('Xone', 'rf')
1576  call delete('Xtwo', 'rf')
1577endfunc
1578
1579func XbottomTests(cchar)
1580  call s:setup_commands(a:cchar)
1581
1582  " Calling lbottom without any errors should fail
1583  if a:cchar == 'l'
1584      call assert_fails('lbottom', 'E776:')
1585  endif
1586
1587  call g:Xsetlist([{'filename': 'foo', 'lnum': 42}])
1588  Xopen
1589  let wid = win_getid()
1590  call assert_equal(1, line('.'))
1591  wincmd w
1592  call g:Xsetlist([{'filename': 'var', 'lnum': 24}], 'a')
1593  Xbottom
1594  call win_gotoid(wid)
1595  call assert_equal(2, line('.'))
1596  Xclose
1597endfunc
1598
1599" Tests for the :cbottom and :lbottom commands
1600func Test_cbottom()
1601  call XbottomTests('c')
1602  call XbottomTests('l')
1603endfunc
1604
1605func HistoryTest(cchar)
1606  call s:setup_commands(a:cchar)
1607
1608  " clear all lists after the first one, then replace the first one.
1609  call g:Xsetlist([])
1610  call assert_fails('Xolder 99', 'E380:')
1611  let entry = {'filename': 'foo', 'lnum': 42}
1612  call g:Xsetlist([entry], 'r')
1613  call g:Xsetlist([entry, entry])
1614  call g:Xsetlist([entry, entry, entry])
1615  let res = split(execute(a:cchar . 'hist'), "\n")
1616  call assert_equal(3, len(res))
1617  let common = 'errors     :set' . (a:cchar == 'c' ? 'qf' : 'loc') . 'list()'
1618  call assert_equal('  error list 1 of 3; 1 ' . common, res[0])
1619  call assert_equal('  error list 2 of 3; 2 ' . common, res[1])
1620  call assert_equal('> error list 3 of 3; 3 ' . common, res[2])
1621endfunc
1622
1623func Test_history()
1624  call HistoryTest('c')
1625  call HistoryTest('l')
1626endfunc
1627
1628func Test_duplicate_buf()
1629  " make sure we can get the highest buffer number
1630  edit DoesNotExist
1631  edit DoesNotExist2
1632  let last_buffer = bufnr("$")
1633
1634  " make sure only one buffer is created
1635  call writefile(['this one', 'that one'], 'Xgrepthis')
1636  vimgrep one Xgrepthis
1637  vimgrep one Xgrepthis
1638  call assert_equal(last_buffer + 1, bufnr("$"))
1639
1640  call delete('Xgrepthis')
1641endfunc
1642
1643" Quickfix/Location list set/get properties tests
1644func Xproperty_tests(cchar)
1645    call s:setup_commands(a:cchar)
1646
1647    " Error cases
1648    call assert_fails('call g:Xgetlist(99)', 'E715:')
1649    call assert_fails('call g:Xsetlist(99)', 'E714:')
1650    call assert_fails('call g:Xsetlist([], "a", [])', 'E715:')
1651
1652    " Set and get the title
1653    call g:Xsetlist([])
1654    Xopen
1655    wincmd p
1656    call g:Xsetlist([{'filename':'foo', 'lnum':27}])
1657    call g:Xsetlist([], 'a', {'title' : 'Sample'})
1658    let d = g:Xgetlist({"title":1})
1659    call assert_equal('Sample', d.title)
1660
1661    Xopen
1662    call assert_equal('Sample', w:quickfix_title)
1663    Xclose
1664
1665    " Tests for action argument
1666    silent! Xolder 999
1667    let qfnr = g:Xgetlist({'all':1}).nr
1668    call g:Xsetlist([], 'r', {'title' : 'N1'})
1669    call assert_equal('N1', g:Xgetlist({'all':1}).title)
1670    call g:Xsetlist([], ' ', {'title' : 'N2'})
1671    call assert_equal(qfnr + 1, g:Xgetlist({'all':1}).nr)
1672
1673    let res = g:Xgetlist({'nr': 0})
1674    call assert_equal(qfnr + 1, res.nr)
1675    call assert_equal(['nr'], keys(res))
1676
1677    call g:Xsetlist([], ' ', {'title' : 'N3'})
1678    call assert_equal('N2', g:Xgetlist({'nr':2, 'title':1}).title)
1679
1680    " Changing the title of an earlier quickfix list
1681    call g:Xsetlist([], ' ', {'title' : 'NewTitle', 'nr' : 2})
1682    call assert_equal('NewTitle', g:Xgetlist({'nr':2, 'title':1}).title)
1683
1684    " Changing the title of an invalid quickfix list
1685    call assert_equal(-1, g:Xsetlist([], ' ',
1686		\ {'title' : 'SomeTitle', 'nr' : 99}))
1687    call assert_equal(-1, g:Xsetlist([], ' ',
1688		\ {'title' : 'SomeTitle', 'nr' : 'abc'}))
1689
1690    if a:cchar == 'c'
1691	copen
1692	call assert_equal({'winid':win_getid()}, getqflist({'winid':1}))
1693	cclose
1694    endif
1695
1696    " Invalid arguments
1697    call assert_fails('call g:Xgetlist([])', 'E715')
1698    call assert_fails('call g:Xsetlist([], "a", [])', 'E715')
1699    let s = g:Xsetlist([], 'a', {'abc':1})
1700    call assert_equal(-1, s)
1701
1702    call assert_equal({}, g:Xgetlist({'abc':1}))
1703    call assert_equal({}, g:Xgetlist({'nr':99, 'title':1}))
1704    call assert_equal({}, g:Xgetlist({'nr':[], 'title':1}))
1705
1706    if a:cchar == 'l'
1707	call assert_equal({}, getloclist(99, {'title': 1}))
1708    endif
1709endfunc
1710
1711func Test_qf_property()
1712    call Xproperty_tests('c')
1713    call Xproperty_tests('l')
1714endfunc
1715
1716" Tests for the QuickFixCmdPre/QuickFixCmdPost autocommands
1717func QfAutoCmdHandler(loc, cmd)
1718  call add(g:acmds, a:loc . a:cmd)
1719endfunc
1720
1721func Test_Autocmd()
1722  autocmd QuickFixCmdPre * call QfAutoCmdHandler('pre', expand('<amatch>'))
1723  autocmd QuickFixCmdPost * call QfAutoCmdHandler('post', expand('<amatch>'))
1724
1725  let g:acmds = []
1726  cexpr "F1:10:Line 10"
1727  caddexpr "F1:20:Line 20"
1728  cgetexpr "F1:30:Line 30"
1729  enew! | call append(0, "F2:10:Line 10")
1730  cbuffer!
1731  enew! | call append(0, "F2:20:Line 20")
1732  cgetbuffer
1733  enew! | call append(0, "F2:30:Line 30")
1734  caddbuffer
1735
1736  let l = ['precexpr',
1737	      \ 'postcexpr',
1738	      \ 'precaddexpr',
1739	      \ 'postcaddexpr',
1740	      \ 'precgetexpr',
1741	      \ 'postcgetexpr',
1742	      \ 'precbuffer',
1743	      \ 'postcbuffer',
1744	      \ 'precgetbuffer',
1745	      \ 'postcgetbuffer',
1746	      \ 'precaddbuffer',
1747	      \ 'postcaddbuffer']
1748  call assert_equal(l, g:acmds)
1749endfunc
1750
1751func Test_Autocmd_Exception()
1752  set efm=%m
1753  lgetexpr '?'
1754
1755  try
1756    call DoesNotExit()
1757  catch
1758    lgetexpr '1'
1759  finally
1760    lgetexpr '1'
1761  endtry
1762
1763  call assert_equal('1', getloclist(0)[0].text)
1764
1765  set efm&vim
1766endfunc
1767
1768func Test_caddbuffer_wrong()
1769  " This used to cause a memory access in freed memory.
1770  let save_efm = &efm
1771  set efm=%EEEE%m,%WWWW,%+CCCC%>%#,%GGGG%.#
1772  cgetexpr ['WWWW', 'EEEE', 'CCCC']
1773  let &efm = save_efm
1774  caddbuffer
1775  bwipe!
1776endfunc
1777
1778func Test_caddexpr_wrong()
1779  " This used to cause a memory access in freed memory.
1780  cbuffer
1781  cbuffer
1782  copen
1783  let save_efm = &efm
1784  set efm=%
1785  call assert_fails('caddexpr ""', 'E376:')
1786  let &efm = save_efm
1787endfunc
1788
1789func Test_dirstack_cleanup()
1790  " This used to cause a memory access in freed memory.
1791  let save_efm = &efm
1792  lexpr '0'
1793  lopen
1794  fun X(c)
1795    let save_efm=&efm
1796    set efm=%D%f
1797    if a:c == 'c'
1798      caddexpr '::'
1799    else
1800      laddexpr ':0:0'
1801    endif
1802    let &efm=save_efm
1803  endfun
1804  call X('c')
1805  call X('l')
1806  call setqflist([], 'r')
1807  caddbuffer
1808  let &efm = save_efm
1809endfunc
1810
1811" Tests for jumping to entries from the location list window and quickfix
1812" window
1813func Test_cwindow_jump()
1814  set efm=%f%%%l%%%m
1815  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
1816  lopen | only
1817  lfirst
1818  call assert_true(winnr('$') == 2)
1819  call assert_true(winnr() == 1)
1820  " Location list for the new window should be set
1821  call assert_true(getloclist(0)[2].text == 'Line 30')
1822
1823  " Open a scratch buffer
1824  " Open a new window and create a location list
1825  " Open the location list window and close the other window
1826  " Jump to an entry.
1827  " Should create a new window and jump to the entry. The scrtach buffer
1828  " should not be used.
1829  enew | only
1830  set buftype=nofile
1831  below new
1832  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
1833  lopen
1834  2wincmd c
1835  lnext
1836  call assert_true(winnr('$') == 3)
1837  call assert_true(winnr() == 2)
1838
1839  " Open two windows with two different location lists
1840  " Open the location list window and close the previous window
1841  " Jump to an entry in the location list window
1842  " Should open the file in the first window and not set the location list.
1843  enew | only
1844  lgetexpr ["F1%5%Line 5"]
1845  below new
1846  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
1847  lopen
1848  2wincmd c
1849  lnext
1850  call assert_true(winnr() == 1)
1851  call assert_true(getloclist(0)[0].text == 'Line 5')
1852
1853  enew | only
1854  cgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
1855  copen
1856  cnext
1857  call assert_true(winnr('$') == 2)
1858  call assert_true(winnr() == 1)
1859
1860  enew | only
1861  set efm&vim
1862endfunc
1863
1864func XvimgrepTests(cchar)
1865  call s:setup_commands(a:cchar)
1866
1867  call writefile(['Editor:VIM vim',
1868	      \ 'Editor:Emacs EmAcS',
1869	      \ 'Editor:Notepad NOTEPAD'], 'Xtestfile1')
1870  call writefile(['Linux', 'MacOS', 'MS-Windows'], 'Xtestfile2')
1871
1872  " Error cases
1873  call assert_fails('Xvimgrep /abc *', 'E682:')
1874
1875  let @/=''
1876  call assert_fails('Xvimgrep // *', 'E35:')
1877
1878  call assert_fails('Xvimgrep abc', 'E683:')
1879  call assert_fails('Xvimgrep a1b2c3 Xtestfile1', 'E480:')
1880  call assert_fails('Xvimgrep pat Xa1b2c3', 'E480:')
1881
1882  Xexpr ""
1883  Xvimgrepadd Notepad Xtestfile1
1884  Xvimgrepadd MacOS Xtestfile2
1885  let l = g:Xgetlist()
1886  call assert_equal(2, len(l))
1887  call assert_equal('Editor:Notepad NOTEPAD', l[0].text)
1888
1889  Xvimgrep #\cvim#g Xtestfile?
1890  let l = g:Xgetlist()
1891  call assert_equal(2, len(l))
1892  call assert_equal(8, l[0].col)
1893  call assert_equal(12, l[1].col)
1894
1895  1Xvimgrep ?Editor? Xtestfile*
1896  let l = g:Xgetlist()
1897  call assert_equal(1, len(l))
1898  call assert_equal('Editor:VIM vim', l[0].text)
1899
1900  edit +3 Xtestfile2
1901  Xvimgrep +\cemacs+j Xtestfile1
1902  let l = g:Xgetlist()
1903  call assert_equal('Xtestfile2', bufname(''))
1904  call assert_equal('Editor:Emacs EmAcS', l[0].text)
1905
1906  call delete('Xtestfile1')
1907  call delete('Xtestfile2')
1908endfunc
1909
1910" Tests for the :vimgrep command
1911func Test_vimgrep()
1912  call XvimgrepTests('c')
1913  call XvimgrepTests('l')
1914endfunc
1915
1916func XfreeTests(cchar)
1917  call s:setup_commands(a:cchar)
1918
1919  enew | only
1920
1921  " Deleting the quickfix stack should work even When the current list is
1922  " somewhere in the middle of the stack
1923  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
1924  Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
1925  Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
1926  Xolder
1927  call g:Xsetlist([], 'f')
1928  call assert_equal(0, len(g:Xgetlist()))
1929
1930  " After deleting the stack, adding a new list should create a stack with a
1931  " single list.
1932  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
1933  call assert_equal(1, g:Xgetlist({'all':1}).nr)
1934
1935  " Deleting the stack from a quickfix window should update/clear the
1936  " quickfix/location list window.
1937  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
1938  Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
1939  Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
1940  Xolder
1941  Xwindow
1942  call g:Xsetlist([], 'f')
1943  call assert_equal(2, winnr('$'))
1944  call assert_equal(1, line('$'))
1945  Xclose
1946
1947  " Deleting the stack from a non-quickfix window should update/clear the
1948  " quickfix/location list window.
1949  Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
1950  Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
1951  Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
1952  Xolder
1953  Xwindow
1954  wincmd p
1955  call g:Xsetlist([], 'f')
1956  call assert_equal(0, len(g:Xgetlist()))
1957  wincmd p
1958  call assert_equal(2, winnr('$'))
1959  call assert_equal(1, line('$'))
1960
1961  " After deleting the location list stack, if the location list window is
1962  " opened, then a new location list should be created. So opening the
1963  " location list window again should not create a new window.
1964  if a:cchar == 'l'
1965      lexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
1966      wincmd p
1967      lopen
1968      call assert_equal(2, winnr('$'))
1969  endif
1970  Xclose
1971endfunc
1972
1973" Tests for the quickifx free functionality
1974func Test_qf_free()
1975  call XfreeTests('c')
1976  call XfreeTests('l')
1977endfunc
1978