blob: 4e0b166849fcab488077a433b8903ab71ab383fa [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'
Bram Moolenaarab47c612016-06-14 22:02:26 +020083 let Xgetlist = function('getqflist')
Bram Moolenaarda59dd52016-01-05 21:59:58 +010084 else
Bram Moolenaarab47c612016-06-14 22:02:26 +020085 let Xgetlist = function('getloclist', [0])
Bram Moolenaarda59dd52016-01-05 21:59:58 +010086 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
Bram Moolenaarab47c612016-06-14 22:02:26 +0200102 let l = Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100103 call assert_equal('Line2', l[0].text)
104
105 " Go forward two lists
106 exe Xnewer
Bram Moolenaarab47c612016-06-14 22:02:26 +0200107 let l = Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100108 call assert_equal('Line3', l[0].text)
109
110 " Test for the optional count argument
111 exe Xolder . ' 2'
Bram Moolenaarab47c612016-06-14 22:02:26 +0200112 let l = Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100113 call assert_equal('Line1', l[0].text)
114
115 exe Xnewer . ' 2'
Bram Moolenaarab47c612016-06-14 22:02:26 +0200116 let l = Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100117 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'
Bram Moolenaarab47c612016-06-14 22:02:26 +0200190 let Xgetlist = function('getqflist')
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100191 else
Bram Moolenaarab47c612016-06-14 22:02:26 +0200192 let Xgetlist = function('getloclist', [0])
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100193 endif
194
195 call writefile(['Xtestfile1:700:10:Line 700',
196 \ 'Xtestfile2:800:15:Line 800'], 'Xqftestfile1')
197
198 enew!
199 exe Xfile . ' Xqftestfile1'
Bram Moolenaarab47c612016-06-14 22:02:26 +0200200 let l = Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100201 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'
Bram Moolenaarab47c612016-06-14 22:02:26 +0200213 let l = Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100214 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'
Bram Moolenaarab47c612016-06-14 22:02:26 +0200222 let l = Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100223 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'
Bram Moolenaarab47c612016-06-14 22:02:26 +0200242 let Xgetlist = function('getqflist')
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100243 else
Bram Moolenaarab47c612016-06-14 22:02:26 +0200244 let Xgetlist = function('getloclist', [0])
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100245 endif
246
247 enew!
248 silent! call setline(1, ['Xtestfile7:700:10:Line 700',
249 \ 'Xtestfile8:800:15:Line 800'])
250 exe Xbuffer . "!"
Bram Moolenaarab47c612016-06-14 22:02:26 +0200251 let l = Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100252 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
Bram Moolenaarab47c612016-06-14 22:02:26 +0200260 let l = Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100261 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
Bram Moolenaarab47c612016-06-14 22:02:26 +0200269 let l = Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100270 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')
Bram Moolenaarab47c612016-06-14 22:02:26 +0200274 enew!
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100275
276endfunction
277
278function Test_cbuffer()
279 call XbufferTests('c')
280 call XbufferTests('l')
281endfunction
282
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100283function Test_nomem()
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200284 call test_alloc_fail(GetAllocId('qf_dirname_start'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100285 call assert_fails('vimgrep vim runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100286
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200287 call test_alloc_fail(GetAllocId('qf_dirname_now'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100288 call assert_fails('vimgrep vim runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100289
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200290 call test_alloc_fail(GetAllocId('qf_namebuf'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100291 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100292
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200293 call test_alloc_fail(GetAllocId('qf_errmsg'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100294 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100295
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200296 call test_alloc_fail(GetAllocId('qf_pattern'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100297 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100298
299endfunc
300
Bram Moolenaar62ef7972016-01-19 14:51:54 +0100301function Test_helpgrep()
302 helpgrep quickfix
303 copen
304 " This wipes out the buffer, make sure that doesn't cause trouble.
305 cclose
306endfunc
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100307
Bram Moolenaar6920c722016-01-22 22:44:10 +0100308func Test_errortitle()
309 augroup QfBufWinEnter
310 au!
311 au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
312 augroup END
313 copen
314 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'')'}]
315 call setqflist(a)
316 call assert_equal(':setqflist()', g:a)
317 augroup QfBufWinEnter
318 au!
319 augroup END
320 augroup! QfBufWinEnter
321endfunc
Bram Moolenaare27dba42016-03-15 14:11:10 +0100322
Bram Moolenaar5584df62016-03-18 21:00:51 +0100323func Test_vimgreptitle()
324 augroup QfBufWinEnter
325 au!
326 au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
327 augroup END
328 try
329 vimgrep /pattern/j file
330 catch /E480/
331 endtry
332 copen
333 call assert_equal(': vimgrep /pattern/j file', g:a)
334 augroup QfBufWinEnter
335 au!
336 augroup END
337 augroup! QfBufWinEnter
338endfunc
339
Bram Moolenaare27dba42016-03-15 14:11:10 +0100340function XqfTitleTests(cchar)
341 let Xgetexpr = a:cchar . 'getexpr'
342 if a:cchar == 'c'
Bram Moolenaarab47c612016-06-14 22:02:26 +0200343 let Xgetlist = function('getqflist')
Bram Moolenaare27dba42016-03-15 14:11:10 +0100344 else
Bram Moolenaarab47c612016-06-14 22:02:26 +0200345 let Xgetlist = function('getloclist', [0])
Bram Moolenaare27dba42016-03-15 14:11:10 +0100346 endif
347 let Xopen = a:cchar . 'open'
348 let Xclose = a:cchar . 'close'
349
350 exe Xgetexpr . " ['file:1:1:message']"
Bram Moolenaarab47c612016-06-14 22:02:26 +0200351 let l = Xgetlist()
Bram Moolenaare27dba42016-03-15 14:11:10 +0100352 if a:cchar == 'c'
353 call setqflist(l, 'r')
354 else
355 call setloclist(0, l, 'r')
356 endif
357
358 exe Xopen
359 if a:cchar == 'c'
360 let title = ':setqflist()'
361 else
362 let title = ':setloclist()'
363 endif
364 call assert_equal(title, w:quickfix_title)
365 exe Xclose
366endfunction
367
368" Tests for quickfix window's title
369function Test_qf_title()
370 call XqfTitleTests('c')
371 call XqfTitleTests('l')
372endfunction
373
374" Tests for 'errorformat'
375function Test_efm()
376 let save_efm = &efm
377 set efm=%EEEE%m,%WWWW%m,%+CCCC%.%#,%-GGGG%.%#
378 cgetexpr ['WWWW', 'EEEE', 'CCCC']
379 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
380 call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
381 cgetexpr ['WWWW', 'GGGG', 'EEEE', 'CCCC']
382 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
383 call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
384 cgetexpr ['WWWW', 'GGGG', 'ZZZZ', 'EEEE', 'CCCC', 'YYYY']
385 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
386 call assert_equal("[['W', 1], ['ZZZZ', 0], ['E^@CCCC', 1], ['YYYY', 0]]", l)
387 let &efm = save_efm
388endfunction
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100389
390" This will test for problems in quickfix:
391" A. incorrectly copying location lists which caused the location list to show
392" a different name than the file that was actually being displayed.
393" B. not reusing the window for which the location list window is opened but
394" instead creating new windows.
395" C. make sure that the location list window is not reused instead of the
396" window it belongs to.
397"
398" Set up the test environment:
399function! ReadTestProtocol(name)
400 let base = substitute(a:name, '\v^test://(.*)%(\.[^.]+)?', '\1', '')
401 let word = substitute(base, '\v(.*)\..*', '\1', '')
402
403 setl modifiable
404 setl noreadonly
405 setl noswapfile
406 setl bufhidden=delete
407 %del _
408 " For problem 2:
409 " 'buftype' has to be set to reproduce the constant opening of new windows
410 setl buftype=nofile
411
412 call setline(1, word)
413
414 setl nomodified
415 setl nomodifiable
416 setl readonly
417 exe 'doautocmd BufRead ' . substitute(a:name, '\v^test://(.*)', '\1', '')
418endfunction
419
420function Test_locationlist()
421 enew
422
423 augroup testgroup
424 au!
425 autocmd BufReadCmd test://* call ReadTestProtocol(expand("<amatch>"))
426 augroup END
427
428 let words = [ "foo", "bar", "baz", "quux", "shmoo", "spam", "eggs" ]
429
430 let qflist = []
431 for word in words
432 call add(qflist, {'filename': 'test://' . word . '.txt', 'text': 'file ' . word . '.txt', })
433 " NOTE: problem 1:
434 " intentionally not setting 'lnum' so that the quickfix entries are not
435 " valid
436 call setloclist(0, qflist, ' ')
437 endfor
438
439 " Test A
440 lrewind
441 enew
442 lopen
443 lnext
444 lnext
445 lnext
446 lnext
447 vert split
448 wincmd L
449 lopen
450 wincmd p
451 lnext
452 let fileName = expand("%")
453 wincmd p
454 let locationListFileName = substitute(getline(line('.')), '\([^|]*\)|.*', '\1', '')
455 let fileName = substitute(fileName, '\\', '/', 'g')
456 let locationListFileName = substitute(locationListFileName, '\\', '/', 'g')
457 call assert_equal("test://bar.txt", fileName)
458 call assert_equal("test://bar.txt", locationListFileName)
459
460 wincmd n | only
461
462 " Test B:
463 lrewind
464 lopen
465 2
466 exe "normal \<CR>"
467 wincmd p
468 3
469 exe "normal \<CR>"
470 wincmd p
471 4
472 exe "normal \<CR>"
473 call assert_equal(2, winnr('$'))
474 wincmd n | only
475
476 " Test C:
477 lrewind
478 lopen
479 " Let's move the location list window to the top to check whether it (the
480 " first window found) will be reused when we try to open new windows:
481 wincmd K
482 2
483 exe "normal \<CR>"
484 wincmd p
485 3
486 exe "normal \<CR>"
487 wincmd p
488 4
489 exe "normal \<CR>"
490 1wincmd w
491 call assert_equal('quickfix', &buftype)
492 2wincmd w
493 let bufferName = expand("%")
494 let bufferName = substitute(bufferName, '\\', '/', 'g')
495 call assert_equal('test://quux.txt', bufferName)
496
497 wincmd n | only
498
499 augroup! testgroup
500endfunction
Bram Moolenaar0899d692016-03-19 13:35:03 +0100501
502function Test_locationlist_curwin_was_closed()
503 augroup testgroup
504 au!
Bram Moolenaard106e5b2016-04-21 19:38:07 +0200505 autocmd BufReadCmd test_curwin.txt call R(expand("<amatch>"))
Bram Moolenaar0899d692016-03-19 13:35:03 +0100506 augroup END
507
Bram Moolenaarffec3c52016-03-23 20:55:42 +0100508 function! R(n)
Bram Moolenaar0899d692016-03-19 13:35:03 +0100509 quit
510 endfunc
511
512 new
513 let q = []
Bram Moolenaard106e5b2016-04-21 19:38:07 +0200514 call add(q, {'filename': 'test_curwin.txt' })
Bram Moolenaar0899d692016-03-19 13:35:03 +0100515 call setloclist(0, q)
516 call assert_fails('lrewind', 'E924:')
517
518 augroup! testgroup
519endfunction
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100520
521" More tests for 'errorformat'
522function! Test_efm1()
523 if !has('unix')
524 " The 'errorformat' setting is different on non-Unix systems.
525 " This test works only on Unix-like systems.
526 return
527 endif
528
529 let l = [
530 \ '"Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set.',
531 \ '"Xtestfile", line 6 col 19; this is an error',
532 \ 'gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include version.c',
533 \ 'Xtestfile:9: parse error before `asd''',
534 \ 'make: *** [vim] Error 1',
535 \ 'in file "Xtestfile" linenr 10: there is an error',
536 \ '',
537 \ '2 returned',
538 \ '"Xtestfile", line 11 col 1; this is an error',
539 \ '"Xtestfile", line 12 col 2; this is another error',
540 \ '"Xtestfile", line 14:10; this is an error in column 10',
541 \ '=Xtestfile=, line 15:10; this is another error, but in vcol 10 this time',
542 \ '"Xtestfile", linenr 16: yet another problem',
543 \ 'Error in "Xtestfile" at line 17:',
544 \ 'x should be a dot',
545 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17',
546 \ ' ^',
547 \ 'Error in "Xtestfile" at line 18:',
548 \ 'x should be a dot',
549 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18',
550 \ '.............^',
551 \ 'Error in "Xtestfile" at line 19:',
552 \ 'x should be a dot',
553 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19',
554 \ '--------------^',
555 \ 'Error in "Xtestfile" at line 20:',
556 \ 'x should be a dot',
557 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20',
558 \ ' ^',
559 \ '',
560 \ 'Does anyone know what is the problem and how to correction it?',
561 \ '"Xtestfile", line 21 col 9: What is the title of the quickfix window?',
562 \ '"Xtestfile", line 22 col 9: What is the title of the quickfix window?'
563 \ ]
564
565 call writefile(l, 'Xerrorfile1')
566 call writefile(l[:-2], 'Xerrorfile2')
567
568 let m = [
569 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 2',
570 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 3',
571 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 4',
572 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 5',
573 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 6',
574 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 7',
575 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 8',
576 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 9',
577 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 10',
578 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 11',
579 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 12',
580 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 13',
581 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 14',
582 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 15',
583 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 16',
584 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17',
585 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18',
586 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19',
587 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20',
588 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 21',
589 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 22'
590 \ ]
591 call writefile(m, 'Xtestfile')
592
593 let save_efm = &efm
594 set efm+==%f=\\,\ line\ %l%*\\D%v%*[^\ ]\ %m
595 set efm^=%AError\ in\ \"%f\"\ at\ line\ %l:,%Z%p^,%C%m
596
597 exe 'cf Xerrorfile2'
598 clast
599 copen
600 call assert_equal(':cf Xerrorfile2', w:quickfix_title)
601 wincmd p
602
603 exe 'cf Xerrorfile1'
604 call assert_equal([4, 12], [line('.'), col('.')])
605 cn
606 call assert_equal([6, 19], [line('.'), col('.')])
607 cn
608 call assert_equal([9, 2], [line('.'), col('.')])
609 cn
610 call assert_equal([10, 2], [line('.'), col('.')])
611 cn
612 call assert_equal([11, 1], [line('.'), col('.')])
613 cn
614 call assert_equal([12, 2], [line('.'), col('.')])
615 cn
616 call assert_equal([14, 10], [line('.'), col('.')])
617 cn
618 call assert_equal([15, 3, 10], [line('.'), col('.'), virtcol('.')])
619 cn
620 call assert_equal([16, 2], [line('.'), col('.')])
621 cn
622 call assert_equal([17, 6], [line('.'), col('.')])
623 cn
624 call assert_equal([18, 7], [line('.'), col('.')])
625 cn
626 call assert_equal([19, 8], [line('.'), col('.')])
627 cn
628 call assert_equal([20, 9], [line('.'), col('.')])
629 clast
630 cprev
631 cprev
632 wincmd w
633 call assert_equal(':cf Xerrorfile1', w:quickfix_title)
634 wincmd p
635
636 let &efm = save_efm
637 call delete('Xerrorfile1')
638 call delete('Xerrorfile2')
639 call delete('Xtestfile')
640endfunction
Bram Moolenaarffec3c52016-03-23 20:55:42 +0100641
Bram Moolenaarab47c612016-06-14 22:02:26 +0200642" Test for quickfix directory stack support
643function! s:dir_stack_tests(cchar)
644 let Xgetexpr = a:cchar . 'getexpr'
645 if a:cchar == 'c'
646 let Xgetlist = function('getqflist')
647 else
648 let Xgetlist = function('getloclist', [0])
649 endif
650
651 let save_efm=&efm
652 set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
653
654 let l = "Entering dir 'dir1/a'\n" .
655 \ 'habits2.txt:1:Nine Healthy Habits' . "\n" .
656 \ "Entering dir 'b'\n" .
657 \ 'habits3.txt:2:0 Hours of television' . "\n" .
658 \ 'habits2.txt:7:5 Small meals' . "\n" .
659 \ "Entering dir 'dir1/c'\n" .
660 \ 'habits4.txt:3:1 Hour of exercise' . "\n" .
661 \ "Leaving dir 'dir1/c'\n" .
662 \ "Leaving dir 'dir1/a'\n" .
663 \ 'habits1.txt:4:2 Liters of water' . "\n" .
664 \ "Entering dir 'dir2'\n" .
665 \ 'habits5.txt:5:3 Cups of hot green tea' . "\n" .
666 \ "Leaving dir 'dir2'\n"
667
668 exe Xgetexpr . " l"
669
670 let qf = Xgetlist()
671
672 call assert_equal('dir1/a/habits2.txt', bufname(qf[1].bufnr))
673 call assert_equal(1, qf[1].lnum)
674 call assert_equal('dir1/a/b/habits3.txt', bufname(qf[3].bufnr))
675 call assert_equal(2, qf[3].lnum)
676 call assert_equal('dir1/a/habits2.txt', bufname(qf[4].bufnr))
677 call assert_equal(7, qf[4].lnum)
678 call assert_equal('dir1/c/habits4.txt', bufname(qf[6].bufnr))
679 call assert_equal(3, qf[6].lnum)
680 call assert_equal('habits1.txt', bufname(qf[9].bufnr))
681 call assert_equal(4, qf[9].lnum)
682 call assert_equal('dir2/habits5.txt', bufname(qf[11].bufnr))
683 call assert_equal(5, qf[11].lnum)
684
685 let &efm=save_efm
686endfunction
687
688" Tests for %D and %X errorformat options
689function! Test_efm_dirstack()
690 " Create the directory stack and files
691 call mkdir('dir1')
692 call mkdir('dir1/a')
693 call mkdir('dir1/a/b')
694 call mkdir('dir1/c')
695 call mkdir('dir2')
696
697 let lines = ["Nine Healthy Habits",
698 \ "0 Hours of television",
699 \ "1 Hour of exercise",
700 \ "2 Liters of water",
701 \ "3 Cups of hot green tea",
702 \ "4 Short mental breaks",
703 \ "5 Small meals",
704 \ "6 AM wake up time",
705 \ "7 Minutes of laughter",
706 \ "8 Hours of sleep (at least)",
707 \ "9 PM end of the day and off to bed"
708 \ ]
709 call writefile(lines, 'habits1.txt')
710 call writefile(lines, 'dir1/a/habits2.txt')
711 call writefile(lines, 'dir1/a/b/habits3.txt')
712 call writefile(lines, 'dir1/c/habits4.txt')
713 call writefile(lines, 'dir2/habits5.txt')
714
715 call s:dir_stack_tests('c')
716 call s:dir_stack_tests('l')
717
718 call delete('dir1', 'rf')
719 call delete('dir2', 'rf')
720 call delete('habits1.txt')
721endfunction
722
Bram Moolenaarffec3c52016-03-23 20:55:42 +0100723function XquickfixChangedByAutocmd(cchar)
724 let Xolder = a:cchar . 'older'
725 let Xgetexpr = a:cchar . 'getexpr'
726 let Xrewind = a:cchar . 'rewind'
727 if a:cchar == 'c'
Bram Moolenaard106e5b2016-04-21 19:38:07 +0200728 let Xsetlist = function('setqflist')
Bram Moolenaarffec3c52016-03-23 20:55:42 +0100729 let ErrorNr = 'E925'
730 function! ReadFunc()
731 colder
732 cgetexpr []
733 endfunc
734 else
Bram Moolenaard106e5b2016-04-21 19:38:07 +0200735 let Xsetlist = function('setloclist', [0])
Bram Moolenaarffec3c52016-03-23 20:55:42 +0100736 let ErrorNr = 'E926'
737 function! ReadFunc()
738 lolder
739 lgetexpr []
740 endfunc
741 endif
742
743 augroup testgroup
744 au!
Bram Moolenaard106e5b2016-04-21 19:38:07 +0200745 autocmd BufReadCmd test_changed.txt call ReadFunc()
Bram Moolenaarffec3c52016-03-23 20:55:42 +0100746 augroup END
747
Bram Moolenaard106e5b2016-04-21 19:38:07 +0200748 new | only
Bram Moolenaarffec3c52016-03-23 20:55:42 +0100749 let words = [ "a", "b" ]
750 let qflist = []
751 for word in words
Bram Moolenaard106e5b2016-04-21 19:38:07 +0200752 call add(qflist, {'filename': 'test_changed.txt'})
753 call Xsetlist(qflist, ' ')
Bram Moolenaarffec3c52016-03-23 20:55:42 +0100754 endfor
755 exec "call assert_fails('" . Xrewind . "', '" . ErrorNr . ":')"
756
757 augroup! testgroup
758endfunc
759
760function Test_quickfix_was_changed_by_autocmd()
761 call XquickfixChangedByAutocmd('c')
762 call XquickfixChangedByAutocmd('l')
763endfunction
Bram Moolenaar8b201792016-03-25 15:01:10 +0100764
765func Test_caddbuffer_to_empty()
766 helpgr quickfix
767 call setqflist([], 'r')
768 cad
Bram Moolenaarf68f1d72016-03-25 17:14:06 +0100769 try
770 cn
771 catch
772 " number of matches is unknown
773 call assert_true(v:exception =~ 'E553:')
774 endtry
Bram Moolenaar8b201792016-03-25 15:01:10 +0100775 quit!
776endfunc
Bram Moolenaar89c64d52016-03-27 18:44:40 +0200777
778func Test_cgetexpr_works()
779 " this must not crash Vim
780 cgetexpr [$x]
781endfunc
Bram Moolenaarc1808d52016-04-18 20:04:00 +0200782
783" Tests for the setqflist() and setloclist() functions
784function SetXlistTests(cchar, bnum)
Bram Moolenaar2b2b8ae2016-05-24 19:59:51 +0200785 let Xwindow = a:cchar . 'window'
786 let Xnext = a:cchar . 'next'
Bram Moolenaarc1808d52016-04-18 20:04:00 +0200787 if a:cchar == 'c'
788 let Xsetlist = function('setqflist')
789 let Xgetlist = function('getqflist')
Bram Moolenaarc1808d52016-04-18 20:04:00 +0200790 else
791 let Xsetlist = function('setloclist', [0])
792 let Xgetlist = function('getloclist', [0])
Bram Moolenaarc1808d52016-04-18 20:04:00 +0200793 endif
794
795 call Xsetlist([{'bufnr': a:bnum, 'lnum': 1},
796 \ {'bufnr': a:bnum, 'lnum': 2}])
797 let l = Xgetlist()
798 call assert_equal(2, len(l))
799 call assert_equal(2, l[1].lnum)
800
801 exe Xnext
802 call Xsetlist([{'bufnr': a:bnum, 'lnum': 3}], 'a')
803 let l = Xgetlist()
804 call assert_equal(3, len(l))
805 exe Xnext
806 call assert_equal(3, line('.'))
807
Bram Moolenaar2b2b8ae2016-05-24 19:59:51 +0200808 " Appending entries to the list should not change the cursor position
809 " in the quickfix window
810 exe Xwindow
811 1
812 call Xsetlist([{'bufnr': a:bnum, 'lnum': 4},
813 \ {'bufnr': a:bnum, 'lnum': 5}], 'a')
814 call assert_equal(1, line('.'))
815 close
816
Bram Moolenaarc1808d52016-04-18 20:04:00 +0200817 call Xsetlist([{'bufnr': a:bnum, 'lnum': 3},
818 \ {'bufnr': a:bnum, 'lnum': 4},
819 \ {'bufnr': a:bnum, 'lnum': 5}], 'r')
820 let l = Xgetlist()
821 call assert_equal(3, len(l))
822 call assert_equal(5, l[2].lnum)
823
824 call Xsetlist([])
825 let l = Xgetlist()
826 call assert_equal(0, len(l))
827endfunction
828
829function Test_setqflist()
830 new Xtestfile | only
831 let bnum = bufnr('%')
832 call setline(1, range(1,5))
833
834 call SetXlistTests('c', bnum)
835 call SetXlistTests('l', bnum)
836
Bram Moolenaar1cee6932016-06-09 22:17:22 +0200837 enew!
Bram Moolenaarc1808d52016-04-18 20:04:00 +0200838 call delete('Xtestfile')
839endfunction
Bram Moolenaard106e5b2016-04-21 19:38:07 +0200840
Bram Moolenaar1cee6932016-06-09 22:17:22 +0200841func Test_setqflist_empty_middle()
842 " create three quickfix lists
843 vimgrep Test_ test_quickfix.vim
844 let testlen = len(getqflist())
845 call assert_true(testlen > 0)
846 vimgrep empty test_quickfix.vim
847 call assert_true(len(getqflist()) > 0)
848 vimgrep matches test_quickfix.vim
849 let matchlen = len(getqflist())
850 call assert_true(matchlen > 0)
851 colder
852 " make the middle list empty
853 call setqflist([], 'r')
854 call assert_true(len(getqflist()) == 0)
855 colder
856 call assert_equal(testlen, len(getqflist()))
857 cnewer
858 cnewer
859 call assert_equal(matchlen, len(getqflist()))
860endfunc
861
862func Test_setqflist_empty_older()
863 " create three quickfix lists
864 vimgrep one test_quickfix.vim
865 let onelen = len(getqflist())
866 call assert_true(onelen > 0)
867 vimgrep two test_quickfix.vim
868 let twolen = len(getqflist())
869 call assert_true(twolen > 0)
870 vimgrep three test_quickfix.vim
871 let threelen = len(getqflist())
872 call assert_true(threelen > 0)
873 colder 2
874 " make the first list empty, check the others didn't change
875 call setqflist([], 'r')
876 call assert_true(len(getqflist()) == 0)
877 cnewer
878 call assert_equal(twolen, len(getqflist()))
879 cnewer
880 call assert_equal(threelen, len(getqflist()))
881endfunc
882
Bram Moolenaard106e5b2016-04-21 19:38:07 +0200883function! XquickfixSetListWithAct(cchar)
884 let Xolder = a:cchar . 'older'
885 let Xnewer = a:cchar . 'newer'
886 if a:cchar == 'c'
887 let Xsetlist = function('setqflist')
888 let Xgetlist = function('getqflist')
889 else
890 let Xsetlist = function('setloclist', [0])
891 let Xgetlist = function('getloclist', [0])
892 endif
893 let list1 = [{'filename': 'fnameA', 'text': 'A'},
894 \ {'filename': 'fnameB', 'text': 'B'}]
895 let list2 = [{'filename': 'fnameC', 'text': 'C'},
896 \ {'filename': 'fnameD', 'text': 'D'},
897 \ {'filename': 'fnameE', 'text': 'E'}]
898
899 " {action} is unspecified. Same as specifing ' '.
900 new | only
901 exec "silent! " . Xnewer . "99"
902 call Xsetlist(list1)
903 call Xsetlist(list2)
904 let li = Xgetlist()
905 call assert_equal(3, len(li))
906 call assert_equal('C', li[0]['text'])
907 call assert_equal('D', li[1]['text'])
908 call assert_equal('E', li[2]['text'])
909 exec "silent! " . Xolder
910 let li = Xgetlist()
911 call assert_equal(2, len(li))
912 call assert_equal('A', li[0]['text'])
913 call assert_equal('B', li[1]['text'])
914
915 " {action} is specified ' '.
916 new | only
917 exec "silent! " . Xnewer . "99"
918 call Xsetlist(list1)
919 call Xsetlist(list2, ' ')
920 let li = Xgetlist()
921 call assert_equal(3, len(li))
922 call assert_equal('C', li[0]['text'])
923 call assert_equal('D', li[1]['text'])
924 call assert_equal('E', li[2]['text'])
925 exec "silent! " . Xolder
926 let li = Xgetlist()
927 call assert_equal(2, len(li))
928 call assert_equal('A', li[0]['text'])
929 call assert_equal('B', li[1]['text'])
930
931 " {action} is specified 'a'.
932 new | only
933 exec "silent! " . Xnewer . "99"
934 call Xsetlist(list1)
935 call Xsetlist(list2, 'a')
936 let li = Xgetlist()
937 call assert_equal(5, len(li))
938 call assert_equal('A', li[0]['text'])
939 call assert_equal('B', li[1]['text'])
940 call assert_equal('C', li[2]['text'])
941 call assert_equal('D', li[3]['text'])
942 call assert_equal('E', li[4]['text'])
943
944 " {action} is specified 'r'.
945 new | only
946 exec "silent! " . Xnewer . "99"
947 call Xsetlist(list1)
948 call Xsetlist(list2, 'r')
949 let li = Xgetlist()
950 call assert_equal(3, len(li))
951 call assert_equal('C', li[0]['text'])
952 call assert_equal('D', li[1]['text'])
953 call assert_equal('E', li[2]['text'])
954
955 " Test for wrong value.
956 new | only
957 call assert_fails("call Xsetlist(0)", 'E714:')
958 call assert_fails("call Xsetlist(list1, '')", 'E927:')
959 call assert_fails("call Xsetlist(list1, 'aa')", 'E927:')
960 call assert_fails("call Xsetlist(list1, ' a')", 'E927:')
961 call assert_fails("call Xsetlist(list1, 0)", 'E928:')
962endfunc
963
964function Test_quickfix_set_list_with_act()
965 call XquickfixSetListWithAct('c')
966 call XquickfixSetListWithAct('l')
967endfunction
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +0200968
969func XLongLinesTests()
970 let l = getqflist()
971
972 call assert_equal(3, len(l))
973 call assert_equal(1, l[0].lnum)
974 call assert_equal(1, l[0].col)
975 call assert_equal(4070, len(l[0].text))
976 call assert_equal(2, l[1].lnum)
977 call assert_equal(1, l[1].col)
978 call assert_equal(4070, len(l[1].text))
979 call assert_equal(3, l[2].lnum)
980 call assert_equal(1, l[2].col)
981 call assert_equal(10, len(l[2].text))
982
983 call setqflist([], 'r')
984endfunc
985
986func Test_long_lines()
987 let testfile = 'samples/quickfix.txt'
988
989 " file
990 exe 'cgetfile' testfile
991 call XLongLinesTests()
992
993 " list
994 cexpr readfile(testfile)
995 call XLongLinesTests()
996
997 " string
998 cexpr join(readfile(testfile), "\n")
999 call XLongLinesTests()
1000
1001 " buffer
1002 e testfile
1003 exe 'cbuffer' bufnr('%')
1004endfunc