blob: 98afdb159366636579d8e126a91e32f12caf7af3 [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 Moolenaar3ef5bf72016-06-15 22:41:31 +020014 command! -nargs=* Xolder <mods>colder <args>
15 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>
27 command! -nargs=* -bang Xnext <mods>cnext<bang> <args>
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +020028 command! -nargs=* -bang Xprev <mods>cprev<bang> <args>
29 command! -nargs=* -bang Xfirst <mods>cfirst<bang> <args>
30 command! -nargs=* -bang Xlast <mods>clast<bang> <args>
31 command! -nargs=* -bang Xnfile <mods>cnfile<bang> <args>
32 command! -nargs=* -bang Xpfile <mods>cpfile<bang> <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020033 command! -nargs=* Xexpr <mods>cexpr <args>
34 command! -nargs=* Xvimgrep <mods>vimgrep <args>
Bram Moolenaar049cba92016-06-26 14:38:04 +020035 command! -nargs=* Xgrep <mods> grep <args>
36 command! -nargs=* Xgrepadd <mods> grepadd <args>
37 command! -nargs=* Xhelpgrep helpgrep <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020038 let g:Xgetlist = function('getqflist')
39 let g:Xsetlist = function('setqflist')
40 else
41 command! -nargs=* -bang Xlist <mods>llist<bang> <args>
42 command! -nargs=* Xgetexpr <mods>lgetexpr <args>
Bram Moolenaar361c8f02016-07-02 15:41:47 +020043 command! -nargs=* Xaddexpr <mods>laddexpr <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020044 command! -nargs=* Xolder <mods>lolder <args>
45 command! -nargs=* Xnewer <mods>lnewer <args>
46 command! -nargs=* Xopen <mods>lopen <args>
47 command! -nargs=* Xwindow <mods>lwindow <args>
Bram Moolenaar537ef082016-07-09 17:56:19 +020048 command! -nargs=* Xbottom <mods>lbottom <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020049 command! -nargs=* Xclose <mods>lclose <args>
50 command! -nargs=* -bang Xfile <mods>lfile<bang> <args>
51 command! -nargs=* Xgetfile <mods>lgetfile <args>
52 command! -nargs=* Xaddfile <mods>laddfile <args>
53 command! -nargs=* -bang Xbuffer <mods>lbuffer<bang> <args>
54 command! -nargs=* Xgetbuffer <mods>lgetbuffer <args>
55 command! -nargs=* Xaddbuffer <mods>laddbuffer <args>
56 command! -nargs=* Xrewind <mods>lrewind <args>
57 command! -nargs=* -bang Xnext <mods>lnext<bang> <args>
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +020058 command! -nargs=* -bang Xprev <mods>lprev<bang> <args>
59 command! -nargs=* -bang Xfirst <mods>lfirst<bang> <args>
60 command! -nargs=* -bang Xlast <mods>llast<bang> <args>
61 command! -nargs=* -bang Xnfile <mods>lnfile<bang> <args>
62 command! -nargs=* -bang Xpfile <mods>lpfile<bang> <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020063 command! -nargs=* Xexpr <mods>lexpr <args>
64 command! -nargs=* Xvimgrep <mods>lvimgrep <args>
Bram Moolenaar049cba92016-06-26 14:38:04 +020065 command! -nargs=* Xgrep <mods> lgrep <args>
66 command! -nargs=* Xgrepadd <mods> lgrepadd <args>
67 command! -nargs=* Xhelpgrep lhelpgrep <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020068 let g:Xgetlist = function('getloclist', [0])
69 let g:Xsetlist = function('setloclist', [0])
70 endif
Bram Moolenaar2b946c92016-11-12 18:14:44 +010071endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020072
Bram Moolenaarda59dd52016-01-05 21:59:58 +010073" Tests for the :clist and :llist commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +010074func XlistTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020075 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +010076
77 " With an empty list, command should return error
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020078 Xgetexpr []
79 silent! Xlist
Bram Moolenaarda59dd52016-01-05 21:59:58 +010080 call assert_true(v:errmsg ==# 'E42: No Errors')
81
82 " Populate the list and then try
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020083 Xgetexpr ['non-error 1', 'Xtestfile1:1:3:Line1',
Bram Moolenaarda59dd52016-01-05 21:59:58 +010084 \ 'non-error 2', 'Xtestfile2:2:2:Line2',
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020085 \ 'non-error 3', 'Xtestfile3:3:1:Line3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +010086
87 " List only valid entries
88 redir => result
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020089 Xlist
Bram Moolenaarda59dd52016-01-05 21:59:58 +010090 redir END
91 let l = split(result, "\n")
92 call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
93 \ ' 4 Xtestfile2:2 col 2: Line2',
94 \ ' 6 Xtestfile3:3 col 1: Line3'], l)
95
96 " List all the entries
97 redir => result
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020098 Xlist!
Bram Moolenaarda59dd52016-01-05 21:59:58 +010099 redir END
100 let l = split(result, "\n")
101 call assert_equal([' 1: non-error 1', ' 2 Xtestfile1:1 col 3: Line1',
102 \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2',
103 \ ' 5: non-error 3', ' 6 Xtestfile3:3 col 1: Line3'], l)
104
105 " List a range of errors
106 redir => result
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200107 Xlist 3,6
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100108 redir END
109 let l = split(result, "\n")
110 call assert_equal([' 4 Xtestfile2:2 col 2: Line2',
111 \ ' 6 Xtestfile3:3 col 1: Line3'], l)
112
113 redir => result
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200114 Xlist! 3,4
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100115 redir END
116 let l = split(result, "\n")
117 call assert_equal([' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
118
119 redir => result
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200120 Xlist -6,-4
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100121 redir END
122 let l = split(result, "\n")
123 call assert_equal([' 2 Xtestfile1:1 col 3: Line1'], l)
124
125 redir => result
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200126 Xlist! -5,-3
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100127 redir END
128 let l = split(result, "\n")
129 call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
130 \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100131endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100132
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100133func Test_clist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100134 call XlistTests('c')
135 call XlistTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100136endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100137
138" Tests for the :colder, :cnewer, :lolder and :lnewer commands
139" Note that this test assumes that a quickfix/location list is
Bram Moolenaarcfc0a352016-01-09 20:23:00 +0100140" already set by the caller.
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100141func XageTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200142 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100143
144 " Jumping to a non existent list should return error
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200145 silent! Xolder 99
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100146 call assert_true(v:errmsg ==# 'E380: At bottom of quickfix stack')
147
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200148 silent! Xnewer 99
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100149 call assert_true(v:errmsg ==# 'E381: At top of quickfix stack')
150
151 " Add three quickfix/location lists
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200152 Xgetexpr ['Xtestfile1:1:3:Line1']
153 Xgetexpr ['Xtestfile2:2:2:Line2']
154 Xgetexpr ['Xtestfile3:3:1:Line3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100155
156 " Go back two lists
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200157 Xolder
158 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100159 call assert_equal('Line2', l[0].text)
160
161 " Go forward two lists
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200162 Xnewer
163 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100164 call assert_equal('Line3', l[0].text)
165
166 " Test for the optional count argument
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200167 Xolder 2
168 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100169 call assert_equal('Line1', l[0].text)
170
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200171 Xnewer 2
172 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100173 call assert_equal('Line3', l[0].text)
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100174endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100175
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100176func Test_cage()
Bram Moolenaarcfc0a352016-01-09 20:23:00 +0100177 let list = [{'bufnr': 1, 'lnum': 1}]
178 call setqflist(list)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100179 call XageTests('c')
Bram Moolenaarcfc0a352016-01-09 20:23:00 +0100180
181 call setloclist(0, list)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100182 call XageTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100183endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100184
185" Tests for the :cwindow, :lwindow :cclose, :lclose, :copen and :lopen
186" commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100187func XwindowTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200188 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100189
190 " Create a list with no valid entries
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200191 Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100192
193 " Quickfix/Location window should not open with no valid errors
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200194 Xwindow
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100195 call assert_true(winnr('$') == 1)
196
197 " Create a list with valid entries
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200198 Xgetexpr ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2',
199 \ 'Xtestfile3:3:1:Line3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100200
201 " Open the window
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200202 Xwindow
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100203 call assert_true(winnr('$') == 2 && winnr() == 2 &&
204 \ getline('.') ==# 'Xtestfile1|1 col 3| Line1')
Bram Moolenaar537ef082016-07-09 17:56:19 +0200205 redraw!
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100206
207 " Close the window
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200208 Xclose
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100209 call assert_true(winnr('$') == 1)
210
211 " Create a list with no valid entries
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200212 Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100213
214 " Open the window
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200215 Xopen 5
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100216 call assert_true(winnr('$') == 2 && getline('.') ==# '|| non-error 1'
217 \ && winheight('.') == 5)
218
219 " Opening the window again, should move the cursor to that window
220 wincmd t
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200221 Xopen 7
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100222 call assert_true(winnr('$') == 2 && winnr() == 2 &&
223 \ winheight('.') == 7 &&
224 \ getline('.') ==# '|| non-error 1')
225
226
227 " Calling cwindow should close the quickfix window with no valid errors
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200228 Xwindow
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100229 call assert_true(winnr('$') == 1)
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100230endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100231
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100232func Test_cwindow()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100233 call XwindowTests('c')
234 call XwindowTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100235endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100236
237" Tests for the :cfile, :lfile, :caddfile, :laddfile, :cgetfile and :lgetfile
238" commands.
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100239func XfileTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200240 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100241
242 call writefile(['Xtestfile1:700:10:Line 700',
243 \ 'Xtestfile2:800:15:Line 800'], 'Xqftestfile1')
244
245 enew!
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200246 Xfile Xqftestfile1
247 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100248 call assert_true(len(l) == 2 &&
249 \ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
250 \ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
251
Bram Moolenaar049cba92016-06-26 14:38:04 +0200252 " Test with a non existent file
253 call assert_fails('Xfile non_existent_file', 'E40')
254
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100255 " Run cfile/lfile from a modified buffer
256 enew!
257 silent! put ='Quickfix'
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200258 silent! Xfile Xqftestfile1
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100259 call assert_true(v:errmsg ==# 'E37: No write since last change (add ! to override)')
260
261 call writefile(['Xtestfile3:900:30:Line 900'], 'Xqftestfile1')
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200262 Xaddfile Xqftestfile1
263 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100264 call assert_true(len(l) == 3 &&
265 \ l[2].lnum == 900 && l[2].col == 30 && l[2].text ==# 'Line 900')
266
267 call writefile(['Xtestfile1:222:77:Line 222',
268 \ 'Xtestfile2:333:88:Line 333'], 'Xqftestfile1')
269
270 enew!
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200271 Xgetfile Xqftestfile1
272 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100273 call assert_true(len(l) == 2 &&
274 \ l[0].lnum == 222 && l[0].col == 77 && l[0].text ==# 'Line 222' &&
275 \ l[1].lnum == 333 && l[1].col == 88 && l[1].text ==# 'Line 333')
276
277 call delete('Xqftestfile1')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100278endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100279
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100280func Test_cfile()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100281 call XfileTests('c')
282 call XfileTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100283endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100284
285" Tests for the :cbuffer, :lbuffer, :caddbuffer, :laddbuffer, :cgetbuffer and
286" :lgetbuffer commands.
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100287func XbufferTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200288 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100289
290 enew!
291 silent! call setline(1, ['Xtestfile7:700:10:Line 700',
292 \ 'Xtestfile8:800:15:Line 800'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200293 Xbuffer!
294 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100295 call assert_true(len(l) == 2 &&
296 \ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
297 \ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
298
299 enew!
300 silent! call setline(1, ['Xtestfile9:900:55:Line 900',
301 \ 'Xtestfile10:950:66:Line 950'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200302 Xgetbuffer
303 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100304 call assert_true(len(l) == 2 &&
305 \ l[0].lnum == 900 && l[0].col == 55 && l[0].text ==# 'Line 900' &&
306 \ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950')
307
308 enew!
309 silent! call setline(1, ['Xtestfile11:700:20:Line 700',
310 \ 'Xtestfile12:750:25:Line 750'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200311 Xaddbuffer
312 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100313 call assert_true(len(l) == 4 &&
314 \ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950' &&
315 \ l[2].lnum == 700 && l[2].col == 20 && l[2].text ==# 'Line 700' &&
316 \ l[3].lnum == 750 && l[3].col == 25 && l[3].text ==# 'Line 750')
Bram Moolenaarab47c612016-06-14 22:02:26 +0200317 enew!
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100318
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100319endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100320
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100321func Test_cbuffer()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100322 call XbufferTests('c')
323 call XbufferTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100324endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100325
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100326func XexprTests(cchar)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200327 call s:setup_commands(a:cchar)
328
329 call assert_fails('Xexpr 10', 'E777:')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100330endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200331
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100332func Test_cexpr()
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200333 call XexprTests('c')
334 call XexprTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100335endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200336
337" Tests for :cnext, :cprev, :cfirst, :clast commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100338func Xtest_browse(cchar)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200339 call s:setup_commands(a:cchar)
340
341 call s:create_test_file('Xqftestfile1')
342 call s:create_test_file('Xqftestfile2')
343
344 Xgetexpr ['Xqftestfile1:5:Line5',
345 \ 'Xqftestfile1:6:Line6',
346 \ 'Xqftestfile2:10:Line10',
347 \ 'Xqftestfile2:11:Line11']
348
349 Xfirst
350 call assert_fails('Xprev', 'E553')
351 call assert_fails('Xpfile', 'E553')
352 Xnfile
353 call assert_equal('Xqftestfile2', bufname('%'))
354 call assert_equal(10, line('.'))
355 Xpfile
356 call assert_equal('Xqftestfile1', bufname('%'))
357 call assert_equal(6, line('.'))
358 Xlast
359 call assert_equal('Xqftestfile2', bufname('%'))
360 call assert_equal(11, line('.'))
361 call assert_fails('Xnext', 'E553')
362 call assert_fails('Xnfile', 'E553')
363 Xrewind
364 call assert_equal('Xqftestfile1', bufname('%'))
365 call assert_equal(5, line('.'))
366
367 call delete('Xqftestfile1')
368 call delete('Xqftestfile2')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100369endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200370
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100371func Test_browse()
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200372 call Xtest_browse('c')
373 call Xtest_browse('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100374endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200375
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100376func Test_nomem()
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200377 call test_alloc_fail(GetAllocId('qf_dirname_start'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100378 call assert_fails('vimgrep vim runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100379
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200380 call test_alloc_fail(GetAllocId('qf_dirname_now'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100381 call assert_fails('vimgrep vim runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100382
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200383 call test_alloc_fail(GetAllocId('qf_namebuf'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100384 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100385
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200386 call test_alloc_fail(GetAllocId('qf_errmsg'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100387 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100388
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200389 call test_alloc_fail(GetAllocId('qf_pattern'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100390 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100391
392endfunc
393
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100394func s:test_xhelpgrep(cchar)
Bram Moolenaar049cba92016-06-26 14:38:04 +0200395 call s:setup_commands(a:cchar)
396 Xhelpgrep quickfix
397 Xopen
398 if a:cchar == 'c'
399 let title_text = ':helpgrep quickfix'
400 else
401 let title_text = ':lhelpgrep quickfix'
402 endif
403 call assert_true(w:quickfix_title =~ title_text, w:quickfix_title)
Bram Moolenaar62ef7972016-01-19 14:51:54 +0100404 " This wipes out the buffer, make sure that doesn't cause trouble.
Bram Moolenaar049cba92016-06-26 14:38:04 +0200405 Xclose
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100406endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +0200407
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100408func Test_helpgrep()
Bram Moolenaar049cba92016-06-26 14:38:04 +0200409 call s:test_xhelpgrep('c')
Bram Moolenaarcf25fdb2016-08-03 21:04:53 +0200410 helpclose
Bram Moolenaar049cba92016-06-26 14:38:04 +0200411 call s:test_xhelpgrep('l')
Bram Moolenaar62ef7972016-01-19 14:51:54 +0100412endfunc
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100413
Bram Moolenaar6920c722016-01-22 22:44:10 +0100414func Test_errortitle()
415 augroup QfBufWinEnter
416 au!
417 au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
418 augroup END
419 copen
420 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'')'}]
421 call setqflist(a)
422 call assert_equal(':setqflist()', g:a)
423 augroup QfBufWinEnter
424 au!
425 augroup END
426 augroup! QfBufWinEnter
427endfunc
Bram Moolenaare27dba42016-03-15 14:11:10 +0100428
Bram Moolenaar5584df62016-03-18 21:00:51 +0100429func Test_vimgreptitle()
430 augroup QfBufWinEnter
431 au!
432 au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
433 augroup END
434 try
435 vimgrep /pattern/j file
436 catch /E480/
437 endtry
438 copen
439 call assert_equal(': vimgrep /pattern/j file', g:a)
440 augroup QfBufWinEnter
441 au!
442 augroup END
443 augroup! QfBufWinEnter
444endfunc
445
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100446func XqfTitleTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200447 call s:setup_commands(a:cchar)
Bram Moolenaare27dba42016-03-15 14:11:10 +0100448
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200449 Xgetexpr ['file:1:1:message']
450 let l = g:Xgetlist()
Bram Moolenaare27dba42016-03-15 14:11:10 +0100451 if a:cchar == 'c'
452 call setqflist(l, 'r')
453 else
454 call setloclist(0, l, 'r')
455 endif
456
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200457 Xopen
Bram Moolenaare27dba42016-03-15 14:11:10 +0100458 if a:cchar == 'c'
459 let title = ':setqflist()'
460 else
461 let title = ':setloclist()'
462 endif
463 call assert_equal(title, w:quickfix_title)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200464 Xclose
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100465endfunc
Bram Moolenaare27dba42016-03-15 14:11:10 +0100466
467" Tests for quickfix window's title
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100468func Test_qf_title()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200469 call XqfTitleTests('c')
470 call XqfTitleTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100471endfunc
Bram Moolenaare27dba42016-03-15 14:11:10 +0100472
473" Tests for 'errorformat'
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100474func Test_efm()
Bram Moolenaare27dba42016-03-15 14:11:10 +0100475 let save_efm = &efm
476 set efm=%EEEE%m,%WWWW%m,%+CCCC%.%#,%-GGGG%.%#
477 cgetexpr ['WWWW', 'EEEE', 'CCCC']
478 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
479 call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
480 cgetexpr ['WWWW', 'GGGG', 'EEEE', 'CCCC']
481 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
482 call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
483 cgetexpr ['WWWW', 'GGGG', 'ZZZZ', 'EEEE', 'CCCC', 'YYYY']
484 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
485 call assert_equal("[['W', 1], ['ZZZZ', 0], ['E^@CCCC', 1], ['YYYY', 0]]", l)
486 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100487endfunc
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100488
489" This will test for problems in quickfix:
490" A. incorrectly copying location lists which caused the location list to show
491" a different name than the file that was actually being displayed.
492" B. not reusing the window for which the location list window is opened but
493" instead creating new windows.
494" C. make sure that the location list window is not reused instead of the
495" window it belongs to.
496"
497" Set up the test environment:
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100498func ReadTestProtocol(name)
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100499 let base = substitute(a:name, '\v^test://(.*)%(\.[^.]+)?', '\1', '')
500 let word = substitute(base, '\v(.*)\..*', '\1', '')
501
502 setl modifiable
503 setl noreadonly
504 setl noswapfile
505 setl bufhidden=delete
506 %del _
507 " For problem 2:
508 " 'buftype' has to be set to reproduce the constant opening of new windows
509 setl buftype=nofile
510
511 call setline(1, word)
512
513 setl nomodified
514 setl nomodifiable
515 setl readonly
516 exe 'doautocmd BufRead ' . substitute(a:name, '\v^test://(.*)', '\1', '')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100517endfunc
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100518
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100519func Test_locationlist()
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100520 enew
521
522 augroup testgroup
523 au!
524 autocmd BufReadCmd test://* call ReadTestProtocol(expand("<amatch>"))
525 augroup END
526
527 let words = [ "foo", "bar", "baz", "quux", "shmoo", "spam", "eggs" ]
528
529 let qflist = []
530 for word in words
531 call add(qflist, {'filename': 'test://' . word . '.txt', 'text': 'file ' . word . '.txt', })
532 " NOTE: problem 1:
533 " intentionally not setting 'lnum' so that the quickfix entries are not
534 " valid
535 call setloclist(0, qflist, ' ')
536 endfor
537
538 " Test A
539 lrewind
540 enew
541 lopen
542 lnext
543 lnext
544 lnext
545 lnext
546 vert split
547 wincmd L
548 lopen
549 wincmd p
550 lnext
551 let fileName = expand("%")
552 wincmd p
553 let locationListFileName = substitute(getline(line('.')), '\([^|]*\)|.*', '\1', '')
554 let fileName = substitute(fileName, '\\', '/', 'g')
555 let locationListFileName = substitute(locationListFileName, '\\', '/', 'g')
556 call assert_equal("test://bar.txt", fileName)
557 call assert_equal("test://bar.txt", locationListFileName)
558
559 wincmd n | only
560
561 " Test B:
562 lrewind
563 lopen
564 2
565 exe "normal \<CR>"
566 wincmd p
567 3
568 exe "normal \<CR>"
569 wincmd p
570 4
571 exe "normal \<CR>"
572 call assert_equal(2, winnr('$'))
573 wincmd n | only
574
575 " Test C:
576 lrewind
577 lopen
578 " Let's move the location list window to the top to check whether it (the
579 " first window found) will be reused when we try to open new windows:
580 wincmd K
581 2
582 exe "normal \<CR>"
583 wincmd p
584 3
585 exe "normal \<CR>"
586 wincmd p
587 4
588 exe "normal \<CR>"
589 1wincmd w
590 call assert_equal('quickfix', &buftype)
591 2wincmd w
592 let bufferName = expand("%")
593 let bufferName = substitute(bufferName, '\\', '/', 'g')
594 call assert_equal('test://quux.txt', bufferName)
595
596 wincmd n | only
597
598 augroup! testgroup
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100599 endfunc
Bram Moolenaar0899d692016-03-19 13:35:03 +0100600
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100601func Test_locationlist_curwin_was_closed()
Bram Moolenaar0899d692016-03-19 13:35:03 +0100602 augroup testgroup
603 au!
Bram Moolenaard106e5b2016-04-21 19:38:07 +0200604 autocmd BufReadCmd test_curwin.txt call R(expand("<amatch>"))
Bram Moolenaar0899d692016-03-19 13:35:03 +0100605 augroup END
606
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100607 func! R(n)
Bram Moolenaar0899d692016-03-19 13:35:03 +0100608 quit
609 endfunc
610
611 new
612 let q = []
Bram Moolenaard106e5b2016-04-21 19:38:07 +0200613 call add(q, {'filename': 'test_curwin.txt' })
Bram Moolenaar0899d692016-03-19 13:35:03 +0100614 call setloclist(0, q)
615 call assert_fails('lrewind', 'E924:')
616
617 augroup! testgroup
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100618 endfunc
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100619
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100620func Test_locationlist_cross_tab_jump()
Bram Moolenaar0a9046f2016-10-15 19:28:13 +0200621 call writefile(['loclistfoo'], 'loclistfoo')
622 call writefile(['loclistbar'], 'loclistbar')
623 set switchbuf=usetab
624
625 edit loclistfoo
626 tabedit loclistbar
627 silent lgrep loclistfoo loclist*
628 call assert_equal(1, tabpagenr())
629
630 enew | only | tabonly
631 set switchbuf&vim
632 call delete('loclistfoo')
633 call delete('loclistbar')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100634endfunc
Bram Moolenaar0a9046f2016-10-15 19:28:13 +0200635
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100636" More tests for 'errorformat'
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100637func Test_efm1()
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100638 if !has('unix')
639 " The 'errorformat' setting is different on non-Unix systems.
640 " This test works only on Unix-like systems.
641 return
642 endif
643
644 let l = [
645 \ '"Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set.',
646 \ '"Xtestfile", line 6 col 19; this is an error',
647 \ 'gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include version.c',
648 \ 'Xtestfile:9: parse error before `asd''',
649 \ 'make: *** [vim] Error 1',
650 \ 'in file "Xtestfile" linenr 10: there is an error',
651 \ '',
652 \ '2 returned',
653 \ '"Xtestfile", line 11 col 1; this is an error',
654 \ '"Xtestfile", line 12 col 2; this is another error',
655 \ '"Xtestfile", line 14:10; this is an error in column 10',
656 \ '=Xtestfile=, line 15:10; this is another error, but in vcol 10 this time',
657 \ '"Xtestfile", linenr 16: yet another problem',
658 \ 'Error in "Xtestfile" at line 17:',
659 \ 'x should be a dot',
660 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17',
661 \ ' ^',
662 \ 'Error in "Xtestfile" at line 18:',
663 \ 'x should be a dot',
664 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18',
665 \ '.............^',
666 \ 'Error in "Xtestfile" at line 19:',
667 \ 'x should be a dot',
668 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19',
669 \ '--------------^',
670 \ 'Error in "Xtestfile" at line 20:',
671 \ 'x should be a dot',
672 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20',
673 \ ' ^',
674 \ '',
675 \ 'Does anyone know what is the problem and how to correction it?',
676 \ '"Xtestfile", line 21 col 9: What is the title of the quickfix window?',
677 \ '"Xtestfile", line 22 col 9: What is the title of the quickfix window?'
678 \ ]
679
680 call writefile(l, 'Xerrorfile1')
681 call writefile(l[:-2], 'Xerrorfile2')
682
683 let m = [
684 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 2',
685 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 3',
686 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 4',
687 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 5',
688 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 6',
689 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 7',
690 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 8',
691 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 9',
692 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 10',
693 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 11',
694 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 12',
695 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 13',
696 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 14',
697 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 15',
698 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 16',
699 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17',
700 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18',
701 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19',
702 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20',
703 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 21',
704 \ ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 22'
705 \ ]
706 call writefile(m, 'Xtestfile')
707
708 let save_efm = &efm
709 set efm+==%f=\\,\ line\ %l%*\\D%v%*[^\ ]\ %m
710 set efm^=%AError\ in\ \"%f\"\ at\ line\ %l:,%Z%p^,%C%m
711
712 exe 'cf Xerrorfile2'
713 clast
714 copen
715 call assert_equal(':cf Xerrorfile2', w:quickfix_title)
716 wincmd p
717
718 exe 'cf Xerrorfile1'
719 call assert_equal([4, 12], [line('.'), col('.')])
720 cn
721 call assert_equal([6, 19], [line('.'), col('.')])
722 cn
723 call assert_equal([9, 2], [line('.'), col('.')])
724 cn
725 call assert_equal([10, 2], [line('.'), col('.')])
726 cn
727 call assert_equal([11, 1], [line('.'), col('.')])
728 cn
729 call assert_equal([12, 2], [line('.'), col('.')])
730 cn
731 call assert_equal([14, 10], [line('.'), col('.')])
732 cn
733 call assert_equal([15, 3, 10], [line('.'), col('.'), virtcol('.')])
734 cn
735 call assert_equal([16, 2], [line('.'), col('.')])
736 cn
737 call assert_equal([17, 6], [line('.'), col('.')])
738 cn
739 call assert_equal([18, 7], [line('.'), col('.')])
740 cn
741 call assert_equal([19, 8], [line('.'), col('.')])
742 cn
743 call assert_equal([20, 9], [line('.'), col('.')])
744 clast
745 cprev
746 cprev
747 wincmd w
748 call assert_equal(':cf Xerrorfile1', w:quickfix_title)
749 wincmd p
750
751 let &efm = save_efm
752 call delete('Xerrorfile1')
753 call delete('Xerrorfile2')
754 call delete('Xtestfile')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100755 endfunc
Bram Moolenaarffec3c52016-03-23 20:55:42 +0100756
Bram Moolenaarab47c612016-06-14 22:02:26 +0200757" Test for quickfix directory stack support
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100758func s:dir_stack_tests(cchar)
Bram Moolenaar38df43b2016-06-20 21:41:12 +0200759 call s:setup_commands(a:cchar)
760
Bram Moolenaarab47c612016-06-14 22:02:26 +0200761 let save_efm=&efm
762 set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
763
Bram Moolenaar361c8f02016-07-02 15:41:47 +0200764 let lines = ["Entering dir 'dir1/a'",
765 \ 'habits2.txt:1:Nine Healthy Habits',
766 \ "Entering dir 'b'",
767 \ 'habits3.txt:2:0 Hours of television',
768 \ 'habits2.txt:7:5 Small meals',
769 \ "Entering dir 'dir1/c'",
770 \ 'habits4.txt:3:1 Hour of exercise',
771 \ "Leaving dir 'dir1/c'",
772 \ "Leaving dir 'dir1/a'",
773 \ 'habits1.txt:4:2 Liters of water',
774 \ "Entering dir 'dir2'",
775 \ 'habits5.txt:5:3 Cups of hot green tea',
776 \ "Leaving dir 'dir2'"
777 \]
Bram Moolenaarab47c612016-06-14 22:02:26 +0200778
Bram Moolenaar361c8f02016-07-02 15:41:47 +0200779 Xexpr ""
780 for l in lines
781 Xaddexpr l
782 endfor
Bram Moolenaarab47c612016-06-14 22:02:26 +0200783
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200784 let qf = g:Xgetlist()
Bram Moolenaarab47c612016-06-14 22:02:26 +0200785
786 call assert_equal('dir1/a/habits2.txt', bufname(qf[1].bufnr))
787 call assert_equal(1, qf[1].lnum)
788 call assert_equal('dir1/a/b/habits3.txt', bufname(qf[3].bufnr))
789 call assert_equal(2, qf[3].lnum)
790 call assert_equal('dir1/a/habits2.txt', bufname(qf[4].bufnr))
791 call assert_equal(7, qf[4].lnum)
792 call assert_equal('dir1/c/habits4.txt', bufname(qf[6].bufnr))
793 call assert_equal(3, qf[6].lnum)
794 call assert_equal('habits1.txt', bufname(qf[9].bufnr))
795 call assert_equal(4, qf[9].lnum)
796 call assert_equal('dir2/habits5.txt', bufname(qf[11].bufnr))
797 call assert_equal(5, qf[11].lnum)
798
799 let &efm=save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100800endfunc
Bram Moolenaarab47c612016-06-14 22:02:26 +0200801
802" Tests for %D and %X errorformat options
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100803func Test_efm_dirstack()
Bram Moolenaarab47c612016-06-14 22:02:26 +0200804 " Create the directory stack and files
805 call mkdir('dir1')
806 call mkdir('dir1/a')
807 call mkdir('dir1/a/b')
808 call mkdir('dir1/c')
809 call mkdir('dir2')
810
811 let lines = ["Nine Healthy Habits",
812 \ "0 Hours of television",
813 \ "1 Hour of exercise",
814 \ "2 Liters of water",
815 \ "3 Cups of hot green tea",
816 \ "4 Short mental breaks",
817 \ "5 Small meals",
818 \ "6 AM wake up time",
819 \ "7 Minutes of laughter",
820 \ "8 Hours of sleep (at least)",
821 \ "9 PM end of the day and off to bed"
822 \ ]
823 call writefile(lines, 'habits1.txt')
824 call writefile(lines, 'dir1/a/habits2.txt')
825 call writefile(lines, 'dir1/a/b/habits3.txt')
826 call writefile(lines, 'dir1/c/habits4.txt')
827 call writefile(lines, 'dir2/habits5.txt')
828
829 call s:dir_stack_tests('c')
830 call s:dir_stack_tests('l')
831
832 call delete('dir1', 'rf')
833 call delete('dir2', 'rf')
834 call delete('habits1.txt')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100835endfunc
Bram Moolenaarab47c612016-06-14 22:02:26 +0200836
Bram Moolenaar9b457942016-10-09 16:10:05 +0200837" Test for resync after continuing an ignored message
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100838func Xefm_ignore_continuations(cchar)
Bram Moolenaar9b457942016-10-09 16:10:05 +0200839 call s:setup_commands(a:cchar)
840
841 let save_efm = &efm
842
843 let &efm =
844 \ '%Eerror %m %l,' .
845 \ '%-Wignored %m %l,' .
846 \ '%+Cmore ignored %m %l,' .
847 \ '%Zignored end'
848 Xgetexpr ['ignored warning 1', 'more ignored continuation 2', 'ignored end', 'error resync 4']
849 let l = map(g:Xgetlist(), '[v:val.text, v:val.valid, v:val.lnum, v:val.type]')
850 call assert_equal([['resync', 1, 4, 'E']], l)
851
852 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100853endfunc
Bram Moolenaar9b457942016-10-09 16:10:05 +0200854
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100855func Test_efm_ignore_continuations()
Bram Moolenaar9b457942016-10-09 16:10:05 +0200856 call Xefm_ignore_continuations('c')
857 call Xefm_ignore_continuations('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100858endfunc
Bram Moolenaar9b457942016-10-09 16:10:05 +0200859
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200860" Tests for invalid error format specifies
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100861func Xinvalid_efm_Tests(cchar)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200862 call s:setup_commands(a:cchar)
863
Bram Moolenaar049cba92016-06-26 14:38:04 +0200864 let save_efm = &efm
865
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200866 set efm=%f:%l:%m,%f:%f:%l:%m
867 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E372:')
868
869 set efm=%f:%l:%m,%f:%l:%r:%m
870 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
871
872 set efm=%f:%l:%m,%O:%f:%l:%m
873 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
874
875 set efm=%f:%l:%m,%f:%l:%*[^a-z
876 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E374:')
877
878 set efm=%f:%l:%m,%f:%l:%*c
879 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E375:')
880
881 set efm=%f:%l:%m,%L%M%N
882 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E376:')
883
884 set efm=%f:%l:%m,%f:%l:%m:%R
885 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E377:')
886
887 set efm=
888 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E378:')
889
890 set efm=%DEntering\ dir\ abc,%f:%l:%m
891 call assert_fails('Xexpr ["Entering dir abc", "abc.txt:1:Hello world"]', 'E379:')
892
893 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100894endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200895
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100896func Test_invalid_efm()
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200897 call Xinvalid_efm_Tests('c')
898 call Xinvalid_efm_Tests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100899endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200900
901" TODO:
902" Add tests for the following formats in 'errorformat'
903" %r %O
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100904func Test_efm2()
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200905 let save_efm = &efm
Bram Moolenaar049cba92016-06-26 14:38:04 +0200906
907 " Test for %s format in efm
908 set efm=%f:%s
909 cexpr 'Xtestfile:Line search text'
Bram Moolenaar049cba92016-06-26 14:38:04 +0200910 let l = getqflist()
911 call assert_equal(l[0].pattern, '^\VLine search text\$')
912 call assert_equal(l[0].lnum, 0)
913
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200914 " Test for %P, %Q and %t format specifiers
Bram Moolenaar049cba92016-06-26 14:38:04 +0200915 let lines=["[Xtestfile1]",
916 \ "(1,17) error: ';' missing",
917 \ "(21,2) warning: variable 'z' not defined",
918 \ "(67,3) error: end of file found before string ended",
919 \ "",
920 \ "[Xtestfile2]",
921 \ "",
922 \ "[Xtestfile3]",
923 \ "NEW compiler v1.1",
924 \ "(2,2) warning: variable 'x' not defined",
925 \ "(67,3) warning: 's' already defined"
926 \]
927 set efm=%+P[%f],(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%-Q
Bram Moolenaar361c8f02016-07-02 15:41:47 +0200928 cexpr ""
929 for l in lines
930 caddexpr l
931 endfor
Bram Moolenaar049cba92016-06-26 14:38:04 +0200932 let l = getqflist()
933 call assert_equal(9, len(l))
934 call assert_equal(21, l[2].lnum)
935 call assert_equal(2, l[2].col)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200936 call assert_equal('w', l[2].type)
937 call assert_equal('e', l[3].type)
938
939 " Tests for %E, %C and %Z format specifiers
940 let lines = ["Error 275",
941 \ "line 42",
942 \ "column 3",
943 \ "' ' expected after '--'"
944 \]
945 set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m
946 cgetexpr lines
947 let l = getqflist()
948 call assert_equal(275, l[0].nr)
949 call assert_equal(42, l[0].lnum)
950 call assert_equal(3, l[0].col)
951 call assert_equal('E', l[0].type)
952 call assert_equal("\n' ' expected after '--'", l[0].text)
953
954 " Test for %>
955 let lines = ["Error in line 147 of foo.c:",
956 \"unknown variable 'i'"
957 \]
958 set efm=unknown\ variable\ %m,%E%>Error\ in\ line\ %l\ of\ %f:,%Z%m
959 cgetexpr lines
960 let l = getqflist()
961 call assert_equal(147, l[0].lnum)
962 call assert_equal('E', l[0].type)
963 call assert_equal("\nunknown variable 'i'", l[0].text)
Bram Moolenaar049cba92016-06-26 14:38:04 +0200964
Bram Moolenaare87e6dd2016-07-17 19:25:04 +0200965 " Test for %A, %C and other formats
966 let lines = [
967 \"==============================================================",
968 \"FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest)",
969 \"--------------------------------------------------------------",
970 \"Traceback (most recent call last):",
971 \' File "unittests/dbfacadeTest.py", line 89, in testFoo',
972 \" self.assertEquals(34, dtid)",
973 \' File "/usr/lib/python2.2/unittest.py", line 286, in',
974 \" failUnlessEqual",
975 \" raise self.failureException, \\",
976 \"AssertionError: 34 != 33",
977 \"",
978 \"--------------------------------------------------------------",
979 \"Ran 27 tests in 0.063s"
980 \]
981 set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m
982 cgetexpr lines
983 let l = getqflist()
984 call assert_equal(8, len(l))
985 call assert_equal(89, l[4].lnum)
986 call assert_equal(1, l[4].valid)
987 call assert_equal('unittests/dbfacadeTest.py', bufname(l[4].bufnr))
988
Bram Moolenaar049cba92016-06-26 14:38:04 +0200989 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100990endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +0200991
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100992func XquickfixChangedByAutocmd(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200993 call s:setup_commands(a:cchar)
Bram Moolenaarffec3c52016-03-23 20:55:42 +0100994 if a:cchar == 'c'
Bram Moolenaarffec3c52016-03-23 20:55:42 +0100995 let ErrorNr = 'E925'
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100996 func! ReadFunc()
Bram Moolenaarffec3c52016-03-23 20:55:42 +0100997 colder
998 cgetexpr []
999 endfunc
1000 else
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001001 let ErrorNr = 'E926'
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001002 func! ReadFunc()
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001003 lolder
1004 lgetexpr []
1005 endfunc
1006 endif
1007
1008 augroup testgroup
1009 au!
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001010 autocmd BufReadCmd test_changed.txt call ReadFunc()
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001011 augroup END
1012
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001013 new | only
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001014 let words = [ "a", "b" ]
1015 let qflist = []
1016 for word in words
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001017 call add(qflist, {'filename': 'test_changed.txt'})
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001018 call g:Xsetlist(qflist, ' ')
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001019 endfor
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001020 call assert_fails('Xrewind', ErrorNr . ':')
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001021
1022 augroup! testgroup
1023endfunc
1024
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001025func Test_quickfix_was_changed_by_autocmd()
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001026 call XquickfixChangedByAutocmd('c')
1027 call XquickfixChangedByAutocmd('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001028endfunc
Bram Moolenaar8b201792016-03-25 15:01:10 +01001029
1030func Test_caddbuffer_to_empty()
1031 helpgr quickfix
1032 call setqflist([], 'r')
1033 cad
Bram Moolenaarf68f1d72016-03-25 17:14:06 +01001034 try
1035 cn
1036 catch
1037 " number of matches is unknown
1038 call assert_true(v:exception =~ 'E553:')
1039 endtry
Bram Moolenaar8b201792016-03-25 15:01:10 +01001040 quit!
1041endfunc
Bram Moolenaar89c64d52016-03-27 18:44:40 +02001042
1043func Test_cgetexpr_works()
1044 " this must not crash Vim
1045 cgetexpr [$x]
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001046 lgetexpr [$x]
Bram Moolenaar89c64d52016-03-27 18:44:40 +02001047endfunc
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001048
1049" Tests for the setqflist() and setloclist() functions
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001050func SetXlistTests(cchar, bnum)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001051 call s:setup_commands(a:cchar)
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001052
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001053 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 1},
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001054 \ {'bufnr': a:bnum, 'lnum': 2}])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001055 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001056 call assert_equal(2, len(l))
1057 call assert_equal(2, l[1].lnum)
1058
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001059 Xnext
1060 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3}], 'a')
1061 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001062 call assert_equal(3, len(l))
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001063 Xnext
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001064 call assert_equal(3, line('.'))
1065
Bram Moolenaar2b2b8ae2016-05-24 19:59:51 +02001066 " Appending entries to the list should not change the cursor position
1067 " in the quickfix window
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001068 Xwindow
Bram Moolenaar2b2b8ae2016-05-24 19:59:51 +02001069 1
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001070 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 4},
Bram Moolenaar2b2b8ae2016-05-24 19:59:51 +02001071 \ {'bufnr': a:bnum, 'lnum': 5}], 'a')
1072 call assert_equal(1, line('.'))
1073 close
1074
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001075 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3},
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001076 \ {'bufnr': a:bnum, 'lnum': 4},
1077 \ {'bufnr': a:bnum, 'lnum': 5}], 'r')
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001078 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001079 call assert_equal(3, len(l))
1080 call assert_equal(5, l[2].lnum)
1081
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001082 call g:Xsetlist([])
1083 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001084 call assert_equal(0, len(l))
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001085endfunc
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001086
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001087func Test_setqflist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001088 new Xtestfile | only
1089 let bnum = bufnr('%')
1090 call setline(1, range(1,5))
1091
1092 call SetXlistTests('c', bnum)
1093 call SetXlistTests('l', bnum)
1094
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001095 enew!
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001096 call delete('Xtestfile')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001097endfunc
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001098
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001099func Xlist_empty_middle(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001100 call s:setup_commands(a:cchar)
1101
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001102 " create three quickfix lists
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001103 Xvimgrep Test_ test_quickfix.vim
1104 let testlen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001105 call assert_true(testlen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001106 Xvimgrep empty test_quickfix.vim
1107 call assert_true(len(g:Xgetlist()) > 0)
1108 Xvimgrep matches test_quickfix.vim
1109 let matchlen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001110 call assert_true(matchlen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001111 Xolder
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001112 " make the middle list empty
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001113 call g:Xsetlist([], 'r')
1114 call assert_true(len(g:Xgetlist()) == 0)
1115 Xolder
1116 call assert_equal(testlen, len(g:Xgetlist()))
1117 Xnewer
1118 Xnewer
1119 call assert_equal(matchlen, len(g:Xgetlist()))
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001120endfunc
1121
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001122func Test_setqflist_empty_middle()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001123 call Xlist_empty_middle('c')
1124 call Xlist_empty_middle('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001125endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001126
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001127func Xlist_empty_older(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001128 call s:setup_commands(a:cchar)
1129
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001130 " create three quickfix lists
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001131 Xvimgrep one test_quickfix.vim
1132 let onelen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001133 call assert_true(onelen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001134 Xvimgrep two test_quickfix.vim
1135 let twolen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001136 call assert_true(twolen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001137 Xvimgrep three test_quickfix.vim
1138 let threelen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001139 call assert_true(threelen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001140 Xolder 2
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001141 " make the first list empty, check the others didn't change
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001142 call g:Xsetlist([], 'r')
1143 call assert_true(len(g:Xgetlist()) == 0)
1144 Xnewer
1145 call assert_equal(twolen, len(g:Xgetlist()))
1146 Xnewer
1147 call assert_equal(threelen, len(g:Xgetlist()))
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001148endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001149
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001150func Test_setqflist_empty_older()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001151 call Xlist_empty_older('c')
1152 call Xlist_empty_older('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001153endfunc
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001154
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001155func XquickfixSetListWithAct(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001156 call s:setup_commands(a:cchar)
1157
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001158 let list1 = [{'filename': 'fnameA', 'text': 'A'},
1159 \ {'filename': 'fnameB', 'text': 'B'}]
1160 let list2 = [{'filename': 'fnameC', 'text': 'C'},
1161 \ {'filename': 'fnameD', 'text': 'D'},
1162 \ {'filename': 'fnameE', 'text': 'E'}]
1163
1164 " {action} is unspecified. Same as specifing ' '.
1165 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001166 silent! Xnewer 99
1167 call g:Xsetlist(list1)
1168 call g:Xsetlist(list2)
1169 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001170 call assert_equal(3, len(li))
1171 call assert_equal('C', li[0]['text'])
1172 call assert_equal('D', li[1]['text'])
1173 call assert_equal('E', li[2]['text'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001174 silent! Xolder
1175 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001176 call assert_equal(2, len(li))
1177 call assert_equal('A', li[0]['text'])
1178 call assert_equal('B', li[1]['text'])
1179
1180 " {action} is specified ' '.
1181 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001182 silent! Xnewer 99
1183 call g:Xsetlist(list1)
1184 call g:Xsetlist(list2, ' ')
1185 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001186 call assert_equal(3, len(li))
1187 call assert_equal('C', li[0]['text'])
1188 call assert_equal('D', li[1]['text'])
1189 call assert_equal('E', li[2]['text'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001190 silent! Xolder
1191 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001192 call assert_equal(2, len(li))
1193 call assert_equal('A', li[0]['text'])
1194 call assert_equal('B', li[1]['text'])
1195
1196 " {action} is specified 'a'.
1197 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001198 silent! Xnewer 99
1199 call g:Xsetlist(list1)
1200 call g:Xsetlist(list2, 'a')
1201 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001202 call assert_equal(5, len(li))
1203 call assert_equal('A', li[0]['text'])
1204 call assert_equal('B', li[1]['text'])
1205 call assert_equal('C', li[2]['text'])
1206 call assert_equal('D', li[3]['text'])
1207 call assert_equal('E', li[4]['text'])
1208
1209 " {action} is specified 'r'.
1210 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001211 silent! Xnewer 99
1212 call g:Xsetlist(list1)
1213 call g:Xsetlist(list2, 'r')
1214 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001215 call assert_equal(3, len(li))
1216 call assert_equal('C', li[0]['text'])
1217 call assert_equal('D', li[1]['text'])
1218 call assert_equal('E', li[2]['text'])
1219
1220 " Test for wrong value.
1221 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001222 call assert_fails("call g:Xsetlist(0)", 'E714:')
1223 call assert_fails("call g:Xsetlist(list1, '')", 'E927:')
1224 call assert_fails("call g:Xsetlist(list1, 'aa')", 'E927:')
1225 call assert_fails("call g:Xsetlist(list1, ' a')", 'E927:')
1226 call assert_fails("call g:Xsetlist(list1, 0)", 'E928:')
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001227endfunc
1228
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001229func Test_quickfix_set_list_with_act()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001230 call XquickfixSetListWithAct('c')
1231 call XquickfixSetListWithAct('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001232endfunc
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001233
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001234func XLongLinesTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001235 let l = g:Xgetlist()
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001236
Bram Moolenaar049cba92016-06-26 14:38:04 +02001237 call assert_equal(4, len(l))
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001238 call assert_equal(1, l[0].lnum)
1239 call assert_equal(1, l[0].col)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001240 call assert_equal(1975, len(l[0].text))
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001241 call assert_equal(2, l[1].lnum)
1242 call assert_equal(1, l[1].col)
1243 call assert_equal(4070, len(l[1].text))
1244 call assert_equal(3, l[2].lnum)
1245 call assert_equal(1, l[2].col)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001246 call assert_equal(4070, len(l[2].text))
1247 call assert_equal(4, l[3].lnum)
1248 call assert_equal(1, l[3].col)
1249 call assert_equal(10, len(l[3].text))
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001250
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001251 call g:Xsetlist([], 'r')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001252endfunc
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001253
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001254func s:long_lines_tests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001255 call s:setup_commands(a:cchar)
1256
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001257 let testfile = 'samples/quickfix.txt'
1258
1259 " file
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001260 exe 'Xgetfile' testfile
1261 call XLongLinesTests(a:cchar)
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001262
1263 " list
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001264 Xexpr readfile(testfile)
1265 call XLongLinesTests(a:cchar)
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001266
1267 " string
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001268 Xexpr join(readfile(testfile), "\n")
1269 call XLongLinesTests(a:cchar)
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001270
1271 " buffer
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001272 exe 'edit' testfile
1273 exe 'Xbuffer' bufnr('%')
Bram Moolenaarf50df392016-06-21 21:33:34 +02001274 call XLongLinesTests(a:cchar)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001275endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001276
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001277func Test_long_lines()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001278 call s:long_lines_tests('c')
1279 call s:long_lines_tests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001280endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001281
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001282func s:create_test_file(filename)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001283 let l = []
1284 for i in range(1, 20)
1285 call add(l, 'Line' . i)
1286 endfor
1287 call writefile(l, a:filename)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001288endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001289
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001290func Test_switchbuf()
Bram Moolenaar049cba92016-06-26 14:38:04 +02001291 call s:create_test_file('Xqftestfile1')
1292 call s:create_test_file('Xqftestfile2')
1293 call s:create_test_file('Xqftestfile3')
1294
1295 new | only
1296 edit Xqftestfile1
1297 let file1_winid = win_getid()
1298 new Xqftestfile2
1299 let file2_winid = win_getid()
1300 cgetexpr ['Xqftestfile1:5:Line5',
1301 \ 'Xqftestfile1:6:Line6',
1302 \ 'Xqftestfile2:10:Line10',
1303 \ 'Xqftestfile2:11:Line11',
1304 \ 'Xqftestfile3:15:Line15',
1305 \ 'Xqftestfile3:16:Line16']
1306
1307 new
1308 let winid = win_getid()
1309 cfirst | cnext
1310 call assert_equal(winid, win_getid())
1311 cnext | cnext
1312 call assert_equal(winid, win_getid())
1313 cnext | cnext
1314 call assert_equal(winid, win_getid())
1315 enew
1316
1317 set switchbuf=useopen
1318 cfirst | cnext
1319 call assert_equal(file1_winid, win_getid())
1320 cnext | cnext
1321 call assert_equal(file2_winid, win_getid())
1322 cnext | cnext
1323 call assert_equal(file2_winid, win_getid())
1324
1325 enew | only
1326 set switchbuf=usetab
1327 tabedit Xqftestfile1
1328 tabedit Xqftestfile2
1329 tabfirst
1330 cfirst | cnext
1331 call assert_equal(2, tabpagenr())
1332 cnext | cnext
1333 call assert_equal(3, tabpagenr())
1334 cnext | cnext
1335 call assert_equal(3, tabpagenr())
1336 tabfirst | tabonly | enew
1337
1338 set switchbuf=split
1339 cfirst | cnext
1340 call assert_equal(1, winnr('$'))
1341 cnext | cnext
1342 call assert_equal(2, winnr('$'))
1343 cnext | cnext
1344 call assert_equal(3, winnr('$'))
1345 enew | only
1346
1347 set switchbuf=newtab
1348 cfirst | cnext
1349 call assert_equal(1, tabpagenr('$'))
1350 cnext | cnext
1351 call assert_equal(2, tabpagenr('$'))
1352 cnext | cnext
1353 call assert_equal(3, tabpagenr('$'))
1354 tabfirst | enew | tabonly | only
1355
1356 set switchbuf=
1357 edit Xqftestfile1
1358 let file1_winid = win_getid()
1359 new Xqftestfile2
1360 let file2_winid = win_getid()
1361 copen
1362 exe "normal 1G\<CR>"
1363 call assert_equal(file1_winid, win_getid())
1364 copen
1365 exe "normal 3G\<CR>"
1366 call assert_equal(file2_winid, win_getid())
1367 copen | only
1368 exe "normal 5G\<CR>"
1369 call assert_equal(2, winnr('$'))
1370 call assert_equal(1, bufwinnr('Xqftestfile3'))
1371
1372 enew | only
1373
1374 call delete('Xqftestfile1')
1375 call delete('Xqftestfile2')
1376 call delete('Xqftestfile3')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001377endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001378
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001379func Xadjust_qflnum(cchar)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001380 call s:setup_commands(a:cchar)
1381
1382 enew | only
1383
Bram Moolenaarc1542742016-07-20 21:44:37 +02001384 let fname = 'Xqftestfile' . a:cchar
1385 call s:create_test_file(fname)
1386 exe 'edit ' . fname
Bram Moolenaar049cba92016-06-26 14:38:04 +02001387
Bram Moolenaarc1542742016-07-20 21:44:37 +02001388 Xgetexpr [fname . ':5:Line5',
1389 \ fname . ':10:Line10',
1390 \ fname . ':15:Line15',
1391 \ fname . ':20:Line20']
Bram Moolenaar049cba92016-06-26 14:38:04 +02001392
1393 6,14delete
1394 call append(6, ['Buffer', 'Window'])
1395
1396 let l = g:Xgetlist()
1397
1398 call assert_equal(5, l[0].lnum)
1399 call assert_equal(6, l[2].lnum)
1400 call assert_equal(13, l[3].lnum)
1401
1402 enew!
Bram Moolenaarc1542742016-07-20 21:44:37 +02001403 call delete(fname)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001404endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001405
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001406func Test_adjust_lnum()
Bram Moolenaarc1542742016-07-20 21:44:37 +02001407 call setloclist(0, [])
Bram Moolenaar049cba92016-06-26 14:38:04 +02001408 call Xadjust_qflnum('c')
Bram Moolenaarc1542742016-07-20 21:44:37 +02001409 call setqflist([])
Bram Moolenaar049cba92016-06-26 14:38:04 +02001410 call Xadjust_qflnum('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001411endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001412
1413" Tests for the :grep/:lgrep and :grepadd/:lgrepadd commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001414func s:test_xgrep(cchar)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001415 call s:setup_commands(a:cchar)
1416
1417 " The following lines are used for the grep test. Don't remove.
1418 " Grep_Test_Text: Match 1
1419 " Grep_Test_Text: Match 2
1420 " GrepAdd_Test_Text: Match 1
1421 " GrepAdd_Test_Text: Match 2
1422 enew! | only
1423 set makeef&vim
1424 silent Xgrep Grep_Test_Text: test_quickfix.vim
1425 call assert_true(len(g:Xgetlist()) == 3)
1426 Xopen
1427 call assert_true(w:quickfix_title =~ '^:grep')
1428 Xclose
1429 enew
1430 set makeef=Temp_File_##
1431 silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
1432 call assert_true(len(g:Xgetlist()) == 6)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001433endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001434
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001435func Test_grep()
Bram Moolenaar049cba92016-06-26 14:38:04 +02001436 if !has('unix')
1437 " The grepprg may not be set on non-Unix systems
1438 return
1439 endif
1440
1441 call s:test_xgrep('c')
1442 call s:test_xgrep('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001443endfunc
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001444
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001445func Test_two_windows()
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001446 " Use one 'errorformat' for two windows. Add an expression to each of them,
1447 " make sure they each keep their own state.
1448 set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
1449 call mkdir('Xone/a', 'p')
1450 call mkdir('Xtwo/a', 'p')
1451 let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
1452 call writefile(lines, 'Xone/a/one.txt')
1453 call writefile(lines, 'Xtwo/a/two.txt')
1454
1455 new one
1456 let one_id = win_getid()
1457 lexpr ""
1458 new two
1459 let two_id = win_getid()
1460 lexpr ""
1461
1462 laddexpr "Entering dir 'Xtwo/a'"
1463 call win_gotoid(one_id)
1464 laddexpr "Entering dir 'Xone/a'"
1465 call win_gotoid(two_id)
1466 laddexpr 'two.txt:5:two two two'
1467 call win_gotoid(one_id)
1468 laddexpr 'one.txt:3:one one one'
1469
1470 let loc_one = getloclist(one_id)
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001471 call assert_equal('Xone/a/one.txt', bufname(loc_one[1].bufnr))
1472 call assert_equal(3, loc_one[1].lnum)
1473
1474 let loc_two = getloclist(two_id)
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001475 call assert_equal('Xtwo/a/two.txt', bufname(loc_two[1].bufnr))
1476 call assert_equal(5, loc_two[1].lnum)
1477
1478 call win_gotoid(one_id)
1479 bwipe!
1480 call win_gotoid(two_id)
1481 bwipe!
1482 call delete('Xone', 'rf')
1483 call delete('Xtwo', 'rf')
1484endfunc
Bram Moolenaardcb17002016-07-07 18:58:59 +02001485
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001486func XbottomTests(cchar)
Bram Moolenaar537ef082016-07-09 17:56:19 +02001487 call s:setup_commands(a:cchar)
1488
1489 call g:Xsetlist([{'filename': 'foo', 'lnum': 42}])
1490 Xopen
Bram Moolenaardcb17002016-07-07 18:58:59 +02001491 let wid = win_getid()
1492 call assert_equal(1, line('.'))
1493 wincmd w
Bram Moolenaar537ef082016-07-09 17:56:19 +02001494 call g:Xsetlist([{'filename': 'var', 'lnum': 24}], 'a')
1495 Xbottom
Bram Moolenaardcb17002016-07-07 18:58:59 +02001496 call win_gotoid(wid)
1497 call assert_equal(2, line('.'))
Bram Moolenaar537ef082016-07-09 17:56:19 +02001498 Xclose
Bram Moolenaardcb17002016-07-07 18:58:59 +02001499endfunc
Bram Moolenaar537ef082016-07-09 17:56:19 +02001500
1501" Tests for the :cbottom and :lbottom commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001502func Test_cbottom()
Bram Moolenaar537ef082016-07-09 17:56:19 +02001503 call XbottomTests('c')
1504 call XbottomTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001505endfunc
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02001506
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001507func HistoryTest(cchar)
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02001508 call s:setup_commands(a:cchar)
1509
1510 call assert_fails(a:cchar . 'older 99', 'E380:')
1511 " clear all lists after the first one, then replace the first one.
1512 call g:Xsetlist([])
1513 Xolder
1514 let entry = {'filename': 'foo', 'lnum': 42}
1515 call g:Xsetlist([entry], 'r')
1516 call g:Xsetlist([entry, entry])
1517 call g:Xsetlist([entry, entry, entry])
1518 let res = split(execute(a:cchar . 'hist'), "\n")
1519 call assert_equal(3, len(res))
1520 let common = 'errors :set' . (a:cchar == 'c' ? 'qf' : 'loc') . 'list()'
1521 call assert_equal(' error list 1 of 3; 1 ' . common, res[0])
1522 call assert_equal(' error list 2 of 3; 2 ' . common, res[1])
1523 call assert_equal('> error list 3 of 3; 3 ' . common, res[2])
1524endfunc
1525
1526func Test_history()
1527 call HistoryTest('c')
1528 call HistoryTest('l')
1529endfunc
Bram Moolenaar015102e2016-07-16 18:24:56 +02001530
1531func Test_duplicate_buf()
1532 " make sure we can get the highest buffer number
1533 edit DoesNotExist
1534 edit DoesNotExist2
1535 let last_buffer = bufnr("$")
1536
1537 " make sure only one buffer is created
1538 call writefile(['this one', 'that one'], 'Xgrepthis')
1539 vimgrep one Xgrepthis
1540 vimgrep one Xgrepthis
1541 call assert_equal(last_buffer + 1, bufnr("$"))
1542
1543 call delete('Xgrepthis')
1544endfunc
Bram Moolenaard823fa92016-08-12 16:29:27 +02001545
1546" Quickfix/Location list set/get properties tests
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001547func Xproperty_tests(cchar)
Bram Moolenaard823fa92016-08-12 16:29:27 +02001548 call s:setup_commands(a:cchar)
1549
1550 " Error cases
1551 call assert_fails('call g:Xgetlist(99)', 'E715:')
1552 call assert_fails('call g:Xsetlist(99)', 'E714:')
1553 call assert_fails('call g:Xsetlist([], "a", [])', 'E715:')
1554
1555 " Set and get the title
1556 Xopen
1557 wincmd p
1558 call g:Xsetlist([{'filename':'foo', 'lnum':27}])
1559 call g:Xsetlist([], 'a', {'title' : 'Sample'})
1560 let d = g:Xgetlist({"title":1})
1561 call assert_equal('Sample', d.title)
1562
1563 Xopen
1564 call assert_equal('Sample', w:quickfix_title)
1565 Xclose
1566
Bram Moolenaar2b529bb2016-08-27 13:35:35 +02001567 " Tests for action argument
1568 silent! Xolder 999
1569 let qfnr = g:Xgetlist({'all':1}).nr
1570 call g:Xsetlist([], 'r', {'title' : 'N1'})
1571 call assert_equal('N1', g:Xgetlist({'all':1}).title)
1572 call g:Xsetlist([], ' ', {'title' : 'N2'})
1573 call assert_equal(qfnr + 1, g:Xgetlist({'all':1}).nr)
Bram Moolenaar890680c2016-09-27 21:28:56 +02001574
1575 let res = g:Xgetlist({'nr': 0})
1576 call assert_equal(qfnr + 1, res.nr)
1577 call assert_equal(['nr'], keys(res))
1578
Bram Moolenaar2b529bb2016-08-27 13:35:35 +02001579 call g:Xsetlist([], ' ', {'title' : 'N3'})
1580 call assert_equal('N2', g:Xgetlist({'nr':2, 'title':1}).title)
1581
Bram Moolenaard823fa92016-08-12 16:29:27 +02001582 " Invalid arguments
1583 call assert_fails('call g:Xgetlist([])', 'E715')
1584 call assert_fails('call g:Xsetlist([], "a", [])', 'E715')
1585 let s = g:Xsetlist([], 'a', {'abc':1})
1586 call assert_equal(-1, s)
1587
1588 call assert_equal({}, g:Xgetlist({'abc':1}))
1589
1590 if a:cchar == 'l'
Bram Moolenaar890680c2016-09-27 21:28:56 +02001591 call assert_equal({}, getloclist(99, {'title': 1}))
Bram Moolenaard823fa92016-08-12 16:29:27 +02001592 endif
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001593 endfunc
Bram Moolenaard823fa92016-08-12 16:29:27 +02001594
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001595func Test_qf_property()
Bram Moolenaard823fa92016-08-12 16:29:27 +02001596 call Xproperty_tests('c')
1597 call Xproperty_tests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001598 endfunc
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02001599
1600" Tests for the QuickFixCmdPre/QuickFixCmdPost autocommands
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001601func QfAutoCmdHandler(loc, cmd)
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02001602 call add(g:acmds, a:loc . a:cmd)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001603endfunc
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02001604
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001605func Test_Autocmd()
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02001606 autocmd QuickFixCmdPre * call QfAutoCmdHandler('pre', expand('<amatch>'))
1607 autocmd QuickFixCmdPost * call QfAutoCmdHandler('post', expand('<amatch>'))
1608
1609 let g:acmds = []
1610 cexpr "F1:10:Line 10"
1611 caddexpr "F1:20:Line 20"
1612 cgetexpr "F1:30:Line 30"
1613 enew! | call append(0, "F2:10:Line 10")
1614 cbuffer!
1615 enew! | call append(0, "F2:20:Line 20")
1616 cgetbuffer
1617 enew! | call append(0, "F2:30:Line 30")
1618 caddbuffer
1619
1620 let l = ['precexpr',
1621 \ 'postcexpr',
1622 \ 'precaddexpr',
1623 \ 'postcaddexpr',
1624 \ 'precgetexpr',
1625 \ 'postcgetexpr',
1626 \ 'precbuffer',
1627 \ 'postcbuffer',
1628 \ 'precgetbuffer',
1629 \ 'postcgetbuffer',
1630 \ 'precaddbuffer',
1631 \ 'postcaddbuffer']
1632 call assert_equal(l, g:acmds)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001633endfunc
Bram Moolenaar21662be2016-11-06 14:46:44 +01001634
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001635func Test_Autocmd_Exception()
Bram Moolenaar21662be2016-11-06 14:46:44 +01001636 set efm=%m
1637 lgetexpr '?'
1638
1639 try
1640 call DoesNotExit()
1641 catch
1642 lgetexpr '1'
1643 finally
1644 lgetexpr '1'
1645 endtry
1646
1647 call assert_equal('1', getloclist(0)[0].text)
1648
1649 set efm&vim
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001650endfunc
Bram Moolenaar63bed3d2016-11-12 15:36:54 +01001651
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001652func Test_caddbuffer_wrong()
1653 " This used to cause a memory access in freed memory.
Bram Moolenaar63bed3d2016-11-12 15:36:54 +01001654 let save_efm = &efm
1655 set efm=%EEEE%m,%WWWW,%+CCCC%>%#,%GGGG%.#
1656 cgetexpr ['WWWW', 'EEEE', 'CCCC']
1657 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001658 caddbuffer
Bram Moolenaar63bed3d2016-11-12 15:36:54 +01001659 bwipe!
1660endfunc
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001661
1662func Test_caddexpr_wrong()
1663 " This used to cause a memory access in freed memory.
1664 cbuffer
1665 cbuffer
1666 copen
1667 let save_efm = &efm
1668 set efm=%
1669 call assert_fails('caddexpr ""', 'E376:')
1670 let &efm = save_efm
1671endfunc