1da59dd5dSBram Moolenaar" Test for the quickfix commands.
2da59dd5dSBram Moolenaar
3da59dd5dSBram Moolenaarif !has('quickfix')
4da59dd5dSBram Moolenaar  finish
5da59dd5dSBram Moolenaarendif
6da59dd5dSBram Moolenaar
7da59dd5dSBram Moolenaar" Tests for the :clist and :llist commands
8da59dd5dSBram Moolenaarfunction XlistTests(cchar)
9da59dd5dSBram Moolenaar  let Xlist = a:cchar . 'list'
10da59dd5dSBram Moolenaar  let Xgetexpr = a:cchar . 'getexpr'
11da59dd5dSBram Moolenaar
12da59dd5dSBram Moolenaar  " With an empty list, command should return error
13da59dd5dSBram Moolenaar  exe Xgetexpr . ' []'
14da59dd5dSBram Moolenaar  exe 'silent! ' . Xlist
15da59dd5dSBram Moolenaar  call assert_true(v:errmsg ==# 'E42: No Errors')
16da59dd5dSBram Moolenaar
17da59dd5dSBram Moolenaar  " Populate the list and then try
18da59dd5dSBram Moolenaar  exe Xgetexpr . " ['non-error 1', 'Xtestfile1:1:3:Line1',
19da59dd5dSBram Moolenaar		  \ 'non-error 2', 'Xtestfile2:2:2:Line2',
20da59dd5dSBram Moolenaar		  \ 'non-error 3', 'Xtestfile3:3:1:Line3']"
21da59dd5dSBram Moolenaar
22da59dd5dSBram Moolenaar  " List only valid entries
23da59dd5dSBram Moolenaar  redir => result
24da59dd5dSBram Moolenaar  exe Xlist
25da59dd5dSBram Moolenaar  redir END
26da59dd5dSBram Moolenaar  let l = split(result, "\n")
27da59dd5dSBram Moolenaar  call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
28da59dd5dSBram Moolenaar		   \ ' 4 Xtestfile2:2 col 2: Line2',
29da59dd5dSBram Moolenaar		   \ ' 6 Xtestfile3:3 col 1: Line3'], l)
30da59dd5dSBram Moolenaar
31da59dd5dSBram Moolenaar  " List all the entries
32da59dd5dSBram Moolenaar  redir => result
33da59dd5dSBram Moolenaar  exe Xlist . "!"
34da59dd5dSBram Moolenaar  redir END
35da59dd5dSBram Moolenaar  let l = split(result, "\n")
36da59dd5dSBram Moolenaar  call assert_equal([' 1: non-error 1', ' 2 Xtestfile1:1 col 3: Line1',
37da59dd5dSBram Moolenaar		   \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2',
38da59dd5dSBram Moolenaar		   \ ' 5: non-error 3', ' 6 Xtestfile3:3 col 1: Line3'], l)
39da59dd5dSBram Moolenaar
40da59dd5dSBram Moolenaar  " List a range of errors
41da59dd5dSBram Moolenaar  redir => result
42da59dd5dSBram Moolenaar  exe Xlist . " 3,6"
43da59dd5dSBram Moolenaar  redir END
44da59dd5dSBram Moolenaar  let l = split(result, "\n")
45da59dd5dSBram Moolenaar  call assert_equal([' 4 Xtestfile2:2 col 2: Line2',
46da59dd5dSBram Moolenaar		   \ ' 6 Xtestfile3:3 col 1: Line3'], l)
47da59dd5dSBram Moolenaar
48da59dd5dSBram Moolenaar  redir => result
49da59dd5dSBram Moolenaar  exe Xlist . "! 3,4"
50da59dd5dSBram Moolenaar  redir END
51da59dd5dSBram Moolenaar  let l = split(result, "\n")
52da59dd5dSBram Moolenaar  call assert_equal([' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
53da59dd5dSBram Moolenaar
54da59dd5dSBram Moolenaar  redir => result
55da59dd5dSBram Moolenaar  exe Xlist . " -6,-4"
56da59dd5dSBram Moolenaar  redir END
57da59dd5dSBram Moolenaar  let l = split(result, "\n")
58da59dd5dSBram Moolenaar  call assert_equal([' 2 Xtestfile1:1 col 3: Line1'], l)
59da59dd5dSBram Moolenaar
60da59dd5dSBram Moolenaar  redir => result
61da59dd5dSBram Moolenaar  exe Xlist . "! -5,-3"
62da59dd5dSBram Moolenaar  redir END
63da59dd5dSBram Moolenaar  let l = split(result, "\n")
64da59dd5dSBram Moolenaar  call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
65da59dd5dSBram Moolenaar		   \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
66da59dd5dSBram Moolenaarendfunction
67da59dd5dSBram Moolenaar
68da59dd5dSBram Moolenaarfunction Test_clist()
69da59dd5dSBram Moolenaar  call XlistTests('c')
70da59dd5dSBram Moolenaar  call XlistTests('l')
71da59dd5dSBram Moolenaarendfunction
72da59dd5dSBram Moolenaar
73da59dd5dSBram Moolenaar" Tests for the :colder, :cnewer, :lolder and :lnewer commands
74da59dd5dSBram Moolenaar" Note that this test assumes that a quickfix/location list is
75cfc0a350SBram Moolenaar" already set by the caller.
76da59dd5dSBram Moolenaarfunction XageTests(cchar)
77da59dd5dSBram Moolenaar  let Xolder = a:cchar . 'older'
78da59dd5dSBram Moolenaar  let Xnewer = a:cchar . 'newer'
79da59dd5dSBram Moolenaar  let Xgetexpr = a:cchar . 'getexpr'
80da59dd5dSBram Moolenaar  if a:cchar == 'c'
81da59dd5dSBram Moolenaar    let Xgetlist = 'getqflist()'
82da59dd5dSBram Moolenaar  else
83da59dd5dSBram Moolenaar    let Xgetlist = 'getloclist(0)'
84da59dd5dSBram Moolenaar  endif
85da59dd5dSBram Moolenaar
86da59dd5dSBram Moolenaar  " Jumping to a non existent list should return error
87da59dd5dSBram Moolenaar  exe 'silent! ' . Xolder . ' 99'
88da59dd5dSBram Moolenaar  call assert_true(v:errmsg ==# 'E380: At bottom of quickfix stack')
89da59dd5dSBram Moolenaar
90da59dd5dSBram Moolenaar  exe 'silent! ' . Xnewer . ' 99'
91da59dd5dSBram Moolenaar  call assert_true(v:errmsg ==# 'E381: At top of quickfix stack')
92da59dd5dSBram Moolenaar
93da59dd5dSBram Moolenaar  " Add three quickfix/location lists
94da59dd5dSBram Moolenaar  exe Xgetexpr . " ['Xtestfile1:1:3:Line1']"
95da59dd5dSBram Moolenaar  exe Xgetexpr . " ['Xtestfile2:2:2:Line2']"
96da59dd5dSBram Moolenaar  exe Xgetexpr . " ['Xtestfile3:3:1:Line3']"
97da59dd5dSBram Moolenaar
98da59dd5dSBram Moolenaar  " Go back two lists
99da59dd5dSBram Moolenaar  exe Xolder
100da59dd5dSBram Moolenaar  exe 'let l = ' . Xgetlist
101da59dd5dSBram Moolenaar  call assert_equal('Line2', l[0].text)
102da59dd5dSBram Moolenaar
103da59dd5dSBram Moolenaar  " Go forward two lists
104da59dd5dSBram Moolenaar  exe Xnewer
105da59dd5dSBram Moolenaar  exe 'let l = ' . Xgetlist
106da59dd5dSBram Moolenaar  call assert_equal('Line3', l[0].text)
107da59dd5dSBram Moolenaar
108da59dd5dSBram Moolenaar  " Test for the optional count argument
109da59dd5dSBram Moolenaar  exe Xolder . ' 2'
110da59dd5dSBram Moolenaar  exe 'let l = ' . Xgetlist
111da59dd5dSBram Moolenaar  call assert_equal('Line1', l[0].text)
112da59dd5dSBram Moolenaar
113da59dd5dSBram Moolenaar  exe Xnewer . ' 2'
114da59dd5dSBram Moolenaar  exe 'let l = ' . Xgetlist
115da59dd5dSBram Moolenaar  call assert_equal('Line3', l[0].text)
116da59dd5dSBram Moolenaarendfunction
117da59dd5dSBram Moolenaar
118da59dd5dSBram Moolenaarfunction Test_cage()
119cfc0a350SBram Moolenaar  let list = [{'bufnr': 1, 'lnum': 1}]
120cfc0a350SBram Moolenaar  call setqflist(list)
121da59dd5dSBram Moolenaar  call XageTests('c')
122cfc0a350SBram Moolenaar
123cfc0a350SBram Moolenaar  call setloclist(0, list)
124da59dd5dSBram Moolenaar  call XageTests('l')
125da59dd5dSBram Moolenaarendfunction
126da59dd5dSBram Moolenaar
127da59dd5dSBram Moolenaar" Tests for the :cwindow, :lwindow :cclose, :lclose, :copen and :lopen
128da59dd5dSBram Moolenaar" commands
129da59dd5dSBram Moolenaarfunction XwindowTests(cchar)
130da59dd5dSBram Moolenaar  let Xwindow = a:cchar . 'window'
131da59dd5dSBram Moolenaar  let Xclose = a:cchar . 'close'
132da59dd5dSBram Moolenaar  let Xopen = a:cchar . 'open'
133da59dd5dSBram Moolenaar  let Xgetexpr = a:cchar . 'getexpr'
134da59dd5dSBram Moolenaar
135da59dd5dSBram Moolenaar  " Create a list with no valid entries
136da59dd5dSBram Moolenaar  exe Xgetexpr . " ['non-error 1', 'non-error 2', 'non-error 3']"
137da59dd5dSBram Moolenaar
138da59dd5dSBram Moolenaar  " Quickfix/Location window should not open with no valid errors
139da59dd5dSBram Moolenaar  exe Xwindow
140da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 1)
141da59dd5dSBram Moolenaar
142da59dd5dSBram Moolenaar  " Create a list with valid entries
143da59dd5dSBram Moolenaar  exe Xgetexpr . " ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2',
144da59dd5dSBram Moolenaar		  \ 'Xtestfile3:3:1:Line3']"
145da59dd5dSBram Moolenaar
146da59dd5dSBram Moolenaar  " Open the window
147da59dd5dSBram Moolenaar  exe Xwindow
148da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 2 && winnr() == 2 &&
149da59dd5dSBram Moolenaar	\ getline('.') ==# 'Xtestfile1|1 col 3| Line1')
150da59dd5dSBram Moolenaar
151da59dd5dSBram Moolenaar  " Close the window
152da59dd5dSBram Moolenaar  exe Xclose
153da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 1)
154da59dd5dSBram Moolenaar
155da59dd5dSBram Moolenaar  " Create a list with no valid entries
156da59dd5dSBram Moolenaar  exe Xgetexpr . " ['non-error 1', 'non-error 2', 'non-error 3']"
157da59dd5dSBram Moolenaar
158da59dd5dSBram Moolenaar  " Open the window
159da59dd5dSBram Moolenaar  exe Xopen . ' 5'
160da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 2 && getline('.') ==# '|| non-error 1'
161da59dd5dSBram Moolenaar		      \  && winheight('.') == 5)
162da59dd5dSBram Moolenaar
163da59dd5dSBram Moolenaar  " Opening the window again, should move the cursor to that window
164da59dd5dSBram Moolenaar  wincmd t
165da59dd5dSBram Moolenaar  exe Xopen . ' 7'
166da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 2 && winnr() == 2 &&
167da59dd5dSBram Moolenaar	\ winheight('.') == 7 &&
168da59dd5dSBram Moolenaar	\ getline('.') ==# '|| non-error 1')
169da59dd5dSBram Moolenaar
170da59dd5dSBram Moolenaar
171da59dd5dSBram Moolenaar  " Calling cwindow should close the quickfix window with no valid errors
172da59dd5dSBram Moolenaar  exe Xwindow
173da59dd5dSBram Moolenaar  call assert_true(winnr('$') == 1)
174da59dd5dSBram Moolenaarendfunction
175da59dd5dSBram Moolenaar
176da59dd5dSBram Moolenaarfunction Test_cwindow()
177da59dd5dSBram Moolenaar  call XwindowTests('c')
178da59dd5dSBram Moolenaar  call XwindowTests('l')
179da59dd5dSBram Moolenaarendfunction
180da59dd5dSBram Moolenaar
181da59dd5dSBram Moolenaar" Tests for the :cfile, :lfile, :caddfile, :laddfile, :cgetfile and :lgetfile
182da59dd5dSBram Moolenaar" commands.
183da59dd5dSBram Moolenaarfunction XfileTests(cchar)
184da59dd5dSBram Moolenaar  let Xfile = a:cchar . 'file'
185da59dd5dSBram Moolenaar  let Xgetfile = a:cchar . 'getfile'
186da59dd5dSBram Moolenaar  let Xaddfile = a:cchar . 'addfile'
187da59dd5dSBram Moolenaar  if a:cchar == 'c'
188da59dd5dSBram Moolenaar    let Xgetlist = 'getqflist()'
189da59dd5dSBram Moolenaar  else
190da59dd5dSBram Moolenaar    let Xgetlist = 'getloclist(0)'
191da59dd5dSBram Moolenaar  endif
192da59dd5dSBram Moolenaar
193da59dd5dSBram Moolenaar  call writefile(['Xtestfile1:700:10:Line 700',
194da59dd5dSBram Moolenaar	\ 'Xtestfile2:800:15:Line 800'], 'Xqftestfile1')
195da59dd5dSBram Moolenaar
196da59dd5dSBram Moolenaar  enew!
197da59dd5dSBram Moolenaar  exe Xfile . ' Xqftestfile1'
198da59dd5dSBram Moolenaar  exe 'let l = ' . Xgetlist
199da59dd5dSBram Moolenaar  call assert_true(len(l) == 2 &&
200da59dd5dSBram Moolenaar	\ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
201da59dd5dSBram Moolenaar	\ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
202da59dd5dSBram Moolenaar
203da59dd5dSBram Moolenaar  " Run cfile/lfile from a modified buffer
204da59dd5dSBram Moolenaar  enew!
205da59dd5dSBram Moolenaar  silent! put ='Quickfix'
206da59dd5dSBram Moolenaar  exe 'silent! ' . Xfile . ' Xqftestfile1'
207da59dd5dSBram Moolenaar  call assert_true(v:errmsg ==# 'E37: No write since last change (add ! to override)')
208da59dd5dSBram Moolenaar
209da59dd5dSBram Moolenaar  call writefile(['Xtestfile3:900:30:Line 900'], 'Xqftestfile1')
210da59dd5dSBram Moolenaar  exe Xaddfile . ' Xqftestfile1'
211da59dd5dSBram Moolenaar  exe 'let l = ' . Xgetlist
212da59dd5dSBram Moolenaar  call assert_true(len(l) == 3 &&
213da59dd5dSBram Moolenaar	\ l[2].lnum == 900 && l[2].col == 30 && l[2].text ==# 'Line 900')
214da59dd5dSBram Moolenaar
215da59dd5dSBram Moolenaar  call writefile(['Xtestfile1:222:77:Line 222',
216da59dd5dSBram Moolenaar	\ 'Xtestfile2:333:88:Line 333'], 'Xqftestfile1')
217da59dd5dSBram Moolenaar
218da59dd5dSBram Moolenaar  enew!
219da59dd5dSBram Moolenaar  exe Xgetfile . ' Xqftestfile1'
220da59dd5dSBram Moolenaar  exe 'let l = ' . Xgetlist
221da59dd5dSBram Moolenaar  call assert_true(len(l) == 2 &&
222da59dd5dSBram Moolenaar	\ l[0].lnum == 222 && l[0].col == 77 && l[0].text ==# 'Line 222' &&
223da59dd5dSBram Moolenaar	\ l[1].lnum == 333 && l[1].col == 88 && l[1].text ==# 'Line 333')
224da59dd5dSBram Moolenaar
225da59dd5dSBram Moolenaar  call delete('Xqftestfile1')
226da59dd5dSBram Moolenaarendfunction
227da59dd5dSBram Moolenaar
228da59dd5dSBram Moolenaarfunction Test_cfile()
229da59dd5dSBram Moolenaar  call XfileTests('c')
230da59dd5dSBram Moolenaar  call XfileTests('l')
231da59dd5dSBram Moolenaarendfunction
232da59dd5dSBram Moolenaar
233da59dd5dSBram Moolenaar" Tests for the :cbuffer, :lbuffer, :caddbuffer, :laddbuffer, :cgetbuffer and
234da59dd5dSBram Moolenaar" :lgetbuffer commands.
235da59dd5dSBram Moolenaarfunction XbufferTests(cchar)
236da59dd5dSBram Moolenaar  let Xbuffer = a:cchar . 'buffer'
237da59dd5dSBram Moolenaar  let Xgetbuffer = a:cchar . 'getbuffer'
238da59dd5dSBram Moolenaar  let Xaddbuffer = a:cchar . 'addbuffer'
239da59dd5dSBram Moolenaar  if a:cchar == 'c'
240da59dd5dSBram Moolenaar    let Xgetlist = 'getqflist()'
241da59dd5dSBram Moolenaar  else
242da59dd5dSBram Moolenaar    let Xgetlist = 'getloclist(0)'
243da59dd5dSBram Moolenaar  endif
244da59dd5dSBram Moolenaar
245da59dd5dSBram Moolenaar  enew!
246da59dd5dSBram Moolenaar  silent! call setline(1, ['Xtestfile7:700:10:Line 700',
247da59dd5dSBram Moolenaar	\ 'Xtestfile8:800:15:Line 800'])
248da59dd5dSBram Moolenaar  exe Xbuffer . "!"
249da59dd5dSBram Moolenaar  exe 'let l = ' . Xgetlist
250da59dd5dSBram Moolenaar  call assert_true(len(l) == 2 &&
251da59dd5dSBram Moolenaar	\ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
252da59dd5dSBram Moolenaar	\ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
253da59dd5dSBram Moolenaar
254da59dd5dSBram Moolenaar  enew!
255da59dd5dSBram Moolenaar  silent! call setline(1, ['Xtestfile9:900:55:Line 900',
256da59dd5dSBram Moolenaar	\ 'Xtestfile10:950:66:Line 950'])
257da59dd5dSBram Moolenaar  exe Xgetbuffer
258da59dd5dSBram Moolenaar  exe 'let l = ' . Xgetlist
259da59dd5dSBram Moolenaar  call assert_true(len(l) == 2 &&
260da59dd5dSBram Moolenaar	\ l[0].lnum == 900 && l[0].col == 55 && l[0].text ==# 'Line 900' &&
261da59dd5dSBram Moolenaar	\ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950')
262da59dd5dSBram Moolenaar
263da59dd5dSBram Moolenaar  enew!
264da59dd5dSBram Moolenaar  silent! call setline(1, ['Xtestfile11:700:20:Line 700',
265da59dd5dSBram Moolenaar	\ 'Xtestfile12:750:25:Line 750'])
266da59dd5dSBram Moolenaar  exe Xaddbuffer
267da59dd5dSBram Moolenaar  exe 'let l = ' . Xgetlist
268da59dd5dSBram Moolenaar  call assert_true(len(l) == 4 &&
269da59dd5dSBram Moolenaar	\ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950' &&
270da59dd5dSBram Moolenaar	\ l[2].lnum == 700 && l[2].col == 20 && l[2].text ==# 'Line 700' &&
271da59dd5dSBram Moolenaar	\ l[3].lnum == 750 && l[3].col == 25 && l[3].text ==# 'Line 750')
272da59dd5dSBram Moolenaar
273da59dd5dSBram Moolenaarendfunction
274da59dd5dSBram Moolenaar
275da59dd5dSBram Moolenaarfunction Test_cbuffer()
276da59dd5dSBram Moolenaar  call XbufferTests('c')
277da59dd5dSBram Moolenaar  call XbufferTests('l')
278da59dd5dSBram Moolenaarendfunction
279da59dd5dSBram Moolenaar
28075bdf6aaSBram Moolenaarfunction Test_nomem()
28128fb79dbSBram Moolenaar  call alloc_fail(GetAllocId('qf_dirname_start'), 0, 0)
282a260b87dSBram Moolenaar  call assert_fails('vimgrep vim runtest.vim', 'E342:')
28375bdf6aaSBram Moolenaar
28428fb79dbSBram Moolenaar  call alloc_fail(GetAllocId('qf_dirname_now'), 0, 0)
285a260b87dSBram Moolenaar  call assert_fails('vimgrep vim runtest.vim', 'E342:')
28675bdf6aaSBram Moolenaar
28728fb79dbSBram Moolenaar  call alloc_fail(GetAllocId('qf_namebuf'), 0, 0)
288a260b87dSBram Moolenaar  call assert_fails('cfile runtest.vim', 'E342:')
28975bdf6aaSBram Moolenaar
29028fb79dbSBram Moolenaar  call alloc_fail(GetAllocId('qf_errmsg'), 0, 0)
291a260b87dSBram Moolenaar  call assert_fails('cfile runtest.vim', 'E342:')
29275bdf6aaSBram Moolenaar
29328fb79dbSBram Moolenaar  call alloc_fail(GetAllocId('qf_pattern'), 0, 0)
294a260b87dSBram Moolenaar  call assert_fails('cfile runtest.vim', 'E342:')
29575bdf6aaSBram Moolenaar
29675bdf6aaSBram Moolenaarendfunc
29775bdf6aaSBram Moolenaar
29862ef7974SBram Moolenaarfunction Test_helpgrep()
29962ef7974SBram Moolenaar  helpgrep quickfix
30062ef7974SBram Moolenaar  copen
30162ef7974SBram Moolenaar  " This wipes out the buffer, make sure that doesn't cause trouble.
30262ef7974SBram Moolenaar  cclose
30362ef7974SBram Moolenaarendfunc
30475bdf6aaSBram Moolenaar
3056920c72dSBram Moolenaarfunc Test_errortitle()
3066920c72dSBram Moolenaar  augroup QfBufWinEnter
3076920c72dSBram Moolenaar    au!
3086920c72dSBram Moolenaar    au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
3096920c72dSBram Moolenaar  augroup END
3106920c72dSBram Moolenaar  copen
3116920c72dSBram Moolenaar  let a=[{'lnum': 308, 'bufnr': bufnr(''), 'col': 58, 'valid': 1, 'vcol': 0, 'nr': 0, 'type': '', 'pattern': '', 'text': '    au BufWinEnter * :let g:a=get(w:, ''quickfix_title'', ''NONE'')'}]
3126920c72dSBram Moolenaar  call setqflist(a)
3136920c72dSBram Moolenaar  call assert_equal(':setqflist()', g:a)
3146920c72dSBram Moolenaar  augroup QfBufWinEnter
3156920c72dSBram Moolenaar    au!
3166920c72dSBram Moolenaar  augroup END
3176920c72dSBram Moolenaar  augroup! QfBufWinEnter
3186920c72dSBram Moolenaarendfunc
319e27dba49SBram Moolenaar
320*5584df65SBram Moolenaarfunc Test_vimgreptitle()
321*5584df65SBram Moolenaar  augroup QfBufWinEnter
322*5584df65SBram Moolenaar    au!
323*5584df65SBram Moolenaar    au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
324*5584df65SBram Moolenaar  augroup END
325*5584df65SBram Moolenaar  try
326*5584df65SBram Moolenaar    vimgrep /pattern/j file
327*5584df65SBram Moolenaar  catch /E480/
328*5584df65SBram Moolenaar  endtry
329*5584df65SBram Moolenaar  copen
330*5584df65SBram Moolenaar  call assert_equal(':    vimgrep /pattern/j file', g:a)
331*5584df65SBram Moolenaar  augroup QfBufWinEnter
332*5584df65SBram Moolenaar    au!
333*5584df65SBram Moolenaar  augroup END
334*5584df65SBram Moolenaar  augroup! QfBufWinEnter
335*5584df65SBram Moolenaarendfunc
336*5584df65SBram Moolenaar
337e27dba49SBram Moolenaarfunction XqfTitleTests(cchar)
338e27dba49SBram Moolenaar  let Xgetexpr = a:cchar . 'getexpr'
339e27dba49SBram Moolenaar  if a:cchar == 'c'
340e27dba49SBram Moolenaar    let Xgetlist = 'getqflist()'
341e27dba49SBram Moolenaar  else
342e27dba49SBram Moolenaar    let Xgetlist = 'getloclist(0)'
343e27dba49SBram Moolenaar  endif
344e27dba49SBram Moolenaar  let Xopen = a:cchar . 'open'
345e27dba49SBram Moolenaar  let Xclose = a:cchar . 'close'
346e27dba49SBram Moolenaar
347e27dba49SBram Moolenaar  exe Xgetexpr . " ['file:1:1:message']"
348e27dba49SBram Moolenaar  exe 'let l = ' . Xgetlist
349e27dba49SBram Moolenaar  if a:cchar == 'c'
350e27dba49SBram Moolenaar    call setqflist(l, 'r')
351e27dba49SBram Moolenaar  else
352e27dba49SBram Moolenaar    call setloclist(0, l, 'r')
353e27dba49SBram Moolenaar  endif
354e27dba49SBram Moolenaar
355e27dba49SBram Moolenaar  exe Xopen
356e27dba49SBram Moolenaar  if a:cchar == 'c'
357e27dba49SBram Moolenaar    let title = ':setqflist()'
358e27dba49SBram Moolenaar  else
359e27dba49SBram Moolenaar    let title = ':setloclist()'
360e27dba49SBram Moolenaar  endif
361e27dba49SBram Moolenaar  call assert_equal(title, w:quickfix_title)
362e27dba49SBram Moolenaar  exe Xclose
363e27dba49SBram Moolenaarendfunction
364e27dba49SBram Moolenaar
365e27dba49SBram Moolenaar" Tests for quickfix window's title
366e27dba49SBram Moolenaarfunction Test_qf_title()
367e27dba49SBram Moolenaar    call XqfTitleTests('c')
368e27dba49SBram Moolenaar    call XqfTitleTests('l')
369e27dba49SBram Moolenaarendfunction
370e27dba49SBram Moolenaar
371e27dba49SBram Moolenaar" Tests for 'errorformat'
372e27dba49SBram Moolenaarfunction Test_efm()
373e27dba49SBram Moolenaar  let save_efm = &efm
374e27dba49SBram Moolenaar  set efm=%EEEE%m,%WWWW%m,%+CCCC%.%#,%-GGGG%.%#
375e27dba49SBram Moolenaar  cgetexpr ['WWWW', 'EEEE', 'CCCC']
376e27dba49SBram Moolenaar  let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
377e27dba49SBram Moolenaar  call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
378e27dba49SBram Moolenaar  cgetexpr ['WWWW', 'GGGG', 'EEEE', 'CCCC']
379e27dba49SBram Moolenaar  let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
380e27dba49SBram Moolenaar  call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
381e27dba49SBram Moolenaar  cgetexpr ['WWWW', 'GGGG', 'ZZZZ', 'EEEE', 'CCCC', 'YYYY']
382e27dba49SBram Moolenaar  let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
383e27dba49SBram Moolenaar  call assert_equal("[['W', 1], ['ZZZZ', 0], ['E^@CCCC', 1], ['YYYY', 0]]", l)
384e27dba49SBram Moolenaar  let &efm = save_efm
385e27dba49SBram Moolenaarendfunction
3861ff2b64bSBram Moolenaar
3871ff2b64bSBram Moolenaar" This will test for problems in quickfix:
3881ff2b64bSBram Moolenaar" A. incorrectly copying location lists which caused the location list to show
3891ff2b64bSBram Moolenaar"    a different name than the file that was actually being displayed.
3901ff2b64bSBram Moolenaar" B. not reusing the window for which the location list window is opened but
3911ff2b64bSBram Moolenaar"    instead creating new windows.
3921ff2b64bSBram Moolenaar" C. make sure that the location list window is not reused instead of the
3931ff2b64bSBram Moolenaar"    window it belongs to.
3941ff2b64bSBram Moolenaar"
3951ff2b64bSBram Moolenaar" Set up the test environment:
3961ff2b64bSBram Moolenaarfunction! ReadTestProtocol(name)
3971ff2b64bSBram Moolenaar  let base = substitute(a:name, '\v^test://(.*)%(\.[^.]+)?', '\1', '')
3981ff2b64bSBram Moolenaar  let word = substitute(base, '\v(.*)\..*', '\1', '')
3991ff2b64bSBram Moolenaar
4001ff2b64bSBram Moolenaar  setl modifiable
4011ff2b64bSBram Moolenaar  setl noreadonly
4021ff2b64bSBram Moolenaar  setl noswapfile
4031ff2b64bSBram Moolenaar  setl bufhidden=delete
4041ff2b64bSBram Moolenaar  %del _
4051ff2b64bSBram Moolenaar  " For problem 2:
4061ff2b64bSBram Moolenaar  " 'buftype' has to be set to reproduce the constant opening of new windows
4071ff2b64bSBram Moolenaar  setl buftype=nofile
4081ff2b64bSBram Moolenaar
4091ff2b64bSBram Moolenaar  call setline(1, word)
4101ff2b64bSBram Moolenaar
4111ff2b64bSBram Moolenaar  setl nomodified
4121ff2b64bSBram Moolenaar  setl nomodifiable
4131ff2b64bSBram Moolenaar  setl readonly
4141ff2b64bSBram Moolenaar  exe 'doautocmd BufRead ' . substitute(a:name, '\v^test://(.*)', '\1', '')
4151ff2b64bSBram Moolenaarendfunction
4161ff2b64bSBram Moolenaar
4171ff2b64bSBram Moolenaarfunction Test_locationlist()
4181ff2b64bSBram Moolenaar    enew
4191ff2b64bSBram Moolenaar
4201ff2b64bSBram Moolenaar    augroup testgroup
4211ff2b64bSBram Moolenaar      au!
4221ff2b64bSBram Moolenaar      autocmd BufReadCmd test://* call ReadTestProtocol(expand("<amatch>"))
4231ff2b64bSBram Moolenaar    augroup END
4241ff2b64bSBram Moolenaar
4251ff2b64bSBram Moolenaar    let words = [ "foo", "bar", "baz", "quux", "shmoo", "spam", "eggs" ]
4261ff2b64bSBram Moolenaar
4271ff2b64bSBram Moolenaar    let qflist = []
4281ff2b64bSBram Moolenaar    for word in words
4291ff2b64bSBram Moolenaar      call add(qflist, {'filename': 'test://' . word . '.txt', 'text': 'file ' . word . '.txt', })
4301ff2b64bSBram Moolenaar      " NOTE: problem 1:
4311ff2b64bSBram Moolenaar      " intentionally not setting 'lnum' so that the quickfix entries are not
4321ff2b64bSBram Moolenaar      " valid
4331ff2b64bSBram Moolenaar      call setloclist(0, qflist, ' ')
4341ff2b64bSBram Moolenaar    endfor
4351ff2b64bSBram Moolenaar
4361ff2b64bSBram Moolenaar    " Test A
4371ff2b64bSBram Moolenaar    lrewind
4381ff2b64bSBram Moolenaar    enew
4391ff2b64bSBram Moolenaar    lopen
4401ff2b64bSBram Moolenaar    lnext
4411ff2b64bSBram Moolenaar    lnext
4421ff2b64bSBram Moolenaar    lnext
4431ff2b64bSBram Moolenaar    lnext
4441ff2b64bSBram Moolenaar    vert split
4451ff2b64bSBram Moolenaar    wincmd L
4461ff2b64bSBram Moolenaar    lopen
4471ff2b64bSBram Moolenaar    wincmd p
4481ff2b64bSBram Moolenaar    lnext
4491ff2b64bSBram Moolenaar    let fileName = expand("%")
4501ff2b64bSBram Moolenaar    wincmd p
4511ff2b64bSBram Moolenaar    let locationListFileName = substitute(getline(line('.')), '\([^|]*\)|.*', '\1', '')
4521ff2b64bSBram Moolenaar    let fileName = substitute(fileName, '\\', '/', 'g')
4531ff2b64bSBram Moolenaar    let locationListFileName = substitute(locationListFileName, '\\', '/', 'g')
4541ff2b64bSBram Moolenaar    call assert_equal("test://bar.txt", fileName)
4551ff2b64bSBram Moolenaar    call assert_equal("test://bar.txt", locationListFileName)
4561ff2b64bSBram Moolenaar
4571ff2b64bSBram Moolenaar    wincmd n | only
4581ff2b64bSBram Moolenaar
4591ff2b64bSBram Moolenaar    " Test B:
4601ff2b64bSBram Moolenaar    lrewind
4611ff2b64bSBram Moolenaar    lopen
4621ff2b64bSBram Moolenaar    2
4631ff2b64bSBram Moolenaar    exe "normal \<CR>"
4641ff2b64bSBram Moolenaar    wincmd p
4651ff2b64bSBram Moolenaar    3
4661ff2b64bSBram Moolenaar    exe "normal \<CR>"
4671ff2b64bSBram Moolenaar    wincmd p
4681ff2b64bSBram Moolenaar    4
4691ff2b64bSBram Moolenaar    exe "normal \<CR>"
4701ff2b64bSBram Moolenaar    call assert_equal(2, winnr('$'))
4711ff2b64bSBram Moolenaar    wincmd n | only
4721ff2b64bSBram Moolenaar
4731ff2b64bSBram Moolenaar    " Test C:
4741ff2b64bSBram Moolenaar    lrewind
4751ff2b64bSBram Moolenaar    lopen
4761ff2b64bSBram Moolenaar    " Let's move the location list window to the top to check whether it (the
4771ff2b64bSBram Moolenaar    " first window found) will be reused when we try to open new windows:
4781ff2b64bSBram Moolenaar    wincmd K
4791ff2b64bSBram Moolenaar    2
4801ff2b64bSBram Moolenaar    exe "normal \<CR>"
4811ff2b64bSBram Moolenaar    wincmd p
4821ff2b64bSBram Moolenaar    3
4831ff2b64bSBram Moolenaar    exe "normal \<CR>"
4841ff2b64bSBram Moolenaar    wincmd p
4851ff2b64bSBram Moolenaar    4
4861ff2b64bSBram Moolenaar    exe "normal \<CR>"
4871ff2b64bSBram Moolenaar    1wincmd w
4881ff2b64bSBram Moolenaar    call assert_equal('quickfix', &buftype)
4891ff2b64bSBram Moolenaar    2wincmd w
4901ff2b64bSBram Moolenaar    let bufferName = expand("%")
4911ff2b64bSBram Moolenaar    let bufferName = substitute(bufferName, '\\', '/', 'g')
4921ff2b64bSBram Moolenaar    call assert_equal('test://quux.txt', bufferName)
4931ff2b64bSBram Moolenaar
4941ff2b64bSBram Moolenaar    wincmd n | only
4951ff2b64bSBram Moolenaar
4961ff2b64bSBram Moolenaar    augroup! testgroup
4971ff2b64bSBram Moolenaarendfunction
498