blob: 6a8d0e7bf20d6c6fc04fc2efd34ff84027895f34 [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 Moolenaar2b946c92016-11-12 18:14:44 +01009func s:setup_commands(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020010 if a:cchar == 'c'
11 command! -nargs=* -bang Xlist <mods>clist<bang> <args>
12 command! -nargs=* Xgetexpr <mods>cgetexpr <args>
Bram Moolenaar361c8f02016-07-02 15:41:47 +020013 command! -nargs=* Xaddexpr <mods>caddexpr <args>
Bram Moolenaar55b69262017-08-13 13:42:01 +020014 command! -nargs=* -count Xolder <mods><count>colder <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020015 command! -nargs=* Xnewer <mods>cnewer <args>
16 command! -nargs=* Xopen <mods>copen <args>
17 command! -nargs=* Xwindow <mods>cwindow <args>
Bram Moolenaar537ef082016-07-09 17:56:19 +020018 command! -nargs=* Xbottom <mods>cbottom <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020019 command! -nargs=* Xclose <mods>cclose <args>
20 command! -nargs=* -bang Xfile <mods>cfile<bang> <args>
21 command! -nargs=* Xgetfile <mods>cgetfile <args>
22 command! -nargs=* Xaddfile <mods>caddfile <args>
23 command! -nargs=* -bang Xbuffer <mods>cbuffer<bang> <args>
24 command! -nargs=* Xgetbuffer <mods>cgetbuffer <args>
25 command! -nargs=* Xaddbuffer <mods>caddbuffer <args>
26 command! -nargs=* Xrewind <mods>crewind <args>
Bram Moolenaar99895ea2017-04-20 22:44:47 +020027 command! -count -nargs=* -bang Xnext <mods><count>cnext<bang> <args>
28 command! -count -nargs=* -bang Xprev <mods><count>cprev<bang> <args>
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +020029 command! -nargs=* -bang Xfirst <mods>cfirst<bang> <args>
30 command! -nargs=* -bang Xlast <mods>clast<bang> <args>
31 command! -nargs=* -bang Xnfile <mods>cnfile<bang> <args>
32 command! -nargs=* -bang Xpfile <mods>cpfile<bang> <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020033 command! -nargs=* Xexpr <mods>cexpr <args>
Bram Moolenaaree85df32017-03-19 14:19:50 +010034 command! -range -nargs=* Xvimgrep <mods><count>vimgrep <args>
35 command! -nargs=* Xvimgrepadd <mods>vimgrepadd <args>
Bram Moolenaar049cba92016-06-26 14:38:04 +020036 command! -nargs=* Xgrep <mods> grep <args>
37 command! -nargs=* Xgrepadd <mods> grepadd <args>
38 command! -nargs=* Xhelpgrep helpgrep <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020039 let g:Xgetlist = function('getqflist')
40 let g:Xsetlist = function('setqflist')
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +020041 call setqflist([], 'f')
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020042 else
43 command! -nargs=* -bang Xlist <mods>llist<bang> <args>
44 command! -nargs=* Xgetexpr <mods>lgetexpr <args>
Bram Moolenaar361c8f02016-07-02 15:41:47 +020045 command! -nargs=* Xaddexpr <mods>laddexpr <args>
Bram Moolenaar55b69262017-08-13 13:42:01 +020046 command! -nargs=* -count Xolder <mods><count>lolder <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020047 command! -nargs=* Xnewer <mods>lnewer <args>
48 command! -nargs=* Xopen <mods>lopen <args>
49 command! -nargs=* Xwindow <mods>lwindow <args>
Bram Moolenaar537ef082016-07-09 17:56:19 +020050 command! -nargs=* Xbottom <mods>lbottom <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020051 command! -nargs=* Xclose <mods>lclose <args>
52 command! -nargs=* -bang Xfile <mods>lfile<bang> <args>
53 command! -nargs=* Xgetfile <mods>lgetfile <args>
54 command! -nargs=* Xaddfile <mods>laddfile <args>
55 command! -nargs=* -bang Xbuffer <mods>lbuffer<bang> <args>
56 command! -nargs=* Xgetbuffer <mods>lgetbuffer <args>
57 command! -nargs=* Xaddbuffer <mods>laddbuffer <args>
58 command! -nargs=* Xrewind <mods>lrewind <args>
Bram Moolenaar99895ea2017-04-20 22:44:47 +020059 command! -count -nargs=* -bang Xnext <mods><count>lnext<bang> <args>
60 command! -count -nargs=* -bang Xprev <mods><count>lprev<bang> <args>
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +020061 command! -nargs=* -bang Xfirst <mods>lfirst<bang> <args>
62 command! -nargs=* -bang Xlast <mods>llast<bang> <args>
63 command! -nargs=* -bang Xnfile <mods>lnfile<bang> <args>
64 command! -nargs=* -bang Xpfile <mods>lpfile<bang> <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020065 command! -nargs=* Xexpr <mods>lexpr <args>
Bram Moolenaaree85df32017-03-19 14:19:50 +010066 command! -range -nargs=* Xvimgrep <mods><count>lvimgrep <args>
67 command! -nargs=* Xvimgrepadd <mods>lvimgrepadd <args>
Bram Moolenaar049cba92016-06-26 14:38:04 +020068 command! -nargs=* Xgrep <mods> lgrep <args>
69 command! -nargs=* Xgrepadd <mods> lgrepadd <args>
70 command! -nargs=* Xhelpgrep lhelpgrep <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020071 let g:Xgetlist = function('getloclist', [0])
72 let g:Xsetlist = function('setloclist', [0])
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +020073 call setloclist(0, [], 'f')
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020074 endif
Bram Moolenaar2b946c92016-11-12 18:14:44 +010075endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020076
Bram Moolenaarda59dd52016-01-05 21:59:58 +010077" Tests for the :clist and :llist commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +010078func XlistTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020079 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +010080
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +020081 if a:cchar == 'l'
82 call assert_fails('llist', 'E776:')
83 endif
Bram Moolenaarda59dd52016-01-05 21:59:58 +010084 " With an empty list, command should return error
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020085 Xgetexpr []
86 silent! Xlist
Bram Moolenaarda59dd52016-01-05 21:59:58 +010087 call assert_true(v:errmsg ==# 'E42: No Errors')
88
89 " Populate the list and then try
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020090 Xgetexpr ['non-error 1', 'Xtestfile1:1:3:Line1',
Bram Moolenaarda59dd52016-01-05 21:59:58 +010091 \ 'non-error 2', 'Xtestfile2:2:2:Line2',
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020092 \ 'non-error 3', 'Xtestfile3:3:1:Line3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +010093
94 " List only valid entries
Bram Moolenaaree85df32017-03-19 14:19:50 +010095 let l = split(execute('Xlist', ''), "\n")
Bram Moolenaarda59dd52016-01-05 21:59:58 +010096 call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
97 \ ' 4 Xtestfile2:2 col 2: Line2',
98 \ ' 6 Xtestfile3:3 col 1: Line3'], l)
99
100 " List all the entries
Bram Moolenaaree85df32017-03-19 14:19:50 +0100101 let l = split(execute('Xlist!', ''), "\n")
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100102 call assert_equal([' 1: non-error 1', ' 2 Xtestfile1:1 col 3: Line1',
103 \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2',
104 \ ' 5: non-error 3', ' 6 Xtestfile3:3 col 1: Line3'], l)
105
106 " List a range of errors
Bram Moolenaaree85df32017-03-19 14:19:50 +0100107 let l = split(execute('Xlist 3,6', ''), "\n")
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100108 call assert_equal([' 4 Xtestfile2:2 col 2: Line2',
109 \ ' 6 Xtestfile3:3 col 1: Line3'], l)
110
Bram Moolenaaree85df32017-03-19 14:19:50 +0100111 let l = split(execute('Xlist! 3,4', ''), "\n")
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100112 call assert_equal([' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
113
Bram Moolenaaree85df32017-03-19 14:19:50 +0100114 let l = split(execute('Xlist -6,-4', ''), "\n")
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100115 call assert_equal([' 2 Xtestfile1:1 col 3: Line1'], l)
116
Bram Moolenaaree85df32017-03-19 14:19:50 +0100117 let l = split(execute('Xlist! -5,-3', ''), "\n")
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100118 call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
119 \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
Bram Moolenaar391b1dd2017-03-04 13:47:11 +0100120
121 " Test for '+'
Bram Moolenaaree85df32017-03-19 14:19:50 +0100122 let l = split(execute('Xlist! +2', ''), "\n")
Bram Moolenaar391b1dd2017-03-04 13:47:11 +0100123 call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
124 \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
Bram Moolenaaree85df32017-03-19 14:19:50 +0100125
126 " Different types of errors
127 call g:Xsetlist([{'lnum':10,'col':5,'type':'W', 'text':'Warning','nr':11},
128 \ {'lnum':20,'col':10,'type':'e','text':'Error','nr':22},
129 \ {'lnum':30,'col':15,'type':'i','text':'Info','nr':33},
130 \ {'lnum':40,'col':20,'type':'x', 'text':'Other','nr':44},
131 \ {'lnum':50,'col':25,'type':"\<C-A>",'text':'one','nr':55}])
132 let l = split(execute('Xlist', ""), "\n")
133 call assert_equal([' 1:10 col 5 warning 11: Warning',
134 \ ' 2:20 col 10 error 22: Error',
135 \ ' 3:30 col 15 info 33: Info',
136 \ ' 4:40 col 20 x 44: Other',
137 \ ' 5:50 col 25 55: one'], l)
138
139 " Error cases
140 call assert_fails('Xlist abc', 'E488:')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100141endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100142
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100143func Test_clist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100144 call XlistTests('c')
145 call XlistTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100146endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100147
148" Tests for the :colder, :cnewer, :lolder and :lnewer commands
149" Note that this test assumes that a quickfix/location list is
Bram Moolenaarcfc0a352016-01-09 20:23:00 +0100150" already set by the caller.
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100151func XageTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200152 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100153
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +0200154 let list = [{'bufnr': 1, 'lnum': 1}]
155 call g:Xsetlist(list)
156
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100157 " Jumping to a non existent list should return error
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200158 silent! Xolder 99
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100159 call assert_true(v:errmsg ==# 'E380: At bottom of quickfix stack')
160
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200161 silent! Xnewer 99
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100162 call assert_true(v:errmsg ==# 'E381: At top of quickfix stack')
163
164 " Add three quickfix/location lists
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200165 Xgetexpr ['Xtestfile1:1:3:Line1']
166 Xgetexpr ['Xtestfile2:2:2:Line2']
167 Xgetexpr ['Xtestfile3:3:1:Line3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100168
169 " Go back two lists
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200170 Xolder
171 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100172 call assert_equal('Line2', l[0].text)
173
174 " Go forward two lists
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200175 Xnewer
176 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100177 call assert_equal('Line3', l[0].text)
178
179 " Test for the optional count argument
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200180 Xolder 2
181 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100182 call assert_equal('Line1', l[0].text)
183
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200184 Xnewer 2
185 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100186 call assert_equal('Line3', l[0].text)
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100187endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100188
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100189func Test_cage()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100190 call XageTests('c')
191 call XageTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100192endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100193
194" Tests for the :cwindow, :lwindow :cclose, :lclose, :copen and :lopen
195" commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100196func XwindowTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200197 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100198
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +0200199 " Opening the location list window without any errors should fail
200 if a:cchar == 'l'
201 call assert_fails('lopen', 'E776:')
202 endif
203
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100204 " Create a list with no valid entries
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200205 Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100206
207 " Quickfix/Location window should not open with no valid errors
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200208 Xwindow
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100209 call assert_true(winnr('$') == 1)
210
211 " Create a list with valid entries
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200212 Xgetexpr ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2',
213 \ 'Xtestfile3:3:1:Line3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100214
215 " Open the window
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200216 Xwindow
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100217 call assert_true(winnr('$') == 2 && winnr() == 2 &&
218 \ getline('.') ==# 'Xtestfile1|1 col 3| Line1')
Bram Moolenaar537ef082016-07-09 17:56:19 +0200219 redraw!
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100220
221 " Close the window
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200222 Xclose
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100223 call assert_true(winnr('$') == 1)
224
225 " Create a list with no valid entries
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200226 Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100227
228 " Open the window
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200229 Xopen 5
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100230 call assert_true(winnr('$') == 2 && getline('.') ==# '|| non-error 1'
231 \ && winheight('.') == 5)
232
233 " Opening the window again, should move the cursor to that window
234 wincmd t
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200235 Xopen 7
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100236 call assert_true(winnr('$') == 2 && winnr() == 2 &&
237 \ winheight('.') == 7 &&
238 \ getline('.') ==# '|| non-error 1')
239
240
241 " Calling cwindow should close the quickfix window with no valid errors
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200242 Xwindow
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100243 call assert_true(winnr('$') == 1)
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +0200244
245 if a:cchar == 'c'
246 " Opening the quickfix window in multiple tab pages should reuse the
247 " quickfix buffer
248 Xgetexpr ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2',
249 \ 'Xtestfile3:3:1:Line3']
250 Xopen
251 let qfbufnum = bufnr('%')
252 tabnew
253 Xopen
254 call assert_equal(qfbufnum, bufnr('%'))
255 new | only | tabonly
256 endif
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100257endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100258
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100259func Test_cwindow()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100260 call XwindowTests('c')
261 call XwindowTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100262endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100263
264" Tests for the :cfile, :lfile, :caddfile, :laddfile, :cgetfile and :lgetfile
265" commands.
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100266func XfileTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200267 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100268
269 call writefile(['Xtestfile1:700:10:Line 700',
270 \ 'Xtestfile2:800:15:Line 800'], 'Xqftestfile1')
271
272 enew!
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200273 Xfile Xqftestfile1
274 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100275 call assert_true(len(l) == 2 &&
276 \ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
277 \ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
278
Bram Moolenaar049cba92016-06-26 14:38:04 +0200279 " Test with a non existent file
280 call assert_fails('Xfile non_existent_file', 'E40')
281
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100282 " Run cfile/lfile from a modified buffer
283 enew!
284 silent! put ='Quickfix'
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200285 silent! Xfile Xqftestfile1
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100286 call assert_true(v:errmsg ==# 'E37: No write since last change (add ! to override)')
287
288 call writefile(['Xtestfile3:900:30:Line 900'], 'Xqftestfile1')
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200289 Xaddfile Xqftestfile1
290 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100291 call assert_true(len(l) == 3 &&
292 \ l[2].lnum == 900 && l[2].col == 30 && l[2].text ==# 'Line 900')
293
294 call writefile(['Xtestfile1:222:77:Line 222',
295 \ 'Xtestfile2:333:88:Line 333'], 'Xqftestfile1')
296
297 enew!
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200298 Xgetfile Xqftestfile1
299 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100300 call assert_true(len(l) == 2 &&
301 \ l[0].lnum == 222 && l[0].col == 77 && l[0].text ==# 'Line 222' &&
302 \ l[1].lnum == 333 && l[1].col == 88 && l[1].text ==# 'Line 333')
303
304 call delete('Xqftestfile1')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100305endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100306
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100307func Test_cfile()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100308 call XfileTests('c')
309 call XfileTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100310endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100311
312" Tests for the :cbuffer, :lbuffer, :caddbuffer, :laddbuffer, :cgetbuffer and
313" :lgetbuffer commands.
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100314func XbufferTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200315 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100316
317 enew!
318 silent! call setline(1, ['Xtestfile7:700:10:Line 700',
319 \ 'Xtestfile8:800:15:Line 800'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200320 Xbuffer!
321 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100322 call assert_true(len(l) == 2 &&
323 \ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
324 \ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
325
326 enew!
327 silent! call setline(1, ['Xtestfile9:900:55:Line 900',
328 \ 'Xtestfile10:950:66:Line 950'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200329 Xgetbuffer
330 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100331 call assert_true(len(l) == 2 &&
332 \ l[0].lnum == 900 && l[0].col == 55 && l[0].text ==# 'Line 900' &&
333 \ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950')
334
335 enew!
336 silent! call setline(1, ['Xtestfile11:700:20:Line 700',
337 \ 'Xtestfile12:750:25:Line 750'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200338 Xaddbuffer
339 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100340 call assert_true(len(l) == 4 &&
341 \ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950' &&
342 \ l[2].lnum == 700 && l[2].col == 20 && l[2].text ==# 'Line 700' &&
343 \ l[3].lnum == 750 && l[3].col == 25 && l[3].text ==# 'Line 750')
Bram Moolenaarab47c612016-06-14 22:02:26 +0200344 enew!
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100345
Bram Moolenaaree85df32017-03-19 14:19:50 +0100346 " Check for invalid buffer
347 call assert_fails('Xbuffer 199', 'E474:')
348
349 " Check for unloaded buffer
350 edit Xtestfile1
351 let bnr = bufnr('%')
352 enew!
353 call assert_fails('Xbuffer ' . bnr, 'E681:')
354
355 " Check for invalid range
356 " Using Xbuffer will not run the range check in the cbuffer/lbuffer
357 " commands. So directly call the commands.
358 if (a:cchar == 'c')
359 call assert_fails('900,999cbuffer', 'E16:')
360 else
361 call assert_fails('900,999lbuffer', 'E16:')
362 endif
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100363endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100364
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100365func Test_cbuffer()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100366 call XbufferTests('c')
367 call XbufferTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100368endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100369
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100370func XexprTests(cchar)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200371 call s:setup_commands(a:cchar)
372
373 call assert_fails('Xexpr 10', 'E777:')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100374endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200375
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100376func Test_cexpr()
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200377 call XexprTests('c')
378 call XexprTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100379endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200380
381" Tests for :cnext, :cprev, :cfirst, :clast commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100382func Xtest_browse(cchar)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200383 call s:setup_commands(a:cchar)
384
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +0200385 " Jumping to first or next location list entry without any error should
386 " result in failure
387 if a:cchar == 'l'
388 call assert_fails('lfirst', 'E776:')
389 call assert_fails('lnext', 'E776:')
390 endif
391
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200392 call s:create_test_file('Xqftestfile1')
393 call s:create_test_file('Xqftestfile2')
394
395 Xgetexpr ['Xqftestfile1:5:Line5',
396 \ 'Xqftestfile1:6:Line6',
397 \ 'Xqftestfile2:10:Line10',
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200398 \ 'Xqftestfile2:11:Line11',
399 \ 'RegularLine1',
400 \ 'RegularLine2']
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200401
402 Xfirst
403 call assert_fails('Xprev', 'E553')
404 call assert_fails('Xpfile', 'E553')
405 Xnfile
406 call assert_equal('Xqftestfile2', bufname('%'))
407 call assert_equal(10, line('.'))
408 Xpfile
409 call assert_equal('Xqftestfile1', bufname('%'))
410 call assert_equal(6, line('.'))
411 Xlast
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200412 Xprev
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200413 call assert_equal('Xqftestfile2', bufname('%'))
414 call assert_equal(11, line('.'))
415 call assert_fails('Xnext', 'E553')
416 call assert_fails('Xnfile', 'E553')
417 Xrewind
418 call assert_equal('Xqftestfile1', bufname('%'))
419 call assert_equal(5, line('.'))
420
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200421 10Xnext
422 call assert_equal('Xqftestfile2', bufname('%'))
423 call assert_equal(11, line('.'))
424 10Xprev
425 call assert_equal('Xqftestfile1', bufname('%'))
426 call assert_equal(5, line('.'))
427
Bram Moolenaaree85df32017-03-19 14:19:50 +0100428 Xexpr ""
429 call assert_fails('Xnext', 'E42:')
430
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200431 call delete('Xqftestfile1')
432 call delete('Xqftestfile2')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100433endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200434
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100435func Test_browse()
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200436 call Xtest_browse('c')
437 call Xtest_browse('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100438endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200439
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100440func Test_nomem()
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200441 call test_alloc_fail(GetAllocId('qf_dirname_start'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100442 call assert_fails('vimgrep vim runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100443
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200444 call test_alloc_fail(GetAllocId('qf_dirname_now'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100445 call assert_fails('vimgrep vim runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100446
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200447 call test_alloc_fail(GetAllocId('qf_namebuf'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100448 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100449
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200450 call test_alloc_fail(GetAllocId('qf_errmsg'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100451 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100452
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200453 call test_alloc_fail(GetAllocId('qf_pattern'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100454 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100455
456endfunc
457
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100458func s:test_xhelpgrep(cchar)
Bram Moolenaar049cba92016-06-26 14:38:04 +0200459 call s:setup_commands(a:cchar)
460 Xhelpgrep quickfix
461 Xopen
462 if a:cchar == 'c'
463 let title_text = ':helpgrep quickfix'
464 else
465 let title_text = ':lhelpgrep quickfix'
466 endif
467 call assert_true(w:quickfix_title =~ title_text, w:quickfix_title)
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200468
469 " Jumping to a help topic should open the help window
470 only
471 Xnext
472 call assert_true(&buftype == 'help')
473 call assert_true(winnr('$') == 2)
474 " Jumping to the next match should reuse the help window
475 Xnext
476 call assert_true(&buftype == 'help')
477 call assert_true(winnr() == 1)
478 call assert_true(winnr('$') == 2)
479 " Jumping to the next match from the quickfix window should reuse the help
480 " window
481 Xopen
482 Xnext
483 call assert_true(&buftype == 'help')
484 call assert_true(winnr() == 1)
485 call assert_true(winnr('$') == 2)
486
Bram Moolenaar62ef7972016-01-19 14:51:54 +0100487 " This wipes out the buffer, make sure that doesn't cause trouble.
Bram Moolenaar049cba92016-06-26 14:38:04 +0200488 Xclose
Bram Moolenaaree85df32017-03-19 14:19:50 +0100489
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200490 new | only
491
Bram Moolenaaree85df32017-03-19 14:19:50 +0100492 " Search for non existing help string
493 call assert_fails('Xhelpgrep a1b2c3', 'E480:')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100494endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +0200495
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100496func Test_helpgrep()
Bram Moolenaar049cba92016-06-26 14:38:04 +0200497 call s:test_xhelpgrep('c')
Bram Moolenaarcf25fdb2016-08-03 21:04:53 +0200498 helpclose
Bram Moolenaar049cba92016-06-26 14:38:04 +0200499 call s:test_xhelpgrep('l')
Bram Moolenaar62ef7972016-01-19 14:51:54 +0100500endfunc
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100501
Bram Moolenaar6920c722016-01-22 22:44:10 +0100502func Test_errortitle()
503 augroup QfBufWinEnter
504 au!
505 au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
506 augroup END
507 copen
508 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'')'}]
509 call setqflist(a)
510 call assert_equal(':setqflist()', g:a)
511 augroup QfBufWinEnter
512 au!
513 augroup END
514 augroup! QfBufWinEnter
515endfunc
Bram Moolenaare27dba42016-03-15 14:11:10 +0100516
Bram Moolenaar5584df62016-03-18 21:00:51 +0100517func Test_vimgreptitle()
518 augroup QfBufWinEnter
519 au!
520 au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
521 augroup END
522 try
523 vimgrep /pattern/j file
524 catch /E480/
525 endtry
526 copen
527 call assert_equal(': vimgrep /pattern/j file', g:a)
528 augroup QfBufWinEnter
529 au!
530 augroup END
531 augroup! QfBufWinEnter
532endfunc
533
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100534func XqfTitleTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200535 call s:setup_commands(a:cchar)
Bram Moolenaare27dba42016-03-15 14:11:10 +0100536
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200537 Xgetexpr ['file:1:1:message']
538 let l = g:Xgetlist()
Bram Moolenaare27dba42016-03-15 14:11:10 +0100539 if a:cchar == 'c'
540 call setqflist(l, 'r')
541 else
542 call setloclist(0, l, 'r')
543 endif
544
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200545 Xopen
Bram Moolenaare27dba42016-03-15 14:11:10 +0100546 if a:cchar == 'c'
547 let title = ':setqflist()'
548 else
549 let title = ':setloclist()'
550 endif
551 call assert_equal(title, w:quickfix_title)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200552 Xclose
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100553endfunc
Bram Moolenaare27dba42016-03-15 14:11:10 +0100554
555" Tests for quickfix window's title
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100556func Test_qf_title()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200557 call XqfTitleTests('c')
558 call XqfTitleTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100559endfunc
Bram Moolenaare27dba42016-03-15 14:11:10 +0100560
561" Tests for 'errorformat'
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100562func Test_efm()
Bram Moolenaare27dba42016-03-15 14:11:10 +0100563 let save_efm = &efm
564 set efm=%EEEE%m,%WWWW%m,%+CCCC%.%#,%-GGGG%.%#
565 cgetexpr ['WWWW', 'EEEE', 'CCCC']
566 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
567 call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
568 cgetexpr ['WWWW', 'GGGG', 'EEEE', 'CCCC']
569 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
570 call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
571 cgetexpr ['WWWW', 'GGGG', 'ZZZZ', 'EEEE', 'CCCC', 'YYYY']
572 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
573 call assert_equal("[['W', 1], ['ZZZZ', 0], ['E^@CCCC', 1], ['YYYY', 0]]", l)
574 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100575endfunc
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100576
577" This will test for problems in quickfix:
578" A. incorrectly copying location lists which caused the location list to show
579" a different name than the file that was actually being displayed.
580" B. not reusing the window for which the location list window is opened but
581" instead creating new windows.
582" C. make sure that the location list window is not reused instead of the
583" window it belongs to.
584"
585" Set up the test environment:
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100586func ReadTestProtocol(name)
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100587 let base = substitute(a:name, '\v^test://(.*)%(\.[^.]+)?', '\1', '')
588 let word = substitute(base, '\v(.*)\..*', '\1', '')
589
590 setl modifiable
591 setl noreadonly
592 setl noswapfile
593 setl bufhidden=delete
594 %del _
595 " For problem 2:
596 " 'buftype' has to be set to reproduce the constant opening of new windows
597 setl buftype=nofile
598
599 call setline(1, word)
600
601 setl nomodified
602 setl nomodifiable
603 setl readonly
604 exe 'doautocmd BufRead ' . substitute(a:name, '\v^test://(.*)', '\1', '')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100605endfunc
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100606
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100607func Test_locationlist()
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100608 enew
609
610 augroup testgroup
611 au!
612 autocmd BufReadCmd test://* call ReadTestProtocol(expand("<amatch>"))
613 augroup END
614
615 let words = [ "foo", "bar", "baz", "quux", "shmoo", "spam", "eggs" ]
616
617 let qflist = []
618 for word in words
619 call add(qflist, {'filename': 'test://' . word . '.txt', 'text': 'file ' . word . '.txt', })
620 " NOTE: problem 1:
621 " intentionally not setting 'lnum' so that the quickfix entries are not
622 " valid
623 call setloclist(0, qflist, ' ')
624 endfor
625
626 " Test A
627 lrewind
628 enew
629 lopen
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200630 4lnext
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100631 vert split
632 wincmd L
633 lopen
634 wincmd p
635 lnext
636 let fileName = expand("%")
637 wincmd p
638 let locationListFileName = substitute(getline(line('.')), '\([^|]*\)|.*', '\1', '')
639 let fileName = substitute(fileName, '\\', '/', 'g')
640 let locationListFileName = substitute(locationListFileName, '\\', '/', 'g')
641 call assert_equal("test://bar.txt", fileName)
642 call assert_equal("test://bar.txt", locationListFileName)
643
644 wincmd n | only
645
646 " Test B:
647 lrewind
648 lopen
649 2
650 exe "normal \<CR>"
651 wincmd p
652 3
653 exe "normal \<CR>"
654 wincmd p
655 4
656 exe "normal \<CR>"
657 call assert_equal(2, winnr('$'))
658 wincmd n | only
659
660 " Test C:
661 lrewind
662 lopen
663 " Let's move the location list window to the top to check whether it (the
664 " first window found) will be reused when we try to open new windows:
665 wincmd K
666 2
667 exe "normal \<CR>"
668 wincmd p
669 3
670 exe "normal \<CR>"
671 wincmd p
672 4
673 exe "normal \<CR>"
674 1wincmd w
675 call assert_equal('quickfix', &buftype)
676 2wincmd w
677 let bufferName = expand("%")
678 let bufferName = substitute(bufferName, '\\', '/', 'g')
679 call assert_equal('test://quux.txt', bufferName)
680
681 wincmd n | only
682
683 augroup! testgroup
Bram Moolenaaree85df32017-03-19 14:19:50 +0100684endfunc
Bram Moolenaar0899d692016-03-19 13:35:03 +0100685
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100686func Test_locationlist_curwin_was_closed()
Bram Moolenaar0899d692016-03-19 13:35:03 +0100687 augroup testgroup
688 au!
Bram Moolenaard106e5b2016-04-21 19:38:07 +0200689 autocmd BufReadCmd test_curwin.txt call R(expand("<amatch>"))
Bram Moolenaar0899d692016-03-19 13:35:03 +0100690 augroup END
691
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100692 func! R(n)
Bram Moolenaar0899d692016-03-19 13:35:03 +0100693 quit
694 endfunc
695
696 new
697 let q = []
Bram Moolenaard106e5b2016-04-21 19:38:07 +0200698 call add(q, {'filename': 'test_curwin.txt' })
Bram Moolenaar0899d692016-03-19 13:35:03 +0100699 call setloclist(0, q)
700 call assert_fails('lrewind', 'E924:')
701
702 augroup! testgroup
Bram Moolenaaree85df32017-03-19 14:19:50 +0100703endfunc
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100704
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100705func Test_locationlist_cross_tab_jump()
Bram Moolenaar0a9046f2016-10-15 19:28:13 +0200706 call writefile(['loclistfoo'], 'loclistfoo')
707 call writefile(['loclistbar'], 'loclistbar')
708 set switchbuf=usetab
709
710 edit loclistfoo
711 tabedit loclistbar
712 silent lgrep loclistfoo loclist*
713 call assert_equal(1, tabpagenr())
714
715 enew | only | tabonly
716 set switchbuf&vim
717 call delete('loclistfoo')
718 call delete('loclistbar')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100719endfunc
Bram Moolenaar0a9046f2016-10-15 19:28:13 +0200720
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100721" More tests for 'errorformat'
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100722func Test_efm1()
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100723 if !has('unix')
724 " The 'errorformat' setting is different on non-Unix systems.
725 " This test works only on Unix-like systems.
726 return
727 endif
728
729 let l = [
730 \ '"Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set.',
731 \ '"Xtestfile", line 6 col 19; this is an error',
732 \ 'gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include version.c',
733 \ 'Xtestfile:9: parse error before `asd''',
734 \ 'make: *** [vim] Error 1',
735 \ 'in file "Xtestfile" linenr 10: there is an error',
736 \ '',
737 \ '2 returned',
738 \ '"Xtestfile", line 11 col 1; this is an error',
739 \ '"Xtestfile", line 12 col 2; this is another error',
740 \ '"Xtestfile", line 14:10; this is an error in column 10',
741 \ '=Xtestfile=, line 15:10; this is another error, but in vcol 10 this time',
742 \ '"Xtestfile", linenr 16: yet another problem',
743 \ 'Error in "Xtestfile" at line 17:',
744 \ 'x should be a dot',
745 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17',
746 \ ' ^',
747 \ 'Error in "Xtestfile" at line 18:',
748 \ 'x should be a dot',
749 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18',
750 \ '.............^',
751 \ 'Error in "Xtestfile" at line 19:',
752 \ 'x should be a dot',
753 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19',
754 \ '--------------^',
755 \ 'Error in "Xtestfile" at line 20:',
756 \ 'x should be a dot',
757 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20',
758 \ ' ^',
759 \ '',
760 \ 'Does anyone know what is the problem and how to correction it?',
761 \ '"Xtestfile", line 21 col 9: What is the title of the quickfix window?',
762 \ '"Xtestfile", line 22 col 9: What is the title of the quickfix window?'
763 \ ]
764
765 call writefile(l, 'Xerrorfile1')
766 call writefile(l[:-2], 'Xerrorfile2')
767
768 let m = [
769 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 2',
770 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 3',
771 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 4',
772 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 5',
773 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 6',
774 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 7',
775 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 8',
776 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 9',
777 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 10',
778 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 11',
779 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 12',
780 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 13',
781 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 14',
782 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 15',
783 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 16',
784 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17',
785 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18',
786 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19',
787 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20',
788 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 21',
789 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 22'
790 \ ]
791 call writefile(m, 'Xtestfile')
792
793 let save_efm = &efm
794 set efm+==%f=\\,\ line\ %l%*\\D%v%*[^\ ]\ %m
795 set efm^=%AError\ in\ \"%f\"\ at\ line\ %l:,%Z%p^,%C%m
796
797 exe 'cf Xerrorfile2'
798 clast
799 copen
800 call assert_equal(':cf Xerrorfile2', w:quickfix_title)
801 wincmd p
802
803 exe 'cf Xerrorfile1'
804 call assert_equal([4, 12], [line('.'), col('.')])
805 cn
806 call assert_equal([6, 19], [line('.'), col('.')])
807 cn
808 call assert_equal([9, 2], [line('.'), col('.')])
809 cn
810 call assert_equal([10, 2], [line('.'), col('.')])
811 cn
812 call assert_equal([11, 1], [line('.'), col('.')])
813 cn
814 call assert_equal([12, 2], [line('.'), col('.')])
815 cn
816 call assert_equal([14, 10], [line('.'), col('.')])
817 cn
818 call assert_equal([15, 3, 10], [line('.'), col('.'), virtcol('.')])
819 cn
820 call assert_equal([16, 2], [line('.'), col('.')])
821 cn
822 call assert_equal([17, 6], [line('.'), col('.')])
823 cn
824 call assert_equal([18, 7], [line('.'), col('.')])
825 cn
826 call assert_equal([19, 8], [line('.'), col('.')])
827 cn
828 call assert_equal([20, 9], [line('.'), col('.')])
829 clast
830 cprev
831 cprev
832 wincmd w
833 call assert_equal(':cf Xerrorfile1', w:quickfix_title)
834 wincmd p
835
836 let &efm = save_efm
837 call delete('Xerrorfile1')
838 call delete('Xerrorfile2')
839 call delete('Xtestfile')
Bram Moolenaaree85df32017-03-19 14:19:50 +0100840endfunc
Bram Moolenaarffec3c52016-03-23 20:55:42 +0100841
Bram Moolenaarab47c612016-06-14 22:02:26 +0200842" Test for quickfix directory stack support
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100843func s:dir_stack_tests(cchar)
Bram Moolenaar38df43b2016-06-20 21:41:12 +0200844 call s:setup_commands(a:cchar)
845
Bram Moolenaarab47c612016-06-14 22:02:26 +0200846 let save_efm=&efm
847 set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
848
Bram Moolenaar361c8f02016-07-02 15:41:47 +0200849 let lines = ["Entering dir 'dir1/a'",
850 \ 'habits2.txt:1:Nine Healthy Habits',
851 \ "Entering dir 'b'",
852 \ 'habits3.txt:2:0 Hours of television',
853 \ 'habits2.txt:7:5 Small meals',
854 \ "Entering dir 'dir1/c'",
855 \ 'habits4.txt:3:1 Hour of exercise',
856 \ "Leaving dir 'dir1/c'",
857 \ "Leaving dir 'dir1/a'",
858 \ 'habits1.txt:4:2 Liters of water',
859 \ "Entering dir 'dir2'",
860 \ 'habits5.txt:5:3 Cups of hot green tea',
861 \ "Leaving dir 'dir2'"
862 \]
Bram Moolenaarab47c612016-06-14 22:02:26 +0200863
Bram Moolenaar361c8f02016-07-02 15:41:47 +0200864 Xexpr ""
865 for l in lines
866 Xaddexpr l
867 endfor
Bram Moolenaarab47c612016-06-14 22:02:26 +0200868
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200869 let qf = g:Xgetlist()
Bram Moolenaarab47c612016-06-14 22:02:26 +0200870
871 call assert_equal('dir1/a/habits2.txt', bufname(qf[1].bufnr))
872 call assert_equal(1, qf[1].lnum)
873 call assert_equal('dir1/a/b/habits3.txt', bufname(qf[3].bufnr))
874 call assert_equal(2, qf[3].lnum)
875 call assert_equal('dir1/a/habits2.txt', bufname(qf[4].bufnr))
876 call assert_equal(7, qf[4].lnum)
877 call assert_equal('dir1/c/habits4.txt', bufname(qf[6].bufnr))
878 call assert_equal(3, qf[6].lnum)
879 call assert_equal('habits1.txt', bufname(qf[9].bufnr))
880 call assert_equal(4, qf[9].lnum)
881 call assert_equal('dir2/habits5.txt', bufname(qf[11].bufnr))
882 call assert_equal(5, qf[11].lnum)
883
884 let &efm=save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100885endfunc
Bram Moolenaarab47c612016-06-14 22:02:26 +0200886
887" Tests for %D and %X errorformat options
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100888func Test_efm_dirstack()
Bram Moolenaarab47c612016-06-14 22:02:26 +0200889 " Create the directory stack and files
890 call mkdir('dir1')
891 call mkdir('dir1/a')
892 call mkdir('dir1/a/b')
893 call mkdir('dir1/c')
894 call mkdir('dir2')
895
896 let lines = ["Nine Healthy Habits",
897 \ "0 Hours of television",
898 \ "1 Hour of exercise",
899 \ "2 Liters of water",
900 \ "3 Cups of hot green tea",
901 \ "4 Short mental breaks",
902 \ "5 Small meals",
903 \ "6 AM wake up time",
904 \ "7 Minutes of laughter",
905 \ "8 Hours of sleep (at least)",
906 \ "9 PM end of the day and off to bed"
907 \ ]
908 call writefile(lines, 'habits1.txt')
909 call writefile(lines, 'dir1/a/habits2.txt')
910 call writefile(lines, 'dir1/a/b/habits3.txt')
911 call writefile(lines, 'dir1/c/habits4.txt')
912 call writefile(lines, 'dir2/habits5.txt')
913
914 call s:dir_stack_tests('c')
915 call s:dir_stack_tests('l')
916
917 call delete('dir1', 'rf')
918 call delete('dir2', 'rf')
919 call delete('habits1.txt')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100920endfunc
Bram Moolenaarab47c612016-06-14 22:02:26 +0200921
Bram Moolenaar9b457942016-10-09 16:10:05 +0200922" Test for resync after continuing an ignored message
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100923func Xefm_ignore_continuations(cchar)
Bram Moolenaar9b457942016-10-09 16:10:05 +0200924 call s:setup_commands(a:cchar)
925
926 let save_efm = &efm
927
928 let &efm =
929 \ '%Eerror %m %l,' .
930 \ '%-Wignored %m %l,' .
931 \ '%+Cmore ignored %m %l,' .
932 \ '%Zignored end'
933 Xgetexpr ['ignored warning 1', 'more ignored continuation 2', 'ignored end', 'error resync 4']
934 let l = map(g:Xgetlist(), '[v:val.text, v:val.valid, v:val.lnum, v:val.type]')
935 call assert_equal([['resync', 1, 4, 'E']], l)
936
937 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100938endfunc
Bram Moolenaar9b457942016-10-09 16:10:05 +0200939
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100940func Test_efm_ignore_continuations()
Bram Moolenaar9b457942016-10-09 16:10:05 +0200941 call Xefm_ignore_continuations('c')
942 call Xefm_ignore_continuations('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100943endfunc
Bram Moolenaar9b457942016-10-09 16:10:05 +0200944
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200945" Tests for invalid error format specifies
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100946func Xinvalid_efm_Tests(cchar)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200947 call s:setup_commands(a:cchar)
948
Bram Moolenaar049cba92016-06-26 14:38:04 +0200949 let save_efm = &efm
950
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200951 set efm=%f:%l:%m,%f:%f:%l:%m
952 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E372:')
953
954 set efm=%f:%l:%m,%f:%l:%r:%m
955 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
956
957 set efm=%f:%l:%m,%O:%f:%l:%m
958 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
959
960 set efm=%f:%l:%m,%f:%l:%*[^a-z
961 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E374:')
962
963 set efm=%f:%l:%m,%f:%l:%*c
964 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E375:')
965
966 set efm=%f:%l:%m,%L%M%N
967 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E376:')
968
969 set efm=%f:%l:%m,%f:%l:%m:%R
970 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E377:')
971
972 set efm=
973 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E378:')
974
975 set efm=%DEntering\ dir\ abc,%f:%l:%m
976 call assert_fails('Xexpr ["Entering dir abc", "abc.txt:1:Hello world"]', 'E379:')
977
978 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100979endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200980
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100981func Test_invalid_efm()
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200982 call Xinvalid_efm_Tests('c')
983 call Xinvalid_efm_Tests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100984endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200985
986" TODO:
987" Add tests for the following formats in 'errorformat'
988" %r %O
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100989func Test_efm2()
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200990 let save_efm = &efm
Bram Moolenaar049cba92016-06-26 14:38:04 +0200991
992 " Test for %s format in efm
993 set efm=%f:%s
994 cexpr 'Xtestfile:Line search text'
Bram Moolenaar049cba92016-06-26 14:38:04 +0200995 let l = getqflist()
996 call assert_equal(l[0].pattern, '^\VLine search text\$')
997 call assert_equal(l[0].lnum, 0)
998
Bram Moolenaaree85df32017-03-19 14:19:50 +0100999 let l = split(execute('clist', ''), "\n")
1000 call assert_equal([' 1 Xtestfile:^\VLine search text\$: '], l)
1001
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001002 " Test for %P, %Q and %t format specifiers
Bram Moolenaar049cba92016-06-26 14:38:04 +02001003 let lines=["[Xtestfile1]",
1004 \ "(1,17) error: ';' missing",
1005 \ "(21,2) warning: variable 'z' not defined",
1006 \ "(67,3) error: end of file found before string ended",
Bram Moolenaaree85df32017-03-19 14:19:50 +01001007 \ "--",
Bram Moolenaar049cba92016-06-26 14:38:04 +02001008 \ "",
1009 \ "[Xtestfile2]",
Bram Moolenaaree85df32017-03-19 14:19:50 +01001010 \ "--",
Bram Moolenaar049cba92016-06-26 14:38:04 +02001011 \ "",
1012 \ "[Xtestfile3]",
1013 \ "NEW compiler v1.1",
1014 \ "(2,2) warning: variable 'x' not defined",
Bram Moolenaaree85df32017-03-19 14:19:50 +01001015 \ "(67,3) warning: 's' already defined",
1016 \ "--"
Bram Moolenaar049cba92016-06-26 14:38:04 +02001017 \]
Bram Moolenaaree85df32017-03-19 14:19:50 +01001018 set efm=%+P[%f]%r,(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%+Q--%r
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001019 " To exercise the push/pop file functionality in quickfix, the test files
1020 " need to be created.
1021 call writefile(['Line1'], 'Xtestfile1')
1022 call writefile(['Line2'], 'Xtestfile2')
1023 call writefile(['Line3'], 'Xtestfile3')
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001024 cexpr ""
1025 for l in lines
1026 caddexpr l
1027 endfor
Bram Moolenaar049cba92016-06-26 14:38:04 +02001028 let l = getqflist()
Bram Moolenaaree85df32017-03-19 14:19:50 +01001029 call assert_equal(12, len(l))
Bram Moolenaar049cba92016-06-26 14:38:04 +02001030 call assert_equal(21, l[2].lnum)
1031 call assert_equal(2, l[2].col)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001032 call assert_equal('w', l[2].type)
1033 call assert_equal('e', l[3].type)
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001034 call delete('Xtestfile1')
1035 call delete('Xtestfile2')
1036 call delete('Xtestfile3')
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001037
1038 " Tests for %E, %C and %Z format specifiers
1039 let lines = ["Error 275",
1040 \ "line 42",
1041 \ "column 3",
1042 \ "' ' expected after '--'"
1043 \]
1044 set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m
1045 cgetexpr lines
1046 let l = getqflist()
1047 call assert_equal(275, l[0].nr)
1048 call assert_equal(42, l[0].lnum)
1049 call assert_equal(3, l[0].col)
1050 call assert_equal('E', l[0].type)
1051 call assert_equal("\n' ' expected after '--'", l[0].text)
1052
1053 " Test for %>
1054 let lines = ["Error in line 147 of foo.c:",
1055 \"unknown variable 'i'"
1056 \]
1057 set efm=unknown\ variable\ %m,%E%>Error\ in\ line\ %l\ of\ %f:,%Z%m
1058 cgetexpr lines
1059 let l = getqflist()
1060 call assert_equal(147, l[0].lnum)
1061 call assert_equal('E', l[0].type)
1062 call assert_equal("\nunknown variable 'i'", l[0].text)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001063
Bram Moolenaare87e6dd2016-07-17 19:25:04 +02001064 " Test for %A, %C and other formats
1065 let lines = [
1066 \"==============================================================",
1067 \"FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest)",
1068 \"--------------------------------------------------------------",
1069 \"Traceback (most recent call last):",
1070 \' File "unittests/dbfacadeTest.py", line 89, in testFoo',
1071 \" self.assertEquals(34, dtid)",
1072 \' File "/usr/lib/python2.2/unittest.py", line 286, in',
1073 \" failUnlessEqual",
1074 \" raise self.failureException, \\",
1075 \"AssertionError: 34 != 33",
1076 \"",
1077 \"--------------------------------------------------------------",
1078 \"Ran 27 tests in 0.063s"
1079 \]
1080 set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m
1081 cgetexpr lines
1082 let l = getqflist()
1083 call assert_equal(8, len(l))
1084 call assert_equal(89, l[4].lnum)
1085 call assert_equal(1, l[4].valid)
1086 call assert_equal('unittests/dbfacadeTest.py', bufname(l[4].bufnr))
1087
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001088 " The following sequence of commands used to crash Vim
1089 set efm=%W%m
1090 cgetexpr ['msg1']
1091 let l = getqflist()
1092 call assert_equal(1, len(l), string(l))
1093 call assert_equal('msg1', l[0].text)
1094 set efm=%C%m
1095 lexpr 'msg2'
1096 let l = getloclist(0)
1097 call assert_equal(1, len(l), string(l))
1098 call assert_equal('msg2', l[0].text)
1099 lopen
1100 call setqflist([], 'r')
1101 caddbuf
1102 let l = getqflist()
1103 call assert_equal(1, len(l), string(l))
1104 call assert_equal('|| msg2', l[0].text)
1105
1106 new | only
Bram Moolenaar049cba92016-06-26 14:38:04 +02001107 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001108endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001109
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001110func XquickfixChangedByAutocmd(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001111 call s:setup_commands(a:cchar)
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001112 if a:cchar == 'c'
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001113 let ErrorNr = 'E925'
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001114 func! ReadFunc()
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001115 colder
1116 cgetexpr []
1117 endfunc
1118 else
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001119 let ErrorNr = 'E926'
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001120 func! ReadFunc()
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001121 lolder
1122 lgetexpr []
1123 endfunc
1124 endif
1125
1126 augroup testgroup
1127 au!
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001128 autocmd BufReadCmd test_changed.txt call ReadFunc()
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001129 augroup END
1130
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001131 new | only
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001132 let words = [ "a", "b" ]
1133 let qflist = []
1134 for word in words
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001135 call add(qflist, {'filename': 'test_changed.txt'})
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001136 call g:Xsetlist(qflist, ' ')
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001137 endfor
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001138 call assert_fails('Xrewind', ErrorNr . ':')
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001139
1140 augroup! testgroup
1141endfunc
1142
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001143func Test_quickfix_was_changed_by_autocmd()
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001144 call XquickfixChangedByAutocmd('c')
1145 call XquickfixChangedByAutocmd('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001146endfunc
Bram Moolenaar8b201792016-03-25 15:01:10 +01001147
1148func Test_caddbuffer_to_empty()
1149 helpgr quickfix
1150 call setqflist([], 'r')
1151 cad
Bram Moolenaarf68f1d72016-03-25 17:14:06 +01001152 try
1153 cn
1154 catch
1155 " number of matches is unknown
1156 call assert_true(v:exception =~ 'E553:')
1157 endtry
Bram Moolenaar8b201792016-03-25 15:01:10 +01001158 quit!
1159endfunc
Bram Moolenaar89c64d52016-03-27 18:44:40 +02001160
1161func Test_cgetexpr_works()
1162 " this must not crash Vim
1163 cgetexpr [$x]
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001164 lgetexpr [$x]
Bram Moolenaar89c64d52016-03-27 18:44:40 +02001165endfunc
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001166
1167" Tests for the setqflist() and setloclist() functions
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001168func SetXlistTests(cchar, bnum)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001169 call s:setup_commands(a:cchar)
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001170
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001171 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 1},
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001172 \ {'bufnr': a:bnum, 'lnum': 2}])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001173 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001174 call assert_equal(2, len(l))
1175 call assert_equal(2, l[1].lnum)
1176
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001177 Xnext
1178 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3}], 'a')
1179 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001180 call assert_equal(3, len(l))
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001181 Xnext
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001182 call assert_equal(3, line('.'))
1183
Bram Moolenaar2b2b8ae2016-05-24 19:59:51 +02001184 " Appending entries to the list should not change the cursor position
1185 " in the quickfix window
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001186 Xwindow
Bram Moolenaar2b2b8ae2016-05-24 19:59:51 +02001187 1
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001188 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 4},
Bram Moolenaar2b2b8ae2016-05-24 19:59:51 +02001189 \ {'bufnr': a:bnum, 'lnum': 5}], 'a')
1190 call assert_equal(1, line('.'))
1191 close
1192
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001193 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3},
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001194 \ {'bufnr': a:bnum, 'lnum': 4},
1195 \ {'bufnr': a:bnum, 'lnum': 5}], 'r')
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001196 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001197 call assert_equal(3, len(l))
1198 call assert_equal(5, l[2].lnum)
1199
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001200 call g:Xsetlist([])
1201 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001202 call assert_equal(0, len(l))
Bram Moolenaaree85df32017-03-19 14:19:50 +01001203
Bram Moolenaarf1d21c82017-04-22 21:20:46 +02001204 " Tests for setting the 'valid' flag
1205 call g:Xsetlist([{'bufnr':a:bnum, 'lnum':4, 'valid':0}])
1206 Xwindow
1207 call assert_equal(1, winnr('$'))
1208 let l = g:Xgetlist()
1209 call g:Xsetlist(l)
1210 call assert_equal(0, g:Xgetlist()[0].valid)
1211 call g:Xsetlist([{'text':'Text1', 'valid':1}])
1212 Xwindow
1213 call assert_equal(2, winnr('$'))
1214 Xclose
1215 let save_efm = &efm
1216 set efm=%m
1217 Xgetexpr 'TestMessage'
1218 let l = g:Xgetlist()
1219 call g:Xsetlist(l)
1220 call assert_equal(1, g:Xgetlist()[0].valid)
1221 let &efm = save_efm
1222
Bram Moolenaaree85df32017-03-19 14:19:50 +01001223 " Error cases:
1224 " Refer to a non-existing buffer and pass a non-dictionary type
1225 call assert_fails("call g:Xsetlist([{'bufnr':998, 'lnum':4}," .
1226 \ " {'bufnr':999, 'lnum':5}])", 'E92:')
1227 call g:Xsetlist([[1, 2,3]])
1228 call assert_equal(0, len(g:Xgetlist()))
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001229endfunc
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001230
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001231func Test_setqflist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001232 new Xtestfile | only
1233 let bnum = bufnr('%')
1234 call setline(1, range(1,5))
1235
1236 call SetXlistTests('c', bnum)
1237 call SetXlistTests('l', bnum)
1238
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001239 enew!
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001240 call delete('Xtestfile')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001241endfunc
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001242
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001243func Xlist_empty_middle(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001244 call s:setup_commands(a:cchar)
1245
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001246 " create three quickfix lists
Bram Moolenaaree85df32017-03-19 14:19:50 +01001247 let @/ = 'Test_'
1248 Xvimgrep // test_quickfix.vim
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001249 let testlen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001250 call assert_true(testlen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001251 Xvimgrep empty test_quickfix.vim
1252 call assert_true(len(g:Xgetlist()) > 0)
1253 Xvimgrep matches test_quickfix.vim
1254 let matchlen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001255 call assert_true(matchlen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001256 Xolder
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001257 " make the middle list empty
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001258 call g:Xsetlist([], 'r')
1259 call assert_true(len(g:Xgetlist()) == 0)
1260 Xolder
1261 call assert_equal(testlen, len(g:Xgetlist()))
1262 Xnewer
1263 Xnewer
1264 call assert_equal(matchlen, len(g:Xgetlist()))
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001265endfunc
1266
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001267func Test_setqflist_empty_middle()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001268 call Xlist_empty_middle('c')
1269 call Xlist_empty_middle('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001270endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001271
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001272func Xlist_empty_older(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001273 call s:setup_commands(a:cchar)
1274
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001275 " create three quickfix lists
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001276 Xvimgrep one test_quickfix.vim
1277 let onelen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001278 call assert_true(onelen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001279 Xvimgrep two test_quickfix.vim
1280 let twolen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001281 call assert_true(twolen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001282 Xvimgrep three test_quickfix.vim
1283 let threelen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001284 call assert_true(threelen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001285 Xolder 2
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001286 " make the first list empty, check the others didn't change
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001287 call g:Xsetlist([], 'r')
1288 call assert_true(len(g:Xgetlist()) == 0)
1289 Xnewer
1290 call assert_equal(twolen, len(g:Xgetlist()))
1291 Xnewer
1292 call assert_equal(threelen, len(g:Xgetlist()))
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001293endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001294
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001295func Test_setqflist_empty_older()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001296 call Xlist_empty_older('c')
1297 call Xlist_empty_older('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001298endfunc
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001299
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001300func XquickfixSetListWithAct(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001301 call s:setup_commands(a:cchar)
1302
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001303 let list1 = [{'filename': 'fnameA', 'text': 'A'},
1304 \ {'filename': 'fnameB', 'text': 'B'}]
1305 let list2 = [{'filename': 'fnameC', 'text': 'C'},
1306 \ {'filename': 'fnameD', 'text': 'D'},
1307 \ {'filename': 'fnameE', 'text': 'E'}]
1308
1309 " {action} is unspecified. Same as specifing ' '.
1310 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001311 silent! Xnewer 99
1312 call g:Xsetlist(list1)
1313 call g:Xsetlist(list2)
1314 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001315 call assert_equal(3, len(li))
1316 call assert_equal('C', li[0]['text'])
1317 call assert_equal('D', li[1]['text'])
1318 call assert_equal('E', li[2]['text'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001319 silent! Xolder
1320 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001321 call assert_equal(2, len(li))
1322 call assert_equal('A', li[0]['text'])
1323 call assert_equal('B', li[1]['text'])
1324
1325 " {action} is specified ' '.
1326 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001327 silent! Xnewer 99
1328 call g:Xsetlist(list1)
1329 call g:Xsetlist(list2, ' ')
1330 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001331 call assert_equal(3, len(li))
1332 call assert_equal('C', li[0]['text'])
1333 call assert_equal('D', li[1]['text'])
1334 call assert_equal('E', li[2]['text'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001335 silent! Xolder
1336 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001337 call assert_equal(2, len(li))
1338 call assert_equal('A', li[0]['text'])
1339 call assert_equal('B', li[1]['text'])
1340
1341 " {action} is specified 'a'.
1342 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001343 silent! Xnewer 99
1344 call g:Xsetlist(list1)
1345 call g:Xsetlist(list2, 'a')
1346 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001347 call assert_equal(5, len(li))
1348 call assert_equal('A', li[0]['text'])
1349 call assert_equal('B', li[1]['text'])
1350 call assert_equal('C', li[2]['text'])
1351 call assert_equal('D', li[3]['text'])
1352 call assert_equal('E', li[4]['text'])
1353
1354 " {action} is specified 'r'.
1355 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001356 silent! Xnewer 99
1357 call g:Xsetlist(list1)
1358 call g:Xsetlist(list2, 'r')
1359 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001360 call assert_equal(3, len(li))
1361 call assert_equal('C', li[0]['text'])
1362 call assert_equal('D', li[1]['text'])
1363 call assert_equal('E', li[2]['text'])
1364
1365 " Test for wrong value.
1366 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001367 call assert_fails("call g:Xsetlist(0)", 'E714:')
1368 call assert_fails("call g:Xsetlist(list1, '')", 'E927:')
1369 call assert_fails("call g:Xsetlist(list1, 'aa')", 'E927:')
1370 call assert_fails("call g:Xsetlist(list1, ' a')", 'E927:')
1371 call assert_fails("call g:Xsetlist(list1, 0)", 'E928:')
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001372endfunc
1373
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001374func Test_quickfix_set_list_with_act()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001375 call XquickfixSetListWithAct('c')
1376 call XquickfixSetListWithAct('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001377endfunc
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001378
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001379func XLongLinesTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001380 let l = g:Xgetlist()
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001381
Bram Moolenaar049cba92016-06-26 14:38:04 +02001382 call assert_equal(4, len(l))
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001383 call assert_equal(1, l[0].lnum)
1384 call assert_equal(1, l[0].col)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001385 call assert_equal(1975, len(l[0].text))
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001386 call assert_equal(2, l[1].lnum)
1387 call assert_equal(1, l[1].col)
1388 call assert_equal(4070, len(l[1].text))
1389 call assert_equal(3, l[2].lnum)
1390 call assert_equal(1, l[2].col)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001391 call assert_equal(4070, len(l[2].text))
1392 call assert_equal(4, l[3].lnum)
1393 call assert_equal(1, l[3].col)
1394 call assert_equal(10, len(l[3].text))
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001395
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001396 call g:Xsetlist([], 'r')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001397endfunc
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001398
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001399func s:long_lines_tests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001400 call s:setup_commands(a:cchar)
1401
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001402 let testfile = 'samples/quickfix.txt'
1403
1404 " file
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001405 exe 'Xgetfile' testfile
1406 call XLongLinesTests(a:cchar)
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001407
1408 " list
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001409 Xexpr readfile(testfile)
1410 call XLongLinesTests(a:cchar)
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001411
1412 " string
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001413 Xexpr join(readfile(testfile), "\n")
1414 call XLongLinesTests(a:cchar)
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001415
1416 " buffer
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001417 exe 'edit' testfile
1418 exe 'Xbuffer' bufnr('%')
Bram Moolenaarf50df392016-06-21 21:33:34 +02001419 call XLongLinesTests(a:cchar)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001420endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001421
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001422func Test_long_lines()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001423 call s:long_lines_tests('c')
1424 call s:long_lines_tests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001425endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001426
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001427func s:create_test_file(filename)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001428 let l = []
1429 for i in range(1, 20)
1430 call add(l, 'Line' . i)
1431 endfor
1432 call writefile(l, a:filename)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001433endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001434
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001435func Test_switchbuf()
Bram Moolenaar049cba92016-06-26 14:38:04 +02001436 call s:create_test_file('Xqftestfile1')
1437 call s:create_test_file('Xqftestfile2')
1438 call s:create_test_file('Xqftestfile3')
1439
1440 new | only
1441 edit Xqftestfile1
1442 let file1_winid = win_getid()
1443 new Xqftestfile2
1444 let file2_winid = win_getid()
1445 cgetexpr ['Xqftestfile1:5:Line5',
1446 \ 'Xqftestfile1:6:Line6',
1447 \ 'Xqftestfile2:10:Line10',
1448 \ 'Xqftestfile2:11:Line11',
1449 \ 'Xqftestfile3:15:Line15',
1450 \ 'Xqftestfile3:16:Line16']
1451
1452 new
1453 let winid = win_getid()
1454 cfirst | cnext
1455 call assert_equal(winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001456 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001457 call assert_equal(winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001458 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001459 call assert_equal(winid, win_getid())
1460 enew
1461
1462 set switchbuf=useopen
1463 cfirst | cnext
1464 call assert_equal(file1_winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001465 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001466 call assert_equal(file2_winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001467 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001468 call assert_equal(file2_winid, win_getid())
1469
1470 enew | only
1471 set switchbuf=usetab
1472 tabedit Xqftestfile1
1473 tabedit Xqftestfile2
1474 tabfirst
1475 cfirst | cnext
1476 call assert_equal(2, tabpagenr())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001477 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001478 call assert_equal(3, tabpagenr())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001479 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001480 call assert_equal(3, tabpagenr())
1481 tabfirst | tabonly | enew
1482
1483 set switchbuf=split
1484 cfirst | cnext
1485 call assert_equal(1, winnr('$'))
1486 cnext | cnext
1487 call assert_equal(2, winnr('$'))
1488 cnext | cnext
1489 call assert_equal(3, winnr('$'))
1490 enew | only
1491
1492 set switchbuf=newtab
1493 cfirst | cnext
1494 call assert_equal(1, tabpagenr('$'))
1495 cnext | cnext
1496 call assert_equal(2, tabpagenr('$'))
1497 cnext | cnext
1498 call assert_equal(3, tabpagenr('$'))
1499 tabfirst | enew | tabonly | only
1500
1501 set switchbuf=
1502 edit Xqftestfile1
1503 let file1_winid = win_getid()
1504 new Xqftestfile2
1505 let file2_winid = win_getid()
1506 copen
1507 exe "normal 1G\<CR>"
1508 call assert_equal(file1_winid, win_getid())
1509 copen
1510 exe "normal 3G\<CR>"
1511 call assert_equal(file2_winid, win_getid())
1512 copen | only
1513 exe "normal 5G\<CR>"
1514 call assert_equal(2, winnr('$'))
1515 call assert_equal(1, bufwinnr('Xqftestfile3'))
1516
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001517 " If only quickfix window is open in the current tabpage, jumping to an
1518 " entry with 'switchubf' set to 'usetab' should search in other tabpages.
Bram Moolenaar049cba92016-06-26 14:38:04 +02001519 enew | only
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001520 set switchbuf=usetab
1521 tabedit Xqftestfile1
1522 tabedit Xqftestfile2
1523 tabedit Xqftestfile3
1524 tabfirst
1525 copen | only
1526 clast
1527 call assert_equal(4, tabpagenr())
1528 tabfirst | tabonly | enew | only
Bram Moolenaar049cba92016-06-26 14:38:04 +02001529
1530 call delete('Xqftestfile1')
1531 call delete('Xqftestfile2')
1532 call delete('Xqftestfile3')
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001533 set switchbuf&vim
1534
1535 enew | only
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001536endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001537
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001538func Xadjust_qflnum(cchar)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001539 call s:setup_commands(a:cchar)
1540
1541 enew | only
1542
Bram Moolenaarc1542742016-07-20 21:44:37 +02001543 let fname = 'Xqftestfile' . a:cchar
1544 call s:create_test_file(fname)
1545 exe 'edit ' . fname
Bram Moolenaar049cba92016-06-26 14:38:04 +02001546
Bram Moolenaarc1542742016-07-20 21:44:37 +02001547 Xgetexpr [fname . ':5:Line5',
1548 \ fname . ':10:Line10',
1549 \ fname . ':15:Line15',
1550 \ fname . ':20:Line20']
Bram Moolenaar049cba92016-06-26 14:38:04 +02001551
1552 6,14delete
1553 call append(6, ['Buffer', 'Window'])
1554
1555 let l = g:Xgetlist()
1556
1557 call assert_equal(5, l[0].lnum)
1558 call assert_equal(6, l[2].lnum)
1559 call assert_equal(13, l[3].lnum)
1560
1561 enew!
Bram Moolenaarc1542742016-07-20 21:44:37 +02001562 call delete(fname)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001563endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001564
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001565func Test_adjust_lnum()
Bram Moolenaarc1542742016-07-20 21:44:37 +02001566 call setloclist(0, [])
Bram Moolenaar049cba92016-06-26 14:38:04 +02001567 call Xadjust_qflnum('c')
Bram Moolenaarc1542742016-07-20 21:44:37 +02001568 call setqflist([])
Bram Moolenaar049cba92016-06-26 14:38:04 +02001569 call Xadjust_qflnum('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001570endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001571
1572" Tests for the :grep/:lgrep and :grepadd/:lgrepadd commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001573func s:test_xgrep(cchar)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001574 call s:setup_commands(a:cchar)
1575
1576 " The following lines are used for the grep test. Don't remove.
1577 " Grep_Test_Text: Match 1
1578 " Grep_Test_Text: Match 2
1579 " GrepAdd_Test_Text: Match 1
1580 " GrepAdd_Test_Text: Match 2
1581 enew! | only
1582 set makeef&vim
1583 silent Xgrep Grep_Test_Text: test_quickfix.vim
1584 call assert_true(len(g:Xgetlist()) == 3)
1585 Xopen
1586 call assert_true(w:quickfix_title =~ '^:grep')
1587 Xclose
1588 enew
1589 set makeef=Temp_File_##
1590 silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
1591 call assert_true(len(g:Xgetlist()) == 6)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001592endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001593
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001594func Test_grep()
Bram Moolenaar049cba92016-06-26 14:38:04 +02001595 if !has('unix')
1596 " The grepprg may not be set on non-Unix systems
1597 return
1598 endif
1599
1600 call s:test_xgrep('c')
1601 call s:test_xgrep('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001602endfunc
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001603
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001604func Test_two_windows()
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001605 " Use one 'errorformat' for two windows. Add an expression to each of them,
1606 " make sure they each keep their own state.
1607 set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
1608 call mkdir('Xone/a', 'p')
1609 call mkdir('Xtwo/a', 'p')
1610 let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
1611 call writefile(lines, 'Xone/a/one.txt')
1612 call writefile(lines, 'Xtwo/a/two.txt')
1613
1614 new one
1615 let one_id = win_getid()
1616 lexpr ""
1617 new two
1618 let two_id = win_getid()
1619 lexpr ""
1620
1621 laddexpr "Entering dir 'Xtwo/a'"
1622 call win_gotoid(one_id)
1623 laddexpr "Entering dir 'Xone/a'"
1624 call win_gotoid(two_id)
1625 laddexpr 'two.txt:5:two two two'
1626 call win_gotoid(one_id)
1627 laddexpr 'one.txt:3:one one one'
1628
1629 let loc_one = getloclist(one_id)
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001630 call assert_equal('Xone/a/one.txt', bufname(loc_one[1].bufnr))
1631 call assert_equal(3, loc_one[1].lnum)
1632
1633 let loc_two = getloclist(two_id)
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001634 call assert_equal('Xtwo/a/two.txt', bufname(loc_two[1].bufnr))
1635 call assert_equal(5, loc_two[1].lnum)
1636
1637 call win_gotoid(one_id)
1638 bwipe!
1639 call win_gotoid(two_id)
1640 bwipe!
1641 call delete('Xone', 'rf')
1642 call delete('Xtwo', 'rf')
1643endfunc
Bram Moolenaardcb17002016-07-07 18:58:59 +02001644
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001645func XbottomTests(cchar)
Bram Moolenaar537ef082016-07-09 17:56:19 +02001646 call s:setup_commands(a:cchar)
1647
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +02001648 " Calling lbottom without any errors should fail
1649 if a:cchar == 'l'
1650 call assert_fails('lbottom', 'E776:')
1651 endif
1652
Bram Moolenaar875feea2017-06-11 16:07:51 +02001653 call g:Xsetlist([{'filename': 'foo', 'lnum': 42}])
Bram Moolenaar537ef082016-07-09 17:56:19 +02001654 Xopen
Bram Moolenaardcb17002016-07-07 18:58:59 +02001655 let wid = win_getid()
1656 call assert_equal(1, line('.'))
1657 wincmd w
Bram Moolenaar875feea2017-06-11 16:07:51 +02001658 call g:Xsetlist([{'filename': 'var', 'lnum': 24}], 'a')
Bram Moolenaar537ef082016-07-09 17:56:19 +02001659 Xbottom
Bram Moolenaardcb17002016-07-07 18:58:59 +02001660 call win_gotoid(wid)
1661 call assert_equal(2, line('.'))
Bram Moolenaar537ef082016-07-09 17:56:19 +02001662 Xclose
Bram Moolenaardcb17002016-07-07 18:58:59 +02001663endfunc
Bram Moolenaar537ef082016-07-09 17:56:19 +02001664
1665" Tests for the :cbottom and :lbottom commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001666func Test_cbottom()
Bram Moolenaar537ef082016-07-09 17:56:19 +02001667 call XbottomTests('c')
1668 call XbottomTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001669endfunc
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02001670
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001671func HistoryTest(cchar)
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02001672 call s:setup_commands(a:cchar)
1673
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02001674 " clear all lists after the first one, then replace the first one.
1675 call g:Xsetlist([])
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +02001676 call assert_fails('Xolder 99', 'E380:')
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02001677 let entry = {'filename': 'foo', 'lnum': 42}
1678 call g:Xsetlist([entry], 'r')
1679 call g:Xsetlist([entry, entry])
1680 call g:Xsetlist([entry, entry, entry])
1681 let res = split(execute(a:cchar . 'hist'), "\n")
1682 call assert_equal(3, len(res))
1683 let common = 'errors :set' . (a:cchar == 'c' ? 'qf' : 'loc') . 'list()'
1684 call assert_equal(' error list 1 of 3; 1 ' . common, res[0])
1685 call assert_equal(' error list 2 of 3; 2 ' . common, res[1])
1686 call assert_equal('> error list 3 of 3; 3 ' . common, res[2])
1687endfunc
1688
1689func Test_history()
1690 call HistoryTest('c')
1691 call HistoryTest('l')
1692endfunc
Bram Moolenaar015102e2016-07-16 18:24:56 +02001693
1694func Test_duplicate_buf()
1695 " make sure we can get the highest buffer number
1696 edit DoesNotExist
1697 edit DoesNotExist2
1698 let last_buffer = bufnr("$")
1699
1700 " make sure only one buffer is created
1701 call writefile(['this one', 'that one'], 'Xgrepthis')
1702 vimgrep one Xgrepthis
1703 vimgrep one Xgrepthis
1704 call assert_equal(last_buffer + 1, bufnr("$"))
1705
1706 call delete('Xgrepthis')
1707endfunc
Bram Moolenaard823fa92016-08-12 16:29:27 +02001708
1709" Quickfix/Location list set/get properties tests
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001710func Xproperty_tests(cchar)
Bram Moolenaard823fa92016-08-12 16:29:27 +02001711 call s:setup_commands(a:cchar)
1712
1713 " Error cases
1714 call assert_fails('call g:Xgetlist(99)', 'E715:')
1715 call assert_fails('call g:Xsetlist(99)', 'E714:')
1716 call assert_fails('call g:Xsetlist([], "a", [])', 'E715:')
1717
1718 " Set and get the title
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +02001719 call g:Xsetlist([])
Bram Moolenaard823fa92016-08-12 16:29:27 +02001720 Xopen
1721 wincmd p
1722 call g:Xsetlist([{'filename':'foo', 'lnum':27}])
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02001723 let s = g:Xsetlist([], 'a', {'title' : 'Sample'})
1724 call assert_equal(0, s)
Bram Moolenaard823fa92016-08-12 16:29:27 +02001725 let d = g:Xgetlist({"title":1})
1726 call assert_equal('Sample', d.title)
1727
1728 Xopen
1729 call assert_equal('Sample', w:quickfix_title)
1730 Xclose
1731
Bram Moolenaar2b529bb2016-08-27 13:35:35 +02001732 " Tests for action argument
1733 silent! Xolder 999
1734 let qfnr = g:Xgetlist({'all':1}).nr
1735 call g:Xsetlist([], 'r', {'title' : 'N1'})
1736 call assert_equal('N1', g:Xgetlist({'all':1}).title)
1737 call g:Xsetlist([], ' ', {'title' : 'N2'})
1738 call assert_equal(qfnr + 1, g:Xgetlist({'all':1}).nr)
Bram Moolenaar890680c2016-09-27 21:28:56 +02001739
1740 let res = g:Xgetlist({'nr': 0})
1741 call assert_equal(qfnr + 1, res.nr)
1742 call assert_equal(['nr'], keys(res))
1743
Bram Moolenaar2b529bb2016-08-27 13:35:35 +02001744 call g:Xsetlist([], ' ', {'title' : 'N3'})
1745 call assert_equal('N2', g:Xgetlist({'nr':2, 'title':1}).title)
1746
Bram Moolenaaree85df32017-03-19 14:19:50 +01001747 " Changing the title of an earlier quickfix list
Bram Moolenaar55b69262017-08-13 13:42:01 +02001748 call g:Xsetlist([], 'r', {'title' : 'NewTitle', 'nr' : 2})
Bram Moolenaaree85df32017-03-19 14:19:50 +01001749 call assert_equal('NewTitle', g:Xgetlist({'nr':2, 'title':1}).title)
1750
1751 " Changing the title of an invalid quickfix list
1752 call assert_equal(-1, g:Xsetlist([], ' ',
1753 \ {'title' : 'SomeTitle', 'nr' : 99}))
1754 call assert_equal(-1, g:Xsetlist([], ' ',
1755 \ {'title' : 'SomeTitle', 'nr' : 'abc'}))
1756
1757 if a:cchar == 'c'
1758 copen
1759 call assert_equal({'winid':win_getid()}, getqflist({'winid':1}))
1760 cclose
1761 endif
1762
Bram Moolenaard823fa92016-08-12 16:29:27 +02001763 " Invalid arguments
1764 call assert_fails('call g:Xgetlist([])', 'E715')
1765 call assert_fails('call g:Xsetlist([], "a", [])', 'E715')
1766 let s = g:Xsetlist([], 'a', {'abc':1})
1767 call assert_equal(-1, s)
1768
1769 call assert_equal({}, g:Xgetlist({'abc':1}))
Bram Moolenaaree85df32017-03-19 14:19:50 +01001770 call assert_equal({}, g:Xgetlist({'nr':99, 'title':1}))
1771 call assert_equal({}, g:Xgetlist({'nr':[], 'title':1}))
Bram Moolenaard823fa92016-08-12 16:29:27 +02001772
1773 if a:cchar == 'l'
Bram Moolenaar890680c2016-09-27 21:28:56 +02001774 call assert_equal({}, getloclist(99, {'title': 1}))
Bram Moolenaard823fa92016-08-12 16:29:27 +02001775 endif
Bram Moolenaar8f77c5a2017-04-30 14:21:00 +02001776
1777 " Context related tests
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02001778 let s = g:Xsetlist([], 'a', {'context':[1,2,3]})
1779 call assert_equal(0, s)
Bram Moolenaar8f77c5a2017-04-30 14:21:00 +02001780 call test_garbagecollect_now()
1781 let d = g:Xgetlist({'context':1})
1782 call assert_equal([1,2,3], d.context)
1783 call g:Xsetlist([], 'a', {'context':{'color':'green'}})
1784 let d = g:Xgetlist({'context':1})
1785 call assert_equal({'color':'green'}, d.context)
1786 call g:Xsetlist([], 'a', {'context':"Context info"})
1787 let d = g:Xgetlist({'context':1})
1788 call assert_equal("Context info", d.context)
1789 call g:Xsetlist([], 'a', {'context':246})
1790 let d = g:Xgetlist({'context':1})
1791 call assert_equal(246, d.context)
1792 if a:cchar == 'l'
1793 " Test for copying context across two different location lists
1794 new | only
1795 let w1_id = win_getid()
1796 let l = [1]
1797 call setloclist(0, [], 'a', {'context':l})
1798 new
1799 let w2_id = win_getid()
1800 call add(l, 2)
1801 call assert_equal([1, 2], getloclist(w1_id, {'context':1}).context)
1802 call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
1803 unlet! l
1804 call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
1805 only
1806 call setloclist(0, [], 'f')
1807 call assert_equal({}, getloclist(0, {'context':1}))
1808 endif
Bram Moolenaar6e62da32017-05-28 08:16:25 +02001809
1810 " Test for changing the context of previous quickfix lists
1811 call g:Xsetlist([], 'f')
1812 Xexpr "One"
1813 Xexpr "Two"
1814 Xexpr "Three"
Bram Moolenaar55b69262017-08-13 13:42:01 +02001815 call g:Xsetlist([], 'r', {'context' : [1], 'nr' : 1})
1816 call g:Xsetlist([], 'a', {'context' : [2], 'nr' : 2})
Bram Moolenaar6e62da32017-05-28 08:16:25 +02001817 " Also, check for setting the context using quickfix list number zero.
Bram Moolenaar55b69262017-08-13 13:42:01 +02001818 call g:Xsetlist([], 'r', {'context' : [3], 'nr' : 0})
Bram Moolenaar6e62da32017-05-28 08:16:25 +02001819 call test_garbagecollect_now()
1820 let l = g:Xgetlist({'nr' : 1, 'context' : 1})
1821 call assert_equal([1], l.context)
1822 let l = g:Xgetlist({'nr' : 2, 'context' : 1})
1823 call assert_equal([2], l.context)
1824 let l = g:Xgetlist({'nr' : 3, 'context' : 1})
1825 call assert_equal([3], l.context)
1826
1827 " Test for changing the context through reference and for garbage
1828 " collection of quickfix context
1829 let l = ["red"]
1830 call g:Xsetlist([], ' ', {'context' : l})
1831 call add(l, "blue")
1832 let x = g:Xgetlist({'context' : 1})
1833 call add(x.context, "green")
1834 call assert_equal(["red", "blue", "green"], l)
1835 call assert_equal(["red", "blue", "green"], x.context)
1836 unlet l
1837 call test_garbagecollect_now()
1838 let m = g:Xgetlist({'context' : 1})
1839 call assert_equal(["red", "blue", "green"], m.context)
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02001840
1841 " Test for setting/getting items
1842 Xexpr ""
1843 let qfprev = g:Xgetlist({'nr':0})
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02001844 let s = g:Xsetlist([], ' ', {'title':'Green',
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02001845 \ 'items' : [{'filename':'F1', 'lnum':10}]})
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02001846 call assert_equal(0, s)
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02001847 let qfcur = g:Xgetlist({'nr':0})
1848 call assert_true(qfcur.nr == qfprev.nr + 1)
1849 let l = g:Xgetlist({'items':1})
1850 call assert_equal('F1', bufname(l.items[0].bufnr))
1851 call assert_equal(10, l.items[0].lnum)
1852 call g:Xsetlist([], 'a', {'items' : [{'filename':'F2', 'lnum':20},
1853 \ {'filename':'F2', 'lnum':30}]})
1854 let l = g:Xgetlist({'items':1})
1855 call assert_equal('F2', bufname(l.items[2].bufnr))
1856 call assert_equal(30, l.items[2].lnum)
1857 call g:Xsetlist([], 'r', {'items' : [{'filename':'F3', 'lnum':40}]})
1858 let l = g:Xgetlist({'items':1})
1859 call assert_equal('F3', bufname(l.items[0].bufnr))
1860 call assert_equal(40, l.items[0].lnum)
1861 call g:Xsetlist([], 'r', {'items' : []})
1862 let l = g:Xgetlist({'items':1})
1863 call assert_equal(0, len(l.items))
1864
Bram Moolenaarae338332017-08-11 20:25:26 +02001865 " The following used to crash Vim with address sanitizer
1866 call g:Xsetlist([], 'f')
1867 call g:Xsetlist([], 'a', {'items' : [{'filename':'F1', 'lnum':10}]})
1868 call assert_equal(10, g:Xgetlist({'items':1}).items[0].lnum)
1869
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02001870 " Save and restore the quickfix stack
1871 call g:Xsetlist([], 'f')
1872 call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
1873 Xexpr "File1:10:Line1"
1874 Xexpr "File2:20:Line2"
1875 Xexpr "File3:30:Line3"
1876 let last_qf = g:Xgetlist({'nr':'$'}).nr
1877 call assert_equal(3, last_qf)
1878 let qstack = []
1879 for i in range(1, last_qf)
1880 let qstack = add(qstack, g:Xgetlist({'nr':i, 'all':1}))
1881 endfor
1882 call g:Xsetlist([], 'f')
1883 for i in range(len(qstack))
1884 call g:Xsetlist([], ' ', qstack[i])
1885 endfor
1886 call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
1887 call assert_equal(10, g:Xgetlist({'nr':1, 'items':1}).items[0].lnum)
1888 call assert_equal(20, g:Xgetlist({'nr':2, 'items':1}).items[0].lnum)
1889 call assert_equal(30, g:Xgetlist({'nr':3, 'items':1}).items[0].lnum)
1890 call g:Xsetlist([], 'f')
1891
1892 " Swap two quickfix lists
1893 Xexpr "File1:10:Line10"
1894 Xexpr "File2:20:Line20"
1895 Xexpr "File3:30:Line30"
1896 call g:Xsetlist([], 'r', {'nr':1,'title':'Colors','context':['Colors']})
1897 call g:Xsetlist([], 'r', {'nr':2,'title':'Fruits','context':['Fruits']})
1898 let l1=g:Xgetlist({'nr':1,'all':1})
1899 let l2=g:Xgetlist({'nr':2,'all':1})
Bram Moolenaara539f4f2017-08-30 20:33:55 +02001900 let save_id = l1.id
1901 let l1.id=l2.id
1902 let l2.id=save_id
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02001903 call g:Xsetlist([], 'r', l1)
1904 call g:Xsetlist([], 'r', l2)
1905 let newl1=g:Xgetlist({'nr':1,'all':1})
1906 let newl2=g:Xgetlist({'nr':2,'all':1})
1907 call assert_equal(':Fruits', newl1.title)
1908 call assert_equal(['Fruits'], newl1.context)
1909 call assert_equal('Line20', newl1.items[0].text)
1910 call assert_equal(':Colors', newl2.title)
1911 call assert_equal(['Colors'], newl2.context)
1912 call assert_equal('Line10', newl2.items[0].text)
1913 call g:Xsetlist([], 'f')
Bram Moolenaaree85df32017-03-19 14:19:50 +01001914endfunc
Bram Moolenaard823fa92016-08-12 16:29:27 +02001915
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001916func Test_qf_property()
Bram Moolenaard823fa92016-08-12 16:29:27 +02001917 call Xproperty_tests('c')
1918 call Xproperty_tests('l')
Bram Moolenaaree85df32017-03-19 14:19:50 +01001919endfunc
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02001920
1921" Tests for the QuickFixCmdPre/QuickFixCmdPost autocommands
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001922func QfAutoCmdHandler(loc, cmd)
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02001923 call add(g:acmds, a:loc . a:cmd)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001924endfunc
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02001925
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001926func Test_Autocmd()
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02001927 autocmd QuickFixCmdPre * call QfAutoCmdHandler('pre', expand('<amatch>'))
1928 autocmd QuickFixCmdPost * call QfAutoCmdHandler('post', expand('<amatch>'))
1929
1930 let g:acmds = []
1931 cexpr "F1:10:Line 10"
1932 caddexpr "F1:20:Line 20"
1933 cgetexpr "F1:30:Line 30"
1934 enew! | call append(0, "F2:10:Line 10")
1935 cbuffer!
1936 enew! | call append(0, "F2:20:Line 20")
1937 cgetbuffer
1938 enew! | call append(0, "F2:30:Line 30")
1939 caddbuffer
1940
1941 let l = ['precexpr',
1942 \ 'postcexpr',
1943 \ 'precaddexpr',
1944 \ 'postcaddexpr',
1945 \ 'precgetexpr',
1946 \ 'postcgetexpr',
1947 \ 'precbuffer',
1948 \ 'postcbuffer',
1949 \ 'precgetbuffer',
1950 \ 'postcgetbuffer',
1951 \ 'precaddbuffer',
1952 \ 'postcaddbuffer']
1953 call assert_equal(l, g:acmds)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001954endfunc
Bram Moolenaar21662be2016-11-06 14:46:44 +01001955
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001956func Test_Autocmd_Exception()
Bram Moolenaar21662be2016-11-06 14:46:44 +01001957 set efm=%m
1958 lgetexpr '?'
1959
1960 try
1961 call DoesNotExit()
1962 catch
1963 lgetexpr '1'
1964 finally
1965 lgetexpr '1'
1966 endtry
1967
1968 call assert_equal('1', getloclist(0)[0].text)
1969
1970 set efm&vim
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001971endfunc
Bram Moolenaar63bed3d2016-11-12 15:36:54 +01001972
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001973func Test_caddbuffer_wrong()
1974 " This used to cause a memory access in freed memory.
Bram Moolenaar63bed3d2016-11-12 15:36:54 +01001975 let save_efm = &efm
1976 set efm=%EEEE%m,%WWWW,%+CCCC%>%#,%GGGG%.#
1977 cgetexpr ['WWWW', 'EEEE', 'CCCC']
1978 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001979 caddbuffer
Bram Moolenaar63bed3d2016-11-12 15:36:54 +01001980 bwipe!
1981endfunc
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001982
1983func Test_caddexpr_wrong()
1984 " This used to cause a memory access in freed memory.
1985 cbuffer
1986 cbuffer
1987 copen
1988 let save_efm = &efm
1989 set efm=%
1990 call assert_fails('caddexpr ""', 'E376:')
1991 let &efm = save_efm
1992endfunc
Bram Moolenaar7618e002016-11-13 15:09:26 +01001993
1994func Test_dirstack_cleanup()
1995 " This used to cause a memory access in freed memory.
1996 let save_efm = &efm
1997 lexpr '0'
1998 lopen
1999 fun X(c)
2000 let save_efm=&efm
2001 set efm=%D%f
2002 if a:c == 'c'
2003 caddexpr '::'
2004 else
2005 laddexpr ':0:0'
2006 endif
2007 let &efm=save_efm
2008 endfun
2009 call X('c')
2010 call X('l')
2011 call setqflist([], 'r')
2012 caddbuffer
2013 let &efm = save_efm
2014endfunc
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01002015
2016" Tests for jumping to entries from the location list window and quickfix
2017" window
2018func Test_cwindow_jump()
2019 set efm=%f%%%l%%%m
2020 lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2021 lopen | only
2022 lfirst
2023 call assert_true(winnr('$') == 2)
2024 call assert_true(winnr() == 1)
2025 " Location list for the new window should be set
2026 call assert_true(getloclist(0)[2].text == 'Line 30')
2027
2028 " Open a scratch buffer
2029 " Open a new window and create a location list
2030 " Open the location list window and close the other window
2031 " Jump to an entry.
2032 " Should create a new window and jump to the entry. The scrtach buffer
2033 " should not be used.
2034 enew | only
2035 set buftype=nofile
2036 below new
2037 lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2038 lopen
2039 2wincmd c
2040 lnext
2041 call assert_true(winnr('$') == 3)
2042 call assert_true(winnr() == 2)
2043
2044 " Open two windows with two different location lists
2045 " Open the location list window and close the previous window
2046 " Jump to an entry in the location list window
2047 " Should open the file in the first window and not set the location list.
2048 enew | only
2049 lgetexpr ["F1%5%Line 5"]
2050 below new
2051 lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2052 lopen
2053 2wincmd c
2054 lnext
2055 call assert_true(winnr() == 1)
2056 call assert_true(getloclist(0)[0].text == 'Line 5')
2057
2058 enew | only
2059 cgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2060 copen
2061 cnext
2062 call assert_true(winnr('$') == 2)
2063 call assert_true(winnr() == 1)
2064
2065 enew | only
2066 set efm&vim
2067endfunc
Bram Moolenaaree85df32017-03-19 14:19:50 +01002068
2069func XvimgrepTests(cchar)
2070 call s:setup_commands(a:cchar)
2071
2072 call writefile(['Editor:VIM vim',
2073 \ 'Editor:Emacs EmAcS',
2074 \ 'Editor:Notepad NOTEPAD'], 'Xtestfile1')
2075 call writefile(['Linux', 'MacOS', 'MS-Windows'], 'Xtestfile2')
2076
2077 " Error cases
2078 call assert_fails('Xvimgrep /abc *', 'E682:')
2079
2080 let @/=''
2081 call assert_fails('Xvimgrep // *', 'E35:')
2082
2083 call assert_fails('Xvimgrep abc', 'E683:')
2084 call assert_fails('Xvimgrep a1b2c3 Xtestfile1', 'E480:')
2085 call assert_fails('Xvimgrep pat Xa1b2c3', 'E480:')
2086
2087 Xexpr ""
2088 Xvimgrepadd Notepad Xtestfile1
2089 Xvimgrepadd MacOS Xtestfile2
2090 let l = g:Xgetlist()
2091 call assert_equal(2, len(l))
2092 call assert_equal('Editor:Notepad NOTEPAD', l[0].text)
2093
2094 Xvimgrep #\cvim#g Xtestfile?
2095 let l = g:Xgetlist()
2096 call assert_equal(2, len(l))
2097 call assert_equal(8, l[0].col)
2098 call assert_equal(12, l[1].col)
2099
2100 1Xvimgrep ?Editor? Xtestfile*
2101 let l = g:Xgetlist()
2102 call assert_equal(1, len(l))
2103 call assert_equal('Editor:VIM vim', l[0].text)
2104
2105 edit +3 Xtestfile2
2106 Xvimgrep +\cemacs+j Xtestfile1
2107 let l = g:Xgetlist()
2108 call assert_equal('Xtestfile2', bufname(''))
2109 call assert_equal('Editor:Emacs EmAcS', l[0].text)
2110
2111 call delete('Xtestfile1')
2112 call delete('Xtestfile2')
2113endfunc
2114
2115" Tests for the :vimgrep command
2116func Test_vimgrep()
2117 call XvimgrepTests('c')
2118 call XvimgrepTests('l')
2119endfunc
Bram Moolenaar69f40be2017-04-02 15:15:49 +02002120
2121func XfreeTests(cchar)
2122 call s:setup_commands(a:cchar)
2123
2124 enew | only
2125
2126 " Deleting the quickfix stack should work even When the current list is
2127 " somewhere in the middle of the stack
2128 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2129 Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
2130 Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
2131 Xolder
2132 call g:Xsetlist([], 'f')
2133 call assert_equal(0, len(g:Xgetlist()))
2134
2135 " After deleting the stack, adding a new list should create a stack with a
2136 " single list.
2137 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2138 call assert_equal(1, g:Xgetlist({'all':1}).nr)
2139
2140 " Deleting the stack from a quickfix window should update/clear the
2141 " quickfix/location list window.
2142 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2143 Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
2144 Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
2145 Xolder
2146 Xwindow
2147 call g:Xsetlist([], 'f')
2148 call assert_equal(2, winnr('$'))
2149 call assert_equal(1, line('$'))
2150 Xclose
2151
2152 " Deleting the stack from a non-quickfix window should update/clear the
2153 " quickfix/location list window.
2154 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2155 Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
2156 Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
2157 Xolder
2158 Xwindow
2159 wincmd p
2160 call g:Xsetlist([], 'f')
2161 call assert_equal(0, len(g:Xgetlist()))
2162 wincmd p
2163 call assert_equal(2, winnr('$'))
2164 call assert_equal(1, line('$'))
2165
2166 " After deleting the location list stack, if the location list window is
2167 " opened, then a new location list should be created. So opening the
2168 " location list window again should not create a new window.
2169 if a:cchar == 'l'
2170 lexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2171 wincmd p
2172 lopen
2173 call assert_equal(2, winnr('$'))
2174 endif
2175 Xclose
2176endfunc
2177
2178" Tests for the quickifx free functionality
2179func Test_qf_free()
2180 call XfreeTests('c')
2181 call XfreeTests('l')
2182endfunc
Bram Moolenaar6e62da32017-05-28 08:16:25 +02002183
2184" Test for buffer overflow when parsing lines and adding new entries to
2185" the quickfix list.
2186func Test_bufoverflow()
2187 set efm=%f:%l:%m
2188 cgetexpr ['File1:100:' . repeat('x', 1025)]
2189
2190 set efm=%+GCompiler:\ %.%#,%f:%l:%m
2191 cgetexpr ['Compiler: ' . repeat('a', 1015), 'File1:10:Hello World']
2192
2193 set efm=%DEntering\ directory\ %f,%f:%l:%m
2194 cgetexpr ['Entering directory ' . repeat('a', 1006),
2195 \ 'File1:10:Hello World']
2196 set efm&vim
2197endfunc
2198
Bram Moolenaar875feea2017-06-11 16:07:51 +02002199" Tests for getting the quickfix stack size
2200func XsizeTests(cchar)
2201 call s:setup_commands(a:cchar)
2202
2203 call g:Xsetlist([], 'f')
2204 call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
2205 call assert_equal(1, len(g:Xgetlist({'nr':'$', 'all':1})))
2206 call assert_equal(0, len(g:Xgetlist({'nr':0})))
2207
2208 Xexpr "File1:10:Line1"
2209 Xexpr "File2:20:Line2"
2210 Xexpr "File3:30:Line3"
2211 Xolder | Xolder
2212 call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
2213 call g:Xsetlist([], 'f')
2214
2215 Xexpr "File1:10:Line1"
2216 Xexpr "File2:20:Line2"
2217 Xexpr "File3:30:Line3"
2218 Xolder | Xolder
2219 call g:Xsetlist([], 'a', {'nr':'$', 'title':'Compiler'})
2220 call assert_equal('Compiler', g:Xgetlist({'nr':3, 'all':1}).title)
2221endfunc
2222
2223func Test_Qf_Size()
2224 call XsizeTests('c')
2225 call XsizeTests('l')
2226endfunc
Bram Moolenaar18141832017-06-25 21:17:25 +02002227
Bram Moolenaar9c4feff2017-06-28 22:26:54 +02002228func Test_cclose_from_copen()
2229 augroup QF_Test
2230 au!
2231 au FileType qf :call assert_fails(':cclose', 'E788')
2232 augroup END
2233 copen
2234 augroup QF_Test
2235 au!
2236 augroup END
2237 augroup! QF_Test
2238endfunc
2239
Bram Moolenaar18141832017-06-25 21:17:25 +02002240func Test_cclose_in_autocmd()
2241 " Problem is only triggered if "starting" is zero, so that the OptionsSet
2242 " event will be triggered.
2243 call test_override('starting', 1)
2244 augroup QF_Test
2245 au!
2246 au FileType qf :call assert_fails(':cclose', 'E788')
2247 augroup END
2248 copen
2249 augroup QF_Test
2250 au!
2251 augroup END
2252 augroup! QF_Test
2253 call test_override('starting', 0)
2254endfunc
Bram Moolenaar9c4feff2017-06-28 22:26:54 +02002255
2256func Test_resize_from_copen()
2257 augroup QF_Test
2258 au!
2259 au FileType qf resize 5
2260 augroup END
2261 try
2262 " This should succeed without any exception. No other buffers are
2263 " involved in the autocmd.
2264 copen
2265 finally
2266 augroup QF_Test
2267 au!
2268 augroup END
2269 augroup! QF_Test
2270 endtry
2271endfunc
Bram Moolenaara8788f42017-07-19 17:06:20 +02002272
2273" Tests for the quickfix buffer b:changedtick variable
2274func Xchangedtick_tests(cchar)
2275 call s:setup_commands(a:cchar)
2276
2277 new | only
2278
2279 Xexpr "" | Xexpr "" | Xexpr ""
2280
2281 Xopen
2282 Xolder
2283 Xolder
2284 Xaddexpr "F1:10:Line10"
2285 Xaddexpr "F2:20:Line20"
2286 call g:Xsetlist([{"filename":"F3", "lnum":30, "text":"Line30"}], 'a')
2287 call g:Xsetlist([], 'f')
2288 call assert_equal(8, getbufvar('%', 'changedtick'))
2289 Xclose
2290endfunc
2291
2292func Test_changedtick()
Bram Moolenaarae338332017-08-11 20:25:26 +02002293 call Xchangedtick_tests('c')
2294 call Xchangedtick_tests('l')
2295endfunc
2296
2297" Tests for parsing an expression using setqflist()
2298func Xsetexpr_tests(cchar)
2299 call s:setup_commands(a:cchar)
2300
2301 let t = ["File1:10:Line10", "File1:20:Line20"]
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002302 call g:Xsetlist([], ' ', {'lines' : t})
2303 call g:Xsetlist([], 'a', {'lines' : ["File1:30:Line30"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02002304
2305 let l = g:Xgetlist()
2306 call assert_equal(3, len(l))
2307 call assert_equal(20, l[1].lnum)
2308 call assert_equal('Line30', l[2].text)
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002309 call g:Xsetlist([], 'r', {'lines' : ["File2:5:Line5"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02002310 let l = g:Xgetlist()
2311 call assert_equal(1, len(l))
2312 call assert_equal('Line5', l[0].text)
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002313 call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : 10}))
2314 call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : "F1:10:L10"}))
Bram Moolenaarae338332017-08-11 20:25:26 +02002315
2316 call g:Xsetlist([], 'f')
2317 " Add entries to multiple lists
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002318 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:10:Line10"]})
2319 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:20:Line20"]})
2320 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:15:Line15"]})
2321 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:25:Line25"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02002322 call assert_equal('Line15', g:Xgetlist({'nr':1, 'items':1}).items[1].text)
2323 call assert_equal('Line25', g:Xgetlist({'nr':2, 'items':1}).items[1].text)
Bram Moolenaar36538222017-09-02 19:51:44 +02002324
2325 " Adding entries using a custom efm
2326 set efm&
2327 call g:Xsetlist([], ' ', {'efm' : '%f#%l#%m',
2328 \ 'lines' : ["F1#10#L10", "F2#20#L20"]})
2329 call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
2330 call g:Xsetlist([], 'a', {'efm' : '%f#%l#%m', 'lines' : ["F3:30:L30"]})
2331 call assert_equal('F3:30:L30', g:Xgetlist({'items':1}).items[2].text)
2332 call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
2333 call assert_equal(-1, g:Xsetlist([], 'a', {'efm' : [],
2334 \ 'lines' : ['F1:10:L10']}))
Bram Moolenaarae338332017-08-11 20:25:26 +02002335endfunc
2336
2337func Test_setexpr()
2338 call Xsetexpr_tests('c')
2339 call Xsetexpr_tests('l')
2340endfunc
2341
2342" Tests for per quickfix/location list directory stack
2343func Xmultidirstack_tests(cchar)
2344 call s:setup_commands(a:cchar)
2345
2346 call g:Xsetlist([], 'f')
2347 Xexpr "" | Xexpr ""
2348
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002349 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["Entering dir 'Xone/a'"]})
2350 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["Entering dir 'Xtwo/a'"]})
2351 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["one.txt:3:one one one"]})
2352 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["two.txt:5:two two two"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02002353
2354 let l1 = g:Xgetlist({'nr':1, 'items':1})
2355 let l2 = g:Xgetlist({'nr':2, 'items':1})
2356 call assert_equal('Xone/a/one.txt', bufname(l1.items[1].bufnr))
2357 call assert_equal(3, l1.items[1].lnum)
2358 call assert_equal('Xtwo/a/two.txt', bufname(l2.items[1].bufnr))
2359 call assert_equal(5, l2.items[1].lnum)
2360endfunc
2361
2362func Test_multidirstack()
2363 call mkdir('Xone/a', 'p')
2364 call mkdir('Xtwo/a', 'p')
2365 let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
2366 call writefile(lines, 'Xone/a/one.txt')
2367 call writefile(lines, 'Xtwo/a/two.txt')
2368 let save_efm = &efm
2369 set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
2370
2371 call Xmultidirstack_tests('c')
2372 call Xmultidirstack_tests('l')
2373
2374 let &efm = save_efm
2375 call delete('Xone', 'rf')
2376 call delete('Xtwo', 'rf')
2377endfunc
2378
2379" Tests for per quickfix/location list file stack
2380func Xmultifilestack_tests(cchar)
2381 call s:setup_commands(a:cchar)
2382
2383 call g:Xsetlist([], 'f')
2384 Xexpr "" | Xexpr ""
2385
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002386 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["[one.txt]"]})
2387 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["[two.txt]"]})
2388 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["(3,5) one one one"]})
2389 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["(5,9) two two two"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02002390
2391 let l1 = g:Xgetlist({'nr':1, 'items':1})
2392 let l2 = g:Xgetlist({'nr':2, 'items':1})
2393 call assert_equal('one.txt', bufname(l1.items[1].bufnr))
2394 call assert_equal(3, l1.items[1].lnum)
2395 call assert_equal('two.txt', bufname(l2.items[1].bufnr))
2396 call assert_equal(5, l2.items[1].lnum)
2397endfunc
2398
2399func Test_multifilestack()
2400 let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
2401 call writefile(lines, 'one.txt')
2402 call writefile(lines, 'two.txt')
2403 let save_efm = &efm
2404 set efm=%+P[%f],(%l\\,%c)\ %m,%-Q
2405
2406 call Xmultifilestack_tests('c')
2407 call Xmultifilestack_tests('l')
2408
2409 let &efm = save_efm
2410 call delete('one.txt')
2411 call delete('two.txt')
2412endfunc
2413
2414" Tests for per buffer 'efm' setting
2415func Test_perbuf_efm()
2416 call writefile(["File1-10-Line10"], 'one.txt')
2417 call writefile(["File2#20#Line20"], 'two.txt')
2418 set efm=%f#%l#%m
2419 new | only
2420 new
2421 setlocal efm=%f-%l-%m
2422 cfile one.txt
2423 wincmd w
2424 caddfile two.txt
2425
2426 let l = getqflist()
2427 call assert_equal(10, l[0].lnum)
2428 call assert_equal('Line20', l[1].text)
2429
2430 set efm&
2431 new | only
2432 call delete('one.txt')
2433 call delete('two.txt')
Bram Moolenaara8788f42017-07-19 17:06:20 +02002434endfunc
Bram Moolenaard28cc3f2017-07-27 22:03:50 +02002435
2436" Open multiple help windows using ":lhelpgrep
2437" This test used to crash Vim
2438func Test_Multi_LL_Help()
2439 new | only
2440 lhelpgrep window
2441 lopen
2442 e#
2443 lhelpgrep buffer
2444 call assert_equal(3, winnr('$'))
2445 call assert_true(len(getloclist(1)) != 0)
2446 call assert_true(len(getloclist(2)) != 0)
2447 new | only
2448endfunc
Bram Moolenaar55b69262017-08-13 13:42:01 +02002449
2450" Tests for adding new quickfix lists using setqflist()
2451func XaddQf_tests(cchar)
2452 call s:setup_commands(a:cchar)
2453
2454 " Create a new list using ' ' for action
2455 call g:Xsetlist([], 'f')
2456 call g:Xsetlist([], ' ', {'title' : 'Test1'})
2457 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
2458 call assert_equal(1, l.nr)
2459 call assert_equal('Test1', l.title)
2460
2461 " Create a new list using ' ' for action and '$' for 'nr'
2462 call g:Xsetlist([], 'f')
2463 call g:Xsetlist([], ' ', {'title' : 'Test2', 'nr' : '$'})
2464 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
2465 call assert_equal(1, l.nr)
2466 call assert_equal('Test2', l.title)
2467
2468 " Create a new list using 'a' for action
2469 call g:Xsetlist([], 'f')
2470 call g:Xsetlist([], 'a', {'title' : 'Test3'})
2471 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
2472 call assert_equal(1, l.nr)
2473 call assert_equal('Test3', l.title)
2474
2475 " Create a new list using 'a' for action and '$' for 'nr'
2476 call g:Xsetlist([], 'f')
2477 call g:Xsetlist([], 'a', {'title' : 'Test3', 'nr' : '$'})
2478 call g:Xsetlist([], 'a', {'title' : 'Test4'})
2479 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
2480 call assert_equal(1, l.nr)
2481 call assert_equal('Test4', l.title)
2482
2483 " Adding a quickfix list should remove all the lists following the current
2484 " list.
2485 Xexpr "" | Xexpr "" | Xexpr ""
2486 silent! 10Xolder
2487 call g:Xsetlist([], ' ', {'title' : 'Test5'})
2488 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
2489 call assert_equal(2, l.nr)
2490 call assert_equal('Test5', l.title)
2491
2492 " Add a quickfix list using '$' as the list number.
2493 let lastqf = g:Xgetlist({'nr':'$'}).nr
2494 silent! 99Xolder
2495 call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test6'})
2496 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
2497 call assert_equal(lastqf + 1, l.nr)
2498 call assert_equal('Test6', l.title)
2499
2500 " Add a quickfix list using 'nr' set to one more than the quickfix
2501 " list size.
2502 let lastqf = g:Xgetlist({'nr':'$'}).nr
2503 silent! 99Xolder
2504 call g:Xsetlist([], ' ', {'nr' : lastqf + 1, 'title' : 'Test7'})
2505 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
2506 call assert_equal(lastqf + 1, l.nr)
2507 call assert_equal('Test7', l.title)
2508
2509 " Add a quickfix list to a stack with 10 lists using 'nr' set to '$'
2510 exe repeat('Xexpr "" |', 9) . 'Xexpr ""'
2511 silent! 99Xolder
2512 call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test8'})
2513 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
2514 call assert_equal(10, l.nr)
2515 call assert_equal('Test8', l.title)
2516
2517 " Add a quickfix list using 'nr' set to a value greater than 10
2518 call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 12, 'title' : 'Test9'}))
2519
2520 " Try adding a quickfix list with 'nr' set to a value greater than the
2521 " quickfix list size but less than 10.
2522 call g:Xsetlist([], 'f')
2523 Xexpr "" | Xexpr "" | Xexpr ""
2524 silent! 99Xolder
2525 call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 8, 'title' : 'Test10'}))
2526
2527 " Add a quickfix list using 'nr' set to a some string or list
2528 call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : [1,2], 'title' : 'Test11'}))
2529endfunc
2530
2531func Test_add_qf()
2532 call XaddQf_tests('c')
2533 call XaddQf_tests('l')
2534endfunc
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02002535
2536" Test for getting the quickfix list items from some text without modifying
2537" the quickfix stack
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002538func XgetListFromLines(cchar)
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02002539 call s:setup_commands(a:cchar)
2540 call g:Xsetlist([], 'f')
2541
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002542 let l = g:Xgetlist({'lines' : ["File2:20:Line20", "File2:30:Line30"]}).items
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02002543 call assert_equal(2, len(l))
2544 call assert_equal(30, l[1].lnum)
2545
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002546 call assert_equal({}, g:Xgetlist({'lines' : 10}))
2547 call assert_equal({}, g:Xgetlist({'lines' : 'File1:10:Line10'}))
2548 call assert_equal([], g:Xgetlist({'lines' : []}).items)
2549 call assert_equal([], g:Xgetlist({'lines' : [10, 20]}).items)
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02002550
Bram Moolenaar36538222017-09-02 19:51:44 +02002551 " Parse text using a custom efm
2552 set efm&
2553 let l = g:Xgetlist({'lines':['File3#30#Line30'], 'efm' : '%f#%l#%m'}).items
2554 call assert_equal('Line30', l[0].text)
2555 let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : '%f-%l-%m'}).items
2556 call assert_equal('File3:30:Line30', l[0].text)
2557 let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : [1,2]})
2558 call assert_equal({}, l)
2559 call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':'%2'})", 'E376:')
2560 call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':''})", 'E378:')
2561
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02002562 " Make sure that the quickfix stack is not modified
2563 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
2564endfunc
2565
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002566func Test_get_list_from_lines()
2567 call XgetListFromLines('c')
2568 call XgetListFromLines('l')
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02002569endfunc
Bram Moolenaara539f4f2017-08-30 20:33:55 +02002570
2571" Tests for the quickfix list id
2572func Xqfid_tests(cchar)
2573 call s:setup_commands(a:cchar)
2574
2575 call g:Xsetlist([], 'f')
2576 call assert_equal({}, g:Xgetlist({'id':0}))
2577 Xexpr ''
2578 let start_id = g:Xgetlist({'id' : 0}).id
2579 Xexpr '' | Xexpr ''
2580 Xolder
2581 call assert_equal(start_id, g:Xgetlist({'id':0, 'nr':1}).id)
2582 call assert_equal(start_id + 1, g:Xgetlist({'id':0, 'nr':0}).id)
2583 call assert_equal(start_id + 2, g:Xgetlist({'id':0, 'nr':'$'}).id)
2584 call assert_equal({}, g:Xgetlist({'id':0, 'nr':99}))
2585 call assert_equal(2, g:Xgetlist({'id':start_id + 1, 'nr':0}).nr)
2586 call assert_equal({}, g:Xgetlist({'id':99, 'nr':0}))
2587 call assert_equal({}, g:Xgetlist({'id':"abc", 'nr':0}))
2588
2589 call g:Xsetlist([], 'a', {'id':start_id, 'context':[1,2]})
2590 call assert_equal([1,2], g:Xgetlist({'nr':1, 'context':1}).context)
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002591 call g:Xsetlist([], 'a', {'id':start_id+1, 'lines':['F1:10:L10']})
Bram Moolenaara539f4f2017-08-30 20:33:55 +02002592 call assert_equal('L10', g:Xgetlist({'nr':2, 'items':1}).items[0].text)
2593 call assert_equal(-1, g:Xsetlist([], 'a', {'id':999, 'title':'Vim'}))
2594 call assert_equal(-1, g:Xsetlist([], 'a', {'id':'abc', 'title':'Vim'}))
2595
2596 let qfid = g:Xgetlist({'id':0, 'nr':0})
2597 call g:Xsetlist([], 'f')
2598 call assert_equal({}, g:Xgetlist({'id':qfid, 'nr':0}))
2599endfunc
2600
2601func Test_qf_id()
2602 call Xqfid_tests('c')
2603 call Xqfid_tests('l')
2604endfunc