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()
281*28fb79dbSBram Moolenaar  call alloc_fail(GetAllocId('qf_dirname_start'), 0, 0)
28275bdf6aaSBram Moolenaar  try
28375bdf6aaSBram Moolenaar    vimgrep vim runtest.vim
28475bdf6aaSBram Moolenaar  catch
28575bdf6aaSBram Moolenaar    call assert_true(v:exception =~ 'E342')
28675bdf6aaSBram Moolenaar  endtry
28775bdf6aaSBram Moolenaar
288*28fb79dbSBram Moolenaar  call alloc_fail(GetAllocId('qf_dirname_now'), 0, 0)
28975bdf6aaSBram Moolenaar  try
29075bdf6aaSBram Moolenaar    vimgrep vim runtest.vim
29175bdf6aaSBram Moolenaar  catch
29275bdf6aaSBram Moolenaar    call assert_true(v:exception =~ 'E342')
29375bdf6aaSBram Moolenaar  endtry
29475bdf6aaSBram Moolenaar
295*28fb79dbSBram Moolenaar  call alloc_fail(GetAllocId('qf_namebuf'), 0, 0)
29675bdf6aaSBram Moolenaar  try
29775bdf6aaSBram Moolenaar    cfile runtest.vim
29875bdf6aaSBram Moolenaar  catch
29975bdf6aaSBram Moolenaar    call assert_true(v:exception =~ 'E342')
30075bdf6aaSBram Moolenaar  endtry
30175bdf6aaSBram Moolenaar
302*28fb79dbSBram Moolenaar  call alloc_fail(GetAllocId('qf_errmsg'), 0, 0)
30375bdf6aaSBram Moolenaar  try
30475bdf6aaSBram Moolenaar    cfile runtest.vim
30575bdf6aaSBram Moolenaar  catch
30675bdf6aaSBram Moolenaar    call assert_true(v:exception =~ 'E342')
30775bdf6aaSBram Moolenaar  endtry
30875bdf6aaSBram Moolenaar
309*28fb79dbSBram Moolenaar  call alloc_fail(GetAllocId('qf_pattern'), 0, 0)
31075bdf6aaSBram Moolenaar  try
31175bdf6aaSBram Moolenaar    cfile runtest.vim
31275bdf6aaSBram Moolenaar  catch
31375bdf6aaSBram Moolenaar    call assert_true(v:exception =~ 'E342')
31475bdf6aaSBram Moolenaar  endtry
31575bdf6aaSBram Moolenaar
31675bdf6aaSBram Moolenaarendfunc
31775bdf6aaSBram Moolenaar
31875bdf6aaSBram Moolenaar
319