blob: 8da1b6fff4b4643f683cc019dc7078f5e250d890 [file] [log] [blame]
Bram Moolenaarda59dd52016-01-05 21:59:58 +01001" Test for the quickfix commands.
2
3if !has('quickfix')
4 finish
5endif
6
Bram Moolenaar7eba3d22016-03-19 22:54:09 +01007set encoding=utf-8
8
Bram Moolenaarda59dd52016-01-05 21:59:58 +01009" Tests for the :clist and :llist commands
10function XlistTests(cchar)
11 let Xlist = a:cchar . 'list'
12 let Xgetexpr = a:cchar . 'getexpr'
13
14 " With an empty list, command should return error
15 exe Xgetexpr . ' []'
16 exe 'silent! ' . Xlist
17 call assert_true(v:errmsg ==# 'E42: No Errors')
18
19 " Populate the list and then try
20 exe Xgetexpr . " ['non-error 1', 'Xtestfile1:1:3:Line1',
21 \ 'non-error 2', 'Xtestfile2:2:2:Line2',
22 \ 'non-error 3', 'Xtestfile3:3:1:Line3']"
23
24 " List only valid entries
25 redir => result
26 exe Xlist
27 redir END
28 let l = split(result, "\n")
29 call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
30 \ ' 4 Xtestfile2:2 col 2: Line2',
31 \ ' 6 Xtestfile3:3 col 1: Line3'], l)
32
33 " List all the entries
34 redir => result
35 exe Xlist . "!"
36 redir END
37 let l = split(result, "\n")
38 call assert_equal([' 1: non-error 1', ' 2 Xtestfile1:1 col 3: Line1',
39 \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2',
40 \ ' 5: non-error 3', ' 6 Xtestfile3:3 col 1: Line3'], l)
41
42 " List a range of errors
43 redir => result
44 exe Xlist . " 3,6"
45 redir END
46 let l = split(result, "\n")
47 call assert_equal([' 4 Xtestfile2:2 col 2: Line2',
48 \ ' 6 Xtestfile3:3 col 1: Line3'], l)
49
50 redir => result
51 exe Xlist . "! 3,4"
52 redir END
53 let l = split(result, "\n")
54 call assert_equal([' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
55
56 redir => result
57 exe Xlist . " -6,-4"
58 redir END
59 let l = split(result, "\n")
60 call assert_equal([' 2 Xtestfile1:1 col 3: Line1'], l)
61
62 redir => result
63 exe Xlist . "! -5,-3"
64 redir END
65 let l = split(result, "\n")
66 call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
67 \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
68endfunction
69
70function Test_clist()
71 call XlistTests('c')
72 call XlistTests('l')
73endfunction
74
75" Tests for the :colder, :cnewer, :lolder and :lnewer commands
76" Note that this test assumes that a quickfix/location list is
Bram Moolenaarcfc0a352016-01-09 20:23:00 +010077" already set by the caller.
Bram Moolenaarda59dd52016-01-05 21:59:58 +010078function XageTests(cchar)
79 let Xolder = a:cchar . 'older'
80 let Xnewer = a:cchar . 'newer'
81 let Xgetexpr = a:cchar . 'getexpr'
82 if a:cchar == 'c'
83 let Xgetlist = 'getqflist()'
84 else
85 let Xgetlist = 'getloclist(0)'
86 endif
87
88 " Jumping to a non existent list should return error
89 exe 'silent! ' . Xolder . ' 99'
90 call assert_true(v:errmsg ==# 'E380: At bottom of quickfix stack')
91
92 exe 'silent! ' . Xnewer . ' 99'
93 call assert_true(v:errmsg ==# 'E381: At top of quickfix stack')
94
95 " Add three quickfix/location lists
96 exe Xgetexpr . " ['Xtestfile1:1:3:Line1']"
97 exe Xgetexpr . " ['Xtestfile2:2:2:Line2']"
98 exe Xgetexpr . " ['Xtestfile3:3:1:Line3']"
99
100 " Go back two lists
101 exe Xolder
102 exe 'let l = ' . Xgetlist
103 call assert_equal('Line2', l[0].text)
104
105 " Go forward two lists
106 exe Xnewer
107 exe 'let l = ' . Xgetlist
108 call assert_equal('Line3', l[0].text)
109
110 " Test for the optional count argument
111 exe Xolder . ' 2'
112 exe 'let l = ' . Xgetlist
113 call assert_equal('Line1', l[0].text)
114
115 exe Xnewer . ' 2'
116 exe 'let l = ' . Xgetlist
117 call assert_equal('Line3', l[0].text)
118endfunction
119
120function Test_cage()
Bram Moolenaarcfc0a352016-01-09 20:23:00 +0100121 let list = [{'bufnr': 1, 'lnum': 1}]
122 call setqflist(list)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100123 call XageTests('c')
Bram Moolenaarcfc0a352016-01-09 20:23:00 +0100124
125 call setloclist(0, list)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100126 call XageTests('l')
127endfunction
128
129" Tests for the :cwindow, :lwindow :cclose, :lclose, :copen and :lopen
130" commands
131function XwindowTests(cchar)
132 let Xwindow = a:cchar . 'window'
133 let Xclose = a:cchar . 'close'
134 let Xopen = a:cchar . 'open'
135 let Xgetexpr = a:cchar . 'getexpr'
136
137 " Create a list with no valid entries
138 exe Xgetexpr . " ['non-error 1', 'non-error 2', 'non-error 3']"
139
140 " Quickfix/Location window should not open with no valid errors
141 exe Xwindow
142 call assert_true(winnr('$') == 1)
143
144 " Create a list with valid entries
145 exe Xgetexpr . " ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2',
146 \ 'Xtestfile3:3:1:Line3']"
147
148 " Open the window
149 exe Xwindow
150 call assert_true(winnr('$') == 2 && winnr() == 2 &&
151 \ getline('.') ==# 'Xtestfile1|1 col 3| Line1')
152
153 " Close the window
154 exe Xclose
155 call assert_true(winnr('$') == 1)
156
157 " Create a list with no valid entries
158 exe Xgetexpr . " ['non-error 1', 'non-error 2', 'non-error 3']"
159
160 " Open the window
161 exe Xopen . ' 5'
162 call assert_true(winnr('$') == 2 && getline('.') ==# '|| non-error 1'
163 \ && winheight('.') == 5)
164
165 " Opening the window again, should move the cursor to that window
166 wincmd t
167 exe Xopen . ' 7'
168 call assert_true(winnr('$') == 2 && winnr() == 2 &&
169 \ winheight('.') == 7 &&
170 \ getline('.') ==# '|| non-error 1')
171
172
173 " Calling cwindow should close the quickfix window with no valid errors
174 exe Xwindow
175 call assert_true(winnr('$') == 1)
176endfunction
177
178function Test_cwindow()
179 call XwindowTests('c')
180 call XwindowTests('l')
181endfunction
182
183" Tests for the :cfile, :lfile, :caddfile, :laddfile, :cgetfile and :lgetfile
184" commands.
185function XfileTests(cchar)
186 let Xfile = a:cchar . 'file'
187 let Xgetfile = a:cchar . 'getfile'
188 let Xaddfile = a:cchar . 'addfile'
189 if a:cchar == 'c'
190 let Xgetlist = 'getqflist()'
191 else
192 let Xgetlist = 'getloclist(0)'
193 endif
194
195 call writefile(['Xtestfile1:700:10:Line 700',
196 \ 'Xtestfile2:800:15:Line 800'], 'Xqftestfile1')
197
198 enew!
199 exe Xfile . ' Xqftestfile1'
200 exe 'let l = ' . Xgetlist
201 call assert_true(len(l) == 2 &&
202 \ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
203 \ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
204
205 " Run cfile/lfile from a modified buffer
206 enew!
207 silent! put ='Quickfix'
208 exe 'silent! ' . Xfile . ' Xqftestfile1'
209 call assert_true(v:errmsg ==# 'E37: No write since last change (add ! to override)')
210
211 call writefile(['Xtestfile3:900:30:Line 900'], 'Xqftestfile1')
212 exe Xaddfile . ' Xqftestfile1'
213 exe 'let l = ' . Xgetlist
214 call assert_true(len(l) == 3 &&
215 \ l[2].lnum == 900 && l[2].col == 30 && l[2].text ==# 'Line 900')
216
217 call writefile(['Xtestfile1:222:77:Line 222',
218 \ 'Xtestfile2:333:88:Line 333'], 'Xqftestfile1')
219
220 enew!
221 exe Xgetfile . ' Xqftestfile1'
222 exe 'let l = ' . Xgetlist
223 call assert_true(len(l) == 2 &&
224 \ l[0].lnum == 222 && l[0].col == 77 && l[0].text ==# 'Line 222' &&
225 \ l[1].lnum == 333 && l[1].col == 88 && l[1].text ==# 'Line 333')
226
227 call delete('Xqftestfile1')
228endfunction
229
230function Test_cfile()
231 call XfileTests('c')
232 call XfileTests('l')
233endfunction
234
235" Tests for the :cbuffer, :lbuffer, :caddbuffer, :laddbuffer, :cgetbuffer and
236" :lgetbuffer commands.
237function XbufferTests(cchar)
238 let Xbuffer = a:cchar . 'buffer'
239 let Xgetbuffer = a:cchar . 'getbuffer'
240 let Xaddbuffer = a:cchar . 'addbuffer'
241 if a:cchar == 'c'
242 let Xgetlist = 'getqflist()'
243 else
244 let Xgetlist = 'getloclist(0)'
245 endif
246
247 enew!
248 silent! call setline(1, ['Xtestfile7:700:10:Line 700',
249 \ 'Xtestfile8:800:15:Line 800'])
250 exe Xbuffer . "!"
251 exe 'let l = ' . Xgetlist
252 call assert_true(len(l) == 2 &&
253 \ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
254 \ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
255
256 enew!
257 silent! call setline(1, ['Xtestfile9:900:55:Line 900',
258 \ 'Xtestfile10:950:66:Line 950'])
259 exe Xgetbuffer
260 exe 'let l = ' . Xgetlist
261 call assert_true(len(l) == 2 &&
262 \ l[0].lnum == 900 && l[0].col == 55 && l[0].text ==# 'Line 900' &&
263 \ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950')
264
265 enew!
266 silent! call setline(1, ['Xtestfile11:700:20:Line 700',
267 \ 'Xtestfile12:750:25:Line 750'])
268 exe Xaddbuffer
269 exe 'let l = ' . Xgetlist
270 call assert_true(len(l) == 4 &&
271 \ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950' &&
272 \ l[2].lnum == 700 && l[2].col == 20 && l[2].text ==# 'Line 700' &&
273 \ l[3].lnum == 750 && l[3].col == 25 && l[3].text ==# 'Line 750')
274
275endfunction
276
277function Test_cbuffer()
278 call XbufferTests('c')
279 call XbufferTests('l')
280endfunction
281
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100282function Test_nomem()
Bram Moolenaar28fb79d2016-01-09 22:28:33 +0100283 call alloc_fail(GetAllocId('qf_dirname_start'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100284 call assert_fails('vimgrep vim runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100285
Bram Moolenaar28fb79d2016-01-09 22:28:33 +0100286 call alloc_fail(GetAllocId('qf_dirname_now'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100287 call assert_fails('vimgrep vim runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100288
Bram Moolenaar28fb79d2016-01-09 22:28:33 +0100289 call alloc_fail(GetAllocId('qf_namebuf'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100290 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100291
Bram Moolenaar28fb79d2016-01-09 22:28:33 +0100292 call alloc_fail(GetAllocId('qf_errmsg'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100293 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100294
Bram Moolenaar28fb79d2016-01-09 22:28:33 +0100295 call alloc_fail(GetAllocId('qf_pattern'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100296 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100297
298endfunc
299
Bram Moolenaar62ef7972016-01-19 14:51:54 +0100300function Test_helpgrep()
301 helpgrep quickfix
302 copen
303 " This wipes out the buffer, make sure that doesn't cause trouble.
304 cclose
305endfunc
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100306
Bram Moolenaar6920c722016-01-22 22:44:10 +0100307func Test_errortitle()
308 augroup QfBufWinEnter
309 au!
310 au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
311 augroup END
312 copen
313 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'')'}]
314 call setqflist(a)
315 call assert_equal(':setqflist()', g:a)
316 augroup QfBufWinEnter
317 au!
318 augroup END
319 augroup! QfBufWinEnter
320endfunc
Bram Moolenaare27dba42016-03-15 14:11:10 +0100321
Bram Moolenaar5584df62016-03-18 21:00:51 +0100322func Test_vimgreptitle()
323 augroup QfBufWinEnter
324 au!
325 au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
326 augroup END
327 try
328 vimgrep /pattern/j file
329 catch /E480/
330 endtry
331 copen
332 call assert_equal(': vimgrep /pattern/j file', g:a)
333 augroup QfBufWinEnter
334 au!
335 augroup END
336 augroup! QfBufWinEnter
337endfunc
338
Bram Moolenaare27dba42016-03-15 14:11:10 +0100339function XqfTitleTests(cchar)
340 let Xgetexpr = a:cchar . 'getexpr'
341 if a:cchar == 'c'
342 let Xgetlist = 'getqflist()'
343 else
344 let Xgetlist = 'getloclist(0)'
345 endif
346 let Xopen = a:cchar . 'open'
347 let Xclose = a:cchar . 'close'
348
349 exe Xgetexpr . " ['file:1:1:message']"
350 exe 'let l = ' . Xgetlist
351 if a:cchar == 'c'
352 call setqflist(l, 'r')
353 else
354 call setloclist(0, l, 'r')
355 endif
356
357 exe Xopen
358 if a:cchar == 'c'
359 let title = ':setqflist()'
360 else
361 let title = ':setloclist()'
362 endif
363 call assert_equal(title, w:quickfix_title)
364 exe Xclose
365endfunction
366
367" Tests for quickfix window's title
368function Test_qf_title()
369 call XqfTitleTests('c')
370 call XqfTitleTests('l')
371endfunction
372
373" Tests for 'errorformat'
374function Test_efm()
375 let save_efm = &efm
376 set efm=%EEEE%m,%WWWW%m,%+CCCC%.%#,%-GGGG%.%#
377 cgetexpr ['WWWW', 'EEEE', 'CCCC']
378 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
379 call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
380 cgetexpr ['WWWW', 'GGGG', 'EEEE', 'CCCC']
381 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
382 call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
383 cgetexpr ['WWWW', 'GGGG', 'ZZZZ', 'EEEE', 'CCCC', 'YYYY']
384 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
385 call assert_equal("[['W', 1], ['ZZZZ', 0], ['E^@CCCC', 1], ['YYYY', 0]]", l)
386 let &efm = save_efm
387endfunction
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100388
389" This will test for problems in quickfix:
390" A. incorrectly copying location lists which caused the location list to show
391" a different name than the file that was actually being displayed.
392" B. not reusing the window for which the location list window is opened but
393" instead creating new windows.
394" C. make sure that the location list window is not reused instead of the
395" window it belongs to.
396"
397" Set up the test environment:
398function! ReadTestProtocol(name)
399 let base = substitute(a:name, '\v^test://(.*)%(\.[^.]+)?', '\1', '')
400 let word = substitute(base, '\v(.*)\..*', '\1', '')
401
402 setl modifiable
403 setl noreadonly
404 setl noswapfile
405 setl bufhidden=delete
406 %del _
407 " For problem 2:
408 " 'buftype' has to be set to reproduce the constant opening of new windows
409 setl buftype=nofile
410
411 call setline(1, word)
412
413 setl nomodified
414 setl nomodifiable
415 setl readonly
416 exe 'doautocmd BufRead ' . substitute(a:name, '\v^test://(.*)', '\1', '')
417endfunction
418
419function Test_locationlist()
420 enew
421
422 augroup testgroup
423 au!
424 autocmd BufReadCmd test://* call ReadTestProtocol(expand("<amatch>"))
425 augroup END
426
427 let words = [ "foo", "bar", "baz", "quux", "shmoo", "spam", "eggs" ]
428
429 let qflist = []
430 for word in words
431 call add(qflist, {'filename': 'test://' . word . '.txt', 'text': 'file ' . word . '.txt', })
432 " NOTE: problem 1:
433 " intentionally not setting 'lnum' so that the quickfix entries are not
434 " valid
435 call setloclist(0, qflist, ' ')
436 endfor
437
438 " Test A
439 lrewind
440 enew
441 lopen
442 lnext
443 lnext
444 lnext
445 lnext
446 vert split
447 wincmd L
448 lopen
449 wincmd p
450 lnext
451 let fileName = expand("%")
452 wincmd p
453 let locationListFileName = substitute(getline(line('.')), '\([^|]*\)|.*', '\1', '')
454 let fileName = substitute(fileName, '\\', '/', 'g')
455 let locationListFileName = substitute(locationListFileName, '\\', '/', 'g')
456 call assert_equal("test://bar.txt", fileName)
457 call assert_equal("test://bar.txt", locationListFileName)
458
459 wincmd n | only
460
461 " Test B:
462 lrewind
463 lopen
464 2
465 exe "normal \<CR>"
466 wincmd p
467 3
468 exe "normal \<CR>"
469 wincmd p
470 4
471 exe "normal \<CR>"
472 call assert_equal(2, winnr('$'))
473 wincmd n | only
474
475 " Test C:
476 lrewind
477 lopen
478 " Let's move the location list window to the top to check whether it (the
479 " first window found) will be reused when we try to open new windows:
480 wincmd K
481 2
482 exe "normal \<CR>"
483 wincmd p
484 3
485 exe "normal \<CR>"
486 wincmd p
487 4
488 exe "normal \<CR>"
489 1wincmd w
490 call assert_equal('quickfix', &buftype)
491 2wincmd w
492 let bufferName = expand("%")
493 let bufferName = substitute(bufferName, '\\', '/', 'g')
494 call assert_equal('test://quux.txt', bufferName)
495
496 wincmd n | only
497
498 augroup! testgroup
499endfunction
Bram Moolenaar0899d692016-03-19 13:35:03 +0100500
501function Test_locationlist_curwin_was_closed()
502 augroup testgroup
503 au!
504 autocmd BufReadCmd t call R(expand("<amatch>"))
505 augroup END
506
Bram Moolenaarffec3c52016-03-23 20:55:42 +0100507 function! R(n)
Bram Moolenaar0899d692016-03-19 13:35:03 +0100508 quit
509 endfunc
510
511 new
512 let q = []
513 call add(q, {'filename': 't' })
514 call setloclist(0, q)
515 call assert_fails('lrewind', 'E924:')
516
517 augroup! testgroup
518endfunction
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100519
520" More tests for 'errorformat'
521function! Test_efm1()
522 if !has('unix')
523 " The 'errorformat' setting is different on non-Unix systems.
524 " This test works only on Unix-like systems.
525 return
526 endif
527
528 let l = [
529 \ '"Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set.',
530 \ '"Xtestfile", line 6 col 19; this is an error',
531 \ 'gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include version.c',
532 \ 'Xtestfile:9: parse error before `asd''',
533 \ 'make: *** [vim] Error 1',
534 \ 'in file "Xtestfile" linenr 10: there is an error',
535 \ '',
536 \ '2 returned',
537 \ '"Xtestfile", line 11 col 1; this is an error',
538 \ '"Xtestfile", line 12 col 2; this is another error',
539 \ '"Xtestfile", line 14:10; this is an error in column 10',
540 \ '=Xtestfile=, line 15:10; this is another error, but in vcol 10 this time',
541 \ '"Xtestfile", linenr 16: yet another problem',
542 \ 'Error in "Xtestfile" at line 17:',
543 \ 'x should be a dot',
544 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17',
545 \ ' ^',
546 \ 'Error in "Xtestfile" at line 18:',
547 \ 'x should be a dot',
548 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18',
549 \ '.............^',
550 \ 'Error in "Xtestfile" at line 19:',
551 \ 'x should be a dot',
552 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19',
553 \ '--------------^',
554 \ 'Error in "Xtestfile" at line 20:',
555 \ 'x should be a dot',
556 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20',
557 \ ' ^',
558 \ '',
559 \ 'Does anyone know what is the problem and how to correction it?',
560 \ '"Xtestfile", line 21 col 9: What is the title of the quickfix window?',
561 \ '"Xtestfile", line 22 col 9: What is the title of the quickfix window?'
562 \ ]
563
564 call writefile(l, 'Xerrorfile1')
565 call writefile(l[:-2], 'Xerrorfile2')
566
567 let m = [
568 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 2',
569 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 3',
570 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 4',
571 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 5',
572 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 6',
573 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 7',
574 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 8',
575 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 9',
576 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 10',
577 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 11',
578 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 12',
579 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 13',
580 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 14',
581 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 15',
582 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 16',
583 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17',
584 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18',
585 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19',
586 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20',
587 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 21',
588 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 22'
589 \ ]
590 call writefile(m, 'Xtestfile')
591
592 let save_efm = &efm
593 set efm+==%f=\\,\ line\ %l%*\\D%v%*[^\ ]\ %m
594 set efm^=%AError\ in\ \"%f\"\ at\ line\ %l:,%Z%p^,%C%m
595
596 exe 'cf Xerrorfile2'
597 clast
598 copen
599 call assert_equal(':cf Xerrorfile2', w:quickfix_title)
600 wincmd p
601
602 exe 'cf Xerrorfile1'
603 call assert_equal([4, 12], [line('.'), col('.')])
604 cn
605 call assert_equal([6, 19], [line('.'), col('.')])
606 cn
607 call assert_equal([9, 2], [line('.'), col('.')])
608 cn
609 call assert_equal([10, 2], [line('.'), col('.')])
610 cn
611 call assert_equal([11, 1], [line('.'), col('.')])
612 cn
613 call assert_equal([12, 2], [line('.'), col('.')])
614 cn
615 call assert_equal([14, 10], [line('.'), col('.')])
616 cn
617 call assert_equal([15, 3, 10], [line('.'), col('.'), virtcol('.')])
618 cn
619 call assert_equal([16, 2], [line('.'), col('.')])
620 cn
621 call assert_equal([17, 6], [line('.'), col('.')])
622 cn
623 call assert_equal([18, 7], [line('.'), col('.')])
624 cn
625 call assert_equal([19, 8], [line('.'), col('.')])
626 cn
627 call assert_equal([20, 9], [line('.'), col('.')])
628 clast
629 cprev
630 cprev
631 wincmd w
632 call assert_equal(':cf Xerrorfile1', w:quickfix_title)
633 wincmd p
634
635 let &efm = save_efm
636 call delete('Xerrorfile1')
637 call delete('Xerrorfile2')
638 call delete('Xtestfile')
639endfunction
Bram Moolenaarffec3c52016-03-23 20:55:42 +0100640
641function XquickfixChangedByAutocmd(cchar)
642 let Xolder = a:cchar . 'older'
643 let Xgetexpr = a:cchar . 'getexpr'
644 let Xrewind = a:cchar . 'rewind'
645 if a:cchar == 'c'
646 let Xsetlist = 'setqflist('
647 let ErrorNr = 'E925'
648 function! ReadFunc()
649 colder
650 cgetexpr []
651 endfunc
652 else
653 let Xsetlist = 'setloclist(0,'
654 let ErrorNr = 'E926'
655 function! ReadFunc()
656 lolder
657 lgetexpr []
658 endfunc
659 endif
660
661 augroup testgroup
662 au!
663 autocmd BufReadCmd t call ReadFunc()
664 augroup END
665
666 bwipe!
667 let words = [ "a", "b" ]
668 let qflist = []
669 for word in words
670 call add(qflist, {'filename': 't'})
671 exec "call " . Xsetlist . "qflist, '')"
672 endfor
673 exec "call assert_fails('" . Xrewind . "', '" . ErrorNr . ":')"
674
675 augroup! testgroup
676endfunc
677
678function Test_quickfix_was_changed_by_autocmd()
679 call XquickfixChangedByAutocmd('c')
680 call XquickfixChangedByAutocmd('l')
681endfunction
Bram Moolenaar8b201792016-03-25 15:01:10 +0100682
683func Test_caddbuffer_to_empty()
684 helpgr quickfix
685 call setqflist([], 'r')
686 cad
Bram Moolenaarf68f1d72016-03-25 17:14:06 +0100687 try
688 cn
689 catch
690 " number of matches is unknown
691 call assert_true(v:exception =~ 'E553:')
692 endtry
Bram Moolenaar8b201792016-03-25 15:01:10 +0100693 quit!
694endfunc
Bram Moolenaar89c64d52016-03-27 18:44:40 +0200695
696func Test_cgetexpr_works()
697 " this must not crash Vim
698 cgetexpr [$x]
699endfunc