blob: f12f4f21a7d69bb597db4b64db0b838620575f39 [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>
Bram Moolenaar74240d32017-12-10 15:26:15 +010031 command! -nargs=* -bang -range Xnfile <mods><count>cnfile<bang> <args>
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +020032 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 Moolenaar74240d32017-12-10 15:26:15 +010039 command! -nargs=0 -count Xcc <count>cc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020040 let g:Xgetlist = function('getqflist')
41 let g:Xsetlist = function('setqflist')
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +020042 call setqflist([], 'f')
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020043 else
44 command! -nargs=* -bang Xlist <mods>llist<bang> <args>
45 command! -nargs=* Xgetexpr <mods>lgetexpr <args>
Bram Moolenaar361c8f02016-07-02 15:41:47 +020046 command! -nargs=* Xaddexpr <mods>laddexpr <args>
Bram Moolenaar55b69262017-08-13 13:42:01 +020047 command! -nargs=* -count Xolder <mods><count>lolder <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020048 command! -nargs=* Xnewer <mods>lnewer <args>
49 command! -nargs=* Xopen <mods>lopen <args>
50 command! -nargs=* Xwindow <mods>lwindow <args>
Bram Moolenaar537ef082016-07-09 17:56:19 +020051 command! -nargs=* Xbottom <mods>lbottom <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020052 command! -nargs=* Xclose <mods>lclose <args>
53 command! -nargs=* -bang Xfile <mods>lfile<bang> <args>
54 command! -nargs=* Xgetfile <mods>lgetfile <args>
55 command! -nargs=* Xaddfile <mods>laddfile <args>
56 command! -nargs=* -bang Xbuffer <mods>lbuffer<bang> <args>
57 command! -nargs=* Xgetbuffer <mods>lgetbuffer <args>
58 command! -nargs=* Xaddbuffer <mods>laddbuffer <args>
59 command! -nargs=* Xrewind <mods>lrewind <args>
Bram Moolenaar99895ea2017-04-20 22:44:47 +020060 command! -count -nargs=* -bang Xnext <mods><count>lnext<bang> <args>
61 command! -count -nargs=* -bang Xprev <mods><count>lprev<bang> <args>
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +020062 command! -nargs=* -bang Xfirst <mods>lfirst<bang> <args>
63 command! -nargs=* -bang Xlast <mods>llast<bang> <args>
Bram Moolenaar74240d32017-12-10 15:26:15 +010064 command! -nargs=* -bang -range Xnfile <mods><count>lnfile<bang> <args>
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +020065 command! -nargs=* -bang Xpfile <mods>lpfile<bang> <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020066 command! -nargs=* Xexpr <mods>lexpr <args>
Bram Moolenaaree85df32017-03-19 14:19:50 +010067 command! -range -nargs=* Xvimgrep <mods><count>lvimgrep <args>
68 command! -nargs=* Xvimgrepadd <mods>lvimgrepadd <args>
Bram Moolenaar049cba92016-06-26 14:38:04 +020069 command! -nargs=* Xgrep <mods> lgrep <args>
70 command! -nargs=* Xgrepadd <mods> lgrepadd <args>
71 command! -nargs=* Xhelpgrep lhelpgrep <args>
Bram Moolenaar74240d32017-12-10 15:26:15 +010072 command! -nargs=0 -count Xcc <count>ll
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020073 let g:Xgetlist = function('getloclist', [0])
74 let g:Xsetlist = function('setloclist', [0])
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +020075 call setloclist(0, [], 'f')
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020076 endif
Bram Moolenaar2b946c92016-11-12 18:14:44 +010077endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020078
Bram Moolenaarda59dd52016-01-05 21:59:58 +010079" Tests for the :clist and :llist commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +010080func XlistTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020081 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +010082
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +020083 if a:cchar == 'l'
84 call assert_fails('llist', 'E776:')
85 endif
Bram Moolenaarda59dd52016-01-05 21:59:58 +010086 " With an empty list, command should return error
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020087 Xgetexpr []
88 silent! Xlist
Bram Moolenaarda59dd52016-01-05 21:59:58 +010089 call assert_true(v:errmsg ==# 'E42: No Errors')
90
91 " Populate the list and then try
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020092 Xgetexpr ['non-error 1', 'Xtestfile1:1:3:Line1',
Bram Moolenaarda59dd52016-01-05 21:59:58 +010093 \ 'non-error 2', 'Xtestfile2:2:2:Line2',
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020094 \ 'non-error 3', 'Xtestfile3:3:1:Line3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +010095
96 " List only valid entries
Bram Moolenaaree85df32017-03-19 14:19:50 +010097 let l = split(execute('Xlist', ''), "\n")
Bram Moolenaarda59dd52016-01-05 21:59:58 +010098 call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
99 \ ' 4 Xtestfile2:2 col 2: Line2',
100 \ ' 6 Xtestfile3:3 col 1: Line3'], l)
101
102 " List all the entries
Bram Moolenaaree85df32017-03-19 14:19:50 +0100103 let l = split(execute('Xlist!', ''), "\n")
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100104 call assert_equal([' 1: non-error 1', ' 2 Xtestfile1:1 col 3: Line1',
105 \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2',
106 \ ' 5: non-error 3', ' 6 Xtestfile3:3 col 1: Line3'], l)
107
108 " List a range of errors
Bram Moolenaaree85df32017-03-19 14:19:50 +0100109 let l = split(execute('Xlist 3,6', ''), "\n")
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100110 call assert_equal([' 4 Xtestfile2:2 col 2: Line2',
111 \ ' 6 Xtestfile3:3 col 1: Line3'], l)
112
Bram Moolenaaree85df32017-03-19 14:19:50 +0100113 let l = split(execute('Xlist! 3,4', ''), "\n")
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100114 call assert_equal([' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
115
Bram Moolenaaree85df32017-03-19 14:19:50 +0100116 let l = split(execute('Xlist -6,-4', ''), "\n")
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100117 call assert_equal([' 2 Xtestfile1:1 col 3: Line1'], l)
118
Bram Moolenaaree85df32017-03-19 14:19:50 +0100119 let l = split(execute('Xlist! -5,-3', ''), "\n")
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100120 call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
121 \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
Bram Moolenaar391b1dd2017-03-04 13:47:11 +0100122
123 " Test for '+'
Bram Moolenaaree85df32017-03-19 14:19:50 +0100124 let l = split(execute('Xlist! +2', ''), "\n")
Bram Moolenaar391b1dd2017-03-04 13:47:11 +0100125 call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
126 \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
Bram Moolenaaree85df32017-03-19 14:19:50 +0100127
128 " Different types of errors
129 call g:Xsetlist([{'lnum':10,'col':5,'type':'W', 'text':'Warning','nr':11},
130 \ {'lnum':20,'col':10,'type':'e','text':'Error','nr':22},
131 \ {'lnum':30,'col':15,'type':'i','text':'Info','nr':33},
132 \ {'lnum':40,'col':20,'type':'x', 'text':'Other','nr':44},
133 \ {'lnum':50,'col':25,'type':"\<C-A>",'text':'one','nr':55}])
134 let l = split(execute('Xlist', ""), "\n")
135 call assert_equal([' 1:10 col 5 warning 11: Warning',
136 \ ' 2:20 col 10 error 22: Error',
137 \ ' 3:30 col 15 info 33: Info',
138 \ ' 4:40 col 20 x 44: Other',
139 \ ' 5:50 col 25 55: one'], l)
140
141 " Error cases
142 call assert_fails('Xlist abc', 'E488:')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100143endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100144
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100145func Test_clist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100146 call XlistTests('c')
147 call XlistTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100148endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100149
150" Tests for the :colder, :cnewer, :lolder and :lnewer commands
151" Note that this test assumes that a quickfix/location list is
Bram Moolenaarcfc0a352016-01-09 20:23:00 +0100152" already set by the caller.
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100153func XageTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200154 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100155
Bram Moolenaarcf1ba352017-10-27 00:55:04 +0200156 let list = [{'bufnr': bufnr('%'), 'lnum': 1}]
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +0200157 call g:Xsetlist(list)
158
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100159 " Jumping to a non existent list should return error
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200160 silent! Xolder 99
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100161 call assert_true(v:errmsg ==# 'E380: At bottom of quickfix stack')
162
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200163 silent! Xnewer 99
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100164 call assert_true(v:errmsg ==# 'E381: At top of quickfix stack')
165
166 " Add three quickfix/location lists
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200167 Xgetexpr ['Xtestfile1:1:3:Line1']
168 Xgetexpr ['Xtestfile2:2:2:Line2']
169 Xgetexpr ['Xtestfile3:3:1:Line3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100170
171 " Go back two lists
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200172 Xolder
173 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100174 call assert_equal('Line2', l[0].text)
175
176 " Go forward two lists
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200177 Xnewer
178 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100179 call assert_equal('Line3', l[0].text)
180
181 " Test for the optional count argument
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200182 Xolder 2
183 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100184 call assert_equal('Line1', l[0].text)
185
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200186 Xnewer 2
187 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100188 call assert_equal('Line3', l[0].text)
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100189endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100190
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100191func Test_cage()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100192 call XageTests('c')
193 call XageTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100194endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100195
196" Tests for the :cwindow, :lwindow :cclose, :lclose, :copen and :lopen
197" commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100198func XwindowTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200199 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100200
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +0200201 " Opening the location list window without any errors should fail
202 if a:cchar == 'l'
203 call assert_fails('lopen', 'E776:')
204 endif
205
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100206 " Create a list with no valid entries
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200207 Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100208
209 " Quickfix/Location window should not open with no valid errors
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200210 Xwindow
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100211 call assert_true(winnr('$') == 1)
212
213 " Create a list with valid entries
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200214 Xgetexpr ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2',
215 \ 'Xtestfile3:3:1:Line3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100216
217 " Open the window
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200218 Xwindow
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100219 call assert_true(winnr('$') == 2 && winnr() == 2 &&
220 \ getline('.') ==# 'Xtestfile1|1 col 3| Line1')
Bram Moolenaar537ef082016-07-09 17:56:19 +0200221 redraw!
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100222
223 " Close the window
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200224 Xclose
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100225 call assert_true(winnr('$') == 1)
226
227 " Create a list with no valid entries
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200228 Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100229
230 " Open the window
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200231 Xopen 5
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100232 call assert_true(winnr('$') == 2 && getline('.') ==# '|| non-error 1'
233 \ && winheight('.') == 5)
234
235 " Opening the window again, should move the cursor to that window
236 wincmd t
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200237 Xopen 7
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100238 call assert_true(winnr('$') == 2 && winnr() == 2 &&
239 \ winheight('.') == 7 &&
240 \ getline('.') ==# '|| non-error 1')
241
242
243 " Calling cwindow should close the quickfix window with no valid errors
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200244 Xwindow
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100245 call assert_true(winnr('$') == 1)
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +0200246
247 if a:cchar == 'c'
248 " Opening the quickfix window in multiple tab pages should reuse the
249 " quickfix buffer
250 Xgetexpr ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2',
251 \ 'Xtestfile3:3:1:Line3']
252 Xopen
253 let qfbufnum = bufnr('%')
254 tabnew
255 Xopen
256 call assert_equal(qfbufnum, bufnr('%'))
257 new | only | tabonly
258 endif
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100259endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100260
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100261func Test_cwindow()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100262 call XwindowTests('c')
263 call XwindowTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100264endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100265
266" Tests for the :cfile, :lfile, :caddfile, :laddfile, :cgetfile and :lgetfile
267" commands.
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100268func XfileTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200269 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100270
271 call writefile(['Xtestfile1:700:10:Line 700',
272 \ 'Xtestfile2:800:15:Line 800'], 'Xqftestfile1')
273
274 enew!
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200275 Xfile Xqftestfile1
276 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100277 call assert_true(len(l) == 2 &&
278 \ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
279 \ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
280
Bram Moolenaar049cba92016-06-26 14:38:04 +0200281 " Test with a non existent file
282 call assert_fails('Xfile non_existent_file', 'E40')
283
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100284 " Run cfile/lfile from a modified buffer
285 enew!
286 silent! put ='Quickfix'
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200287 silent! Xfile Xqftestfile1
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100288 call assert_true(v:errmsg ==# 'E37: No write since last change (add ! to override)')
289
290 call writefile(['Xtestfile3:900:30:Line 900'], 'Xqftestfile1')
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200291 Xaddfile Xqftestfile1
292 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100293 call assert_true(len(l) == 3 &&
294 \ l[2].lnum == 900 && l[2].col == 30 && l[2].text ==# 'Line 900')
295
296 call writefile(['Xtestfile1:222:77:Line 222',
297 \ 'Xtestfile2:333:88:Line 333'], 'Xqftestfile1')
298
299 enew!
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200300 Xgetfile Xqftestfile1
301 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100302 call assert_true(len(l) == 2 &&
303 \ l[0].lnum == 222 && l[0].col == 77 && l[0].text ==# 'Line 222' &&
304 \ l[1].lnum == 333 && l[1].col == 88 && l[1].text ==# 'Line 333')
305
306 call delete('Xqftestfile1')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100307endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100308
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100309func Test_cfile()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100310 call XfileTests('c')
311 call XfileTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100312endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100313
314" Tests for the :cbuffer, :lbuffer, :caddbuffer, :laddbuffer, :cgetbuffer and
315" :lgetbuffer commands.
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100316func XbufferTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200317 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100318
319 enew!
320 silent! call setline(1, ['Xtestfile7:700:10:Line 700',
321 \ 'Xtestfile8:800:15:Line 800'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200322 Xbuffer!
323 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100324 call assert_true(len(l) == 2 &&
325 \ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
326 \ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
327
328 enew!
329 silent! call setline(1, ['Xtestfile9:900:55:Line 900',
330 \ 'Xtestfile10:950:66:Line 950'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200331 Xgetbuffer
332 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100333 call assert_true(len(l) == 2 &&
334 \ l[0].lnum == 900 && l[0].col == 55 && l[0].text ==# 'Line 900' &&
335 \ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950')
336
337 enew!
338 silent! call setline(1, ['Xtestfile11:700:20:Line 700',
339 \ 'Xtestfile12:750:25:Line 750'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200340 Xaddbuffer
341 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100342 call assert_true(len(l) == 4 &&
343 \ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950' &&
344 \ l[2].lnum == 700 && l[2].col == 20 && l[2].text ==# 'Line 700' &&
345 \ l[3].lnum == 750 && l[3].col == 25 && l[3].text ==# 'Line 750')
Bram Moolenaarab47c612016-06-14 22:02:26 +0200346 enew!
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100347
Bram Moolenaaree85df32017-03-19 14:19:50 +0100348 " Check for invalid buffer
349 call assert_fails('Xbuffer 199', 'E474:')
350
351 " Check for unloaded buffer
352 edit Xtestfile1
353 let bnr = bufnr('%')
354 enew!
355 call assert_fails('Xbuffer ' . bnr, 'E681:')
356
357 " Check for invalid range
358 " Using Xbuffer will not run the range check in the cbuffer/lbuffer
359 " commands. So directly call the commands.
360 if (a:cchar == 'c')
361 call assert_fails('900,999cbuffer', 'E16:')
362 else
363 call assert_fails('900,999lbuffer', 'E16:')
364 endif
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100365endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100366
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100367func Test_cbuffer()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100368 call XbufferTests('c')
369 call XbufferTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100370endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100371
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100372func XexprTests(cchar)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200373 call s:setup_commands(a:cchar)
374
375 call assert_fails('Xexpr 10', 'E777:')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100376endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200377
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100378func Test_cexpr()
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200379 call XexprTests('c')
380 call XexprTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100381endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200382
383" Tests for :cnext, :cprev, :cfirst, :clast commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100384func Xtest_browse(cchar)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200385 call s:setup_commands(a:cchar)
386
Bram Moolenaar74240d32017-12-10 15:26:15 +0100387 call g:Xsetlist([], 'f')
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +0200388 " Jumping to first or next location list entry without any error should
389 " result in failure
Bram Moolenaar74240d32017-12-10 15:26:15 +0100390 if a:cchar == 'c'
391 let err = 'E42:'
392 else
393 let err = 'E776:'
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +0200394 endif
Bram Moolenaar74240d32017-12-10 15:26:15 +0100395 call assert_fails('Xnext', err)
396 call assert_fails('Xprev', err)
397 call assert_fails('Xnfile', err)
398 call assert_fails('Xpfile', err)
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +0200399
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200400 call s:create_test_file('Xqftestfile1')
401 call s:create_test_file('Xqftestfile2')
402
403 Xgetexpr ['Xqftestfile1:5:Line5',
404 \ 'Xqftestfile1:6:Line6',
405 \ 'Xqftestfile2:10:Line10',
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200406 \ 'Xqftestfile2:11:Line11',
407 \ 'RegularLine1',
408 \ 'RegularLine2']
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200409
410 Xfirst
411 call assert_fails('Xprev', 'E553')
412 call assert_fails('Xpfile', 'E553')
413 Xnfile
414 call assert_equal('Xqftestfile2', bufname('%'))
415 call assert_equal(10, line('.'))
416 Xpfile
417 call assert_equal('Xqftestfile1', bufname('%'))
418 call assert_equal(6, line('.'))
Bram Moolenaar74240d32017-12-10 15:26:15 +0100419 5Xcc
420 call assert_equal(5, g:Xgetlist({'idx':0}).idx)
421 2Xcc
422 call assert_equal(2, g:Xgetlist({'idx':0}).idx)
423 10Xcc
424 call assert_equal(6, g:Xgetlist({'idx':0}).idx)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200425 Xlast
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200426 Xprev
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200427 call assert_equal('Xqftestfile2', bufname('%'))
428 call assert_equal(11, line('.'))
429 call assert_fails('Xnext', 'E553')
430 call assert_fails('Xnfile', 'E553')
431 Xrewind
432 call assert_equal('Xqftestfile1', bufname('%'))
433 call assert_equal(5, line('.'))
434
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200435 10Xnext
436 call assert_equal('Xqftestfile2', bufname('%'))
437 call assert_equal(11, line('.'))
438 10Xprev
439 call assert_equal('Xqftestfile1', bufname('%'))
440 call assert_equal(5, line('.'))
441
Bram Moolenaar74240d32017-12-10 15:26:15 +0100442 " Jumping to an error from the error window using cc command
443 Xgetexpr ['Xqftestfile1:5:Line5',
444 \ 'Xqftestfile1:6:Line6',
445 \ 'Xqftestfile2:10:Line10',
446 \ 'Xqftestfile2:11:Line11']
447 Xopen
448 10Xcc
449 call assert_equal(11, line('.'))
450 call assert_equal('Xqftestfile2', bufname('%'))
451
452 " Jumping to an error from the error window (when only the error window is
453 " present)
454 Xopen | only
455 Xlast 1
456 call assert_equal(5, line('.'))
457 call assert_equal('Xqftestfile1', bufname('%'))
458
Bram Moolenaaree85df32017-03-19 14:19:50 +0100459 Xexpr ""
460 call assert_fails('Xnext', 'E42:')
461
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200462 call delete('Xqftestfile1')
463 call delete('Xqftestfile2')
Bram Moolenaarfc2b2702017-09-15 22:43:07 +0200464
465 " Should be able to use next/prev with invalid entries
466 Xexpr ""
467 call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
468 call assert_equal(0, g:Xgetlist({'size' : 0}).size)
469 Xaddexpr ['foo', 'bar', 'baz', 'quux', 'shmoo']
470 call assert_equal(5, g:Xgetlist({'size' : 0}).size)
471 Xlast
472 call assert_equal(5, g:Xgetlist({'idx' : 0}).idx)
473 Xfirst
474 call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
475 2Xnext
476 call assert_equal(3, g:Xgetlist({'idx' : 0}).idx)
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100477endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200478
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100479func Test_browse()
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200480 call Xtest_browse('c')
481 call Xtest_browse('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100482endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200483
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100484func Test_nomem()
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200485 call test_alloc_fail(GetAllocId('qf_dirname_start'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100486 call assert_fails('vimgrep vim runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100487
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200488 call test_alloc_fail(GetAllocId('qf_dirname_now'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100489 call assert_fails('vimgrep vim runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100490
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200491 call test_alloc_fail(GetAllocId('qf_namebuf'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100492 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100493
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200494 call test_alloc_fail(GetAllocId('qf_errmsg'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100495 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100496
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200497 call test_alloc_fail(GetAllocId('qf_pattern'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100498 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100499
500endfunc
501
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100502func s:test_xhelpgrep(cchar)
Bram Moolenaar049cba92016-06-26 14:38:04 +0200503 call s:setup_commands(a:cchar)
504 Xhelpgrep quickfix
505 Xopen
506 if a:cchar == 'c'
507 let title_text = ':helpgrep quickfix'
508 else
509 let title_text = ':lhelpgrep quickfix'
510 endif
511 call assert_true(w:quickfix_title =~ title_text, w:quickfix_title)
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200512
513 " Jumping to a help topic should open the help window
514 only
515 Xnext
516 call assert_true(&buftype == 'help')
517 call assert_true(winnr('$') == 2)
518 " Jumping to the next match should reuse the help window
519 Xnext
520 call assert_true(&buftype == 'help')
521 call assert_true(winnr() == 1)
522 call assert_true(winnr('$') == 2)
523 " Jumping to the next match from the quickfix window should reuse the help
524 " window
525 Xopen
526 Xnext
527 call assert_true(&buftype == 'help')
528 call assert_true(winnr() == 1)
529 call assert_true(winnr('$') == 2)
530
Bram Moolenaar62ef7972016-01-19 14:51:54 +0100531 " This wipes out the buffer, make sure that doesn't cause trouble.
Bram Moolenaar049cba92016-06-26 14:38:04 +0200532 Xclose
Bram Moolenaaree85df32017-03-19 14:19:50 +0100533
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +0200534 if a:cchar == 'l'
535 " When a help window is present, running :lhelpgrep should reuse the
536 " help window and not the current window
537 new | only
538 call g:Xsetlist([], 'f')
539 help index.txt
540 wincmd w
541 lhelpgrep quickfix
542 call assert_equal(1, winnr())
543 call assert_notequal([], getloclist(1))
544 call assert_equal([], getloclist(2))
545 endif
546
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200547 new | only
548
Bram Moolenaaree85df32017-03-19 14:19:50 +0100549 " Search for non existing help string
550 call assert_fails('Xhelpgrep a1b2c3', 'E480:')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100551endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +0200552
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100553func Test_helpgrep()
Bram Moolenaar049cba92016-06-26 14:38:04 +0200554 call s:test_xhelpgrep('c')
Bram Moolenaarcf25fdb2016-08-03 21:04:53 +0200555 helpclose
Bram Moolenaar049cba92016-06-26 14:38:04 +0200556 call s:test_xhelpgrep('l')
Bram Moolenaar62ef7972016-01-19 14:51:54 +0100557endfunc
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100558
Bram Moolenaar6920c722016-01-22 22:44:10 +0100559func Test_errortitle()
560 augroup QfBufWinEnter
561 au!
562 au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
563 augroup END
564 copen
565 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'')'}]
566 call setqflist(a)
567 call assert_equal(':setqflist()', g:a)
568 augroup QfBufWinEnter
569 au!
570 augroup END
571 augroup! QfBufWinEnter
572endfunc
Bram Moolenaare27dba42016-03-15 14:11:10 +0100573
Bram Moolenaar5584df62016-03-18 21:00:51 +0100574func Test_vimgreptitle()
575 augroup QfBufWinEnter
576 au!
577 au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
578 augroup END
579 try
580 vimgrep /pattern/j file
581 catch /E480/
582 endtry
583 copen
584 call assert_equal(': vimgrep /pattern/j file', g:a)
585 augroup QfBufWinEnter
586 au!
587 augroup END
588 augroup! QfBufWinEnter
589endfunc
590
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100591func XqfTitleTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200592 call s:setup_commands(a:cchar)
Bram Moolenaare27dba42016-03-15 14:11:10 +0100593
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200594 Xgetexpr ['file:1:1:message']
595 let l = g:Xgetlist()
Bram Moolenaare27dba42016-03-15 14:11:10 +0100596 if a:cchar == 'c'
597 call setqflist(l, 'r')
598 else
599 call setloclist(0, l, 'r')
600 endif
601
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200602 Xopen
Bram Moolenaare27dba42016-03-15 14:11:10 +0100603 if a:cchar == 'c'
604 let title = ':setqflist()'
605 else
606 let title = ':setloclist()'
607 endif
608 call assert_equal(title, w:quickfix_title)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200609 Xclose
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100610endfunc
Bram Moolenaare27dba42016-03-15 14:11:10 +0100611
612" Tests for quickfix window's title
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100613func Test_qf_title()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200614 call XqfTitleTests('c')
615 call XqfTitleTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100616endfunc
Bram Moolenaare27dba42016-03-15 14:11:10 +0100617
618" Tests for 'errorformat'
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100619func Test_efm()
Bram Moolenaare27dba42016-03-15 14:11:10 +0100620 let save_efm = &efm
621 set efm=%EEEE%m,%WWWW%m,%+CCCC%.%#,%-GGGG%.%#
622 cgetexpr ['WWWW', 'EEEE', 'CCCC']
623 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
624 call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
625 cgetexpr ['WWWW', 'GGGG', 'EEEE', 'CCCC']
626 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
627 call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
628 cgetexpr ['WWWW', 'GGGG', 'ZZZZ', 'EEEE', 'CCCC', 'YYYY']
629 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
630 call assert_equal("[['W', 1], ['ZZZZ', 0], ['E^@CCCC', 1], ['YYYY', 0]]", l)
631 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100632endfunc
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100633
634" This will test for problems in quickfix:
635" A. incorrectly copying location lists which caused the location list to show
636" a different name than the file that was actually being displayed.
637" B. not reusing the window for which the location list window is opened but
638" instead creating new windows.
639" C. make sure that the location list window is not reused instead of the
640" window it belongs to.
641"
642" Set up the test environment:
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100643func ReadTestProtocol(name)
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100644 let base = substitute(a:name, '\v^test://(.*)%(\.[^.]+)?', '\1', '')
645 let word = substitute(base, '\v(.*)\..*', '\1', '')
646
647 setl modifiable
648 setl noreadonly
649 setl noswapfile
650 setl bufhidden=delete
651 %del _
652 " For problem 2:
653 " 'buftype' has to be set to reproduce the constant opening of new windows
654 setl buftype=nofile
655
656 call setline(1, word)
657
658 setl nomodified
659 setl nomodifiable
660 setl readonly
661 exe 'doautocmd BufRead ' . substitute(a:name, '\v^test://(.*)', '\1', '')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100662endfunc
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100663
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100664func Test_locationlist()
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100665 enew
666
667 augroup testgroup
668 au!
669 autocmd BufReadCmd test://* call ReadTestProtocol(expand("<amatch>"))
670 augroup END
671
672 let words = [ "foo", "bar", "baz", "quux", "shmoo", "spam", "eggs" ]
673
674 let qflist = []
675 for word in words
676 call add(qflist, {'filename': 'test://' . word . '.txt', 'text': 'file ' . word . '.txt', })
677 " NOTE: problem 1:
678 " intentionally not setting 'lnum' so that the quickfix entries are not
679 " valid
680 call setloclist(0, qflist, ' ')
681 endfor
682
683 " Test A
684 lrewind
685 enew
686 lopen
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200687 4lnext
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100688 vert split
689 wincmd L
690 lopen
691 wincmd p
692 lnext
693 let fileName = expand("%")
694 wincmd p
695 let locationListFileName = substitute(getline(line('.')), '\([^|]*\)|.*', '\1', '')
696 let fileName = substitute(fileName, '\\', '/', 'g')
697 let locationListFileName = substitute(locationListFileName, '\\', '/', 'g')
698 call assert_equal("test://bar.txt", fileName)
699 call assert_equal("test://bar.txt", locationListFileName)
700
701 wincmd n | only
702
703 " Test B:
704 lrewind
705 lopen
706 2
707 exe "normal \<CR>"
708 wincmd p
709 3
710 exe "normal \<CR>"
711 wincmd p
712 4
713 exe "normal \<CR>"
714 call assert_equal(2, winnr('$'))
715 wincmd n | only
716
717 " Test C:
718 lrewind
719 lopen
720 " Let's move the location list window to the top to check whether it (the
721 " first window found) will be reused when we try to open new windows:
722 wincmd K
723 2
724 exe "normal \<CR>"
725 wincmd p
726 3
727 exe "normal \<CR>"
728 wincmd p
729 4
730 exe "normal \<CR>"
731 1wincmd w
732 call assert_equal('quickfix', &buftype)
733 2wincmd w
734 let bufferName = expand("%")
735 let bufferName = substitute(bufferName, '\\', '/', 'g')
736 call assert_equal('test://quux.txt', bufferName)
737
738 wincmd n | only
739
740 augroup! testgroup
Bram Moolenaaree85df32017-03-19 14:19:50 +0100741endfunc
Bram Moolenaar0899d692016-03-19 13:35:03 +0100742
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100743func Test_locationlist_curwin_was_closed()
Bram Moolenaar0899d692016-03-19 13:35:03 +0100744 augroup testgroup
745 au!
Bram Moolenaard106e5b2016-04-21 19:38:07 +0200746 autocmd BufReadCmd test_curwin.txt call R(expand("<amatch>"))
Bram Moolenaar0899d692016-03-19 13:35:03 +0100747 augroup END
748
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100749 func! R(n)
Bram Moolenaar0899d692016-03-19 13:35:03 +0100750 quit
751 endfunc
752
753 new
754 let q = []
Bram Moolenaard106e5b2016-04-21 19:38:07 +0200755 call add(q, {'filename': 'test_curwin.txt' })
Bram Moolenaar0899d692016-03-19 13:35:03 +0100756 call setloclist(0, q)
757 call assert_fails('lrewind', 'E924:')
758
759 augroup! testgroup
Bram Moolenaaree85df32017-03-19 14:19:50 +0100760endfunc
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100761
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100762func Test_locationlist_cross_tab_jump()
Bram Moolenaar0a9046f2016-10-15 19:28:13 +0200763 call writefile(['loclistfoo'], 'loclistfoo')
764 call writefile(['loclistbar'], 'loclistbar')
765 set switchbuf=usetab
766
767 edit loclistfoo
768 tabedit loclistbar
769 silent lgrep loclistfoo loclist*
770 call assert_equal(1, tabpagenr())
771
772 enew | only | tabonly
773 set switchbuf&vim
774 call delete('loclistfoo')
775 call delete('loclistbar')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100776endfunc
Bram Moolenaar0a9046f2016-10-15 19:28:13 +0200777
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100778" More tests for 'errorformat'
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100779func Test_efm1()
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100780 if !has('unix')
781 " The 'errorformat' setting is different on non-Unix systems.
782 " This test works only on Unix-like systems.
783 return
784 endif
785
786 let l = [
787 \ '"Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set.',
788 \ '"Xtestfile", line 6 col 19; this is an error',
789 \ 'gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include version.c',
790 \ 'Xtestfile:9: parse error before `asd''',
791 \ 'make: *** [vim] Error 1',
792 \ 'in file "Xtestfile" linenr 10: there is an error',
793 \ '',
794 \ '2 returned',
795 \ '"Xtestfile", line 11 col 1; this is an error',
796 \ '"Xtestfile", line 12 col 2; this is another error',
797 \ '"Xtestfile", line 14:10; this is an error in column 10',
798 \ '=Xtestfile=, line 15:10; this is another error, but in vcol 10 this time',
799 \ '"Xtestfile", linenr 16: yet another problem',
800 \ 'Error in "Xtestfile" at line 17:',
801 \ 'x should be a dot',
802 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17',
803 \ ' ^',
804 \ 'Error in "Xtestfile" at line 18:',
805 \ 'x should be a dot',
806 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18',
807 \ '.............^',
808 \ 'Error in "Xtestfile" at line 19:',
809 \ 'x should be a dot',
810 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19',
811 \ '--------------^',
812 \ 'Error in "Xtestfile" at line 20:',
813 \ 'x should be a dot',
814 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20',
815 \ ' ^',
816 \ '',
817 \ 'Does anyone know what is the problem and how to correction it?',
818 \ '"Xtestfile", line 21 col 9: What is the title of the quickfix window?',
819 \ '"Xtestfile", line 22 col 9: What is the title of the quickfix window?'
820 \ ]
821
822 call writefile(l, 'Xerrorfile1')
823 call writefile(l[:-2], 'Xerrorfile2')
824
825 let m = [
826 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 2',
827 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 3',
828 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 4',
829 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 5',
830 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 6',
831 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 7',
832 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 8',
833 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 9',
834 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 10',
835 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 11',
836 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 12',
837 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 13',
838 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 14',
839 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 15',
840 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 16',
841 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17',
842 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18',
843 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19',
844 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20',
845 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 21',
846 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 22'
847 \ ]
848 call writefile(m, 'Xtestfile')
849
850 let save_efm = &efm
851 set efm+==%f=\\,\ line\ %l%*\\D%v%*[^\ ]\ %m
852 set efm^=%AError\ in\ \"%f\"\ at\ line\ %l:,%Z%p^,%C%m
853
854 exe 'cf Xerrorfile2'
855 clast
856 copen
857 call assert_equal(':cf Xerrorfile2', w:quickfix_title)
858 wincmd p
859
860 exe 'cf Xerrorfile1'
861 call assert_equal([4, 12], [line('.'), col('.')])
862 cn
863 call assert_equal([6, 19], [line('.'), col('.')])
864 cn
865 call assert_equal([9, 2], [line('.'), col('.')])
866 cn
867 call assert_equal([10, 2], [line('.'), col('.')])
868 cn
869 call assert_equal([11, 1], [line('.'), col('.')])
870 cn
871 call assert_equal([12, 2], [line('.'), col('.')])
872 cn
873 call assert_equal([14, 10], [line('.'), col('.')])
874 cn
875 call assert_equal([15, 3, 10], [line('.'), col('.'), virtcol('.')])
876 cn
877 call assert_equal([16, 2], [line('.'), col('.')])
878 cn
879 call assert_equal([17, 6], [line('.'), col('.')])
880 cn
881 call assert_equal([18, 7], [line('.'), col('.')])
882 cn
883 call assert_equal([19, 8], [line('.'), col('.')])
884 cn
885 call assert_equal([20, 9], [line('.'), col('.')])
886 clast
887 cprev
888 cprev
889 wincmd w
890 call assert_equal(':cf Xerrorfile1', w:quickfix_title)
891 wincmd p
892
893 let &efm = save_efm
894 call delete('Xerrorfile1')
895 call delete('Xerrorfile2')
896 call delete('Xtestfile')
Bram Moolenaaree85df32017-03-19 14:19:50 +0100897endfunc
Bram Moolenaarffec3c52016-03-23 20:55:42 +0100898
Bram Moolenaarab47c612016-06-14 22:02:26 +0200899" Test for quickfix directory stack support
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100900func s:dir_stack_tests(cchar)
Bram Moolenaar38df43b2016-06-20 21:41:12 +0200901 call s:setup_commands(a:cchar)
902
Bram Moolenaarab47c612016-06-14 22:02:26 +0200903 let save_efm=&efm
904 set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
905
Bram Moolenaar361c8f02016-07-02 15:41:47 +0200906 let lines = ["Entering dir 'dir1/a'",
907 \ 'habits2.txt:1:Nine Healthy Habits',
908 \ "Entering dir 'b'",
909 \ 'habits3.txt:2:0 Hours of television',
910 \ 'habits2.txt:7:5 Small meals',
911 \ "Entering dir 'dir1/c'",
912 \ 'habits4.txt:3:1 Hour of exercise',
913 \ "Leaving dir 'dir1/c'",
914 \ "Leaving dir 'dir1/a'",
915 \ 'habits1.txt:4:2 Liters of water',
916 \ "Entering dir 'dir2'",
917 \ 'habits5.txt:5:3 Cups of hot green tea',
918 \ "Leaving dir 'dir2'"
919 \]
Bram Moolenaarab47c612016-06-14 22:02:26 +0200920
Bram Moolenaar361c8f02016-07-02 15:41:47 +0200921 Xexpr ""
922 for l in lines
923 Xaddexpr l
924 endfor
Bram Moolenaarab47c612016-06-14 22:02:26 +0200925
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200926 let qf = g:Xgetlist()
Bram Moolenaarab47c612016-06-14 22:02:26 +0200927
928 call assert_equal('dir1/a/habits2.txt', bufname(qf[1].bufnr))
929 call assert_equal(1, qf[1].lnum)
930 call assert_equal('dir1/a/b/habits3.txt', bufname(qf[3].bufnr))
931 call assert_equal(2, qf[3].lnum)
932 call assert_equal('dir1/a/habits2.txt', bufname(qf[4].bufnr))
933 call assert_equal(7, qf[4].lnum)
934 call assert_equal('dir1/c/habits4.txt', bufname(qf[6].bufnr))
935 call assert_equal(3, qf[6].lnum)
936 call assert_equal('habits1.txt', bufname(qf[9].bufnr))
937 call assert_equal(4, qf[9].lnum)
938 call assert_equal('dir2/habits5.txt', bufname(qf[11].bufnr))
939 call assert_equal(5, qf[11].lnum)
940
941 let &efm=save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100942endfunc
Bram Moolenaarab47c612016-06-14 22:02:26 +0200943
944" Tests for %D and %X errorformat options
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100945func Test_efm_dirstack()
Bram Moolenaarab47c612016-06-14 22:02:26 +0200946 " Create the directory stack and files
947 call mkdir('dir1')
948 call mkdir('dir1/a')
949 call mkdir('dir1/a/b')
950 call mkdir('dir1/c')
951 call mkdir('dir2')
952
953 let lines = ["Nine Healthy Habits",
954 \ "0 Hours of television",
955 \ "1 Hour of exercise",
956 \ "2 Liters of water",
957 \ "3 Cups of hot green tea",
958 \ "4 Short mental breaks",
959 \ "5 Small meals",
960 \ "6 AM wake up time",
961 \ "7 Minutes of laughter",
962 \ "8 Hours of sleep (at least)",
963 \ "9 PM end of the day and off to bed"
964 \ ]
965 call writefile(lines, 'habits1.txt')
966 call writefile(lines, 'dir1/a/habits2.txt')
967 call writefile(lines, 'dir1/a/b/habits3.txt')
968 call writefile(lines, 'dir1/c/habits4.txt')
969 call writefile(lines, 'dir2/habits5.txt')
970
971 call s:dir_stack_tests('c')
972 call s:dir_stack_tests('l')
973
974 call delete('dir1', 'rf')
975 call delete('dir2', 'rf')
976 call delete('habits1.txt')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100977endfunc
Bram Moolenaarab47c612016-06-14 22:02:26 +0200978
Bram Moolenaar9b457942016-10-09 16:10:05 +0200979" Test for resync after continuing an ignored message
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100980func Xefm_ignore_continuations(cchar)
Bram Moolenaar9b457942016-10-09 16:10:05 +0200981 call s:setup_commands(a:cchar)
982
983 let save_efm = &efm
984
985 let &efm =
986 \ '%Eerror %m %l,' .
987 \ '%-Wignored %m %l,' .
988 \ '%+Cmore ignored %m %l,' .
989 \ '%Zignored end'
990 Xgetexpr ['ignored warning 1', 'more ignored continuation 2', 'ignored end', 'error resync 4']
991 let l = map(g:Xgetlist(), '[v:val.text, v:val.valid, v:val.lnum, v:val.type]')
992 call assert_equal([['resync', 1, 4, 'E']], l)
993
994 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100995endfunc
Bram Moolenaar9b457942016-10-09 16:10:05 +0200996
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100997func Test_efm_ignore_continuations()
Bram Moolenaar9b457942016-10-09 16:10:05 +0200998 call Xefm_ignore_continuations('c')
999 call Xefm_ignore_continuations('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001000endfunc
Bram Moolenaar9b457942016-10-09 16:10:05 +02001001
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001002" Tests for invalid error format specifies
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001003func Xinvalid_efm_Tests(cchar)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001004 call s:setup_commands(a:cchar)
1005
Bram Moolenaar049cba92016-06-26 14:38:04 +02001006 let save_efm = &efm
1007
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001008 set efm=%f:%l:%m,%f:%f:%l:%m
1009 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E372:')
1010
1011 set efm=%f:%l:%m,%f:%l:%r:%m
1012 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
1013
1014 set efm=%f:%l:%m,%O:%f:%l:%m
1015 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
1016
1017 set efm=%f:%l:%m,%f:%l:%*[^a-z
1018 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E374:')
1019
1020 set efm=%f:%l:%m,%f:%l:%*c
1021 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E375:')
1022
1023 set efm=%f:%l:%m,%L%M%N
1024 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E376:')
1025
1026 set efm=%f:%l:%m,%f:%l:%m:%R
1027 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E377:')
1028
1029 set efm=
1030 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E378:')
1031
1032 set efm=%DEntering\ dir\ abc,%f:%l:%m
1033 call assert_fails('Xexpr ["Entering dir abc", "abc.txt:1:Hello world"]', 'E379:')
1034
1035 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001036endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001037
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001038func Test_invalid_efm()
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001039 call Xinvalid_efm_Tests('c')
1040 call Xinvalid_efm_Tests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001041endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001042
1043" TODO:
1044" Add tests for the following formats in 'errorformat'
1045" %r %O
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001046func Test_efm2()
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001047 let save_efm = &efm
Bram Moolenaar049cba92016-06-26 14:38:04 +02001048
1049 " Test for %s format in efm
1050 set efm=%f:%s
1051 cexpr 'Xtestfile:Line search text'
Bram Moolenaar049cba92016-06-26 14:38:04 +02001052 let l = getqflist()
1053 call assert_equal(l[0].pattern, '^\VLine search text\$')
1054 call assert_equal(l[0].lnum, 0)
1055
Bram Moolenaaree85df32017-03-19 14:19:50 +01001056 let l = split(execute('clist', ''), "\n")
1057 call assert_equal([' 1 Xtestfile:^\VLine search text\$: '], l)
1058
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001059 " Test for %P, %Q and %t format specifiers
Bram Moolenaar049cba92016-06-26 14:38:04 +02001060 let lines=["[Xtestfile1]",
1061 \ "(1,17) error: ';' missing",
1062 \ "(21,2) warning: variable 'z' not defined",
1063 \ "(67,3) error: end of file found before string ended",
Bram Moolenaaree85df32017-03-19 14:19:50 +01001064 \ "--",
Bram Moolenaar049cba92016-06-26 14:38:04 +02001065 \ "",
1066 \ "[Xtestfile2]",
Bram Moolenaaree85df32017-03-19 14:19:50 +01001067 \ "--",
Bram Moolenaar049cba92016-06-26 14:38:04 +02001068 \ "",
1069 \ "[Xtestfile3]",
1070 \ "NEW compiler v1.1",
1071 \ "(2,2) warning: variable 'x' not defined",
Bram Moolenaaree85df32017-03-19 14:19:50 +01001072 \ "(67,3) warning: 's' already defined",
1073 \ "--"
Bram Moolenaar049cba92016-06-26 14:38:04 +02001074 \]
Bram Moolenaaree85df32017-03-19 14:19:50 +01001075 set efm=%+P[%f]%r,(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%+Q--%r
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001076 " To exercise the push/pop file functionality in quickfix, the test files
1077 " need to be created.
1078 call writefile(['Line1'], 'Xtestfile1')
1079 call writefile(['Line2'], 'Xtestfile2')
1080 call writefile(['Line3'], 'Xtestfile3')
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001081 cexpr ""
1082 for l in lines
1083 caddexpr l
1084 endfor
Bram Moolenaar049cba92016-06-26 14:38:04 +02001085 let l = getqflist()
Bram Moolenaaree85df32017-03-19 14:19:50 +01001086 call assert_equal(12, len(l))
Bram Moolenaar049cba92016-06-26 14:38:04 +02001087 call assert_equal(21, l[2].lnum)
1088 call assert_equal(2, l[2].col)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001089 call assert_equal('w', l[2].type)
1090 call assert_equal('e', l[3].type)
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001091 call delete('Xtestfile1')
1092 call delete('Xtestfile2')
1093 call delete('Xtestfile3')
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001094
1095 " Tests for %E, %C and %Z format specifiers
1096 let lines = ["Error 275",
1097 \ "line 42",
1098 \ "column 3",
1099 \ "' ' expected after '--'"
1100 \]
1101 set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m
1102 cgetexpr lines
1103 let l = getqflist()
1104 call assert_equal(275, l[0].nr)
1105 call assert_equal(42, l[0].lnum)
1106 call assert_equal(3, l[0].col)
1107 call assert_equal('E', l[0].type)
1108 call assert_equal("\n' ' expected after '--'", l[0].text)
1109
1110 " Test for %>
1111 let lines = ["Error in line 147 of foo.c:",
1112 \"unknown variable 'i'"
1113 \]
1114 set efm=unknown\ variable\ %m,%E%>Error\ in\ line\ %l\ of\ %f:,%Z%m
1115 cgetexpr lines
1116 let l = getqflist()
1117 call assert_equal(147, l[0].lnum)
1118 call assert_equal('E', l[0].type)
1119 call assert_equal("\nunknown variable 'i'", l[0].text)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001120
Bram Moolenaare87e6dd2016-07-17 19:25:04 +02001121 " Test for %A, %C and other formats
1122 let lines = [
1123 \"==============================================================",
1124 \"FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest)",
1125 \"--------------------------------------------------------------",
1126 \"Traceback (most recent call last):",
1127 \' File "unittests/dbfacadeTest.py", line 89, in testFoo',
1128 \" self.assertEquals(34, dtid)",
1129 \' File "/usr/lib/python2.2/unittest.py", line 286, in',
1130 \" failUnlessEqual",
1131 \" raise self.failureException, \\",
1132 \"AssertionError: 34 != 33",
1133 \"",
1134 \"--------------------------------------------------------------",
1135 \"Ran 27 tests in 0.063s"
1136 \]
1137 set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m
1138 cgetexpr lines
1139 let l = getqflist()
1140 call assert_equal(8, len(l))
1141 call assert_equal(89, l[4].lnum)
1142 call assert_equal(1, l[4].valid)
1143 call assert_equal('unittests/dbfacadeTest.py', bufname(l[4].bufnr))
1144
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001145 " The following sequence of commands used to crash Vim
1146 set efm=%W%m
1147 cgetexpr ['msg1']
1148 let l = getqflist()
1149 call assert_equal(1, len(l), string(l))
1150 call assert_equal('msg1', l[0].text)
1151 set efm=%C%m
1152 lexpr 'msg2'
1153 let l = getloclist(0)
1154 call assert_equal(1, len(l), string(l))
1155 call assert_equal('msg2', l[0].text)
1156 lopen
1157 call setqflist([], 'r')
1158 caddbuf
1159 let l = getqflist()
1160 call assert_equal(1, len(l), string(l))
1161 call assert_equal('|| msg2', l[0].text)
1162
1163 new | only
Bram Moolenaar049cba92016-06-26 14:38:04 +02001164 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001165endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001166
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001167func XquickfixChangedByAutocmd(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001168 call s:setup_commands(a:cchar)
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001169 if a:cchar == 'c'
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001170 let ErrorNr = 'E925'
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001171 func! ReadFunc()
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001172 colder
1173 cgetexpr []
1174 endfunc
1175 else
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001176 let ErrorNr = 'E926'
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001177 func! ReadFunc()
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001178 lolder
1179 lgetexpr []
1180 endfunc
1181 endif
1182
1183 augroup testgroup
1184 au!
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001185 autocmd BufReadCmd test_changed.txt call ReadFunc()
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001186 augroup END
1187
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001188 new | only
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001189 let words = [ "a", "b" ]
1190 let qflist = []
1191 for word in words
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001192 call add(qflist, {'filename': 'test_changed.txt'})
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001193 call g:Xsetlist(qflist, ' ')
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001194 endfor
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001195 call assert_fails('Xrewind', ErrorNr . ':')
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001196
1197 augroup! testgroup
1198endfunc
1199
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001200func Test_quickfix_was_changed_by_autocmd()
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001201 call XquickfixChangedByAutocmd('c')
1202 call XquickfixChangedByAutocmd('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001203endfunc
Bram Moolenaar8b201792016-03-25 15:01:10 +01001204
1205func Test_caddbuffer_to_empty()
1206 helpgr quickfix
1207 call setqflist([], 'r')
1208 cad
Bram Moolenaarf68f1d72016-03-25 17:14:06 +01001209 try
1210 cn
1211 catch
1212 " number of matches is unknown
1213 call assert_true(v:exception =~ 'E553:')
1214 endtry
Bram Moolenaar8b201792016-03-25 15:01:10 +01001215 quit!
1216endfunc
Bram Moolenaar89c64d52016-03-27 18:44:40 +02001217
1218func Test_cgetexpr_works()
1219 " this must not crash Vim
1220 cgetexpr [$x]
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001221 lgetexpr [$x]
Bram Moolenaar89c64d52016-03-27 18:44:40 +02001222endfunc
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001223
1224" Tests for the setqflist() and setloclist() functions
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001225func SetXlistTests(cchar, bnum)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001226 call s:setup_commands(a:cchar)
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001227
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001228 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 1},
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001229 \ {'bufnr': a:bnum, 'lnum': 2}])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001230 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001231 call assert_equal(2, len(l))
1232 call assert_equal(2, l[1].lnum)
1233
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001234 Xnext
1235 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3}], 'a')
1236 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001237 call assert_equal(3, len(l))
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001238 Xnext
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001239 call assert_equal(3, line('.'))
1240
Bram Moolenaar2b2b8ae2016-05-24 19:59:51 +02001241 " Appending entries to the list should not change the cursor position
1242 " in the quickfix window
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001243 Xwindow
Bram Moolenaar2b2b8ae2016-05-24 19:59:51 +02001244 1
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001245 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 4},
Bram Moolenaar2b2b8ae2016-05-24 19:59:51 +02001246 \ {'bufnr': a:bnum, 'lnum': 5}], 'a')
1247 call assert_equal(1, line('.'))
1248 close
1249
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001250 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3},
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001251 \ {'bufnr': a:bnum, 'lnum': 4},
1252 \ {'bufnr': a:bnum, 'lnum': 5}], 'r')
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001253 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001254 call assert_equal(3, len(l))
1255 call assert_equal(5, l[2].lnum)
1256
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001257 call g:Xsetlist([])
1258 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001259 call assert_equal(0, len(l))
Bram Moolenaaree85df32017-03-19 14:19:50 +01001260
Bram Moolenaarf1d21c82017-04-22 21:20:46 +02001261 " Tests for setting the 'valid' flag
1262 call g:Xsetlist([{'bufnr':a:bnum, 'lnum':4, 'valid':0}])
1263 Xwindow
1264 call assert_equal(1, winnr('$'))
1265 let l = g:Xgetlist()
1266 call g:Xsetlist(l)
1267 call assert_equal(0, g:Xgetlist()[0].valid)
1268 call g:Xsetlist([{'text':'Text1', 'valid':1}])
1269 Xwindow
1270 call assert_equal(2, winnr('$'))
1271 Xclose
1272 let save_efm = &efm
1273 set efm=%m
1274 Xgetexpr 'TestMessage'
1275 let l = g:Xgetlist()
1276 call g:Xsetlist(l)
1277 call assert_equal(1, g:Xgetlist()[0].valid)
1278 let &efm = save_efm
1279
Bram Moolenaaree85df32017-03-19 14:19:50 +01001280 " Error cases:
1281 " Refer to a non-existing buffer and pass a non-dictionary type
1282 call assert_fails("call g:Xsetlist([{'bufnr':998, 'lnum':4}," .
1283 \ " {'bufnr':999, 'lnum':5}])", 'E92:')
1284 call g:Xsetlist([[1, 2,3]])
1285 call assert_equal(0, len(g:Xgetlist()))
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001286endfunc
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001287
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001288func Test_setqflist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001289 new Xtestfile | only
1290 let bnum = bufnr('%')
1291 call setline(1, range(1,5))
1292
1293 call SetXlistTests('c', bnum)
1294 call SetXlistTests('l', bnum)
1295
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001296 enew!
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001297 call delete('Xtestfile')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001298endfunc
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001299
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001300func Xlist_empty_middle(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001301 call s:setup_commands(a:cchar)
1302
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001303 " create three quickfix lists
Bram Moolenaaree85df32017-03-19 14:19:50 +01001304 let @/ = 'Test_'
1305 Xvimgrep // test_quickfix.vim
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001306 let testlen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001307 call assert_true(testlen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001308 Xvimgrep empty test_quickfix.vim
1309 call assert_true(len(g:Xgetlist()) > 0)
1310 Xvimgrep matches test_quickfix.vim
1311 let matchlen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001312 call assert_true(matchlen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001313 Xolder
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001314 " make the middle list empty
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001315 call g:Xsetlist([], 'r')
1316 call assert_true(len(g:Xgetlist()) == 0)
1317 Xolder
1318 call assert_equal(testlen, len(g:Xgetlist()))
1319 Xnewer
1320 Xnewer
1321 call assert_equal(matchlen, len(g:Xgetlist()))
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001322endfunc
1323
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001324func Test_setqflist_empty_middle()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001325 call Xlist_empty_middle('c')
1326 call Xlist_empty_middle('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001327endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001328
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001329func Xlist_empty_older(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001330 call s:setup_commands(a:cchar)
1331
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001332 " create three quickfix lists
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001333 Xvimgrep one test_quickfix.vim
1334 let onelen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001335 call assert_true(onelen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001336 Xvimgrep two test_quickfix.vim
1337 let twolen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001338 call assert_true(twolen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001339 Xvimgrep three test_quickfix.vim
1340 let threelen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001341 call assert_true(threelen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001342 Xolder 2
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001343 " make the first list empty, check the others didn't change
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001344 call g:Xsetlist([], 'r')
1345 call assert_true(len(g:Xgetlist()) == 0)
1346 Xnewer
1347 call assert_equal(twolen, len(g:Xgetlist()))
1348 Xnewer
1349 call assert_equal(threelen, len(g:Xgetlist()))
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001350endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001351
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001352func Test_setqflist_empty_older()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001353 call Xlist_empty_older('c')
1354 call Xlist_empty_older('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001355endfunc
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001356
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001357func XquickfixSetListWithAct(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001358 call s:setup_commands(a:cchar)
1359
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001360 let list1 = [{'filename': 'fnameA', 'text': 'A'},
1361 \ {'filename': 'fnameB', 'text': 'B'}]
1362 let list2 = [{'filename': 'fnameC', 'text': 'C'},
1363 \ {'filename': 'fnameD', 'text': 'D'},
1364 \ {'filename': 'fnameE', 'text': 'E'}]
1365
1366 " {action} is unspecified. Same as specifing ' '.
1367 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001368 silent! Xnewer 99
1369 call g:Xsetlist(list1)
1370 call g:Xsetlist(list2)
1371 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001372 call assert_equal(3, len(li))
1373 call assert_equal('C', li[0]['text'])
1374 call assert_equal('D', li[1]['text'])
1375 call assert_equal('E', li[2]['text'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001376 silent! Xolder
1377 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001378 call assert_equal(2, len(li))
1379 call assert_equal('A', li[0]['text'])
1380 call assert_equal('B', li[1]['text'])
1381
1382 " {action} is specified ' '.
1383 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001384 silent! Xnewer 99
1385 call g:Xsetlist(list1)
1386 call g:Xsetlist(list2, ' ')
1387 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001388 call assert_equal(3, len(li))
1389 call assert_equal('C', li[0]['text'])
1390 call assert_equal('D', li[1]['text'])
1391 call assert_equal('E', li[2]['text'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001392 silent! Xolder
1393 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001394 call assert_equal(2, len(li))
1395 call assert_equal('A', li[0]['text'])
1396 call assert_equal('B', li[1]['text'])
1397
1398 " {action} is specified 'a'.
1399 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001400 silent! Xnewer 99
1401 call g:Xsetlist(list1)
1402 call g:Xsetlist(list2, 'a')
1403 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001404 call assert_equal(5, len(li))
1405 call assert_equal('A', li[0]['text'])
1406 call assert_equal('B', li[1]['text'])
1407 call assert_equal('C', li[2]['text'])
1408 call assert_equal('D', li[3]['text'])
1409 call assert_equal('E', li[4]['text'])
1410
1411 " {action} is specified 'r'.
1412 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001413 silent! Xnewer 99
1414 call g:Xsetlist(list1)
1415 call g:Xsetlist(list2, 'r')
1416 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001417 call assert_equal(3, len(li))
1418 call assert_equal('C', li[0]['text'])
1419 call assert_equal('D', li[1]['text'])
1420 call assert_equal('E', li[2]['text'])
1421
1422 " Test for wrong value.
1423 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001424 call assert_fails("call g:Xsetlist(0)", 'E714:')
1425 call assert_fails("call g:Xsetlist(list1, '')", 'E927:')
1426 call assert_fails("call g:Xsetlist(list1, 'aa')", 'E927:')
1427 call assert_fails("call g:Xsetlist(list1, ' a')", 'E927:')
1428 call assert_fails("call g:Xsetlist(list1, 0)", 'E928:')
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001429endfunc
1430
Bram Moolenaara0ca7d02017-12-19 10:22:19 +01001431func Test_setqflist_invalid_nr()
1432 " The following command used to crash Vim
1433 call setqflist([], ' ', {'nr' : $XXX_DOES_NOT_EXIST})
1434endfunc
1435
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001436func Test_quickfix_set_list_with_act()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001437 call XquickfixSetListWithAct('c')
1438 call XquickfixSetListWithAct('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001439endfunc
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001440
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001441func XLongLinesTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001442 let l = g:Xgetlist()
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001443
Bram Moolenaar049cba92016-06-26 14:38:04 +02001444 call assert_equal(4, len(l))
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001445 call assert_equal(1, l[0].lnum)
1446 call assert_equal(1, l[0].col)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001447 call assert_equal(1975, len(l[0].text))
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001448 call assert_equal(2, l[1].lnum)
1449 call assert_equal(1, l[1].col)
1450 call assert_equal(4070, len(l[1].text))
1451 call assert_equal(3, l[2].lnum)
1452 call assert_equal(1, l[2].col)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001453 call assert_equal(4070, len(l[2].text))
1454 call assert_equal(4, l[3].lnum)
1455 call assert_equal(1, l[3].col)
1456 call assert_equal(10, len(l[3].text))
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001457
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001458 call g:Xsetlist([], 'r')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001459endfunc
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001460
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001461func s:long_lines_tests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001462 call s:setup_commands(a:cchar)
1463
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001464 let testfile = 'samples/quickfix.txt'
1465
1466 " file
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001467 exe 'Xgetfile' testfile
1468 call XLongLinesTests(a:cchar)
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001469
1470 " list
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001471 Xexpr readfile(testfile)
1472 call XLongLinesTests(a:cchar)
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001473
1474 " string
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001475 Xexpr join(readfile(testfile), "\n")
1476 call XLongLinesTests(a:cchar)
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001477
1478 " buffer
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001479 exe 'edit' testfile
1480 exe 'Xbuffer' bufnr('%')
Bram Moolenaarf50df392016-06-21 21:33:34 +02001481 call XLongLinesTests(a:cchar)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001482endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001483
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001484func Test_long_lines()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001485 call s:long_lines_tests('c')
1486 call s:long_lines_tests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001487endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001488
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001489func s:create_test_file(filename)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001490 let l = []
1491 for i in range(1, 20)
1492 call add(l, 'Line' . i)
1493 endfor
1494 call writefile(l, a:filename)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001495endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001496
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001497func Test_switchbuf()
Bram Moolenaar049cba92016-06-26 14:38:04 +02001498 call s:create_test_file('Xqftestfile1')
1499 call s:create_test_file('Xqftestfile2')
1500 call s:create_test_file('Xqftestfile3')
1501
1502 new | only
1503 edit Xqftestfile1
1504 let file1_winid = win_getid()
1505 new Xqftestfile2
1506 let file2_winid = win_getid()
1507 cgetexpr ['Xqftestfile1:5:Line5',
1508 \ 'Xqftestfile1:6:Line6',
1509 \ 'Xqftestfile2:10:Line10',
1510 \ 'Xqftestfile2:11:Line11',
1511 \ 'Xqftestfile3:15:Line15',
1512 \ 'Xqftestfile3:16:Line16']
1513
1514 new
1515 let winid = win_getid()
1516 cfirst | cnext
1517 call assert_equal(winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001518 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001519 call assert_equal(winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001520 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001521 call assert_equal(winid, win_getid())
1522 enew
1523
1524 set switchbuf=useopen
1525 cfirst | cnext
1526 call assert_equal(file1_winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001527 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001528 call assert_equal(file2_winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001529 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001530 call assert_equal(file2_winid, win_getid())
1531
1532 enew | only
1533 set switchbuf=usetab
1534 tabedit Xqftestfile1
1535 tabedit Xqftestfile2
Bram Moolenaar74240d32017-12-10 15:26:15 +01001536 tabedit Xqftestfile3
Bram Moolenaar049cba92016-06-26 14:38:04 +02001537 tabfirst
1538 cfirst | cnext
1539 call assert_equal(2, tabpagenr())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001540 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001541 call assert_equal(3, tabpagenr())
Bram Moolenaar74240d32017-12-10 15:26:15 +01001542 6cnext
1543 call assert_equal(4, tabpagenr())
1544 2cpfile
1545 call assert_equal(2, tabpagenr())
1546 2cnfile
1547 call assert_equal(4, tabpagenr())
Bram Moolenaar049cba92016-06-26 14:38:04 +02001548 tabfirst | tabonly | enew
1549
1550 set switchbuf=split
1551 cfirst | cnext
1552 call assert_equal(1, winnr('$'))
1553 cnext | cnext
1554 call assert_equal(2, winnr('$'))
1555 cnext | cnext
1556 call assert_equal(3, winnr('$'))
1557 enew | only
1558
1559 set switchbuf=newtab
1560 cfirst | cnext
1561 call assert_equal(1, tabpagenr('$'))
1562 cnext | cnext
1563 call assert_equal(2, tabpagenr('$'))
1564 cnext | cnext
1565 call assert_equal(3, tabpagenr('$'))
1566 tabfirst | enew | tabonly | only
1567
1568 set switchbuf=
1569 edit Xqftestfile1
1570 let file1_winid = win_getid()
1571 new Xqftestfile2
1572 let file2_winid = win_getid()
1573 copen
1574 exe "normal 1G\<CR>"
1575 call assert_equal(file1_winid, win_getid())
1576 copen
1577 exe "normal 3G\<CR>"
1578 call assert_equal(file2_winid, win_getid())
1579 copen | only
1580 exe "normal 5G\<CR>"
1581 call assert_equal(2, winnr('$'))
1582 call assert_equal(1, bufwinnr('Xqftestfile3'))
1583
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001584 " If only quickfix window is open in the current tabpage, jumping to an
1585 " entry with 'switchubf' set to 'usetab' should search in other tabpages.
Bram Moolenaar049cba92016-06-26 14:38:04 +02001586 enew | only
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001587 set switchbuf=usetab
1588 tabedit Xqftestfile1
1589 tabedit Xqftestfile2
1590 tabedit Xqftestfile3
1591 tabfirst
1592 copen | only
1593 clast
1594 call assert_equal(4, tabpagenr())
1595 tabfirst | tabonly | enew | only
Bram Moolenaar049cba92016-06-26 14:38:04 +02001596
1597 call delete('Xqftestfile1')
1598 call delete('Xqftestfile2')
1599 call delete('Xqftestfile3')
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001600 set switchbuf&vim
1601
1602 enew | only
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001603endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001604
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001605func Xadjust_qflnum(cchar)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001606 call s:setup_commands(a:cchar)
1607
1608 enew | only
1609
Bram Moolenaarc1542742016-07-20 21:44:37 +02001610 let fname = 'Xqftestfile' . a:cchar
1611 call s:create_test_file(fname)
1612 exe 'edit ' . fname
Bram Moolenaar049cba92016-06-26 14:38:04 +02001613
Bram Moolenaarc1542742016-07-20 21:44:37 +02001614 Xgetexpr [fname . ':5:Line5',
1615 \ fname . ':10:Line10',
1616 \ fname . ':15:Line15',
1617 \ fname . ':20:Line20']
Bram Moolenaar049cba92016-06-26 14:38:04 +02001618
1619 6,14delete
1620 call append(6, ['Buffer', 'Window'])
1621
1622 let l = g:Xgetlist()
1623
1624 call assert_equal(5, l[0].lnum)
1625 call assert_equal(6, l[2].lnum)
1626 call assert_equal(13, l[3].lnum)
1627
1628 enew!
Bram Moolenaarc1542742016-07-20 21:44:37 +02001629 call delete(fname)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001630endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001631
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001632func Test_adjust_lnum()
Bram Moolenaarc1542742016-07-20 21:44:37 +02001633 call setloclist(0, [])
Bram Moolenaar049cba92016-06-26 14:38:04 +02001634 call Xadjust_qflnum('c')
Bram Moolenaarc1542742016-07-20 21:44:37 +02001635 call setqflist([])
Bram Moolenaar049cba92016-06-26 14:38:04 +02001636 call Xadjust_qflnum('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001637endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001638
1639" Tests for the :grep/:lgrep and :grepadd/:lgrepadd commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001640func s:test_xgrep(cchar)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001641 call s:setup_commands(a:cchar)
1642
1643 " The following lines are used for the grep test. Don't remove.
1644 " Grep_Test_Text: Match 1
1645 " Grep_Test_Text: Match 2
1646 " GrepAdd_Test_Text: Match 1
1647 " GrepAdd_Test_Text: Match 2
1648 enew! | only
1649 set makeef&vim
1650 silent Xgrep Grep_Test_Text: test_quickfix.vim
1651 call assert_true(len(g:Xgetlist()) == 3)
1652 Xopen
1653 call assert_true(w:quickfix_title =~ '^:grep')
1654 Xclose
1655 enew
1656 set makeef=Temp_File_##
1657 silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
1658 call assert_true(len(g:Xgetlist()) == 6)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001659endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001660
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001661func Test_grep()
Bram Moolenaar049cba92016-06-26 14:38:04 +02001662 if !has('unix')
1663 " The grepprg may not be set on non-Unix systems
1664 return
1665 endif
1666
1667 call s:test_xgrep('c')
1668 call s:test_xgrep('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001669endfunc
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001670
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001671func Test_two_windows()
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001672 " Use one 'errorformat' for two windows. Add an expression to each of them,
1673 " make sure they each keep their own state.
1674 set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
1675 call mkdir('Xone/a', 'p')
1676 call mkdir('Xtwo/a', 'p')
1677 let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
1678 call writefile(lines, 'Xone/a/one.txt')
1679 call writefile(lines, 'Xtwo/a/two.txt')
1680
1681 new one
1682 let one_id = win_getid()
1683 lexpr ""
1684 new two
1685 let two_id = win_getid()
1686 lexpr ""
1687
1688 laddexpr "Entering dir 'Xtwo/a'"
1689 call win_gotoid(one_id)
1690 laddexpr "Entering dir 'Xone/a'"
1691 call win_gotoid(two_id)
1692 laddexpr 'two.txt:5:two two two'
1693 call win_gotoid(one_id)
1694 laddexpr 'one.txt:3:one one one'
1695
1696 let loc_one = getloclist(one_id)
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001697 call assert_equal('Xone/a/one.txt', bufname(loc_one[1].bufnr))
1698 call assert_equal(3, loc_one[1].lnum)
1699
1700 let loc_two = getloclist(two_id)
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001701 call assert_equal('Xtwo/a/two.txt', bufname(loc_two[1].bufnr))
1702 call assert_equal(5, loc_two[1].lnum)
1703
1704 call win_gotoid(one_id)
1705 bwipe!
1706 call win_gotoid(two_id)
1707 bwipe!
1708 call delete('Xone', 'rf')
1709 call delete('Xtwo', 'rf')
1710endfunc
Bram Moolenaardcb17002016-07-07 18:58:59 +02001711
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001712func XbottomTests(cchar)
Bram Moolenaar537ef082016-07-09 17:56:19 +02001713 call s:setup_commands(a:cchar)
1714
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +02001715 " Calling lbottom without any errors should fail
1716 if a:cchar == 'l'
1717 call assert_fails('lbottom', 'E776:')
1718 endif
1719
Bram Moolenaar875feea2017-06-11 16:07:51 +02001720 call g:Xsetlist([{'filename': 'foo', 'lnum': 42}])
Bram Moolenaar537ef082016-07-09 17:56:19 +02001721 Xopen
Bram Moolenaardcb17002016-07-07 18:58:59 +02001722 let wid = win_getid()
1723 call assert_equal(1, line('.'))
1724 wincmd w
Bram Moolenaar875feea2017-06-11 16:07:51 +02001725 call g:Xsetlist([{'filename': 'var', 'lnum': 24}], 'a')
Bram Moolenaar537ef082016-07-09 17:56:19 +02001726 Xbottom
Bram Moolenaardcb17002016-07-07 18:58:59 +02001727 call win_gotoid(wid)
1728 call assert_equal(2, line('.'))
Bram Moolenaar537ef082016-07-09 17:56:19 +02001729 Xclose
Bram Moolenaardcb17002016-07-07 18:58:59 +02001730endfunc
Bram Moolenaar537ef082016-07-09 17:56:19 +02001731
1732" Tests for the :cbottom and :lbottom commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001733func Test_cbottom()
Bram Moolenaar537ef082016-07-09 17:56:19 +02001734 call XbottomTests('c')
1735 call XbottomTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001736endfunc
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02001737
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001738func HistoryTest(cchar)
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02001739 call s:setup_commands(a:cchar)
1740
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02001741 " clear all lists after the first one, then replace the first one.
1742 call g:Xsetlist([])
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +02001743 call assert_fails('Xolder 99', 'E380:')
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02001744 let entry = {'filename': 'foo', 'lnum': 42}
1745 call g:Xsetlist([entry], 'r')
1746 call g:Xsetlist([entry, entry])
1747 call g:Xsetlist([entry, entry, entry])
1748 let res = split(execute(a:cchar . 'hist'), "\n")
1749 call assert_equal(3, len(res))
1750 let common = 'errors :set' . (a:cchar == 'c' ? 'qf' : 'loc') . 'list()'
1751 call assert_equal(' error list 1 of 3; 1 ' . common, res[0])
1752 call assert_equal(' error list 2 of 3; 2 ' . common, res[1])
1753 call assert_equal('> error list 3 of 3; 3 ' . common, res[2])
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02001754
1755 call g:Xsetlist([], 'f')
1756 let l = split(execute(a:cchar . 'hist'), "\n")
1757 call assert_equal('No entries', l[0])
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02001758endfunc
1759
1760func Test_history()
1761 call HistoryTest('c')
1762 call HistoryTest('l')
1763endfunc
Bram Moolenaar015102e2016-07-16 18:24:56 +02001764
1765func Test_duplicate_buf()
1766 " make sure we can get the highest buffer number
1767 edit DoesNotExist
1768 edit DoesNotExist2
1769 let last_buffer = bufnr("$")
1770
1771 " make sure only one buffer is created
1772 call writefile(['this one', 'that one'], 'Xgrepthis')
1773 vimgrep one Xgrepthis
1774 vimgrep one Xgrepthis
1775 call assert_equal(last_buffer + 1, bufnr("$"))
1776
1777 call delete('Xgrepthis')
1778endfunc
Bram Moolenaard823fa92016-08-12 16:29:27 +02001779
1780" Quickfix/Location list set/get properties tests
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001781func Xproperty_tests(cchar)
Bram Moolenaard823fa92016-08-12 16:29:27 +02001782 call s:setup_commands(a:cchar)
1783
1784 " Error cases
1785 call assert_fails('call g:Xgetlist(99)', 'E715:')
1786 call assert_fails('call g:Xsetlist(99)', 'E714:')
1787 call assert_fails('call g:Xsetlist([], "a", [])', 'E715:')
1788
1789 " Set and get the title
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +02001790 call g:Xsetlist([])
Bram Moolenaard823fa92016-08-12 16:29:27 +02001791 Xopen
1792 wincmd p
1793 call g:Xsetlist([{'filename':'foo', 'lnum':27}])
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02001794 let s = g:Xsetlist([], 'a', {'title' : 'Sample'})
1795 call assert_equal(0, s)
Bram Moolenaard823fa92016-08-12 16:29:27 +02001796 let d = g:Xgetlist({"title":1})
1797 call assert_equal('Sample', d.title)
Bram Moolenaara2aa8a22018-04-24 13:55:00 +02001798 " Try setting title to a non-string value
1799 call assert_equal(-1, g:Xsetlist([], 'a', {'title' : ['Test']}))
1800 call assert_equal('Sample', g:Xgetlist({"title":1}).title)
Bram Moolenaard823fa92016-08-12 16:29:27 +02001801
1802 Xopen
1803 call assert_equal('Sample', w:quickfix_title)
1804 Xclose
1805
Bram Moolenaar2b529bb2016-08-27 13:35:35 +02001806 " Tests for action argument
1807 silent! Xolder 999
1808 let qfnr = g:Xgetlist({'all':1}).nr
1809 call g:Xsetlist([], 'r', {'title' : 'N1'})
1810 call assert_equal('N1', g:Xgetlist({'all':1}).title)
1811 call g:Xsetlist([], ' ', {'title' : 'N2'})
1812 call assert_equal(qfnr + 1, g:Xgetlist({'all':1}).nr)
Bram Moolenaar890680c2016-09-27 21:28:56 +02001813
1814 let res = g:Xgetlist({'nr': 0})
1815 call assert_equal(qfnr + 1, res.nr)
1816 call assert_equal(['nr'], keys(res))
1817
Bram Moolenaar2b529bb2016-08-27 13:35:35 +02001818 call g:Xsetlist([], ' ', {'title' : 'N3'})
1819 call assert_equal('N2', g:Xgetlist({'nr':2, 'title':1}).title)
1820
Bram Moolenaaree85df32017-03-19 14:19:50 +01001821 " Changing the title of an earlier quickfix list
Bram Moolenaar55b69262017-08-13 13:42:01 +02001822 call g:Xsetlist([], 'r', {'title' : 'NewTitle', 'nr' : 2})
Bram Moolenaaree85df32017-03-19 14:19:50 +01001823 call assert_equal('NewTitle', g:Xgetlist({'nr':2, 'title':1}).title)
1824
1825 " Changing the title of an invalid quickfix list
1826 call assert_equal(-1, g:Xsetlist([], ' ',
1827 \ {'title' : 'SomeTitle', 'nr' : 99}))
1828 call assert_equal(-1, g:Xsetlist([], ' ',
1829 \ {'title' : 'SomeTitle', 'nr' : 'abc'}))
1830
1831 if a:cchar == 'c'
1832 copen
1833 call assert_equal({'winid':win_getid()}, getqflist({'winid':1}))
1834 cclose
1835 endif
1836
Bram Moolenaard823fa92016-08-12 16:29:27 +02001837 " Invalid arguments
1838 call assert_fails('call g:Xgetlist([])', 'E715')
1839 call assert_fails('call g:Xsetlist([], "a", [])', 'E715')
1840 let s = g:Xsetlist([], 'a', {'abc':1})
1841 call assert_equal(-1, s)
1842
1843 call assert_equal({}, g:Xgetlist({'abc':1}))
Bram Moolenaara6d48492017-12-12 22:45:31 +01001844 call assert_equal('', g:Xgetlist({'nr':99, 'title':1}).title)
1845 call assert_equal('', g:Xgetlist({'nr':[], 'title':1}).title)
Bram Moolenaard823fa92016-08-12 16:29:27 +02001846
1847 if a:cchar == 'l'
Bram Moolenaar890680c2016-09-27 21:28:56 +02001848 call assert_equal({}, getloclist(99, {'title': 1}))
Bram Moolenaard823fa92016-08-12 16:29:27 +02001849 endif
Bram Moolenaar8f77c5a2017-04-30 14:21:00 +02001850
1851 " Context related tests
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02001852 let s = g:Xsetlist([], 'a', {'context':[1,2,3]})
1853 call assert_equal(0, s)
Bram Moolenaar8f77c5a2017-04-30 14:21:00 +02001854 call test_garbagecollect_now()
1855 let d = g:Xgetlist({'context':1})
1856 call assert_equal([1,2,3], d.context)
1857 call g:Xsetlist([], 'a', {'context':{'color':'green'}})
1858 let d = g:Xgetlist({'context':1})
1859 call assert_equal({'color':'green'}, d.context)
1860 call g:Xsetlist([], 'a', {'context':"Context info"})
1861 let d = g:Xgetlist({'context':1})
1862 call assert_equal("Context info", d.context)
1863 call g:Xsetlist([], 'a', {'context':246})
1864 let d = g:Xgetlist({'context':1})
1865 call assert_equal(246, d.context)
1866 if a:cchar == 'l'
1867 " Test for copying context across two different location lists
1868 new | only
1869 let w1_id = win_getid()
1870 let l = [1]
1871 call setloclist(0, [], 'a', {'context':l})
1872 new
1873 let w2_id = win_getid()
1874 call add(l, 2)
1875 call assert_equal([1, 2], getloclist(w1_id, {'context':1}).context)
1876 call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
1877 unlet! l
1878 call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
1879 only
1880 call setloclist(0, [], 'f')
Bram Moolenaara6d48492017-12-12 22:45:31 +01001881 call assert_equal('', getloclist(0, {'context':1}).context)
Bram Moolenaar8f77c5a2017-04-30 14:21:00 +02001882 endif
Bram Moolenaar6e62da32017-05-28 08:16:25 +02001883
1884 " Test for changing the context of previous quickfix lists
1885 call g:Xsetlist([], 'f')
1886 Xexpr "One"
1887 Xexpr "Two"
1888 Xexpr "Three"
Bram Moolenaar55b69262017-08-13 13:42:01 +02001889 call g:Xsetlist([], 'r', {'context' : [1], 'nr' : 1})
1890 call g:Xsetlist([], 'a', {'context' : [2], 'nr' : 2})
Bram Moolenaar6e62da32017-05-28 08:16:25 +02001891 " Also, check for setting the context using quickfix list number zero.
Bram Moolenaar55b69262017-08-13 13:42:01 +02001892 call g:Xsetlist([], 'r', {'context' : [3], 'nr' : 0})
Bram Moolenaar6e62da32017-05-28 08:16:25 +02001893 call test_garbagecollect_now()
1894 let l = g:Xgetlist({'nr' : 1, 'context' : 1})
1895 call assert_equal([1], l.context)
1896 let l = g:Xgetlist({'nr' : 2, 'context' : 1})
1897 call assert_equal([2], l.context)
1898 let l = g:Xgetlist({'nr' : 3, 'context' : 1})
1899 call assert_equal([3], l.context)
1900
1901 " Test for changing the context through reference and for garbage
1902 " collection of quickfix context
1903 let l = ["red"]
1904 call g:Xsetlist([], ' ', {'context' : l})
1905 call add(l, "blue")
1906 let x = g:Xgetlist({'context' : 1})
1907 call add(x.context, "green")
1908 call assert_equal(["red", "blue", "green"], l)
1909 call assert_equal(["red", "blue", "green"], x.context)
1910 unlet l
1911 call test_garbagecollect_now()
1912 let m = g:Xgetlist({'context' : 1})
1913 call assert_equal(["red", "blue", "green"], m.context)
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02001914
1915 " Test for setting/getting items
1916 Xexpr ""
1917 let qfprev = g:Xgetlist({'nr':0})
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02001918 let s = g:Xsetlist([], ' ', {'title':'Green',
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02001919 \ 'items' : [{'filename':'F1', 'lnum':10}]})
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02001920 call assert_equal(0, s)
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02001921 let qfcur = g:Xgetlist({'nr':0})
1922 call assert_true(qfcur.nr == qfprev.nr + 1)
1923 let l = g:Xgetlist({'items':1})
1924 call assert_equal('F1', bufname(l.items[0].bufnr))
1925 call assert_equal(10, l.items[0].lnum)
1926 call g:Xsetlist([], 'a', {'items' : [{'filename':'F2', 'lnum':20},
1927 \ {'filename':'F2', 'lnum':30}]})
1928 let l = g:Xgetlist({'items':1})
1929 call assert_equal('F2', bufname(l.items[2].bufnr))
1930 call assert_equal(30, l.items[2].lnum)
1931 call g:Xsetlist([], 'r', {'items' : [{'filename':'F3', 'lnum':40}]})
1932 let l = g:Xgetlist({'items':1})
1933 call assert_equal('F3', bufname(l.items[0].bufnr))
1934 call assert_equal(40, l.items[0].lnum)
1935 call g:Xsetlist([], 'r', {'items' : []})
1936 let l = g:Xgetlist({'items':1})
1937 call assert_equal(0, len(l.items))
1938
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02001939 call g:Xsetlist([], 'r', {'title' : 'TestTitle'})
1940 call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]})
1941 call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]})
1942 call assert_equal('TestTitle', g:Xgetlist({'title' : 1}).title)
1943
Bram Moolenaarae338332017-08-11 20:25:26 +02001944 " The following used to crash Vim with address sanitizer
1945 call g:Xsetlist([], 'f')
1946 call g:Xsetlist([], 'a', {'items' : [{'filename':'F1', 'lnum':10}]})
1947 call assert_equal(10, g:Xgetlist({'items':1}).items[0].lnum)
1948
Bram Moolenaara2aa8a22018-04-24 13:55:00 +02001949 " Try setting the items using a string
1950 call assert_equal(-1, g:Xsetlist([], ' ', {'items' : 'Test'}))
1951
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02001952 " Save and restore the quickfix stack
1953 call g:Xsetlist([], 'f')
1954 call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
1955 Xexpr "File1:10:Line1"
1956 Xexpr "File2:20:Line2"
1957 Xexpr "File3:30:Line3"
1958 let last_qf = g:Xgetlist({'nr':'$'}).nr
1959 call assert_equal(3, last_qf)
1960 let qstack = []
1961 for i in range(1, last_qf)
1962 let qstack = add(qstack, g:Xgetlist({'nr':i, 'all':1}))
1963 endfor
1964 call g:Xsetlist([], 'f')
1965 for i in range(len(qstack))
1966 call g:Xsetlist([], ' ', qstack[i])
1967 endfor
1968 call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
1969 call assert_equal(10, g:Xgetlist({'nr':1, 'items':1}).items[0].lnum)
1970 call assert_equal(20, g:Xgetlist({'nr':2, 'items':1}).items[0].lnum)
1971 call assert_equal(30, g:Xgetlist({'nr':3, 'items':1}).items[0].lnum)
1972 call g:Xsetlist([], 'f')
1973
1974 " Swap two quickfix lists
1975 Xexpr "File1:10:Line10"
1976 Xexpr "File2:20:Line20"
1977 Xexpr "File3:30:Line30"
1978 call g:Xsetlist([], 'r', {'nr':1,'title':'Colors','context':['Colors']})
1979 call g:Xsetlist([], 'r', {'nr':2,'title':'Fruits','context':['Fruits']})
1980 let l1=g:Xgetlist({'nr':1,'all':1})
1981 let l2=g:Xgetlist({'nr':2,'all':1})
Bram Moolenaara539f4f2017-08-30 20:33:55 +02001982 let save_id = l1.id
1983 let l1.id=l2.id
1984 let l2.id=save_id
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02001985 call g:Xsetlist([], 'r', l1)
1986 call g:Xsetlist([], 'r', l2)
1987 let newl1=g:Xgetlist({'nr':1,'all':1})
1988 let newl2=g:Xgetlist({'nr':2,'all':1})
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02001989 call assert_equal('Fruits', newl1.title)
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02001990 call assert_equal(['Fruits'], newl1.context)
1991 call assert_equal('Line20', newl1.items[0].text)
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02001992 call assert_equal('Colors', newl2.title)
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02001993 call assert_equal(['Colors'], newl2.context)
1994 call assert_equal('Line10', newl2.items[0].text)
1995 call g:Xsetlist([], 'f')
Bram Moolenaaree85df32017-03-19 14:19:50 +01001996endfunc
Bram Moolenaard823fa92016-08-12 16:29:27 +02001997
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001998func Test_qf_property()
Bram Moolenaard823fa92016-08-12 16:29:27 +02001999 call Xproperty_tests('c')
2000 call Xproperty_tests('l')
Bram Moolenaaree85df32017-03-19 14:19:50 +01002001endfunc
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002002
2003" Tests for the QuickFixCmdPre/QuickFixCmdPost autocommands
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002004func QfAutoCmdHandler(loc, cmd)
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002005 call add(g:acmds, a:loc . a:cmd)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002006endfunc
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002007
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002008func Test_Autocmd()
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002009 autocmd QuickFixCmdPre * call QfAutoCmdHandler('pre', expand('<amatch>'))
2010 autocmd QuickFixCmdPost * call QfAutoCmdHandler('post', expand('<amatch>'))
2011
2012 let g:acmds = []
2013 cexpr "F1:10:Line 10"
2014 caddexpr "F1:20:Line 20"
2015 cgetexpr "F1:30:Line 30"
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002016 cexpr ""
2017 caddexpr ""
2018 cgetexpr ""
2019 silent! cexpr non_existing_func()
2020 silent! caddexpr non_existing_func()
2021 silent! cgetexpr non_existing_func()
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002022 let l = ['precexpr',
2023 \ 'postcexpr',
2024 \ 'precaddexpr',
2025 \ 'postcaddexpr',
2026 \ 'precgetexpr',
2027 \ 'postcgetexpr',
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002028 \ 'precexpr',
2029 \ 'postcexpr',
2030 \ 'precaddexpr',
2031 \ 'postcaddexpr',
2032 \ 'precgetexpr',
2033 \ 'postcgetexpr',
2034 \ 'precexpr',
2035 \ 'precaddexpr',
2036 \ 'precgetexpr']
2037 call assert_equal(l, g:acmds)
2038
2039 let g:acmds = []
2040 enew! | call append(0, "F2:10:Line 10")
2041 cbuffer!
2042 enew! | call append(0, "F2:20:Line 20")
2043 cgetbuffer
2044 enew! | call append(0, "F2:30:Line 30")
2045 caddbuffer
2046 new
2047 let bnum = bufnr('%')
2048 bunload
2049 exe 'silent! cbuffer! ' . bnum
2050 exe 'silent! cgetbuffer ' . bnum
2051 exe 'silent! caddbuffer ' . bnum
2052 enew!
2053 let l = ['precbuffer',
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002054 \ 'postcbuffer',
2055 \ 'precgetbuffer',
2056 \ 'postcgetbuffer',
2057 \ 'precaddbuffer',
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002058 \ 'postcaddbuffer',
2059 \ 'precbuffer',
2060 \ 'precgetbuffer',
2061 \ 'precaddbuffer']
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002062 call assert_equal(l, g:acmds)
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002063
2064 call writefile(['Xtest:1:Line1'], 'Xtest')
2065 call writefile([], 'Xempty')
2066 let g:acmds = []
2067 cfile Xtest
2068 caddfile Xtest
2069 cgetfile Xtest
2070 cfile Xempty
2071 caddfile Xempty
2072 cgetfile Xempty
2073 silent! cfile do_not_exist
2074 silent! caddfile do_not_exist
2075 silent! cgetfile do_not_exist
2076 let l = ['precfile',
2077 \ 'postcfile',
2078 \ 'precaddfile',
2079 \ 'postcaddfile',
2080 \ 'precgetfile',
2081 \ 'postcgetfile',
2082 \ 'precfile',
2083 \ 'postcfile',
2084 \ 'precaddfile',
2085 \ 'postcaddfile',
2086 \ 'precgetfile',
2087 \ 'postcgetfile',
2088 \ 'precfile',
2089 \ 'postcfile',
2090 \ 'precaddfile',
2091 \ 'postcaddfile',
2092 \ 'precgetfile',
2093 \ 'postcgetfile']
2094 call assert_equal(l, g:acmds)
2095
2096 let g:acmds = []
2097 helpgrep quickfix
2098 silent! helpgrep non_existing_help_topic
2099 vimgrep test Xtest
2100 vimgrepadd test Xtest
2101 silent! vimgrep non_existing_test Xtest
2102 silent! vimgrepadd non_existing_test Xtest
2103 set makeprg=
2104 silent! make
2105 set makeprg&
2106 let l = ['prehelpgrep',
2107 \ 'posthelpgrep',
2108 \ 'prehelpgrep',
2109 \ 'posthelpgrep',
2110 \ 'previmgrep',
2111 \ 'postvimgrep',
2112 \ 'previmgrepadd',
2113 \ 'postvimgrepadd',
2114 \ 'previmgrep',
2115 \ 'postvimgrep',
2116 \ 'previmgrepadd',
2117 \ 'postvimgrepadd',
2118 \ 'premake',
2119 \ 'postmake']
2120 call assert_equal(l, g:acmds)
2121
2122 if has('unix')
2123 " Run this test only on Unix-like systems. The grepprg may not be set on
2124 " non-Unix systems.
2125 " The following lines are used for the grep test. Don't remove.
2126 " Grep_Autocmd_Text: Match 1
2127 " GrepAdd_Autocmd_Text: Match 2
2128 let g:acmds = []
2129 silent grep Grep_Autocmd_Text test_quickfix.vim
2130 silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim
2131 silent grep abc123def Xtest
2132 silent grepadd abc123def Xtest
2133 let l = ['pregrep',
2134 \ 'postgrep',
2135 \ 'pregrepadd',
2136 \ 'postgrepadd',
2137 \ 'pregrep',
2138 \ 'postgrep',
2139 \ 'pregrepadd',
2140 \ 'postgrepadd']
2141 call assert_equal(l, g:acmds)
2142 endif
2143
2144 call delete('Xtest')
2145 call delete('Xempty')
Bram Moolenaarb254af32017-12-18 19:48:58 +01002146 au! QuickFixCmdPre
2147 au! QuickFixCmdPost
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002148endfunc
Bram Moolenaar21662be2016-11-06 14:46:44 +01002149
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002150func Test_Autocmd_Exception()
Bram Moolenaar21662be2016-11-06 14:46:44 +01002151 set efm=%m
2152 lgetexpr '?'
2153
2154 try
2155 call DoesNotExit()
2156 catch
2157 lgetexpr '1'
2158 finally
2159 lgetexpr '1'
2160 endtry
2161
2162 call assert_equal('1', getloclist(0)[0].text)
2163
2164 set efm&vim
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002165endfunc
Bram Moolenaar63bed3d2016-11-12 15:36:54 +01002166
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002167func Test_caddbuffer_wrong()
2168 " This used to cause a memory access in freed memory.
Bram Moolenaar63bed3d2016-11-12 15:36:54 +01002169 let save_efm = &efm
2170 set efm=%EEEE%m,%WWWW,%+CCCC%>%#,%GGGG%.#
2171 cgetexpr ['WWWW', 'EEEE', 'CCCC']
2172 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002173 caddbuffer
Bram Moolenaar63bed3d2016-11-12 15:36:54 +01002174 bwipe!
2175endfunc
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002176
2177func Test_caddexpr_wrong()
2178 " This used to cause a memory access in freed memory.
2179 cbuffer
2180 cbuffer
2181 copen
2182 let save_efm = &efm
2183 set efm=%
2184 call assert_fails('caddexpr ""', 'E376:')
2185 let &efm = save_efm
2186endfunc
Bram Moolenaar7618e002016-11-13 15:09:26 +01002187
2188func Test_dirstack_cleanup()
2189 " This used to cause a memory access in freed memory.
2190 let save_efm = &efm
2191 lexpr '0'
2192 lopen
2193 fun X(c)
2194 let save_efm=&efm
2195 set efm=%D%f
2196 if a:c == 'c'
2197 caddexpr '::'
2198 else
2199 laddexpr ':0:0'
2200 endif
2201 let &efm=save_efm
2202 endfun
2203 call X('c')
2204 call X('l')
2205 call setqflist([], 'r')
2206 caddbuffer
2207 let &efm = save_efm
2208endfunc
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01002209
2210" Tests for jumping to entries from the location list window and quickfix
2211" window
2212func Test_cwindow_jump()
2213 set efm=%f%%%l%%%m
2214 lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2215 lopen | only
2216 lfirst
2217 call assert_true(winnr('$') == 2)
2218 call assert_true(winnr() == 1)
2219 " Location list for the new window should be set
2220 call assert_true(getloclist(0)[2].text == 'Line 30')
2221
2222 " Open a scratch buffer
2223 " Open a new window and create a location list
2224 " Open the location list window and close the other window
2225 " Jump to an entry.
2226 " Should create a new window and jump to the entry. The scrtach buffer
2227 " should not be used.
2228 enew | only
2229 set buftype=nofile
2230 below new
2231 lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2232 lopen
2233 2wincmd c
2234 lnext
2235 call assert_true(winnr('$') == 3)
2236 call assert_true(winnr() == 2)
2237
2238 " Open two windows with two different location lists
2239 " Open the location list window and close the previous window
2240 " Jump to an entry in the location list window
2241 " Should open the file in the first window and not set the location list.
2242 enew | only
2243 lgetexpr ["F1%5%Line 5"]
2244 below new
2245 lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2246 lopen
2247 2wincmd c
2248 lnext
2249 call assert_true(winnr() == 1)
2250 call assert_true(getloclist(0)[0].text == 'Line 5')
2251
2252 enew | only
2253 cgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2254 copen
2255 cnext
2256 call assert_true(winnr('$') == 2)
2257 call assert_true(winnr() == 1)
2258
2259 enew | only
2260 set efm&vim
2261endfunc
Bram Moolenaaree85df32017-03-19 14:19:50 +01002262
2263func XvimgrepTests(cchar)
2264 call s:setup_commands(a:cchar)
2265
2266 call writefile(['Editor:VIM vim',
2267 \ 'Editor:Emacs EmAcS',
2268 \ 'Editor:Notepad NOTEPAD'], 'Xtestfile1')
2269 call writefile(['Linux', 'MacOS', 'MS-Windows'], 'Xtestfile2')
2270
2271 " Error cases
2272 call assert_fails('Xvimgrep /abc *', 'E682:')
2273
2274 let @/=''
2275 call assert_fails('Xvimgrep // *', 'E35:')
2276
2277 call assert_fails('Xvimgrep abc', 'E683:')
2278 call assert_fails('Xvimgrep a1b2c3 Xtestfile1', 'E480:')
2279 call assert_fails('Xvimgrep pat Xa1b2c3', 'E480:')
2280
2281 Xexpr ""
2282 Xvimgrepadd Notepad Xtestfile1
2283 Xvimgrepadd MacOS Xtestfile2
2284 let l = g:Xgetlist()
2285 call assert_equal(2, len(l))
2286 call assert_equal('Editor:Notepad NOTEPAD', l[0].text)
2287
2288 Xvimgrep #\cvim#g Xtestfile?
2289 let l = g:Xgetlist()
2290 call assert_equal(2, len(l))
2291 call assert_equal(8, l[0].col)
2292 call assert_equal(12, l[1].col)
2293
2294 1Xvimgrep ?Editor? Xtestfile*
2295 let l = g:Xgetlist()
2296 call assert_equal(1, len(l))
2297 call assert_equal('Editor:VIM vim', l[0].text)
2298
2299 edit +3 Xtestfile2
2300 Xvimgrep +\cemacs+j Xtestfile1
2301 let l = g:Xgetlist()
2302 call assert_equal('Xtestfile2', bufname(''))
2303 call assert_equal('Editor:Emacs EmAcS', l[0].text)
2304
2305 call delete('Xtestfile1')
2306 call delete('Xtestfile2')
2307endfunc
2308
2309" Tests for the :vimgrep command
2310func Test_vimgrep()
2311 call XvimgrepTests('c')
2312 call XvimgrepTests('l')
2313endfunc
Bram Moolenaar69f40be2017-04-02 15:15:49 +02002314
2315func XfreeTests(cchar)
2316 call s:setup_commands(a:cchar)
2317
2318 enew | only
2319
2320 " Deleting the quickfix stack should work even When the current list is
2321 " somewhere in the middle of the stack
2322 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2323 Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
2324 Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
2325 Xolder
2326 call g:Xsetlist([], 'f')
2327 call assert_equal(0, len(g:Xgetlist()))
2328
2329 " After deleting the stack, adding a new list should create a stack with a
2330 " single list.
2331 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2332 call assert_equal(1, g:Xgetlist({'all':1}).nr)
2333
2334 " Deleting the stack from a quickfix window should update/clear the
2335 " quickfix/location list window.
2336 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2337 Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
2338 Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
2339 Xolder
2340 Xwindow
2341 call g:Xsetlist([], 'f')
2342 call assert_equal(2, winnr('$'))
2343 call assert_equal(1, line('$'))
2344 Xclose
2345
2346 " Deleting the stack from a non-quickfix window should update/clear the
2347 " quickfix/location list window.
2348 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2349 Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
2350 Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
2351 Xolder
2352 Xwindow
2353 wincmd p
2354 call g:Xsetlist([], 'f')
2355 call assert_equal(0, len(g:Xgetlist()))
2356 wincmd p
2357 call assert_equal(2, winnr('$'))
2358 call assert_equal(1, line('$'))
2359
2360 " After deleting the location list stack, if the location list window is
2361 " opened, then a new location list should be created. So opening the
2362 " location list window again should not create a new window.
2363 if a:cchar == 'l'
2364 lexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2365 wincmd p
2366 lopen
2367 call assert_equal(2, winnr('$'))
2368 endif
2369 Xclose
2370endfunc
2371
Bram Moolenaar74240d32017-12-10 15:26:15 +01002372" Tests for the quickfix free functionality
Bram Moolenaar69f40be2017-04-02 15:15:49 +02002373func Test_qf_free()
2374 call XfreeTests('c')
2375 call XfreeTests('l')
2376endfunc
Bram Moolenaar6e62da32017-05-28 08:16:25 +02002377
2378" Test for buffer overflow when parsing lines and adding new entries to
2379" the quickfix list.
2380func Test_bufoverflow()
2381 set efm=%f:%l:%m
2382 cgetexpr ['File1:100:' . repeat('x', 1025)]
2383
2384 set efm=%+GCompiler:\ %.%#,%f:%l:%m
2385 cgetexpr ['Compiler: ' . repeat('a', 1015), 'File1:10:Hello World']
2386
2387 set efm=%DEntering\ directory\ %f,%f:%l:%m
2388 cgetexpr ['Entering directory ' . repeat('a', 1006),
2389 \ 'File1:10:Hello World']
2390 set efm&vim
2391endfunc
2392
Bram Moolenaar875feea2017-06-11 16:07:51 +02002393" Tests for getting the quickfix stack size
2394func XsizeTests(cchar)
2395 call s:setup_commands(a:cchar)
2396
2397 call g:Xsetlist([], 'f')
2398 call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
Bram Moolenaara6d48492017-12-12 22:45:31 +01002399 call assert_equal('', g:Xgetlist({'nr':'$', 'all':1}).title)
2400 call assert_equal(0, g:Xgetlist({'nr':0}).nr)
Bram Moolenaar875feea2017-06-11 16:07:51 +02002401
2402 Xexpr "File1:10:Line1"
2403 Xexpr "File2:20:Line2"
2404 Xexpr "File3:30:Line3"
2405 Xolder | Xolder
2406 call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
2407 call g:Xsetlist([], 'f')
2408
2409 Xexpr "File1:10:Line1"
2410 Xexpr "File2:20:Line2"
2411 Xexpr "File3:30:Line3"
2412 Xolder | Xolder
2413 call g:Xsetlist([], 'a', {'nr':'$', 'title':'Compiler'})
2414 call assert_equal('Compiler', g:Xgetlist({'nr':3, 'all':1}).title)
2415endfunc
2416
2417func Test_Qf_Size()
2418 call XsizeTests('c')
2419 call XsizeTests('l')
2420endfunc
Bram Moolenaar18141832017-06-25 21:17:25 +02002421
Bram Moolenaar9c4feff2017-06-28 22:26:54 +02002422func Test_cclose_from_copen()
2423 augroup QF_Test
2424 au!
2425 au FileType qf :call assert_fails(':cclose', 'E788')
2426 augroup END
2427 copen
2428 augroup QF_Test
2429 au!
2430 augroup END
2431 augroup! QF_Test
2432endfunc
2433
Bram Moolenaar18141832017-06-25 21:17:25 +02002434func Test_cclose_in_autocmd()
2435 " Problem is only triggered if "starting" is zero, so that the OptionsSet
2436 " event will be triggered.
2437 call test_override('starting', 1)
2438 augroup QF_Test
2439 au!
2440 au FileType qf :call assert_fails(':cclose', 'E788')
2441 augroup END
2442 copen
2443 augroup QF_Test
2444 au!
2445 augroup END
2446 augroup! QF_Test
2447 call test_override('starting', 0)
2448endfunc
Bram Moolenaar9c4feff2017-06-28 22:26:54 +02002449
2450func Test_resize_from_copen()
2451 augroup QF_Test
2452 au!
2453 au FileType qf resize 5
2454 augroup END
2455 try
2456 " This should succeed without any exception. No other buffers are
2457 " involved in the autocmd.
2458 copen
2459 finally
2460 augroup QF_Test
2461 au!
2462 augroup END
2463 augroup! QF_Test
2464 endtry
2465endfunc
Bram Moolenaara8788f42017-07-19 17:06:20 +02002466
2467" Tests for the quickfix buffer b:changedtick variable
2468func Xchangedtick_tests(cchar)
2469 call s:setup_commands(a:cchar)
2470
2471 new | only
2472
2473 Xexpr "" | Xexpr "" | Xexpr ""
2474
2475 Xopen
2476 Xolder
2477 Xolder
2478 Xaddexpr "F1:10:Line10"
2479 Xaddexpr "F2:20:Line20"
2480 call g:Xsetlist([{"filename":"F3", "lnum":30, "text":"Line30"}], 'a')
2481 call g:Xsetlist([], 'f')
2482 call assert_equal(8, getbufvar('%', 'changedtick'))
2483 Xclose
2484endfunc
2485
2486func Test_changedtick()
Bram Moolenaarae338332017-08-11 20:25:26 +02002487 call Xchangedtick_tests('c')
2488 call Xchangedtick_tests('l')
2489endfunc
2490
2491" Tests for parsing an expression using setqflist()
2492func Xsetexpr_tests(cchar)
2493 call s:setup_commands(a:cchar)
2494
2495 let t = ["File1:10:Line10", "File1:20:Line20"]
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002496 call g:Xsetlist([], ' ', {'lines' : t})
2497 call g:Xsetlist([], 'a', {'lines' : ["File1:30:Line30"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02002498
2499 let l = g:Xgetlist()
2500 call assert_equal(3, len(l))
2501 call assert_equal(20, l[1].lnum)
2502 call assert_equal('Line30', l[2].text)
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002503 call g:Xsetlist([], 'r', {'lines' : ["File2:5:Line5"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02002504 let l = g:Xgetlist()
2505 call assert_equal(1, len(l))
2506 call assert_equal('Line5', l[0].text)
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002507 call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : 10}))
2508 call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : "F1:10:L10"}))
Bram Moolenaarae338332017-08-11 20:25:26 +02002509
2510 call g:Xsetlist([], 'f')
2511 " Add entries to multiple lists
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002512 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:10:Line10"]})
2513 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:20:Line20"]})
2514 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:15:Line15"]})
2515 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:25:Line25"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02002516 call assert_equal('Line15', g:Xgetlist({'nr':1, 'items':1}).items[1].text)
2517 call assert_equal('Line25', g:Xgetlist({'nr':2, 'items':1}).items[1].text)
Bram Moolenaar36538222017-09-02 19:51:44 +02002518
2519 " Adding entries using a custom efm
2520 set efm&
2521 call g:Xsetlist([], ' ', {'efm' : '%f#%l#%m',
2522 \ 'lines' : ["F1#10#L10", "F2#20#L20"]})
2523 call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
2524 call g:Xsetlist([], 'a', {'efm' : '%f#%l#%m', 'lines' : ["F3:30:L30"]})
2525 call assert_equal('F3:30:L30', g:Xgetlist({'items':1}).items[2].text)
2526 call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
2527 call assert_equal(-1, g:Xsetlist([], 'a', {'efm' : [],
2528 \ 'lines' : ['F1:10:L10']}))
Bram Moolenaarae338332017-08-11 20:25:26 +02002529endfunc
2530
2531func Test_setexpr()
2532 call Xsetexpr_tests('c')
2533 call Xsetexpr_tests('l')
2534endfunc
2535
2536" Tests for per quickfix/location list directory stack
2537func Xmultidirstack_tests(cchar)
2538 call s:setup_commands(a:cchar)
2539
2540 call g:Xsetlist([], 'f')
2541 Xexpr "" | Xexpr ""
2542
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002543 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["Entering dir 'Xone/a'"]})
2544 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["Entering dir 'Xtwo/a'"]})
2545 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["one.txt:3:one one one"]})
2546 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["two.txt:5:two two two"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02002547
2548 let l1 = g:Xgetlist({'nr':1, 'items':1})
2549 let l2 = g:Xgetlist({'nr':2, 'items':1})
2550 call assert_equal('Xone/a/one.txt', bufname(l1.items[1].bufnr))
2551 call assert_equal(3, l1.items[1].lnum)
2552 call assert_equal('Xtwo/a/two.txt', bufname(l2.items[1].bufnr))
2553 call assert_equal(5, l2.items[1].lnum)
2554endfunc
2555
2556func Test_multidirstack()
2557 call mkdir('Xone/a', 'p')
2558 call mkdir('Xtwo/a', 'p')
2559 let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
2560 call writefile(lines, 'Xone/a/one.txt')
2561 call writefile(lines, 'Xtwo/a/two.txt')
2562 let save_efm = &efm
2563 set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
2564
2565 call Xmultidirstack_tests('c')
2566 call Xmultidirstack_tests('l')
2567
2568 let &efm = save_efm
2569 call delete('Xone', 'rf')
2570 call delete('Xtwo', 'rf')
2571endfunc
2572
2573" Tests for per quickfix/location list file stack
2574func Xmultifilestack_tests(cchar)
2575 call s:setup_commands(a:cchar)
2576
2577 call g:Xsetlist([], 'f')
2578 Xexpr "" | Xexpr ""
2579
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002580 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["[one.txt]"]})
2581 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["[two.txt]"]})
2582 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["(3,5) one one one"]})
2583 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["(5,9) two two two"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02002584
2585 let l1 = g:Xgetlist({'nr':1, 'items':1})
2586 let l2 = g:Xgetlist({'nr':2, 'items':1})
2587 call assert_equal('one.txt', bufname(l1.items[1].bufnr))
2588 call assert_equal(3, l1.items[1].lnum)
2589 call assert_equal('two.txt', bufname(l2.items[1].bufnr))
2590 call assert_equal(5, l2.items[1].lnum)
Bram Moolenaare333e792018-04-08 13:27:39 +02002591
2592 " Test for start of a new error line in the same line where a previous
2593 " error line ends with a file stack.
2594 let efm_val = 'Error\ l%l\ in\ %f,'
2595 let efm_val .= '%-P%>(%f%r,Error\ l%l\ in\ %m,%-Q)%r'
2596 let l = g:Xgetlist({'lines' : [
2597 \ '(one.txt',
2598 \ 'Error l4 in one.txt',
2599 \ ') (two.txt',
2600 \ 'Error l6 in two.txt',
2601 \ ')',
2602 \ 'Error l8 in one.txt'
2603 \ ], 'efm' : efm_val})
2604 call assert_equal(3, len(l.items))
2605 call assert_equal('one.txt', bufname(l.items[0].bufnr))
2606 call assert_equal(4, l.items[0].lnum)
2607 call assert_equal('one.txt', l.items[0].text)
2608 call assert_equal('two.txt', bufname(l.items[1].bufnr))
2609 call assert_equal(6, l.items[1].lnum)
2610 call assert_equal('two.txt', l.items[1].text)
2611 call assert_equal('one.txt', bufname(l.items[2].bufnr))
2612 call assert_equal(8, l.items[2].lnum)
2613 call assert_equal('', l.items[2].text)
Bram Moolenaarae338332017-08-11 20:25:26 +02002614endfunc
2615
2616func Test_multifilestack()
2617 let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
2618 call writefile(lines, 'one.txt')
2619 call writefile(lines, 'two.txt')
2620 let save_efm = &efm
2621 set efm=%+P[%f],(%l\\,%c)\ %m,%-Q
2622
2623 call Xmultifilestack_tests('c')
2624 call Xmultifilestack_tests('l')
2625
2626 let &efm = save_efm
2627 call delete('one.txt')
2628 call delete('two.txt')
2629endfunc
2630
2631" Tests for per buffer 'efm' setting
2632func Test_perbuf_efm()
2633 call writefile(["File1-10-Line10"], 'one.txt')
2634 call writefile(["File2#20#Line20"], 'two.txt')
2635 set efm=%f#%l#%m
2636 new | only
2637 new
2638 setlocal efm=%f-%l-%m
2639 cfile one.txt
2640 wincmd w
2641 caddfile two.txt
2642
2643 let l = getqflist()
2644 call assert_equal(10, l[0].lnum)
2645 call assert_equal('Line20', l[1].text)
2646
2647 set efm&
2648 new | only
2649 call delete('one.txt')
2650 call delete('two.txt')
Bram Moolenaara8788f42017-07-19 17:06:20 +02002651endfunc
Bram Moolenaard28cc3f2017-07-27 22:03:50 +02002652
2653" Open multiple help windows using ":lhelpgrep
2654" This test used to crash Vim
2655func Test_Multi_LL_Help()
2656 new | only
2657 lhelpgrep window
2658 lopen
2659 e#
2660 lhelpgrep buffer
2661 call assert_equal(3, winnr('$'))
2662 call assert_true(len(getloclist(1)) != 0)
2663 call assert_true(len(getloclist(2)) != 0)
2664 new | only
2665endfunc
Bram Moolenaar55b69262017-08-13 13:42:01 +02002666
2667" Tests for adding new quickfix lists using setqflist()
2668func XaddQf_tests(cchar)
2669 call s:setup_commands(a:cchar)
2670
2671 " Create a new list using ' ' for action
2672 call g:Xsetlist([], 'f')
2673 call g:Xsetlist([], ' ', {'title' : 'Test1'})
2674 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
2675 call assert_equal(1, l.nr)
2676 call assert_equal('Test1', l.title)
2677
2678 " Create a new list using ' ' for action and '$' for 'nr'
2679 call g:Xsetlist([], 'f')
2680 call g:Xsetlist([], ' ', {'title' : 'Test2', 'nr' : '$'})
2681 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
2682 call assert_equal(1, l.nr)
2683 call assert_equal('Test2', l.title)
2684
2685 " Create a new list using 'a' for action
2686 call g:Xsetlist([], 'f')
2687 call g:Xsetlist([], 'a', {'title' : 'Test3'})
2688 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
2689 call assert_equal(1, l.nr)
2690 call assert_equal('Test3', l.title)
2691
2692 " Create a new list using 'a' for action and '$' for 'nr'
2693 call g:Xsetlist([], 'f')
2694 call g:Xsetlist([], 'a', {'title' : 'Test3', 'nr' : '$'})
2695 call g:Xsetlist([], 'a', {'title' : 'Test4'})
2696 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
2697 call assert_equal(1, l.nr)
2698 call assert_equal('Test4', l.title)
2699
2700 " Adding a quickfix list should remove all the lists following the current
2701 " list.
2702 Xexpr "" | Xexpr "" | Xexpr ""
2703 silent! 10Xolder
2704 call g:Xsetlist([], ' ', {'title' : 'Test5'})
2705 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
2706 call assert_equal(2, l.nr)
2707 call assert_equal('Test5', l.title)
2708
2709 " Add a quickfix list using '$' as the list number.
2710 let lastqf = g:Xgetlist({'nr':'$'}).nr
2711 silent! 99Xolder
2712 call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test6'})
2713 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
2714 call assert_equal(lastqf + 1, l.nr)
2715 call assert_equal('Test6', l.title)
2716
2717 " Add a quickfix list using 'nr' set to one more than the quickfix
2718 " list size.
2719 let lastqf = g:Xgetlist({'nr':'$'}).nr
2720 silent! 99Xolder
2721 call g:Xsetlist([], ' ', {'nr' : lastqf + 1, 'title' : 'Test7'})
2722 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
2723 call assert_equal(lastqf + 1, l.nr)
2724 call assert_equal('Test7', l.title)
2725
2726 " Add a quickfix list to a stack with 10 lists using 'nr' set to '$'
2727 exe repeat('Xexpr "" |', 9) . 'Xexpr ""'
2728 silent! 99Xolder
2729 call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test8'})
2730 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
2731 call assert_equal(10, l.nr)
2732 call assert_equal('Test8', l.title)
2733
2734 " Add a quickfix list using 'nr' set to a value greater than 10
2735 call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 12, 'title' : 'Test9'}))
2736
2737 " Try adding a quickfix list with 'nr' set to a value greater than the
2738 " quickfix list size but less than 10.
2739 call g:Xsetlist([], 'f')
2740 Xexpr "" | Xexpr "" | Xexpr ""
2741 silent! 99Xolder
2742 call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 8, 'title' : 'Test10'}))
2743
2744 " Add a quickfix list using 'nr' set to a some string or list
2745 call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : [1,2], 'title' : 'Test11'}))
2746endfunc
2747
2748func Test_add_qf()
2749 call XaddQf_tests('c')
2750 call XaddQf_tests('l')
2751endfunc
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02002752
2753" Test for getting the quickfix list items from some text without modifying
2754" the quickfix stack
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002755func XgetListFromLines(cchar)
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02002756 call s:setup_commands(a:cchar)
2757 call g:Xsetlist([], 'f')
2758
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002759 let l = g:Xgetlist({'lines' : ["File2:20:Line20", "File2:30:Line30"]}).items
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02002760 call assert_equal(2, len(l))
2761 call assert_equal(30, l[1].lnum)
2762
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002763 call assert_equal({}, g:Xgetlist({'lines' : 10}))
2764 call assert_equal({}, g:Xgetlist({'lines' : 'File1:10:Line10'}))
2765 call assert_equal([], g:Xgetlist({'lines' : []}).items)
2766 call assert_equal([], g:Xgetlist({'lines' : [10, 20]}).items)
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02002767
Bram Moolenaar36538222017-09-02 19:51:44 +02002768 " Parse text using a custom efm
2769 set efm&
2770 let l = g:Xgetlist({'lines':['File3#30#Line30'], 'efm' : '%f#%l#%m'}).items
2771 call assert_equal('Line30', l[0].text)
2772 let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : '%f-%l-%m'}).items
2773 call assert_equal('File3:30:Line30', l[0].text)
2774 let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : [1,2]})
2775 call assert_equal({}, l)
2776 call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':'%2'})", 'E376:')
2777 call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':''})", 'E378:')
2778
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02002779 " Make sure that the quickfix stack is not modified
2780 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
2781endfunc
2782
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002783func Test_get_list_from_lines()
2784 call XgetListFromLines('c')
2785 call XgetListFromLines('l')
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02002786endfunc
Bram Moolenaara539f4f2017-08-30 20:33:55 +02002787
2788" Tests for the quickfix list id
2789func Xqfid_tests(cchar)
2790 call s:setup_commands(a:cchar)
2791
2792 call g:Xsetlist([], 'f')
Bram Moolenaara6d48492017-12-12 22:45:31 +01002793 call assert_equal(0, g:Xgetlist({'id':0}).id)
Bram Moolenaara539f4f2017-08-30 20:33:55 +02002794 Xexpr ''
2795 let start_id = g:Xgetlist({'id' : 0}).id
2796 Xexpr '' | Xexpr ''
2797 Xolder
2798 call assert_equal(start_id, g:Xgetlist({'id':0, 'nr':1}).id)
2799 call assert_equal(start_id + 1, g:Xgetlist({'id':0, 'nr':0}).id)
2800 call assert_equal(start_id + 2, g:Xgetlist({'id':0, 'nr':'$'}).id)
Bram Moolenaara6d48492017-12-12 22:45:31 +01002801 call assert_equal(0, g:Xgetlist({'id':0, 'nr':99}).id)
Bram Moolenaara539f4f2017-08-30 20:33:55 +02002802 call assert_equal(2, g:Xgetlist({'id':start_id + 1, 'nr':0}).nr)
Bram Moolenaara6d48492017-12-12 22:45:31 +01002803 call assert_equal(0, g:Xgetlist({'id':99, 'nr':0}).id)
2804 call assert_equal(0, g:Xgetlist({'id':"abc", 'nr':0}).id)
Bram Moolenaara539f4f2017-08-30 20:33:55 +02002805
2806 call g:Xsetlist([], 'a', {'id':start_id, 'context':[1,2]})
2807 call assert_equal([1,2], g:Xgetlist({'nr':1, 'context':1}).context)
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002808 call g:Xsetlist([], 'a', {'id':start_id+1, 'lines':['F1:10:L10']})
Bram Moolenaara539f4f2017-08-30 20:33:55 +02002809 call assert_equal('L10', g:Xgetlist({'nr':2, 'items':1}).items[0].text)
2810 call assert_equal(-1, g:Xsetlist([], 'a', {'id':999, 'title':'Vim'}))
2811 call assert_equal(-1, g:Xsetlist([], 'a', {'id':'abc', 'title':'Vim'}))
2812
2813 let qfid = g:Xgetlist({'id':0, 'nr':0})
2814 call g:Xsetlist([], 'f')
Bram Moolenaara6d48492017-12-12 22:45:31 +01002815 call assert_equal(0, g:Xgetlist({'id':qfid, 'nr':0}).id)
Bram Moolenaara539f4f2017-08-30 20:33:55 +02002816endfunc
2817
2818func Test_qf_id()
2819 call Xqfid_tests('c')
2820 call Xqfid_tests('l')
2821endfunc
Bram Moolenaar74240d32017-12-10 15:26:15 +01002822
2823func Xqfjump_tests(cchar)
2824 call s:setup_commands(a:cchar)
2825
2826 call writefile(["Line1\tFoo", "Line2"], 'F1')
2827 call writefile(["Line1\tBar", "Line2"], 'F2')
2828 call writefile(["Line1\tBaz", "Line2"], 'F3')
2829
2830 call g:Xsetlist([], 'f')
2831
2832 " Tests for
2833 " Jumping to a line using a pattern
2834 " Jumping to a column greater than the last column in a line
2835 " Jumping to a line greater than the last line in the file
2836 let l = []
2837 for i in range(1, 7)
2838 call add(l, {})
2839 endfor
2840 let l[0].filename='F1'
2841 let l[0].pattern='Line1'
2842 let l[1].filename='F2'
2843 let l[1].pattern='Line1'
2844 let l[2].filename='F3'
2845 let l[2].pattern='Line1'
2846 let l[3].filename='F3'
2847 let l[3].lnum=1
2848 let l[3].col=9
2849 let l[3].vcol=1
2850 let l[4].filename='F3'
2851 let l[4].lnum=99
2852 let l[5].filename='F3'
2853 let l[5].lnum=1
2854 let l[5].col=99
2855 let l[5].vcol=1
2856 let l[6].filename='F3'
2857 let l[6].pattern='abcxyz'
2858
2859 call g:Xsetlist([], ' ', {'items' : l})
2860 Xopen | only
2861 2Xnext
2862 call assert_equal(3, g:Xgetlist({'idx' : 0}).idx)
2863 call assert_equal('F3', bufname('%'))
2864 Xnext
2865 call assert_equal(7, col('.'))
2866 Xnext
2867 call assert_equal(2, line('.'))
2868 Xnext
2869 call assert_equal(9, col('.'))
2870 2
2871 Xnext
2872 call assert_equal(2, line('.'))
2873
2874 if a:cchar == 'l'
2875 " When jumping to a location list entry in the location list window and
2876 " no usable windows are available, then a new window should be opened.
2877 enew! | new | only
2878 call g:Xsetlist([], 'f')
2879 setlocal buftype=nofile
2880 new
2881 call g:Xsetlist([], ' ', {'lines' : ['F1:1:1:Line1', 'F1:2:2:Line2', 'F2:1:1:Line1', 'F2:2:2:Line2', 'F3:1:1:Line1', 'F3:2:2:Line2']})
2882 Xopen
2883 let winid = win_getid()
2884 wincmd p
2885 close
2886 call win_gotoid(winid)
2887 Xnext
2888 call assert_equal(3, winnr('$'))
2889 call assert_equal(1, winnr())
2890 call assert_equal(2, line('.'))
2891
2892 " When jumping to an entry in the location list window and the window
2893 " associated with the location list is not present and a window containing
2894 " the file is already present, then that window should be used.
2895 close
2896 belowright new
2897 call g:Xsetlist([], 'f')
2898 edit F3
2899 call win_gotoid(winid)
2900 Xlast
2901 call assert_equal(3, winnr())
2902 call assert_equal(6, g:Xgetlist({'size' : 1}).size)
2903 call assert_equal(winid, g:Xgetlist({'winid' : 1}).winid)
2904 endif
2905
2906 " Cleanup
2907 enew!
2908 new | only
2909
2910 call delete('F1')
2911 call delete('F2')
2912 call delete('F3')
2913endfunc
2914
2915func Test_qfjump()
2916 call Xqfjump_tests('c')
2917 call Xqfjump_tests('l')
2918endfunc
Bram Moolenaara6d48492017-12-12 22:45:31 +01002919
2920" Tests for the getqflist() and getloclist() functions when the list is not
2921" present or is empty
2922func Xgetlist_empty_tests(cchar)
2923 call s:setup_commands(a:cchar)
2924
2925 " Empty quickfix stack
2926 call g:Xsetlist([], 'f')
2927 call assert_equal('', g:Xgetlist({'context' : 0}).context)
2928 call assert_equal(0, g:Xgetlist({'id' : 0}).id)
2929 call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
2930 call assert_equal([], g:Xgetlist({'items' : 0}).items)
2931 call assert_equal(0, g:Xgetlist({'nr' : 0}).nr)
2932 call assert_equal(0, g:Xgetlist({'size' : 0}).size)
2933 call assert_equal('', g:Xgetlist({'title' : 0}).title)
2934 call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
Bram Moolenaarb254af32017-12-18 19:48:58 +01002935 call assert_equal(0, g:Xgetlist({'changedtick' : 0}).changedtick)
2936 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0, 'changedtick': 0}, g:Xgetlist({'all' : 0}))
Bram Moolenaara6d48492017-12-12 22:45:31 +01002937
Bram Moolenaar2ec364e2018-01-27 11:52:13 +01002938 " Quickfix window with empty stack
2939 silent! Xopen
2940 let qfwinid = (a:cchar == 'c') ? win_getid() : 0
2941 call assert_equal(qfwinid, g:Xgetlist({'winid' : 0}).winid)
2942 Xclose
2943
Bram Moolenaara6d48492017-12-12 22:45:31 +01002944 " Empty quickfix list
2945 Xexpr ""
2946 call assert_equal('', g:Xgetlist({'context' : 0}).context)
2947 call assert_notequal(0, g:Xgetlist({'id' : 0}).id)
2948 call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
2949 call assert_equal([], g:Xgetlist({'items' : 0}).items)
2950 call assert_notequal(0, g:Xgetlist({'nr' : 0}).nr)
2951 call assert_equal(0, g:Xgetlist({'size' : 0}).size)
2952 call assert_notequal('', g:Xgetlist({'title' : 0}).title)
2953 call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
Bram Moolenaarb254af32017-12-18 19:48:58 +01002954 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
Bram Moolenaara6d48492017-12-12 22:45:31 +01002955
2956 let qfid = g:Xgetlist({'id' : 0}).id
2957 call g:Xsetlist([], 'f')
2958
2959 " Non-existing quickfix identifier
2960 call assert_equal('', g:Xgetlist({'id' : qfid, 'context' : 0}).context)
2961 call assert_equal(0, g:Xgetlist({'id' : qfid}).id)
2962 call assert_equal(0, g:Xgetlist({'id' : qfid, 'idx' : 0}).idx)
2963 call assert_equal([], g:Xgetlist({'id' : qfid, 'items' : 0}).items)
2964 call assert_equal(0, g:Xgetlist({'id' : qfid, 'nr' : 0}).nr)
2965 call assert_equal(0, g:Xgetlist({'id' : qfid, 'size' : 0}).size)
2966 call assert_equal('', g:Xgetlist({'id' : qfid, 'title' : 0}).title)
2967 call assert_equal(0, g:Xgetlist({'id' : qfid, 'winid' : 0}).winid)
Bram Moolenaarb254af32017-12-18 19:48:58 +01002968 call assert_equal(0, g:Xgetlist({'id' : qfid, 'changedtick' : 0}).changedtick)
2969 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0, 'changedtick' : 0}, g:Xgetlist({'id' : qfid, 'all' : 0}))
Bram Moolenaara6d48492017-12-12 22:45:31 +01002970
2971 " Non-existing quickfix list number
2972 call assert_equal('', g:Xgetlist({'nr' : 5, 'context' : 0}).context)
2973 call assert_equal(0, g:Xgetlist({'nr' : 5}).nr)
2974 call assert_equal(0, g:Xgetlist({'nr' : 5, 'idx' : 0}).idx)
2975 call assert_equal([], g:Xgetlist({'nr' : 5, 'items' : 0}).items)
2976 call assert_equal(0, g:Xgetlist({'nr' : 5, 'id' : 0}).id)
2977 call assert_equal(0, g:Xgetlist({'nr' : 5, 'size' : 0}).size)
2978 call assert_equal('', g:Xgetlist({'nr' : 5, 'title' : 0}).title)
2979 call assert_equal(0, g:Xgetlist({'nr' : 5, 'winid' : 0}).winid)
Bram Moolenaarb254af32017-12-18 19:48:58 +01002980 call assert_equal(0, g:Xgetlist({'nr' : 5, 'changedtick' : 0}).changedtick)
2981 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0, 'changedtick' : 0}, g:Xgetlist({'nr' : 5, 'all' : 0}))
Bram Moolenaara6d48492017-12-12 22:45:31 +01002982endfunc
2983
2984func Test_getqflist()
2985 call Xgetlist_empty_tests('c')
2986 call Xgetlist_empty_tests('l')
2987endfunc
Bram Moolenaarb254af32017-12-18 19:48:58 +01002988
Bram Moolenaara0ca7d02017-12-19 10:22:19 +01002989func Test_getqflist_invalid_nr()
2990 " The following commands used to crash Vim
2991 cexpr ""
2992 call getqflist({'nr' : $XXX_DOES_NOT_EXIST_XXX})
2993
2994 " Cleanup
2995 call setqflist([], 'r')
2996endfunc
2997
Bram Moolenaarb254af32017-12-18 19:48:58 +01002998" Tests for the quickfix/location list changedtick
2999func Xqftick_tests(cchar)
3000 call s:setup_commands(a:cchar)
3001
3002 call g:Xsetlist([], 'f')
3003
3004 Xexpr "F1:10:Line10"
3005 let qfid = g:Xgetlist({'id' : 0}).id
3006 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3007 Xaddexpr "F2:20:Line20\nF2:21:Line21"
3008 call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3009 call g:Xsetlist([], 'a', {'lines' : ["F3:30:Line30", "F3:31:Line31"]})
3010 call assert_equal(3, g:Xgetlist({'changedtick' : 0}).changedtick)
3011 call g:Xsetlist([], 'r', {'lines' : ["F4:40:Line40"]})
3012 call assert_equal(4, g:Xgetlist({'changedtick' : 0}).changedtick)
3013 call g:Xsetlist([], 'a', {'title' : 'New Title'})
3014 call assert_equal(5, g:Xgetlist({'changedtick' : 0}).changedtick)
3015
3016 enew!
3017 call append(0, ["F5:50:L50", "F6:60:L60"])
3018 Xaddbuffer
3019 call assert_equal(6, g:Xgetlist({'changedtick' : 0}).changedtick)
3020 enew!
3021
3022 call g:Xsetlist([], 'a', {'context' : {'bus' : 'pci'}})
3023 call assert_equal(7, g:Xgetlist({'changedtick' : 0}).changedtick)
3024 call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3025 \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'a')
3026 call assert_equal(8, g:Xgetlist({'changedtick' : 0}).changedtick)
3027 call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3028 \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], ' ')
3029 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3030 call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3031 \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'r')
3032 call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3033
3034 call writefile(["F8:80:L80", "F8:81:L81"], "Xone")
3035 Xfile Xone
3036 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3037 Xaddfile Xone
3038 call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3039
3040 " Test case for updating a non-current quickfix list
3041 call g:Xsetlist([], 'f')
3042 Xexpr "F1:1:L1"
3043 Xexpr "F2:2:L2"
3044 call g:Xsetlist([], 'a', {'nr' : 1, "lines" : ["F10:10:L10"]})
3045 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3046 call assert_equal(2, g:Xgetlist({'nr' : 1, 'changedtick' : 0}).changedtick)
3047
3048 call delete("Xone")
3049endfunc
3050
3051func Test_qf_tick()
3052 call Xqftick_tests('c')
3053 call Xqftick_tests('l')
3054endfunc
Bram Moolenaar12237442017-12-19 12:38:52 +01003055
3056" The following test used to crash Vim.
3057" Open the location list window and close the regular window associated with
3058" the location list. When the garbage collection runs now, it incorrectly
3059" marks the location list context as not in use and frees the context.
3060func Test_ll_window_ctx()
3061 call setloclist(0, [], 'f')
3062 call setloclist(0, [], 'a', {'context' : []})
3063 lopen | only
3064 call test_garbagecollect_now()
3065 echo getloclist(0, {'context' : 1}).context
3066 enew | only
3067endfunc
3068
Bram Moolenaar14a4deb2017-12-19 16:48:55 +01003069" The following test used to crash vim
3070func Test_lfile_crash()
3071 sp Xtest
3072 au QuickFixCmdPre * bw
3073 call assert_fails('lfile', 'E40')
3074 au! QuickFixCmdPre
3075endfunc
Bram Moolenaar3c097222017-12-21 20:54:49 +01003076
3077" The following test used to crash vim
3078func Test_lbuffer_crash()
3079 sv Xtest
3080 augroup QF_Test
3081 au!
3082 au * * bw
3083 augroup END
3084 lbuffer
3085 augroup QF_Test
3086 au!
3087 augroup END
3088endfunc
3089
3090" The following test used to crash vim
3091func Test_lexpr_crash()
3092 augroup QF_Test
3093 au!
3094 au * * call setloclist(0, [], 'f')
3095 augroup END
3096 lexpr ""
3097 augroup QF_Test
3098 au!
3099 augroup END
3100 enew | only
3101endfunc
3102
3103" The following test used to crash Vim
3104func Test_lvimgrep_crash()
3105 sv Xtest
3106 augroup QF_Test
3107 au!
3108 au * * call setloclist(0, [], 'f')
3109 augroup END
3110 lvimgrep quickfix test_quickfix.vim
3111 augroup QF_Test
3112 au!
3113 augroup END
3114 enew | only
3115endfunc
Bram Moolenaarde046542017-12-26 13:53:11 +01003116
3117" Test for the position of the quickfix and location list window
3118func Test_qfwin_pos()
3119 " Open two windows
3120 new | only
3121 new
3122 cexpr ['F1:10:L10']
3123 copen
3124 " Quickfix window should be the bottom most window
3125 call assert_equal(3, winnr())
3126 close
3127 " Open at the very top
3128 wincmd t
3129 topleft copen
3130 call assert_equal(1, winnr())
3131 close
3132 " open left of the current window
3133 wincmd t
3134 below new
3135 leftabove copen
3136 call assert_equal(2, winnr())
3137 close
3138 " open right of the current window
3139 rightbelow copen
3140 call assert_equal(3, winnr())
3141 close
3142endfunc
Bram Moolenaare1bb8792018-04-06 22:58:23 +02003143
3144" Tests for quickfix/location lists changed by autocommands when
3145" :vimgrep/:lvimgrep commands are running.
3146func Test_vimgrep_autocmd()
3147 call setqflist([], 'f')
3148 call writefile(['stars'], 'Xtest1.txt')
3149 call writefile(['stars'], 'Xtest2.txt')
3150
3151 " Test 1:
3152 " When searching for a pattern using :vimgrep, if the quickfix list is
3153 " changed by an autocmd, the results should be added to the correct quickfix
3154 " list.
3155 autocmd BufRead Xtest2.txt cexpr '' | cexpr ''
3156 silent vimgrep stars Xtest*.txt
3157 call assert_equal(1, getqflist({'nr' : 0}).nr)
3158 call assert_equal(3, getqflist({'nr' : '$'}).nr)
3159 call assert_equal('Xtest2.txt', bufname(getqflist()[1].bufnr))
3160 au! BufRead Xtest2.txt
3161
3162 " Test 2:
3163 " When searching for a pattern using :vimgrep, if the quickfix list is
3164 " freed, then a error should be given.
3165 silent! %bwipe!
3166 call setqflist([], 'f')
3167 autocmd BufRead Xtest2.txt for i in range(10) | cexpr '' | endfor
3168 call assert_fails('vimgrep stars Xtest*.txt', 'E925:')
3169 au! BufRead Xtest2.txt
3170
3171 " Test 3:
3172 " When searching for a pattern using :lvimgrep, if the location list is
3173 " freed, then the command should error out.
3174 silent! %bwipe!
3175 let g:save_winid = win_getid()
3176 autocmd BufRead Xtest2.txt call setloclist(g:save_winid, [], 'f')
3177 call assert_fails('lvimgrep stars Xtest*.txt', 'E926:')
3178 au! BufRead Xtest2.txt
3179
3180 call delete('Xtest1.txt')
3181 call delete('Xtest2.txt')
3182 call setqflist([], 'f')
3183endfunc
Bram Moolenaar3b9474b2018-04-23 21:29:48 +02003184
3185" The following test used to crash Vim
3186func Test_lhelpgrep_autocmd()
3187 lhelpgrep quickfix
3188 autocmd QuickFixCmdPost * call setloclist(0, [], 'f')
3189 lhelpgrep buffer
3190 call assert_equal('help', &filetype)
3191 call assert_equal(0, getloclist(0, {'nr' : '$'}).nr)
3192 lhelpgrep tabpage
3193 call assert_equal('help', &filetype)
3194 call assert_equal(1, getloclist(0, {'nr' : '$'}).nr)
3195 au! QuickFixCmdPost
3196 new | only
3197endfunc