blob: cfd9a35b7d32383ca747f41cafe73cad8b77b449 [file] [log] [blame]
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01001" Test for the quickfix feature.
Bram Moolenaarda59dd52016-01-05 21:59:58 +01002
Bram Moolenaarb46fecd2019-06-15 17:58:09 +02003source check.vim
4CheckFeature quickfix
Bram Moolenaarda59dd52016-01-05 21:59:58 +01005
Bram Moolenaare00fdf32019-09-15 19:09:42 +02006source screendump.vim
7
Bram Moolenaar7eba3d22016-03-19 22:54:09 +01008set encoding=utf-8
9
Bram Moolenaar2b946c92016-11-12 18:14:44 +010010func s:setup_commands(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020011 if a:cchar == 'c'
12 command! -nargs=* -bang Xlist <mods>clist<bang> <args>
13 command! -nargs=* Xgetexpr <mods>cgetexpr <args>
Bram Moolenaar361c8f02016-07-02 15:41:47 +020014 command! -nargs=* Xaddexpr <mods>caddexpr <args>
Bram Moolenaar55b69262017-08-13 13:42:01 +020015 command! -nargs=* -count Xolder <mods><count>colder <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020016 command! -nargs=* Xnewer <mods>cnewer <args>
Bram Moolenaarf9ae1542019-11-18 22:02:16 +010017 command! -nargs=* Xopen <mods> copen <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020018 command! -nargs=* Xwindow <mods>cwindow <args>
Bram Moolenaar537ef082016-07-09 17:56:19 +020019 command! -nargs=* Xbottom <mods>cbottom <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020020 command! -nargs=* Xclose <mods>cclose <args>
21 command! -nargs=* -bang Xfile <mods>cfile<bang> <args>
22 command! -nargs=* Xgetfile <mods>cgetfile <args>
23 command! -nargs=* Xaddfile <mods>caddfile <args>
24 command! -nargs=* -bang Xbuffer <mods>cbuffer<bang> <args>
25 command! -nargs=* Xgetbuffer <mods>cgetbuffer <args>
26 command! -nargs=* Xaddbuffer <mods>caddbuffer <args>
27 command! -nargs=* Xrewind <mods>crewind <args>
Bram Moolenaar99895ea2017-04-20 22:44:47 +020028 command! -count -nargs=* -bang Xnext <mods><count>cnext<bang> <args>
29 command! -count -nargs=* -bang Xprev <mods><count>cprev<bang> <args>
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +020030 command! -nargs=* -bang Xfirst <mods>cfirst<bang> <args>
31 command! -nargs=* -bang Xlast <mods>clast<bang> <args>
Bram Moolenaar25190db2019-05-04 15:05:28 +020032 command! -count -nargs=* -bang Xnfile <mods><count>cnfile<bang> <args>
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +020033 command! -nargs=* -bang Xpfile <mods>cpfile<bang> <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020034 command! -nargs=* Xexpr <mods>cexpr <args>
Bram Moolenaarf9ae1542019-11-18 22:02:16 +010035 command! -count -nargs=* Xvimgrep <mods> <count>vimgrep <args>
36 command! -nargs=* Xvimgrepadd <mods> vimgrepadd <args>
Bram Moolenaar049cba92016-06-26 14:38:04 +020037 command! -nargs=* Xgrep <mods> grep <args>
38 command! -nargs=* Xgrepadd <mods> grepadd <args>
39 command! -nargs=* Xhelpgrep helpgrep <args>
Bram Moolenaar74240d32017-12-10 15:26:15 +010040 command! -nargs=0 -count Xcc <count>cc
Bram Moolenaar3ff33112019-05-03 21:56:35 +020041 command! -count=1 -nargs=0 Xbelow <mods><count>cbelow
42 command! -count=1 -nargs=0 Xabove <mods><count>cabove
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +020043 command! -count=1 -nargs=0 Xbefore <mods><count>cbefore
44 command! -count=1 -nargs=0 Xafter <mods><count>cafter
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020045 let g:Xgetlist = function('getqflist')
46 let g:Xsetlist = function('setqflist')
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +020047 call setqflist([], 'f')
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020048 else
49 command! -nargs=* -bang Xlist <mods>llist<bang> <args>
50 command! -nargs=* Xgetexpr <mods>lgetexpr <args>
Bram Moolenaar361c8f02016-07-02 15:41:47 +020051 command! -nargs=* Xaddexpr <mods>laddexpr <args>
Bram Moolenaar55b69262017-08-13 13:42:01 +020052 command! -nargs=* -count Xolder <mods><count>lolder <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020053 command! -nargs=* Xnewer <mods>lnewer <args>
Bram Moolenaarf9ae1542019-11-18 22:02:16 +010054 command! -nargs=* Xopen <mods> lopen <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020055 command! -nargs=* Xwindow <mods>lwindow <args>
Bram Moolenaar537ef082016-07-09 17:56:19 +020056 command! -nargs=* Xbottom <mods>lbottom <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020057 command! -nargs=* Xclose <mods>lclose <args>
58 command! -nargs=* -bang Xfile <mods>lfile<bang> <args>
59 command! -nargs=* Xgetfile <mods>lgetfile <args>
60 command! -nargs=* Xaddfile <mods>laddfile <args>
61 command! -nargs=* -bang Xbuffer <mods>lbuffer<bang> <args>
62 command! -nargs=* Xgetbuffer <mods>lgetbuffer <args>
63 command! -nargs=* Xaddbuffer <mods>laddbuffer <args>
64 command! -nargs=* Xrewind <mods>lrewind <args>
Bram Moolenaar99895ea2017-04-20 22:44:47 +020065 command! -count -nargs=* -bang Xnext <mods><count>lnext<bang> <args>
66 command! -count -nargs=* -bang Xprev <mods><count>lprev<bang> <args>
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +020067 command! -nargs=* -bang Xfirst <mods>lfirst<bang> <args>
68 command! -nargs=* -bang Xlast <mods>llast<bang> <args>
Bram Moolenaar25190db2019-05-04 15:05:28 +020069 command! -count -nargs=* -bang Xnfile <mods><count>lnfile<bang> <args>
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +020070 command! -nargs=* -bang Xpfile <mods>lpfile<bang> <args>
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020071 command! -nargs=* Xexpr <mods>lexpr <args>
Bram Moolenaarf9ae1542019-11-18 22:02:16 +010072 command! -count -nargs=* Xvimgrep <mods> <count>lvimgrep <args>
73 command! -nargs=* Xvimgrepadd <mods> lvimgrepadd <args>
Bram Moolenaar049cba92016-06-26 14:38:04 +020074 command! -nargs=* Xgrep <mods> lgrep <args>
75 command! -nargs=* Xgrepadd <mods> lgrepadd <args>
76 command! -nargs=* Xhelpgrep lhelpgrep <args>
Bram Moolenaar74240d32017-12-10 15:26:15 +010077 command! -nargs=0 -count Xcc <count>ll
Bram Moolenaar3ff33112019-05-03 21:56:35 +020078 command! -count=1 -nargs=0 Xbelow <mods><count>lbelow
79 command! -count=1 -nargs=0 Xabove <mods><count>labove
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +020080 command! -count=1 -nargs=0 Xbefore <mods><count>lbefore
81 command! -count=1 -nargs=0 Xafter <mods><count>lafter
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020082 let g:Xgetlist = function('getloclist', [0])
83 let g:Xsetlist = function('setloclist', [0])
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +020084 call setloclist(0, [], 'f')
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020085 endif
Bram Moolenaar2b946c92016-11-12 18:14:44 +010086endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020087
Bram Moolenaarda59dd52016-01-05 21:59:58 +010088" Tests for the :clist and :llist commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +010089func XlistTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020090 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +010091
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +020092 if a:cchar == 'l'
93 call assert_fails('llist', 'E776:')
94 endif
Bram Moolenaarda59dd52016-01-05 21:59:58 +010095 " With an empty list, command should return error
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +020096 Xgetexpr []
97 silent! Xlist
Bram Moolenaarda59dd52016-01-05 21:59:58 +010098 call assert_true(v:errmsg ==# 'E42: No Errors')
99
100 " Populate the list and then try
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200101 Xgetexpr ['non-error 1', 'Xtestfile1:1:3:Line1',
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100102 \ 'non-error 2', 'Xtestfile2:2:2:Line2',
Bram Moolenaar88a3e2b2019-12-06 21:11:39 +0100103 \ 'non-error| 3', 'Xtestfile3:3:1:Line3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100104
105 " List only valid entries
Bram Moolenaaree85df32017-03-19 14:19:50 +0100106 let l = split(execute('Xlist', ''), "\n")
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100107 call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
108 \ ' 4 Xtestfile2:2 col 2: Line2',
109 \ ' 6 Xtestfile3:3 col 1: Line3'], l)
110
111 " List all the entries
Bram Moolenaaree85df32017-03-19 14:19:50 +0100112 let l = split(execute('Xlist!', ''), "\n")
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100113 call assert_equal([' 1: non-error 1', ' 2 Xtestfile1:1 col 3: Line1',
114 \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2',
Bram Moolenaar88a3e2b2019-12-06 21:11:39 +0100115 \ ' 5: non-error| 3', ' 6 Xtestfile3:3 col 1: Line3'], l)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100116
117 " List a range of errors
Bram Moolenaaree85df32017-03-19 14:19:50 +0100118 let l = split(execute('Xlist 3,6', ''), "\n")
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100119 call assert_equal([' 4 Xtestfile2:2 col 2: Line2',
120 \ ' 6 Xtestfile3:3 col 1: Line3'], l)
121
Bram Moolenaaree85df32017-03-19 14:19:50 +0100122 let l = split(execute('Xlist! 3,4', ''), "\n")
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100123 call assert_equal([' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
124
Bram Moolenaaree85df32017-03-19 14:19:50 +0100125 let l = split(execute('Xlist -6,-4', ''), "\n")
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100126 call assert_equal([' 2 Xtestfile1:1 col 3: Line1'], l)
127
Bram Moolenaaree85df32017-03-19 14:19:50 +0100128 let l = split(execute('Xlist! -5,-3', ''), "\n")
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100129 call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
130 \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
Bram Moolenaar391b1dd2017-03-04 13:47:11 +0100131
132 " Test for '+'
Bram Moolenaaree85df32017-03-19 14:19:50 +0100133 let l = split(execute('Xlist! +2', ''), "\n")
Bram Moolenaar391b1dd2017-03-04 13:47:11 +0100134 call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
135 \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
Bram Moolenaaree85df32017-03-19 14:19:50 +0100136
137 " Different types of errors
138 call g:Xsetlist([{'lnum':10,'col':5,'type':'W', 'text':'Warning','nr':11},
139 \ {'lnum':20,'col':10,'type':'e','text':'Error','nr':22},
140 \ {'lnum':30,'col':15,'type':'i','text':'Info','nr':33},
141 \ {'lnum':40,'col':20,'type':'x', 'text':'Other','nr':44},
142 \ {'lnum':50,'col':25,'type':"\<C-A>",'text':'one','nr':55}])
143 let l = split(execute('Xlist', ""), "\n")
144 call assert_equal([' 1:10 col 5 warning 11: Warning',
145 \ ' 2:20 col 10 error 22: Error',
146 \ ' 3:30 col 15 info 33: Info',
147 \ ' 4:40 col 20 x 44: Other',
148 \ ' 5:50 col 25 55: one'], l)
149
Bram Moolenaard76ce852018-05-01 15:02:04 +0200150 " Test for module names, one needs to explicitly set `'valid':v:true` so
151 call g:Xsetlist([
152 \ {'lnum':10,'col':5,'type':'W','module':'Data.Text','text':'ModuleWarning','nr':11,'valid':v:true},
153 \ {'lnum':20,'col':10,'type':'W','module':'Data.Text','filename':'Data/Text.hs','text':'ModuleWarning','nr':22,'valid':v:true},
154 \ {'lnum':30,'col':15,'type':'W','filename':'Data/Text.hs','text':'FileWarning','nr':33,'valid':v:true}])
155 let l = split(execute('Xlist', ""), "\n")
156 call assert_equal([' 1 Data.Text:10 col 5 warning 11: ModuleWarning',
157 \ ' 2 Data.Text:20 col 10 warning 22: ModuleWarning',
158 \ ' 3 Data/Text.hs:30 col 15 warning 33: FileWarning'], l)
159
Bram Moolenaarf9ae1542019-11-18 22:02:16 +0100160 " For help entries in the quickfix list, only the filename without directory
161 " should be displayed
162 Xhelpgrep setqflist()
163 let l = split(execute('Xlist 1', ''), "\n")
164 call assert_match('^ 1 [^\\/]\{-}:', l[0])
165
Bram Moolenaaree85df32017-03-19 14:19:50 +0100166 " Error cases
167 call assert_fails('Xlist abc', 'E488:')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100168endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100169
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100170func Test_clist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100171 call XlistTests('c')
172 call XlistTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100173endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100174
175" Tests for the :colder, :cnewer, :lolder and :lnewer commands
176" Note that this test assumes that a quickfix/location list is
Bram Moolenaarcfc0a352016-01-09 20:23:00 +0100177" already set by the caller.
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100178func XageTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200179 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100180
Bram Moolenaar87f59b02019-04-04 14:04:11 +0200181 if a:cchar == 'l'
182 " No location list for the current window
183 call assert_fails('lolder', 'E776:')
184 call assert_fails('lnewer', 'E776:')
185 endif
186
Bram Moolenaarcf1ba352017-10-27 00:55:04 +0200187 let list = [{'bufnr': bufnr('%'), 'lnum': 1}]
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +0200188 call g:Xsetlist(list)
189
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100190 " Jumping to a non existent list should return error
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200191 silent! Xolder 99
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100192 call assert_true(v:errmsg ==# 'E380: At bottom of quickfix stack')
193
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200194 silent! Xnewer 99
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100195 call assert_true(v:errmsg ==# 'E381: At top of quickfix stack')
196
197 " Add three quickfix/location lists
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200198 Xgetexpr ['Xtestfile1:1:3:Line1']
199 Xgetexpr ['Xtestfile2:2:2:Line2']
200 Xgetexpr ['Xtestfile3:3:1:Line3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100201
202 " Go back two lists
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200203 Xolder
204 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100205 call assert_equal('Line2', l[0].text)
206
207 " Go forward two lists
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200208 Xnewer
209 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100210 call assert_equal('Line3', l[0].text)
211
212 " Test for the optional count argument
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200213 Xolder 2
214 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100215 call assert_equal('Line1', l[0].text)
216
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200217 Xnewer 2
218 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100219 call assert_equal('Line3', l[0].text)
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100220endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100221
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100222func Test_cage()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100223 call XageTests('c')
224 call XageTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100225endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100226
227" Tests for the :cwindow, :lwindow :cclose, :lclose, :copen and :lopen
228" commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100229func XwindowTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200230 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100231
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +0200232 " Opening the location list window without any errors should fail
233 if a:cchar == 'l'
234 call assert_fails('lopen', 'E776:')
235 endif
236
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100237 " Create a list with no valid entries
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200238 Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100239
240 " Quickfix/Location window should not open with no valid errors
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200241 Xwindow
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100242 call assert_true(winnr('$') == 1)
243
244 " Create a list with valid entries
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200245 Xgetexpr ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2',
246 \ 'Xtestfile3:3:1:Line3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100247
248 " Open the window
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200249 Xwindow
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100250 call assert_true(winnr('$') == 2 && winnr() == 2 &&
251 \ getline('.') ==# 'Xtestfile1|1 col 3| Line1')
Bram Moolenaar537ef082016-07-09 17:56:19 +0200252 redraw!
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100253
254 " Close the window
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200255 Xclose
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100256 call assert_true(winnr('$') == 1)
257
258 " Create a list with no valid entries
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200259 Xgetexpr ['non-error 1', 'non-error 2', 'non-error 3']
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100260
261 " Open the window
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200262 Xopen 5
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100263 call assert_true(winnr('$') == 2 && getline('.') ==# '|| non-error 1'
264 \ && winheight('.') == 5)
265
266 " Opening the window again, should move the cursor to that window
267 wincmd t
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200268 Xopen 7
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100269 call assert_true(winnr('$') == 2 && winnr() == 2 &&
270 \ winheight('.') == 7 &&
271 \ getline('.') ==# '|| non-error 1')
272
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +0100273 " :cnext in quickfix window should move to the next entry
274 Xnext
275 call assert_equal(2, g:Xgetlist({'idx' : 0}).idx)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100276
277 " Calling cwindow should close the quickfix window with no valid errors
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200278 Xwindow
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100279 call assert_true(winnr('$') == 1)
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +0200280
Bram Moolenaarf9ae1542019-11-18 22:02:16 +0100281 " Specifying the width should adjust the width for a vertically split
282 " quickfix window.
283 vert Xopen
284 call assert_equal(10, winwidth(0))
285 vert Xopen 12
286 call assert_equal(12, winwidth(0))
287 Xclose
288
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +0200289 if a:cchar == 'c'
290 " Opening the quickfix window in multiple tab pages should reuse the
291 " quickfix buffer
292 Xgetexpr ['Xtestfile1:1:3:Line1', 'Xtestfile2:2:2:Line2',
293 \ 'Xtestfile3:3:1:Line3']
294 Xopen
295 let qfbufnum = bufnr('%')
296 tabnew
297 Xopen
298 call assert_equal(qfbufnum, bufnr('%'))
299 new | only | tabonly
300 endif
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100301endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100302
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100303func Test_cwindow()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100304 call XwindowTests('c')
305 call XwindowTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100306endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100307
Bram Moolenaar36d50222019-05-02 20:17:40 +0200308func Test_copenHeight()
309 copen
310 wincmd H
311 let height = winheight(0)
312 copen 10
313 call assert_equal(height, winheight(0))
314 quit
315endfunc
316
Bram Moolenaar1142a312019-10-16 14:51:39 +0200317func Test_copenHeight_tabline()
318 set tabline=foo showtabline=2
319 copen
320 wincmd H
321 let height = winheight(0)
322 copen 10
323 call assert_equal(height, winheight(0))
324 quit
325 set tabline& showtabline&
326endfunc
327
328
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100329" Tests for the :cfile, :lfile, :caddfile, :laddfile, :cgetfile and :lgetfile
330" commands.
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100331func XfileTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200332 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100333
334 call writefile(['Xtestfile1:700:10:Line 700',
335 \ 'Xtestfile2:800:15:Line 800'], 'Xqftestfile1')
336
337 enew!
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200338 Xfile Xqftestfile1
339 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100340 call assert_true(len(l) == 2 &&
341 \ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
342 \ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
343
Bram Moolenaar049cba92016-06-26 14:38:04 +0200344 " Test with a non existent file
345 call assert_fails('Xfile non_existent_file', 'E40')
346
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100347 " Run cfile/lfile from a modified buffer
348 enew!
349 silent! put ='Quickfix'
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200350 silent! Xfile Xqftestfile1
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100351 call assert_true(v:errmsg ==# 'E37: No write since last change (add ! to override)')
352
353 call writefile(['Xtestfile3:900:30:Line 900'], 'Xqftestfile1')
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200354 Xaddfile Xqftestfile1
355 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100356 call assert_true(len(l) == 3 &&
357 \ l[2].lnum == 900 && l[2].col == 30 && l[2].text ==# 'Line 900')
358
359 call writefile(['Xtestfile1:222:77:Line 222',
360 \ 'Xtestfile2:333:88:Line 333'], 'Xqftestfile1')
361
362 enew!
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200363 Xgetfile Xqftestfile1
364 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100365 call assert_true(len(l) == 2 &&
366 \ l[0].lnum == 222 && l[0].col == 77 && l[0].text ==# 'Line 222' &&
367 \ l[1].lnum == 333 && l[1].col == 88 && l[1].text ==# 'Line 333')
368
Bram Moolenaar70077dd2019-11-24 12:12:42 +0100369 " Test for a file with a long line and without a newline at the end
370 let text = repeat('x', 1024)
371 let t = 'a.txt:18:' . text
372 call writefile([t], 'Xqftestfile1', 'b')
373 silent! Xfile Xqftestfile1
374 call assert_equal(text, g:Xgetlist()[0].text)
375
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100376 call delete('Xqftestfile1')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100377endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100378
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100379func Test_cfile()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100380 call XfileTests('c')
381 call XfileTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100382endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100383
384" Tests for the :cbuffer, :lbuffer, :caddbuffer, :laddbuffer, :cgetbuffer and
385" :lgetbuffer commands.
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100386func XbufferTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200387 call s:setup_commands(a:cchar)
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100388
389 enew!
390 silent! call setline(1, ['Xtestfile7:700:10:Line 700',
391 \ 'Xtestfile8:800:15:Line 800'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200392 Xbuffer!
393 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100394 call assert_true(len(l) == 2 &&
395 \ l[0].lnum == 700 && l[0].col == 10 && l[0].text ==# 'Line 700' &&
396 \ l[1].lnum == 800 && l[1].col == 15 && l[1].text ==# 'Line 800')
397
398 enew!
399 silent! call setline(1, ['Xtestfile9:900:55:Line 900',
400 \ 'Xtestfile10:950:66:Line 950'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200401 Xgetbuffer
402 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100403 call assert_true(len(l) == 2 &&
404 \ l[0].lnum == 900 && l[0].col == 55 && l[0].text ==# 'Line 900' &&
405 \ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950')
406
407 enew!
408 silent! call setline(1, ['Xtestfile11:700:20:Line 700',
409 \ 'Xtestfile12:750:25:Line 750'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200410 Xaddbuffer
411 let l = g:Xgetlist()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100412 call assert_true(len(l) == 4 &&
413 \ l[1].lnum == 950 && l[1].col == 66 && l[1].text ==# 'Line 950' &&
414 \ l[2].lnum == 700 && l[2].col == 20 && l[2].text ==# 'Line 700' &&
415 \ l[3].lnum == 750 && l[3].col == 25 && l[3].text ==# 'Line 750')
Bram Moolenaarab47c612016-06-14 22:02:26 +0200416 enew!
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100417
Bram Moolenaaree85df32017-03-19 14:19:50 +0100418 " Check for invalid buffer
419 call assert_fails('Xbuffer 199', 'E474:')
420
421 " Check for unloaded buffer
422 edit Xtestfile1
423 let bnr = bufnr('%')
424 enew!
425 call assert_fails('Xbuffer ' . bnr, 'E681:')
426
427 " Check for invalid range
428 " Using Xbuffer will not run the range check in the cbuffer/lbuffer
429 " commands. So directly call the commands.
430 if (a:cchar == 'c')
431 call assert_fails('900,999cbuffer', 'E16:')
432 else
433 call assert_fails('900,999lbuffer', 'E16:')
434 endif
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100435endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100436
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100437func Test_cbuffer()
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100438 call XbufferTests('c')
439 call XbufferTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100440endfunc
Bram Moolenaarda59dd52016-01-05 21:59:58 +0100441
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100442func XexprTests(cchar)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200443 call s:setup_commands(a:cchar)
444
445 call assert_fails('Xexpr 10', 'E777:')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100446endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200447
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100448func Test_cexpr()
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200449 call XexprTests('c')
450 call XexprTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100451endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200452
453" Tests for :cnext, :cprev, :cfirst, :clast commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100454func Xtest_browse(cchar)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200455 call s:setup_commands(a:cchar)
456
Bram Moolenaar74240d32017-12-10 15:26:15 +0100457 call g:Xsetlist([], 'f')
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +0200458 " Jumping to first or next location list entry without any error should
459 " result in failure
Bram Moolenaar74240d32017-12-10 15:26:15 +0100460 if a:cchar == 'c'
461 let err = 'E42:'
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +0100462 let cmd = '$cc'
Bram Moolenaar74240d32017-12-10 15:26:15 +0100463 else
464 let err = 'E776:'
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +0100465 let cmd = '$ll'
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +0200466 endif
Bram Moolenaar74240d32017-12-10 15:26:15 +0100467 call assert_fails('Xnext', err)
468 call assert_fails('Xprev', err)
469 call assert_fails('Xnfile', err)
470 call assert_fails('Xpfile', err)
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +0100471 call assert_fails(cmd, err)
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +0200472
Bram Moolenaarf9ae1542019-11-18 22:02:16 +0100473 Xexpr ''
Bram Moolenaarf9ae1542019-11-18 22:02:16 +0100474 call assert_fails(cmd, 'E42:')
475
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200476 call s:create_test_file('Xqftestfile1')
477 call s:create_test_file('Xqftestfile2')
478
479 Xgetexpr ['Xqftestfile1:5:Line5',
480 \ 'Xqftestfile1:6:Line6',
481 \ 'Xqftestfile2:10:Line10',
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200482 \ 'Xqftestfile2:11:Line11',
483 \ 'RegularLine1',
484 \ 'RegularLine2']
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200485
486 Xfirst
Bram Moolenaar818fc9a2020-02-21 17:54:45 +0100487 call assert_fails('-5Xcc', 'E16:')
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200488 call assert_fails('Xprev', 'E553')
489 call assert_fails('Xpfile', 'E553')
490 Xnfile
491 call assert_equal('Xqftestfile2', bufname('%'))
492 call assert_equal(10, line('.'))
493 Xpfile
494 call assert_equal('Xqftestfile1', bufname('%'))
495 call assert_equal(6, line('.'))
Bram Moolenaar74240d32017-12-10 15:26:15 +0100496 5Xcc
497 call assert_equal(5, g:Xgetlist({'idx':0}).idx)
498 2Xcc
499 call assert_equal(2, g:Xgetlist({'idx':0}).idx)
Bram Moolenaarf9ae1542019-11-18 22:02:16 +0100500 if a:cchar == 'c'
501 cc
502 else
503 ll
504 endif
505 call assert_equal(2, g:Xgetlist({'idx':0}).idx)
Bram Moolenaar74240d32017-12-10 15:26:15 +0100506 10Xcc
507 call assert_equal(6, g:Xgetlist({'idx':0}).idx)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200508 Xlast
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200509 Xprev
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200510 call assert_equal('Xqftestfile2', bufname('%'))
511 call assert_equal(11, line('.'))
512 call assert_fails('Xnext', 'E553')
513 call assert_fails('Xnfile', 'E553')
Bram Moolenaarf9ae1542019-11-18 22:02:16 +0100514 " To process the range using quickfix list entries, directly use the
515 " quickfix commands (don't use the user defined commands)
516 if a:cchar == 'c'
517 $cc
518 else
519 $ll
520 endif
521 call assert_equal(6, g:Xgetlist({'idx':0}).idx)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200522 Xrewind
523 call assert_equal('Xqftestfile1', bufname('%'))
524 call assert_equal(5, line('.'))
525
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200526 10Xnext
527 call assert_equal('Xqftestfile2', bufname('%'))
528 call assert_equal(11, line('.'))
529 10Xprev
530 call assert_equal('Xqftestfile1', bufname('%'))
531 call assert_equal(5, line('.'))
532
Bram Moolenaar74240d32017-12-10 15:26:15 +0100533 " Jumping to an error from the error window using cc command
534 Xgetexpr ['Xqftestfile1:5:Line5',
535 \ 'Xqftestfile1:6:Line6',
536 \ 'Xqftestfile2:10:Line10',
537 \ 'Xqftestfile2:11:Line11']
538 Xopen
539 10Xcc
540 call assert_equal(11, line('.'))
541 call assert_equal('Xqftestfile2', bufname('%'))
Bram Moolenaarf0cee192020-02-16 13:33:56 +0100542 Xopen
543 call cursor(2, 1)
544 if a:cchar == 'c'
545 .cc
546 else
547 .ll
548 endif
549 call assert_equal(6, line('.'))
550 call assert_equal('Xqftestfile1', bufname('%'))
Bram Moolenaar74240d32017-12-10 15:26:15 +0100551
552 " Jumping to an error from the error window (when only the error window is
553 " present)
554 Xopen | only
555 Xlast 1
556 call assert_equal(5, line('.'))
557 call assert_equal('Xqftestfile1', bufname('%'))
558
Bram Moolenaaree85df32017-03-19 14:19:50 +0100559 Xexpr ""
560 call assert_fails('Xnext', 'E42:')
561
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200562 call delete('Xqftestfile1')
563 call delete('Xqftestfile2')
Bram Moolenaarfc2b2702017-09-15 22:43:07 +0200564
565 " Should be able to use next/prev with invalid entries
566 Xexpr ""
567 call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
568 call assert_equal(0, g:Xgetlist({'size' : 0}).size)
Bram Moolenaar88a3e2b2019-12-06 21:11:39 +0100569 Xaddexpr ['foo', 'bar', 'baz', 'quux', 'sh|moo']
Bram Moolenaarfc2b2702017-09-15 22:43:07 +0200570 call assert_equal(5, g:Xgetlist({'size' : 0}).size)
571 Xlast
572 call assert_equal(5, g:Xgetlist({'idx' : 0}).idx)
573 Xfirst
574 call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
575 2Xnext
576 call assert_equal(3, g:Xgetlist({'idx' : 0}).idx)
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100577endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200578
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100579func Test_browse()
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200580 call Xtest_browse('c')
581 call Xtest_browse('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100582endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200583
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100584func Test_nomem()
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200585 call test_alloc_fail(GetAllocId('qf_dirname_start'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100586 call assert_fails('vimgrep vim runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100587
Bram Moolenaarce90e362019-09-08 18:58:44 +0200588 call GetAllocId('qf_dirname_now')->test_alloc_fail(0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100589 call assert_fails('vimgrep vim runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100590
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200591 call test_alloc_fail(GetAllocId('qf_namebuf'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100592 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100593
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200594 call test_alloc_fail(GetAllocId('qf_errmsg'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100595 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100596
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200597 call test_alloc_fail(GetAllocId('qf_pattern'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100598 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100599
600endfunc
601
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100602func s:test_xhelpgrep(cchar)
Bram Moolenaar049cba92016-06-26 14:38:04 +0200603 call s:setup_commands(a:cchar)
604 Xhelpgrep quickfix
605 Xopen
606 if a:cchar == 'c'
607 let title_text = ':helpgrep quickfix'
608 else
609 let title_text = ':lhelpgrep quickfix'
610 endif
611 call assert_true(w:quickfix_title =~ title_text, w:quickfix_title)
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200612
613 " Jumping to a help topic should open the help window
614 only
615 Xnext
616 call assert_true(&buftype == 'help')
617 call assert_true(winnr('$') == 2)
618 " Jumping to the next match should reuse the help window
619 Xnext
620 call assert_true(&buftype == 'help')
621 call assert_true(winnr() == 1)
622 call assert_true(winnr('$') == 2)
623 " Jumping to the next match from the quickfix window should reuse the help
624 " window
625 Xopen
626 Xnext
627 call assert_true(&buftype == 'help')
628 call assert_true(winnr() == 1)
629 call assert_true(winnr('$') == 2)
630
Bram Moolenaar62ef7972016-01-19 14:51:54 +0100631 " This wipes out the buffer, make sure that doesn't cause trouble.
Bram Moolenaar049cba92016-06-26 14:38:04 +0200632 Xclose
Bram Moolenaaree85df32017-03-19 14:19:50 +0100633
Bram Moolenaarf9ae1542019-11-18 22:02:16 +0100634 " When the current window is vertically split, jumping to a help match
635 " should open the help window at the top.
636 only | enew
637 let w1 = win_getid()
638 vert new
639 let w2 = win_getid()
640 Xnext
641 let w3 = win_getid()
642 call assert_true(&buftype == 'help')
643 call assert_true(winnr() == 1)
Bram Moolenaara106e6c2019-11-24 22:13:58 +0100644 " See jump_to_help_window() for details
645 let w2_width = winwidth(w2)
646 if w2_width != &columns && w2_width < 80
647 call assert_equal(['col', [['leaf', w3],
648 \ ['row', [['leaf', w2], ['leaf', w1]]]]], winlayout())
649 else
650 call assert_equal(['row', [['col', [['leaf', w3], ['leaf', w2]]],
651 \ ['leaf', w1]]] , winlayout())
652 endif
Bram Moolenaarf9ae1542019-11-18 22:02:16 +0100653
654 new | only
655 set buftype=help
656 set modified
657 call assert_fails('Xnext', 'E37:')
658 set nomodified
659 new | only
660
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +0200661 if a:cchar == 'l'
662 " When a help window is present, running :lhelpgrep should reuse the
663 " help window and not the current window
664 new | only
665 call g:Xsetlist([], 'f')
666 help index.txt
667 wincmd w
668 lhelpgrep quickfix
669 call assert_equal(1, winnr())
670 call assert_notequal([], getloclist(1))
671 call assert_equal([], getloclist(2))
672 endif
673
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200674 new | only
675
Bram Moolenaaree85df32017-03-19 14:19:50 +0100676 " Search for non existing help string
677 call assert_fails('Xhelpgrep a1b2c3', 'E480:')
Bram Moolenaar108e7b42018-10-11 17:39:12 +0200678 " Invalid regular expression
679 call assert_fails('Xhelpgrep \@<!', 'E480:')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100680endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +0200681
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100682func Test_helpgrep()
Bram Moolenaar049cba92016-06-26 14:38:04 +0200683 call s:test_xhelpgrep('c')
Bram Moolenaarcf25fdb2016-08-03 21:04:53 +0200684 helpclose
Bram Moolenaar049cba92016-06-26 14:38:04 +0200685 call s:test_xhelpgrep('l')
Bram Moolenaar62ef7972016-01-19 14:51:54 +0100686endfunc
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100687
Bram Moolenaar6920c722016-01-22 22:44:10 +0100688func Test_errortitle()
689 augroup QfBufWinEnter
690 au!
691 au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
692 augroup END
693 copen
694 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'')'}]
695 call setqflist(a)
696 call assert_equal(':setqflist()', g:a)
697 augroup QfBufWinEnter
698 au!
699 augroup END
700 augroup! QfBufWinEnter
701endfunc
Bram Moolenaare27dba42016-03-15 14:11:10 +0100702
Bram Moolenaar5584df62016-03-18 21:00:51 +0100703func Test_vimgreptitle()
704 augroup QfBufWinEnter
705 au!
706 au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
707 augroup END
708 try
709 vimgrep /pattern/j file
710 catch /E480/
711 endtry
712 copen
713 call assert_equal(': vimgrep /pattern/j file', g:a)
714 augroup QfBufWinEnter
715 au!
716 augroup END
717 augroup! QfBufWinEnter
718endfunc
719
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100720func XqfTitleTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200721 call s:setup_commands(a:cchar)
Bram Moolenaare27dba42016-03-15 14:11:10 +0100722
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200723 Xgetexpr ['file:1:1:message']
724 let l = g:Xgetlist()
Bram Moolenaare27dba42016-03-15 14:11:10 +0100725 if a:cchar == 'c'
726 call setqflist(l, 'r')
727 else
728 call setloclist(0, l, 'r')
729 endif
730
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200731 Xopen
Bram Moolenaare27dba42016-03-15 14:11:10 +0100732 if a:cchar == 'c'
733 let title = ':setqflist()'
734 else
735 let title = ':setloclist()'
736 endif
737 call assert_equal(title, w:quickfix_title)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200738 Xclose
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100739endfunc
Bram Moolenaare27dba42016-03-15 14:11:10 +0100740
741" Tests for quickfix window's title
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100742func Test_qf_title()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200743 call XqfTitleTests('c')
744 call XqfTitleTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100745endfunc
Bram Moolenaare27dba42016-03-15 14:11:10 +0100746
747" Tests for 'errorformat'
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100748func Test_efm()
Bram Moolenaare27dba42016-03-15 14:11:10 +0100749 let save_efm = &efm
750 set efm=%EEEE%m,%WWWW%m,%+CCCC%.%#,%-GGGG%.%#
751 cgetexpr ['WWWW', 'EEEE', 'CCCC']
752 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
753 call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
754 cgetexpr ['WWWW', 'GGGG', 'EEEE', 'CCCC']
755 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
756 call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
757 cgetexpr ['WWWW', 'GGGG', 'ZZZZ', 'EEEE', 'CCCC', 'YYYY']
758 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
759 call assert_equal("[['W', 1], ['ZZZZ', 0], ['E^@CCCC', 1], ['YYYY', 0]]", l)
760 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100761endfunc
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100762
763" This will test for problems in quickfix:
764" A. incorrectly copying location lists which caused the location list to show
765" a different name than the file that was actually being displayed.
766" B. not reusing the window for which the location list window is opened but
767" instead creating new windows.
768" C. make sure that the location list window is not reused instead of the
769" window it belongs to.
770"
771" Set up the test environment:
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100772func ReadTestProtocol(name)
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100773 let base = substitute(a:name, '\v^test://(.*)%(\.[^.]+)?', '\1', '')
774 let word = substitute(base, '\v(.*)\..*', '\1', '')
775
776 setl modifiable
777 setl noreadonly
778 setl noswapfile
779 setl bufhidden=delete
780 %del _
781 " For problem 2:
782 " 'buftype' has to be set to reproduce the constant opening of new windows
783 setl buftype=nofile
784
785 call setline(1, word)
786
787 setl nomodified
788 setl nomodifiable
789 setl readonly
790 exe 'doautocmd BufRead ' . substitute(a:name, '\v^test://(.*)', '\1', '')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100791endfunc
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100792
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100793func Test_locationlist()
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100794 enew
795
796 augroup testgroup
797 au!
798 autocmd BufReadCmd test://* call ReadTestProtocol(expand("<amatch>"))
799 augroup END
800
801 let words = [ "foo", "bar", "baz", "quux", "shmoo", "spam", "eggs" ]
802
803 let qflist = []
804 for word in words
805 call add(qflist, {'filename': 'test://' . word . '.txt', 'text': 'file ' . word . '.txt', })
806 " NOTE: problem 1:
807 " intentionally not setting 'lnum' so that the quickfix entries are not
808 " valid
Bram Moolenaaraad222c2019-09-06 22:46:09 +0200809 eval qflist->setloclist(0, ' ')
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100810 endfor
811
812 " Test A
813 lrewind
814 enew
815 lopen
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200816 4lnext
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100817 vert split
818 wincmd L
819 lopen
820 wincmd p
821 lnext
822 let fileName = expand("%")
823 wincmd p
824 let locationListFileName = substitute(getline(line('.')), '\([^|]*\)|.*', '\1', '')
825 let fileName = substitute(fileName, '\\', '/', 'g')
826 let locationListFileName = substitute(locationListFileName, '\\', '/', 'g')
827 call assert_equal("test://bar.txt", fileName)
828 call assert_equal("test://bar.txt", locationListFileName)
829
830 wincmd n | only
831
832 " Test B:
833 lrewind
834 lopen
835 2
836 exe "normal \<CR>"
837 wincmd p
838 3
839 exe "normal \<CR>"
840 wincmd p
841 4
842 exe "normal \<CR>"
843 call assert_equal(2, winnr('$'))
844 wincmd n | only
845
846 " Test C:
847 lrewind
848 lopen
849 " Let's move the location list window to the top to check whether it (the
850 " first window found) will be reused when we try to open new windows:
851 wincmd K
852 2
853 exe "normal \<CR>"
854 wincmd p
855 3
856 exe "normal \<CR>"
857 wincmd p
858 4
859 exe "normal \<CR>"
860 1wincmd w
861 call assert_equal('quickfix', &buftype)
862 2wincmd w
863 let bufferName = expand("%")
864 let bufferName = substitute(bufferName, '\\', '/', 'g')
865 call assert_equal('test://quux.txt', bufferName)
866
867 wincmd n | only
868
869 augroup! testgroup
Bram Moolenaaree85df32017-03-19 14:19:50 +0100870endfunc
Bram Moolenaar0899d692016-03-19 13:35:03 +0100871
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100872func Test_locationlist_curwin_was_closed()
Bram Moolenaar0899d692016-03-19 13:35:03 +0100873 augroup testgroup
874 au!
Bram Moolenaard106e5b2016-04-21 19:38:07 +0200875 autocmd BufReadCmd test_curwin.txt call R(expand("<amatch>"))
Bram Moolenaar0899d692016-03-19 13:35:03 +0100876 augroup END
877
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100878 func! R(n)
Bram Moolenaar0899d692016-03-19 13:35:03 +0100879 quit
880 endfunc
881
882 new
883 let q = []
Bram Moolenaard106e5b2016-04-21 19:38:07 +0200884 call add(q, {'filename': 'test_curwin.txt' })
Bram Moolenaar0899d692016-03-19 13:35:03 +0100885 call setloclist(0, q)
886 call assert_fails('lrewind', 'E924:')
887
888 augroup! testgroup
Bram Moolenaaree85df32017-03-19 14:19:50 +0100889endfunc
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100890
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100891func Test_locationlist_cross_tab_jump()
Bram Moolenaar0a9046f2016-10-15 19:28:13 +0200892 call writefile(['loclistfoo'], 'loclistfoo')
893 call writefile(['loclistbar'], 'loclistbar')
894 set switchbuf=usetab
895
896 edit loclistfoo
897 tabedit loclistbar
898 silent lgrep loclistfoo loclist*
899 call assert_equal(1, tabpagenr())
900
901 enew | only | tabonly
902 set switchbuf&vim
903 call delete('loclistfoo')
904 call delete('loclistbar')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100905endfunc
Bram Moolenaar0a9046f2016-10-15 19:28:13 +0200906
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100907" More tests for 'errorformat'
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100908func Test_efm1()
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100909 if !has('unix')
910 " The 'errorformat' setting is different on non-Unix systems.
911 " This test works only on Unix-like systems.
912 return
913 endif
914
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200915 let l =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200916 "Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set.
917 "Xtestfile", line 6 col 19; this is an error
918 gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include version.c
919 Xtestfile:9: parse error before `asd'
920 make: *** [vim] Error 1
921 in file "Xtestfile" linenr 10: there is an error
922
923 2 returned
924 "Xtestfile", line 11 col 1; this is an error
925 "Xtestfile", line 12 col 2; this is another error
926 "Xtestfile", line 14:10; this is an error in column 10
927 =Xtestfile=, line 15:10; this is another error, but in vcol 10 this time
928 "Xtestfile", linenr 16: yet another problem
929 Error in "Xtestfile" at line 17:
930 x should be a dot
931 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17
932 ^
933 Error in "Xtestfile" at line 18:
934 x should be a dot
935 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18
936 .............^
937 Error in "Xtestfile" at line 19:
938 x should be a dot
939 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19
940 --------------^
941 Error in "Xtestfile" at line 20:
942 x should be a dot
943 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20
944 ^
945
946 Does anyone know what is the problem and how to correction it?
947 "Xtestfile", line 21 col 9: What is the title of the quickfix window?
948 "Xtestfile", line 22 col 9: What is the title of the quickfix window?
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200949 [DATA]
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100950
951 call writefile(l, 'Xerrorfile1')
952 call writefile(l[:-2], 'Xerrorfile2')
953
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200954 let m =<< [DATA]
955 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 2
956 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 3
957 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 4
958 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 5
959 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 6
960 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 7
961 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 8
962 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 9
963 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 10
964 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 11
965 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 12
966 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 13
967 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 14
968 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 15
969 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 16
970 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17
971 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18
972 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19
973 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20
974 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 21
975 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 22
976[DATA]
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100977 call writefile(m, 'Xtestfile')
978
979 let save_efm = &efm
980 set efm+==%f=\\,\ line\ %l%*\\D%v%*[^\ ]\ %m
981 set efm^=%AError\ in\ \"%f\"\ at\ line\ %l:,%Z%p^,%C%m
982
983 exe 'cf Xerrorfile2'
984 clast
985 copen
986 call assert_equal(':cf Xerrorfile2', w:quickfix_title)
987 wincmd p
988
989 exe 'cf Xerrorfile1'
990 call assert_equal([4, 12], [line('.'), col('.')])
991 cn
992 call assert_equal([6, 19], [line('.'), col('.')])
993 cn
994 call assert_equal([9, 2], [line('.'), col('.')])
995 cn
996 call assert_equal([10, 2], [line('.'), col('.')])
997 cn
998 call assert_equal([11, 1], [line('.'), col('.')])
999 cn
1000 call assert_equal([12, 2], [line('.'), col('.')])
1001 cn
1002 call assert_equal([14, 10], [line('.'), col('.')])
1003 cn
1004 call assert_equal([15, 3, 10], [line('.'), col('.'), virtcol('.')])
1005 cn
1006 call assert_equal([16, 2], [line('.'), col('.')])
1007 cn
1008 call assert_equal([17, 6], [line('.'), col('.')])
1009 cn
1010 call assert_equal([18, 7], [line('.'), col('.')])
1011 cn
1012 call assert_equal([19, 8], [line('.'), col('.')])
1013 cn
1014 call assert_equal([20, 9], [line('.'), col('.')])
1015 clast
1016 cprev
1017 cprev
1018 wincmd w
1019 call assert_equal(':cf Xerrorfile1', w:quickfix_title)
1020 wincmd p
1021
1022 let &efm = save_efm
1023 call delete('Xerrorfile1')
1024 call delete('Xerrorfile2')
1025 call delete('Xtestfile')
Bram Moolenaaree85df32017-03-19 14:19:50 +01001026endfunc
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001027
Bram Moolenaarab47c612016-06-14 22:02:26 +02001028" Test for quickfix directory stack support
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001029func s:dir_stack_tests(cchar)
Bram Moolenaar38df43b2016-06-20 21:41:12 +02001030 call s:setup_commands(a:cchar)
1031
Bram Moolenaarab47c612016-06-14 22:02:26 +02001032 let save_efm=&efm
1033 set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
1034
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001035 let lines = ["Entering dir 'dir1/a'",
1036 \ 'habits2.txt:1:Nine Healthy Habits',
1037 \ "Entering dir 'b'",
1038 \ 'habits3.txt:2:0 Hours of television',
1039 \ 'habits2.txt:7:5 Small meals',
1040 \ "Entering dir 'dir1/c'",
1041 \ 'habits4.txt:3:1 Hour of exercise',
1042 \ "Leaving dir 'dir1/c'",
1043 \ "Leaving dir 'dir1/a'",
1044 \ 'habits1.txt:4:2 Liters of water',
1045 \ "Entering dir 'dir2'",
1046 \ 'habits5.txt:5:3 Cups of hot green tea',
1047 \ "Leaving dir 'dir2'"
1048 \]
Bram Moolenaarab47c612016-06-14 22:02:26 +02001049
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001050 Xexpr ""
1051 for l in lines
1052 Xaddexpr l
1053 endfor
Bram Moolenaarab47c612016-06-14 22:02:26 +02001054
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001055 let qf = g:Xgetlist()
Bram Moolenaarab47c612016-06-14 22:02:26 +02001056
1057 call assert_equal('dir1/a/habits2.txt', bufname(qf[1].bufnr))
1058 call assert_equal(1, qf[1].lnum)
1059 call assert_equal('dir1/a/b/habits3.txt', bufname(qf[3].bufnr))
1060 call assert_equal(2, qf[3].lnum)
1061 call assert_equal('dir1/a/habits2.txt', bufname(qf[4].bufnr))
1062 call assert_equal(7, qf[4].lnum)
1063 call assert_equal('dir1/c/habits4.txt', bufname(qf[6].bufnr))
1064 call assert_equal(3, qf[6].lnum)
1065 call assert_equal('habits1.txt', bufname(qf[9].bufnr))
1066 call assert_equal(4, qf[9].lnum)
1067 call assert_equal('dir2/habits5.txt', bufname(qf[11].bufnr))
1068 call assert_equal(5, qf[11].lnum)
1069
1070 let &efm=save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001071endfunc
Bram Moolenaarab47c612016-06-14 22:02:26 +02001072
1073" Tests for %D and %X errorformat options
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001074func Test_efm_dirstack()
Bram Moolenaarab47c612016-06-14 22:02:26 +02001075 " Create the directory stack and files
1076 call mkdir('dir1')
1077 call mkdir('dir1/a')
1078 call mkdir('dir1/a/b')
1079 call mkdir('dir1/c')
1080 call mkdir('dir2')
1081
1082 let lines = ["Nine Healthy Habits",
1083 \ "0 Hours of television",
1084 \ "1 Hour of exercise",
1085 \ "2 Liters of water",
1086 \ "3 Cups of hot green tea",
1087 \ "4 Short mental breaks",
1088 \ "5 Small meals",
1089 \ "6 AM wake up time",
1090 \ "7 Minutes of laughter",
1091 \ "8 Hours of sleep (at least)",
1092 \ "9 PM end of the day and off to bed"
1093 \ ]
1094 call writefile(lines, 'habits1.txt')
1095 call writefile(lines, 'dir1/a/habits2.txt')
1096 call writefile(lines, 'dir1/a/b/habits3.txt')
1097 call writefile(lines, 'dir1/c/habits4.txt')
1098 call writefile(lines, 'dir2/habits5.txt')
1099
1100 call s:dir_stack_tests('c')
1101 call s:dir_stack_tests('l')
1102
1103 call delete('dir1', 'rf')
1104 call delete('dir2', 'rf')
1105 call delete('habits1.txt')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001106endfunc
Bram Moolenaarab47c612016-06-14 22:02:26 +02001107
Bram Moolenaar9b457942016-10-09 16:10:05 +02001108" Test for resync after continuing an ignored message
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001109func Xefm_ignore_continuations(cchar)
Bram Moolenaar9b457942016-10-09 16:10:05 +02001110 call s:setup_commands(a:cchar)
1111
1112 let save_efm = &efm
1113
1114 let &efm =
1115 \ '%Eerror %m %l,' .
1116 \ '%-Wignored %m %l,' .
1117 \ '%+Cmore ignored %m %l,' .
1118 \ '%Zignored end'
1119 Xgetexpr ['ignored warning 1', 'more ignored continuation 2', 'ignored end', 'error resync 4']
1120 let l = map(g:Xgetlist(), '[v:val.text, v:val.valid, v:val.lnum, v:val.type]')
1121 call assert_equal([['resync', 1, 4, 'E']], l)
1122
1123 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001124endfunc
Bram Moolenaar9b457942016-10-09 16:10:05 +02001125
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001126func Test_efm_ignore_continuations()
Bram Moolenaar9b457942016-10-09 16:10:05 +02001127 call Xefm_ignore_continuations('c')
1128 call Xefm_ignore_continuations('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001129endfunc
Bram Moolenaar9b457942016-10-09 16:10:05 +02001130
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001131" Tests for invalid error format specifies
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001132func Xinvalid_efm_Tests(cchar)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001133 call s:setup_commands(a:cchar)
1134
Bram Moolenaar049cba92016-06-26 14:38:04 +02001135 let save_efm = &efm
1136
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001137 set efm=%f:%l:%m,%f:%f:%l:%m
1138 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E372:')
1139
1140 set efm=%f:%l:%m,%f:%l:%r:%m
1141 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
1142
1143 set efm=%f:%l:%m,%O:%f:%l:%m
1144 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
1145
1146 set efm=%f:%l:%m,%f:%l:%*[^a-z
1147 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E374:')
1148
1149 set efm=%f:%l:%m,%f:%l:%*c
1150 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E375:')
1151
1152 set efm=%f:%l:%m,%L%M%N
1153 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E376:')
1154
1155 set efm=%f:%l:%m,%f:%l:%m:%R
1156 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E377:')
1157
Bram Moolenaar70077dd2019-11-24 12:12:42 +01001158 " Invalid regular expression
1159 set efm=%\\%%k
1160 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E867:')
1161
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001162 set efm=
1163 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E378:')
1164
1165 set efm=%DEntering\ dir\ abc,%f:%l:%m
1166 call assert_fails('Xexpr ["Entering dir abc", "abc.txt:1:Hello world"]', 'E379:')
1167
1168 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001169endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001170
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001171func Test_invalid_efm()
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001172 call Xinvalid_efm_Tests('c')
1173 call Xinvalid_efm_Tests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001174endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001175
1176" TODO:
1177" Add tests for the following formats in 'errorformat'
1178" %r %O
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001179func Test_efm2()
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001180 let save_efm = &efm
Bram Moolenaar049cba92016-06-26 14:38:04 +02001181
1182 " Test for %s format in efm
1183 set efm=%f:%s
1184 cexpr 'Xtestfile:Line search text'
Bram Moolenaar049cba92016-06-26 14:38:04 +02001185 let l = getqflist()
Bram Moolenaar70077dd2019-11-24 12:12:42 +01001186 call assert_equal('^\VLine search text\$', l[0].pattern)
1187 call assert_equal(0, l[0].lnum)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001188
Bram Moolenaaree85df32017-03-19 14:19:50 +01001189 let l = split(execute('clist', ''), "\n")
1190 call assert_equal([' 1 Xtestfile:^\VLine search text\$: '], l)
1191
Bram Moolenaar70077dd2019-11-24 12:12:42 +01001192 " Test for a long line
1193 cexpr 'Xtestfile:' . repeat('a', 1026)
1194 let l = getqflist()
1195 call assert_equal('^\V' . repeat('a', 1019) . '\$', l[0].pattern)
1196
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001197 " Test for %P, %Q and %t format specifiers
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001198 let lines =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001199 [Xtestfile1]
1200 (1,17) error: ';' missing
1201 (21,2) warning: variable 'z' not defined
1202 (67,3) error: end of file found before string ended
1203 --
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001204
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001205 [Xtestfile2]
1206 --
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001207
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001208 [Xtestfile3]
1209 NEW compiler v1.1
1210 (2,2) warning: variable 'x' not defined
1211 (67,3) warning: 's' already defined
1212 --
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001213 [DATA]
1214
Bram Moolenaaree85df32017-03-19 14:19:50 +01001215 set efm=%+P[%f]%r,(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%+Q--%r
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001216 " To exercise the push/pop file functionality in quickfix, the test files
1217 " need to be created.
1218 call writefile(['Line1'], 'Xtestfile1')
1219 call writefile(['Line2'], 'Xtestfile2')
1220 call writefile(['Line3'], 'Xtestfile3')
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001221 cexpr ""
1222 for l in lines
1223 caddexpr l
1224 endfor
Bram Moolenaar049cba92016-06-26 14:38:04 +02001225 let l = getqflist()
Bram Moolenaaree85df32017-03-19 14:19:50 +01001226 call assert_equal(12, len(l))
Bram Moolenaar049cba92016-06-26 14:38:04 +02001227 call assert_equal(21, l[2].lnum)
1228 call assert_equal(2, l[2].col)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001229 call assert_equal('w', l[2].type)
1230 call assert_equal('e', l[3].type)
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001231 call delete('Xtestfile1')
1232 call delete('Xtestfile2')
1233 call delete('Xtestfile3')
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001234
Bram Moolenaar70077dd2019-11-24 12:12:42 +01001235 " Test for %P, %Q with non-existing files
1236 cexpr lines
1237 let l = getqflist()
1238 call assert_equal(14, len(l))
1239 call assert_equal('[Xtestfile1]', l[0].text)
1240 call assert_equal('[Xtestfile2]', l[6].text)
1241 call assert_equal('[Xtestfile3]', l[9].text)
1242
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001243 " Tests for %E, %C and %Z format specifiers
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001244 let lines =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001245 Error 275
1246 line 42
1247 column 3
1248 ' ' expected after '--'
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001249 [DATA]
1250
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001251 set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m
1252 cgetexpr lines
1253 let l = getqflist()
1254 call assert_equal(275, l[0].nr)
1255 call assert_equal(42, l[0].lnum)
1256 call assert_equal(3, l[0].col)
1257 call assert_equal('E', l[0].type)
1258 call assert_equal("\n' ' expected after '--'", l[0].text)
1259
1260 " Test for %>
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001261 let lines =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001262 Error in line 147 of foo.c:
1263 unknown variable 'i'
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001264 [DATA]
1265
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001266 set efm=unknown\ variable\ %m,%E%>Error\ in\ line\ %l\ of\ %f:,%Z%m
1267 cgetexpr lines
1268 let l = getqflist()
1269 call assert_equal(147, l[0].lnum)
1270 call assert_equal('E', l[0].type)
1271 call assert_equal("\nunknown variable 'i'", l[0].text)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001272
Bram Moolenaare87e6dd2016-07-17 19:25:04 +02001273 " Test for %A, %C and other formats
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001274 let lines =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001275 ==============================================================
1276 FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest)
1277 --------------------------------------------------------------
1278 Traceback (most recent call last):
1279 File "unittests/dbfacadeTest.py", line 89, in testFoo
1280 self.assertEquals(34, dtid)
1281 File "/usr/lib/python2.2/unittest.py", line 286, in
1282 failUnlessEqual
1283 raise self.failureException, \\
Bram Moolenaar70077dd2019-11-24 12:12:42 +01001284 W:AssertionError: 34 != 33
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001285
1286 --------------------------------------------------------------
1287 Ran 27 tests in 0.063s
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001288 [DATA]
1289
Bram Moolenaar70077dd2019-11-24 12:12:42 +01001290 set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%t:%m
Bram Moolenaare87e6dd2016-07-17 19:25:04 +02001291 cgetexpr lines
1292 let l = getqflist()
1293 call assert_equal(8, len(l))
1294 call assert_equal(89, l[4].lnum)
1295 call assert_equal(1, l[4].valid)
1296 call assert_equal('unittests/dbfacadeTest.py', bufname(l[4].bufnr))
Bram Moolenaar70077dd2019-11-24 12:12:42 +01001297 call assert_equal('W', l[4].type)
Bram Moolenaare87e6dd2016-07-17 19:25:04 +02001298
Bram Moolenaard76ce852018-05-01 15:02:04 +02001299 " Test for %o
1300 set efm=%f(%o):%l\ %m
Bram Moolenaarbc7845d2018-05-01 16:26:48 +02001301 cgetexpr ['Xotestfile(Language.PureScript.Types):20 Error']
1302 call writefile(['Line1'], 'Xotestfile')
Bram Moolenaard76ce852018-05-01 15:02:04 +02001303 let l = getqflist()
1304 call assert_equal(1, len(l), string(l))
1305 call assert_equal('Language.PureScript.Types', l[0].module)
1306 copen
1307 call assert_equal('Language.PureScript.Types|20| Error', getline(1))
1308 call feedkeys("\<CR>", 'xn')
Bram Moolenaarbc7845d2018-05-01 16:26:48 +02001309 call assert_equal('Xotestfile', expand('%:t'))
Bram Moolenaard76ce852018-05-01 15:02:04 +02001310 cclose
1311 bd
Bram Moolenaarbc7845d2018-05-01 16:26:48 +02001312 call delete("Xotestfile")
Bram Moolenaard76ce852018-05-01 15:02:04 +02001313
Bram Moolenaar70077dd2019-11-24 12:12:42 +01001314 " Test for a long module name
1315 cexpr 'Xtest(' . repeat('m', 1026) . '):15 message'
1316 let l = getqflist()
1317 call assert_equal(repeat('m', 1024), l[0].module)
1318 call assert_equal(15, l[0].lnum)
1319 call assert_equal('message', l[0].text)
1320
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001321 " The following sequence of commands used to crash Vim
1322 set efm=%W%m
1323 cgetexpr ['msg1']
1324 let l = getqflist()
1325 call assert_equal(1, len(l), string(l))
1326 call assert_equal('msg1', l[0].text)
1327 set efm=%C%m
1328 lexpr 'msg2'
1329 let l = getloclist(0)
1330 call assert_equal(1, len(l), string(l))
1331 call assert_equal('msg2', l[0].text)
1332 lopen
1333 call setqflist([], 'r')
1334 caddbuf
1335 let l = getqflist()
1336 call assert_equal(1, len(l), string(l))
1337 call assert_equal('|| msg2', l[0].text)
1338
Bram Moolenaar78ddc062018-05-15 21:56:34 +02001339 " When matching error lines, case should be ignored. Test for this.
1340 set noignorecase
1341 let l=getqflist({'lines' : ['Xtest:FOO10:Line 20'], 'efm':'%f:foo%l:%m'})
1342 call assert_equal(10, l.items[0].lnum)
1343 call assert_equal('Line 20', l.items[0].text)
1344 set ignorecase&
1345
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001346 new | only
Bram Moolenaar049cba92016-06-26 14:38:04 +02001347 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001348endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001349
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001350func XquickfixChangedByAutocmd(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001351 call s:setup_commands(a:cchar)
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001352 if a:cchar == 'c'
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001353 let ErrorNr = 'E925'
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001354 func! ReadFunc()
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001355 colder
1356 cgetexpr []
1357 endfunc
1358 else
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001359 let ErrorNr = 'E926'
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001360 func! ReadFunc()
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001361 lolder
1362 lgetexpr []
1363 endfunc
1364 endif
1365
1366 augroup testgroup
1367 au!
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001368 autocmd BufReadCmd test_changed.txt call ReadFunc()
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001369 augroup END
1370
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001371 new | only
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001372 let words = [ "a", "b" ]
1373 let qflist = []
1374 for word in words
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001375 call add(qflist, {'filename': 'test_changed.txt'})
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001376 call g:Xsetlist(qflist, ' ')
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001377 endfor
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001378 call assert_fails('Xrewind', ErrorNr . ':')
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001379
1380 augroup! testgroup
1381endfunc
1382
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001383func Test_quickfix_was_changed_by_autocmd()
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001384 call XquickfixChangedByAutocmd('c')
1385 call XquickfixChangedByAutocmd('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001386endfunc
Bram Moolenaar8b201792016-03-25 15:01:10 +01001387
1388func Test_caddbuffer_to_empty()
1389 helpgr quickfix
1390 call setqflist([], 'r')
1391 cad
Bram Moolenaarf68f1d72016-03-25 17:14:06 +01001392 try
1393 cn
1394 catch
1395 " number of matches is unknown
1396 call assert_true(v:exception =~ 'E553:')
1397 endtry
Bram Moolenaar8b201792016-03-25 15:01:10 +01001398 quit!
1399endfunc
Bram Moolenaar89c64d52016-03-27 18:44:40 +02001400
1401func Test_cgetexpr_works()
1402 " this must not crash Vim
1403 cgetexpr [$x]
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001404 lgetexpr [$x]
Bram Moolenaar89c64d52016-03-27 18:44:40 +02001405endfunc
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001406
1407" Tests for the setqflist() and setloclist() functions
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001408func SetXlistTests(cchar, bnum)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001409 call s:setup_commands(a:cchar)
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001410
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001411 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 1},
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001412 \ {'bufnr': a:bnum, 'lnum': 2}])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001413 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001414 call assert_equal(2, len(l))
1415 call assert_equal(2, l[1].lnum)
1416
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001417 Xnext
1418 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3}], 'a')
1419 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001420 call assert_equal(3, len(l))
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001421 Xnext
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001422 call assert_equal(3, line('.'))
1423
Bram Moolenaar2b2b8ae2016-05-24 19:59:51 +02001424 " Appending entries to the list should not change the cursor position
1425 " in the quickfix window
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001426 Xwindow
Bram Moolenaar2b2b8ae2016-05-24 19:59:51 +02001427 1
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001428 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 4},
Bram Moolenaar2b2b8ae2016-05-24 19:59:51 +02001429 \ {'bufnr': a:bnum, 'lnum': 5}], 'a')
1430 call assert_equal(1, line('.'))
1431 close
1432
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001433 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3},
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001434 \ {'bufnr': a:bnum, 'lnum': 4},
1435 \ {'bufnr': a:bnum, 'lnum': 5}], 'r')
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001436 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001437 call assert_equal(3, len(l))
1438 call assert_equal(5, l[2].lnum)
1439
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001440 call g:Xsetlist([])
1441 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001442 call assert_equal(0, len(l))
Bram Moolenaaree85df32017-03-19 14:19:50 +01001443
Bram Moolenaarf1d21c82017-04-22 21:20:46 +02001444 " Tests for setting the 'valid' flag
1445 call g:Xsetlist([{'bufnr':a:bnum, 'lnum':4, 'valid':0}])
1446 Xwindow
1447 call assert_equal(1, winnr('$'))
1448 let l = g:Xgetlist()
1449 call g:Xsetlist(l)
1450 call assert_equal(0, g:Xgetlist()[0].valid)
Bram Moolenaar9752c722018-12-22 16:49:34 +01001451 " Adding a non-valid entry should not mark the list as having valid entries
1452 call g:Xsetlist([{'bufnr':a:bnum, 'lnum':5, 'valid':0}], 'a')
1453 Xwindow
1454 call assert_equal(1, winnr('$'))
1455
1456 " :cnext/:cprev should still work even with invalid entries in the list
1457 let l = [{'bufnr' : a:bnum, 'lnum' : 1, 'text' : '1', 'valid' : 0},
1458 \ {'bufnr' : a:bnum, 'lnum' : 2, 'text' : '2', 'valid' : 0}]
1459 call g:Xsetlist(l)
1460 Xnext
1461 call assert_equal(2, g:Xgetlist({'idx' : 0}).idx)
1462 Xprev
1463 call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
1464 " :cnext/:cprev should still work after appending invalid entries to an
1465 " empty list
1466 call g:Xsetlist([])
1467 call g:Xsetlist(l, 'a')
1468 Xnext
1469 call assert_equal(2, g:Xgetlist({'idx' : 0}).idx)
1470 Xprev
1471 call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
1472
Bram Moolenaarf1d21c82017-04-22 21:20:46 +02001473 call g:Xsetlist([{'text':'Text1', 'valid':1}])
1474 Xwindow
1475 call assert_equal(2, winnr('$'))
1476 Xclose
1477 let save_efm = &efm
1478 set efm=%m
1479 Xgetexpr 'TestMessage'
1480 let l = g:Xgetlist()
1481 call g:Xsetlist(l)
1482 call assert_equal(1, g:Xgetlist()[0].valid)
1483 let &efm = save_efm
1484
Bram Moolenaaree85df32017-03-19 14:19:50 +01001485 " Error cases:
1486 " Refer to a non-existing buffer and pass a non-dictionary type
1487 call assert_fails("call g:Xsetlist([{'bufnr':998, 'lnum':4}," .
1488 \ " {'bufnr':999, 'lnum':5}])", 'E92:')
1489 call g:Xsetlist([[1, 2,3]])
1490 call assert_equal(0, len(g:Xgetlist()))
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001491endfunc
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001492
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001493func Test_setqflist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001494 new Xtestfile | only
1495 let bnum = bufnr('%')
1496 call setline(1, range(1,5))
1497
1498 call SetXlistTests('c', bnum)
1499 call SetXlistTests('l', bnum)
1500
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001501 enew!
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001502 call delete('Xtestfile')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001503endfunc
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001504
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001505func Xlist_empty_middle(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001506 call s:setup_commands(a:cchar)
1507
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001508 " create three quickfix lists
Bram Moolenaaree85df32017-03-19 14:19:50 +01001509 let @/ = 'Test_'
1510 Xvimgrep // test_quickfix.vim
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001511 let testlen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001512 call assert_true(testlen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001513 Xvimgrep empty test_quickfix.vim
1514 call assert_true(len(g:Xgetlist()) > 0)
1515 Xvimgrep matches test_quickfix.vim
1516 let matchlen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001517 call assert_true(matchlen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001518 Xolder
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001519 " make the middle list empty
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001520 call g:Xsetlist([], 'r')
1521 call assert_true(len(g:Xgetlist()) == 0)
1522 Xolder
1523 call assert_equal(testlen, len(g:Xgetlist()))
1524 Xnewer
1525 Xnewer
1526 call assert_equal(matchlen, len(g:Xgetlist()))
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001527endfunc
1528
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001529func Test_setqflist_empty_middle()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001530 call Xlist_empty_middle('c')
1531 call Xlist_empty_middle('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001532endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001533
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001534func Xlist_empty_older(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001535 call s:setup_commands(a:cchar)
1536
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001537 " create three quickfix lists
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001538 Xvimgrep one test_quickfix.vim
1539 let onelen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001540 call assert_true(onelen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001541 Xvimgrep two test_quickfix.vim
1542 let twolen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001543 call assert_true(twolen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001544 Xvimgrep three test_quickfix.vim
1545 let threelen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001546 call assert_true(threelen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001547 Xolder 2
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001548 " make the first list empty, check the others didn't change
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001549 call g:Xsetlist([], 'r')
1550 call assert_true(len(g:Xgetlist()) == 0)
1551 Xnewer
1552 call assert_equal(twolen, len(g:Xgetlist()))
1553 Xnewer
1554 call assert_equal(threelen, len(g:Xgetlist()))
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001555endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001556
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001557func Test_setqflist_empty_older()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001558 call Xlist_empty_older('c')
1559 call Xlist_empty_older('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001560endfunc
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001561
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001562func XquickfixSetListWithAct(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001563 call s:setup_commands(a:cchar)
1564
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001565 let list1 = [{'filename': 'fnameA', 'text': 'A'},
1566 \ {'filename': 'fnameB', 'text': 'B'}]
1567 let list2 = [{'filename': 'fnameC', 'text': 'C'},
1568 \ {'filename': 'fnameD', 'text': 'D'},
1569 \ {'filename': 'fnameE', 'text': 'E'}]
1570
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01001571 " {action} is unspecified. Same as specifying ' '.
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001572 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001573 silent! Xnewer 99
1574 call g:Xsetlist(list1)
1575 call g:Xsetlist(list2)
1576 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001577 call assert_equal(3, len(li))
1578 call assert_equal('C', li[0]['text'])
1579 call assert_equal('D', li[1]['text'])
1580 call assert_equal('E', li[2]['text'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001581 silent! Xolder
1582 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001583 call assert_equal(2, len(li))
1584 call assert_equal('A', li[0]['text'])
1585 call assert_equal('B', li[1]['text'])
1586
1587 " {action} is specified ' '.
1588 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001589 silent! Xnewer 99
1590 call g:Xsetlist(list1)
1591 call g:Xsetlist(list2, ' ')
1592 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001593 call assert_equal(3, len(li))
1594 call assert_equal('C', li[0]['text'])
1595 call assert_equal('D', li[1]['text'])
1596 call assert_equal('E', li[2]['text'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001597 silent! Xolder
1598 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001599 call assert_equal(2, len(li))
1600 call assert_equal('A', li[0]['text'])
1601 call assert_equal('B', li[1]['text'])
1602
1603 " {action} is specified 'a'.
1604 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001605 silent! Xnewer 99
1606 call g:Xsetlist(list1)
1607 call g:Xsetlist(list2, 'a')
1608 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001609 call assert_equal(5, len(li))
1610 call assert_equal('A', li[0]['text'])
1611 call assert_equal('B', li[1]['text'])
1612 call assert_equal('C', li[2]['text'])
1613 call assert_equal('D', li[3]['text'])
1614 call assert_equal('E', li[4]['text'])
1615
1616 " {action} is specified 'r'.
1617 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001618 silent! Xnewer 99
1619 call g:Xsetlist(list1)
1620 call g:Xsetlist(list2, 'r')
1621 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001622 call assert_equal(3, len(li))
1623 call assert_equal('C', li[0]['text'])
1624 call assert_equal('D', li[1]['text'])
1625 call assert_equal('E', li[2]['text'])
1626
1627 " Test for wrong value.
1628 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001629 call assert_fails("call g:Xsetlist(0)", 'E714:')
1630 call assert_fails("call g:Xsetlist(list1, '')", 'E927:')
1631 call assert_fails("call g:Xsetlist(list1, 'aa')", 'E927:')
1632 call assert_fails("call g:Xsetlist(list1, ' a')", 'E927:')
1633 call assert_fails("call g:Xsetlist(list1, 0)", 'E928:')
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001634endfunc
1635
Bram Moolenaara0ca7d02017-12-19 10:22:19 +01001636func Test_setqflist_invalid_nr()
1637 " The following command used to crash Vim
Bram Moolenaaraad222c2019-09-06 22:46:09 +02001638 eval []->setqflist(' ', {'nr' : $XXX_DOES_NOT_EXIST})
Bram Moolenaara0ca7d02017-12-19 10:22:19 +01001639endfunc
1640
Bram Moolenaar99234f22020-02-10 22:56:54 +01001641func Test_setqflist_user_sets_buftype()
1642 call setqflist([{'text': 'foo'}, {'text': 'bar'}])
1643 set buftype=quickfix
1644 call setqflist([], 'a')
1645 enew
1646endfunc
1647
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001648func Test_quickfix_set_list_with_act()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001649 call XquickfixSetListWithAct('c')
1650 call XquickfixSetListWithAct('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001651endfunc
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001652
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001653func XLongLinesTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001654 let l = g:Xgetlist()
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001655
Bram Moolenaar049cba92016-06-26 14:38:04 +02001656 call assert_equal(4, len(l))
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001657 call assert_equal(1, l[0].lnum)
1658 call assert_equal(1, l[0].col)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001659 call assert_equal(1975, len(l[0].text))
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001660 call assert_equal(2, l[1].lnum)
1661 call assert_equal(1, l[1].col)
1662 call assert_equal(4070, len(l[1].text))
1663 call assert_equal(3, l[2].lnum)
1664 call assert_equal(1, l[2].col)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001665 call assert_equal(4070, len(l[2].text))
1666 call assert_equal(4, l[3].lnum)
1667 call assert_equal(1, l[3].col)
1668 call assert_equal(10, len(l[3].text))
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001669
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001670 call g:Xsetlist([], 'r')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001671endfunc
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001672
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001673func s:long_lines_tests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001674 call s:setup_commands(a:cchar)
1675
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001676 let testfile = 'samples/quickfix.txt'
1677
1678 " file
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001679 exe 'Xgetfile' testfile
1680 call XLongLinesTests(a:cchar)
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001681
1682 " list
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001683 Xexpr readfile(testfile)
1684 call XLongLinesTests(a:cchar)
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001685
1686 " string
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001687 Xexpr join(readfile(testfile), "\n")
1688 call XLongLinesTests(a:cchar)
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001689
1690 " buffer
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001691 exe 'edit' testfile
1692 exe 'Xbuffer' bufnr('%')
Bram Moolenaarf50df392016-06-21 21:33:34 +02001693 call XLongLinesTests(a:cchar)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001694endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001695
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001696func Test_long_lines()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001697 call s:long_lines_tests('c')
1698 call s:long_lines_tests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001699endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001700
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001701func s:create_test_file(filename)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001702 let l = []
1703 for i in range(1, 20)
1704 call add(l, 'Line' . i)
1705 endfor
1706 call writefile(l, a:filename)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001707endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001708
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001709func Test_switchbuf()
Bram Moolenaar9134f1e2019-11-29 20:26:13 +01001710 CheckNotBSD
Bram Moolenaar049cba92016-06-26 14:38:04 +02001711 call s:create_test_file('Xqftestfile1')
1712 call s:create_test_file('Xqftestfile2')
1713 call s:create_test_file('Xqftestfile3')
1714
1715 new | only
1716 edit Xqftestfile1
1717 let file1_winid = win_getid()
1718 new Xqftestfile2
1719 let file2_winid = win_getid()
1720 cgetexpr ['Xqftestfile1:5:Line5',
1721 \ 'Xqftestfile1:6:Line6',
1722 \ 'Xqftestfile2:10:Line10',
1723 \ 'Xqftestfile2:11:Line11',
1724 \ 'Xqftestfile3:15:Line15',
1725 \ 'Xqftestfile3:16:Line16']
1726
1727 new
1728 let winid = win_getid()
1729 cfirst | cnext
1730 call assert_equal(winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001731 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001732 call assert_equal(winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001733 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001734 call assert_equal(winid, win_getid())
Bram Moolenaar049cba92016-06-26 14:38:04 +02001735
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001736 " Test for 'switchbuf' set to search for files in windows in the current
1737 " tabpage and jump to an existing window (if present)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001738 set switchbuf=useopen
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001739 enew
Bram Moolenaar049cba92016-06-26 14:38:04 +02001740 cfirst | cnext
1741 call assert_equal(file1_winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001742 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001743 call assert_equal(file2_winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001744 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001745 call assert_equal(file2_winid, win_getid())
1746
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001747 " Test for 'switchbuf' set to search for files in tabpages and jump to an
1748 " existing tabpage (if present)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001749 enew | only
1750 set switchbuf=usetab
1751 tabedit Xqftestfile1
1752 tabedit Xqftestfile2
Bram Moolenaar74240d32017-12-10 15:26:15 +01001753 tabedit Xqftestfile3
Bram Moolenaar049cba92016-06-26 14:38:04 +02001754 tabfirst
1755 cfirst | cnext
1756 call assert_equal(2, tabpagenr())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001757 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001758 call assert_equal(3, tabpagenr())
Bram Moolenaar74240d32017-12-10 15:26:15 +01001759 6cnext
1760 call assert_equal(4, tabpagenr())
1761 2cpfile
1762 call assert_equal(2, tabpagenr())
1763 2cnfile
1764 call assert_equal(4, tabpagenr())
Bram Moolenaar049cba92016-06-26 14:38:04 +02001765 tabfirst | tabonly | enew
1766
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001767 " Test for 'switchbuf' set to open a new window for every file
Bram Moolenaar049cba92016-06-26 14:38:04 +02001768 set switchbuf=split
1769 cfirst | cnext
1770 call assert_equal(1, winnr('$'))
1771 cnext | cnext
1772 call assert_equal(2, winnr('$'))
1773 cnext | cnext
1774 call assert_equal(3, winnr('$'))
Bram Moolenaar049cba92016-06-26 14:38:04 +02001775
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001776 " Test for 'switchbuf' set to open a new tabpage for every file
Bram Moolenaar049cba92016-06-26 14:38:04 +02001777 set switchbuf=newtab
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001778 enew | only
Bram Moolenaar049cba92016-06-26 14:38:04 +02001779 cfirst | cnext
1780 call assert_equal(1, tabpagenr('$'))
1781 cnext | cnext
1782 call assert_equal(2, tabpagenr('$'))
1783 cnext | cnext
1784 call assert_equal(3, tabpagenr('$'))
1785 tabfirst | enew | tabonly | only
1786
Bram Moolenaar539aa6b2019-11-17 18:09:38 +01001787 set switchbuf=uselast
1788 split
1789 let last_winid = win_getid()
1790 copen
1791 exe "normal 1G\<CR>"
1792 call assert_equal(last_winid, win_getid())
1793 enew | only
1794
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001795 " With an empty 'switchbuf', jumping to a quickfix entry should open the
1796 " file in an existing window (if present)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001797 set switchbuf=
1798 edit Xqftestfile1
1799 let file1_winid = win_getid()
1800 new Xqftestfile2
1801 let file2_winid = win_getid()
1802 copen
1803 exe "normal 1G\<CR>"
1804 call assert_equal(file1_winid, win_getid())
1805 copen
1806 exe "normal 3G\<CR>"
1807 call assert_equal(file2_winid, win_getid())
1808 copen | only
1809 exe "normal 5G\<CR>"
1810 call assert_equal(2, winnr('$'))
1811 call assert_equal(1, bufwinnr('Xqftestfile3'))
1812
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001813 " If only quickfix window is open in the current tabpage, jumping to an
Bram Moolenaar1bc353b2019-09-01 14:45:28 +02001814 " entry with 'switchbuf' set to 'usetab' should search in other tabpages.
Bram Moolenaar049cba92016-06-26 14:38:04 +02001815 enew | only
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001816 set switchbuf=usetab
1817 tabedit Xqftestfile1
1818 tabedit Xqftestfile2
1819 tabedit Xqftestfile3
1820 tabfirst
1821 copen | only
1822 clast
1823 call assert_equal(4, tabpagenr())
1824 tabfirst | tabonly | enew | only
Bram Moolenaar049cba92016-06-26 14:38:04 +02001825
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001826 " Jumping to a file that is not present in any of the tabpages and the
1827 " current tabpage doesn't have any usable windows, should open it in a new
1828 " window in the current tabpage.
1829 copen | only
1830 cfirst
1831 call assert_equal(1, tabpagenr())
1832 call assert_equal('Xqftestfile1', bufname(''))
1833
1834 " If opening a file changes 'switchbuf', then the new value should be
1835 " retained.
1836 call writefile(["vim: switchbuf=split"], 'Xqftestfile1')
1837 enew | only
1838 set switchbuf&vim
1839 cexpr "Xqftestfile1:1:10"
1840 call assert_equal('split', &switchbuf)
1841 call writefile(["vim: switchbuf=usetab"], 'Xqftestfile1')
1842 enew | only
1843 set switchbuf=useopen
1844 cexpr "Xqftestfile1:1:10"
1845 call assert_equal('usetab', &switchbuf)
1846 call writefile(["vim: switchbuf&vim"], 'Xqftestfile1')
1847 enew | only
1848 set switchbuf=useopen
1849 cexpr "Xqftestfile1:1:10"
1850 call assert_equal('', &switchbuf)
1851
Bram Moolenaar049cba92016-06-26 14:38:04 +02001852 call delete('Xqftestfile1')
1853 call delete('Xqftestfile2')
1854 call delete('Xqftestfile3')
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001855 set switchbuf&vim
1856
1857 enew | only
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001858endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001859
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001860func Xadjust_qflnum(cchar)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001861 call s:setup_commands(a:cchar)
1862
1863 enew | only
1864
Bram Moolenaarc1542742016-07-20 21:44:37 +02001865 let fname = 'Xqftestfile' . a:cchar
1866 call s:create_test_file(fname)
1867 exe 'edit ' . fname
Bram Moolenaar049cba92016-06-26 14:38:04 +02001868
Bram Moolenaarc1542742016-07-20 21:44:37 +02001869 Xgetexpr [fname . ':5:Line5',
1870 \ fname . ':10:Line10',
1871 \ fname . ':15:Line15',
1872 \ fname . ':20:Line20']
Bram Moolenaar049cba92016-06-26 14:38:04 +02001873
1874 6,14delete
1875 call append(6, ['Buffer', 'Window'])
1876
1877 let l = g:Xgetlist()
Bram Moolenaar049cba92016-06-26 14:38:04 +02001878 call assert_equal(5, l[0].lnum)
1879 call assert_equal(6, l[2].lnum)
1880 call assert_equal(13, l[3].lnum)
1881
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001882 " If a file doesn't have any quickfix entries, then deleting lines in the
1883 " file should not update the quickfix list
1884 call g:Xsetlist([], 'f')
1885 1,2delete
1886 call assert_equal([], g:Xgetlist())
1887
Bram Moolenaar049cba92016-06-26 14:38:04 +02001888 enew!
Bram Moolenaarc1542742016-07-20 21:44:37 +02001889 call delete(fname)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001890endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001891
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001892func Test_adjust_lnum()
Bram Moolenaarc1542742016-07-20 21:44:37 +02001893 call setloclist(0, [])
Bram Moolenaar049cba92016-06-26 14:38:04 +02001894 call Xadjust_qflnum('c')
Bram Moolenaarc1542742016-07-20 21:44:37 +02001895 call setqflist([])
Bram Moolenaar049cba92016-06-26 14:38:04 +02001896 call Xadjust_qflnum('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001897endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001898
1899" Tests for the :grep/:lgrep and :grepadd/:lgrepadd commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001900func s:test_xgrep(cchar)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001901 call s:setup_commands(a:cchar)
1902
1903 " The following lines are used for the grep test. Don't remove.
1904 " Grep_Test_Text: Match 1
1905 " Grep_Test_Text: Match 2
1906 " GrepAdd_Test_Text: Match 1
1907 " GrepAdd_Test_Text: Match 2
1908 enew! | only
1909 set makeef&vim
1910 silent Xgrep Grep_Test_Text: test_quickfix.vim
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +01001911 call assert_true(len(g:Xgetlist()) == 5)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001912 Xopen
1913 call assert_true(w:quickfix_title =~ '^:grep')
1914 Xclose
1915 enew
1916 set makeef=Temp_File_##
1917 silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +01001918 call assert_true(len(g:Xgetlist()) == 9)
1919
1920 " Try with 'grepprg' set to 'internal'
1921 set grepprg=internal
1922 silent Xgrep Grep_Test_Text: test_quickfix.vim
1923 silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
1924 call assert_true(len(g:Xgetlist()) == 9)
1925 set grepprg&vim
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001926
1927 call writefile(['Vim'], 'XtestTempFile')
1928 set makeef=XtestTempFile
1929 silent Xgrep Grep_Test_Text: test_quickfix.vim
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +01001930 call assert_equal(5, len(g:Xgetlist()))
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001931 call assert_false(filereadable('XtestTempFile'))
1932 set makeef&vim
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001933endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001934
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001935func Test_grep()
Bram Moolenaar049cba92016-06-26 14:38:04 +02001936 if !has('unix')
1937 " The grepprg may not be set on non-Unix systems
1938 return
1939 endif
1940
1941 call s:test_xgrep('c')
1942 call s:test_xgrep('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001943endfunc
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001944
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001945func Test_two_windows()
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001946 " Use one 'errorformat' for two windows. Add an expression to each of them,
1947 " make sure they each keep their own state.
1948 set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
1949 call mkdir('Xone/a', 'p')
1950 call mkdir('Xtwo/a', 'p')
1951 let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
1952 call writefile(lines, 'Xone/a/one.txt')
1953 call writefile(lines, 'Xtwo/a/two.txt')
1954
1955 new one
1956 let one_id = win_getid()
1957 lexpr ""
1958 new two
1959 let two_id = win_getid()
1960 lexpr ""
1961
1962 laddexpr "Entering dir 'Xtwo/a'"
1963 call win_gotoid(one_id)
1964 laddexpr "Entering dir 'Xone/a'"
1965 call win_gotoid(two_id)
1966 laddexpr 'two.txt:5:two two two'
1967 call win_gotoid(one_id)
1968 laddexpr 'one.txt:3:one one one'
1969
1970 let loc_one = getloclist(one_id)
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001971 call assert_equal('Xone/a/one.txt', bufname(loc_one[1].bufnr))
1972 call assert_equal(3, loc_one[1].lnum)
1973
1974 let loc_two = getloclist(two_id)
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001975 call assert_equal('Xtwo/a/two.txt', bufname(loc_two[1].bufnr))
1976 call assert_equal(5, loc_two[1].lnum)
1977
1978 call win_gotoid(one_id)
1979 bwipe!
1980 call win_gotoid(two_id)
1981 bwipe!
1982 call delete('Xone', 'rf')
1983 call delete('Xtwo', 'rf')
1984endfunc
Bram Moolenaardcb17002016-07-07 18:58:59 +02001985
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001986func XbottomTests(cchar)
Bram Moolenaar537ef082016-07-09 17:56:19 +02001987 call s:setup_commands(a:cchar)
1988
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +02001989 " Calling lbottom without any errors should fail
1990 if a:cchar == 'l'
1991 call assert_fails('lbottom', 'E776:')
1992 endif
1993
Bram Moolenaar875feea2017-06-11 16:07:51 +02001994 call g:Xsetlist([{'filename': 'foo', 'lnum': 42}])
Bram Moolenaar537ef082016-07-09 17:56:19 +02001995 Xopen
Bram Moolenaardcb17002016-07-07 18:58:59 +02001996 let wid = win_getid()
1997 call assert_equal(1, line('.'))
1998 wincmd w
Bram Moolenaar875feea2017-06-11 16:07:51 +02001999 call g:Xsetlist([{'filename': 'var', 'lnum': 24}], 'a')
Bram Moolenaar537ef082016-07-09 17:56:19 +02002000 Xbottom
Bram Moolenaardcb17002016-07-07 18:58:59 +02002001 call win_gotoid(wid)
2002 call assert_equal(2, line('.'))
Bram Moolenaar537ef082016-07-09 17:56:19 +02002003 Xclose
Bram Moolenaardcb17002016-07-07 18:58:59 +02002004endfunc
Bram Moolenaar537ef082016-07-09 17:56:19 +02002005
2006" Tests for the :cbottom and :lbottom commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002007func Test_cbottom()
Bram Moolenaar537ef082016-07-09 17:56:19 +02002008 call XbottomTests('c')
2009 call XbottomTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002010endfunc
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02002011
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002012func HistoryTest(cchar)
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02002013 call s:setup_commands(a:cchar)
2014
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02002015 " clear all lists after the first one, then replace the first one.
2016 call g:Xsetlist([])
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +02002017 call assert_fails('Xolder 99', 'E380:')
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02002018 let entry = {'filename': 'foo', 'lnum': 42}
2019 call g:Xsetlist([entry], 'r')
2020 call g:Xsetlist([entry, entry])
2021 call g:Xsetlist([entry, entry, entry])
2022 let res = split(execute(a:cchar . 'hist'), "\n")
2023 call assert_equal(3, len(res))
2024 let common = 'errors :set' . (a:cchar == 'c' ? 'qf' : 'loc') . 'list()'
2025 call assert_equal(' error list 1 of 3; 1 ' . common, res[0])
2026 call assert_equal(' error list 2 of 3; 2 ' . common, res[1])
2027 call assert_equal('> error list 3 of 3; 3 ' . common, res[2])
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02002028
Bram Moolenaar8ffc7c82019-05-05 21:00:26 +02002029 " Test for changing the quickfix lists
2030 call assert_equal(3, g:Xgetlist({'nr' : 0}).nr)
2031 exe '1' . a:cchar . 'hist'
2032 call assert_equal(1, g:Xgetlist({'nr' : 0}).nr)
2033 exe '3' . a:cchar . 'hist'
2034 call assert_equal(3, g:Xgetlist({'nr' : 0}).nr)
2035 call assert_fails('-2' . a:cchar . 'hist', 'E16:')
2036 call assert_fails('4' . a:cchar . 'hist', 'E16:')
2037
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02002038 call g:Xsetlist([], 'f')
2039 let l = split(execute(a:cchar . 'hist'), "\n")
2040 call assert_equal('No entries', l[0])
Bram Moolenaar8ffc7c82019-05-05 21:00:26 +02002041 if a:cchar == 'c'
2042 call assert_fails('4chist', 'E16:')
2043 else
2044 call assert_fails('4lhist', 'E776:')
2045 endif
Bram Moolenaar5b69c222019-01-11 14:50:06 +01002046
2047 " An empty list should still show the stack history
2048 call g:Xsetlist([])
2049 let res = split(execute(a:cchar . 'hist'), "\n")
2050 call assert_equal('> error list 1 of 1; 0 ' . common, res[0])
2051
2052 call g:Xsetlist([], 'f')
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02002053endfunc
2054
2055func Test_history()
2056 call HistoryTest('c')
2057 call HistoryTest('l')
2058endfunc
Bram Moolenaar015102e2016-07-16 18:24:56 +02002059
2060func Test_duplicate_buf()
2061 " make sure we can get the highest buffer number
2062 edit DoesNotExist
2063 edit DoesNotExist2
2064 let last_buffer = bufnr("$")
2065
2066 " make sure only one buffer is created
2067 call writefile(['this one', 'that one'], 'Xgrepthis')
2068 vimgrep one Xgrepthis
2069 vimgrep one Xgrepthis
2070 call assert_equal(last_buffer + 1, bufnr("$"))
2071
2072 call delete('Xgrepthis')
2073endfunc
Bram Moolenaard823fa92016-08-12 16:29:27 +02002074
2075" Quickfix/Location list set/get properties tests
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002076func Xproperty_tests(cchar)
Bram Moolenaard823fa92016-08-12 16:29:27 +02002077 call s:setup_commands(a:cchar)
2078
2079 " Error cases
2080 call assert_fails('call g:Xgetlist(99)', 'E715:')
2081 call assert_fails('call g:Xsetlist(99)', 'E714:')
2082 call assert_fails('call g:Xsetlist([], "a", [])', 'E715:')
2083
2084 " Set and get the title
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +02002085 call g:Xsetlist([])
Bram Moolenaard823fa92016-08-12 16:29:27 +02002086 Xopen
2087 wincmd p
2088 call g:Xsetlist([{'filename':'foo', 'lnum':27}])
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02002089 let s = g:Xsetlist([], 'a', {'title' : 'Sample'})
2090 call assert_equal(0, s)
Bram Moolenaard823fa92016-08-12 16:29:27 +02002091 let d = g:Xgetlist({"title":1})
2092 call assert_equal('Sample', d.title)
Bram Moolenaara2aa8a22018-04-24 13:55:00 +02002093 " Try setting title to a non-string value
2094 call assert_equal(-1, g:Xsetlist([], 'a', {'title' : ['Test']}))
2095 call assert_equal('Sample', g:Xgetlist({"title":1}).title)
Bram Moolenaard823fa92016-08-12 16:29:27 +02002096
2097 Xopen
2098 call assert_equal('Sample', w:quickfix_title)
2099 Xclose
2100
Bram Moolenaar2b529bb2016-08-27 13:35:35 +02002101 " Tests for action argument
2102 silent! Xolder 999
2103 let qfnr = g:Xgetlist({'all':1}).nr
2104 call g:Xsetlist([], 'r', {'title' : 'N1'})
2105 call assert_equal('N1', g:Xgetlist({'all':1}).title)
2106 call g:Xsetlist([], ' ', {'title' : 'N2'})
2107 call assert_equal(qfnr + 1, g:Xgetlist({'all':1}).nr)
Bram Moolenaar890680c2016-09-27 21:28:56 +02002108
2109 let res = g:Xgetlist({'nr': 0})
2110 call assert_equal(qfnr + 1, res.nr)
2111 call assert_equal(['nr'], keys(res))
2112
Bram Moolenaar2b529bb2016-08-27 13:35:35 +02002113 call g:Xsetlist([], ' ', {'title' : 'N3'})
2114 call assert_equal('N2', g:Xgetlist({'nr':2, 'title':1}).title)
2115
Bram Moolenaaree85df32017-03-19 14:19:50 +01002116 " Changing the title of an earlier quickfix list
Bram Moolenaar55b69262017-08-13 13:42:01 +02002117 call g:Xsetlist([], 'r', {'title' : 'NewTitle', 'nr' : 2})
Bram Moolenaaree85df32017-03-19 14:19:50 +01002118 call assert_equal('NewTitle', g:Xgetlist({'nr':2, 'title':1}).title)
2119
2120 " Changing the title of an invalid quickfix list
2121 call assert_equal(-1, g:Xsetlist([], ' ',
2122 \ {'title' : 'SomeTitle', 'nr' : 99}))
2123 call assert_equal(-1, g:Xsetlist([], ' ',
2124 \ {'title' : 'SomeTitle', 'nr' : 'abc'}))
2125
2126 if a:cchar == 'c'
2127 copen
2128 call assert_equal({'winid':win_getid()}, getqflist({'winid':1}))
2129 cclose
2130 endif
2131
Bram Moolenaard823fa92016-08-12 16:29:27 +02002132 " Invalid arguments
2133 call assert_fails('call g:Xgetlist([])', 'E715')
2134 call assert_fails('call g:Xsetlist([], "a", [])', 'E715')
2135 let s = g:Xsetlist([], 'a', {'abc':1})
2136 call assert_equal(-1, s)
2137
2138 call assert_equal({}, g:Xgetlist({'abc':1}))
Bram Moolenaara6d48492017-12-12 22:45:31 +01002139 call assert_equal('', g:Xgetlist({'nr':99, 'title':1}).title)
2140 call assert_equal('', g:Xgetlist({'nr':[], 'title':1}).title)
Bram Moolenaard823fa92016-08-12 16:29:27 +02002141
2142 if a:cchar == 'l'
Bram Moolenaar890680c2016-09-27 21:28:56 +02002143 call assert_equal({}, getloclist(99, {'title': 1}))
Bram Moolenaard823fa92016-08-12 16:29:27 +02002144 endif
Bram Moolenaar8f77c5a2017-04-30 14:21:00 +02002145
2146 " Context related tests
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02002147 let s = g:Xsetlist([], 'a', {'context':[1,2,3]})
2148 call assert_equal(0, s)
Bram Moolenaar8f77c5a2017-04-30 14:21:00 +02002149 call test_garbagecollect_now()
2150 let d = g:Xgetlist({'context':1})
2151 call assert_equal([1,2,3], d.context)
2152 call g:Xsetlist([], 'a', {'context':{'color':'green'}})
2153 let d = g:Xgetlist({'context':1})
2154 call assert_equal({'color':'green'}, d.context)
2155 call g:Xsetlist([], 'a', {'context':"Context info"})
2156 let d = g:Xgetlist({'context':1})
2157 call assert_equal("Context info", d.context)
2158 call g:Xsetlist([], 'a', {'context':246})
2159 let d = g:Xgetlist({'context':1})
2160 call assert_equal(246, d.context)
Bram Moolenaar92b83cc2020-04-25 15:24:44 +02002161 " set other Vim data types as context
2162 call g:Xsetlist([], 'a', {'context' : test_null_blob()})
2163 if has('channel')
2164 call g:Xsetlist([], 'a', {'context' : test_null_channel()})
2165 endif
2166 if has('job')
2167 call g:Xsetlist([], 'a', {'context' : test_null_job()})
2168 endif
2169 call g:Xsetlist([], 'a', {'context' : test_null_function()})
2170 call g:Xsetlist([], 'a', {'context' : test_null_partial()})
2171 call g:Xsetlist([], 'a', {'context' : ''})
2172 call test_garbagecollect_now()
Bram Moolenaar8f77c5a2017-04-30 14:21:00 +02002173 if a:cchar == 'l'
2174 " Test for copying context across two different location lists
2175 new | only
2176 let w1_id = win_getid()
2177 let l = [1]
2178 call setloclist(0, [], 'a', {'context':l})
2179 new
2180 let w2_id = win_getid()
2181 call add(l, 2)
2182 call assert_equal([1, 2], getloclist(w1_id, {'context':1}).context)
2183 call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
2184 unlet! l
2185 call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
2186 only
2187 call setloclist(0, [], 'f')
Bram Moolenaara6d48492017-12-12 22:45:31 +01002188 call assert_equal('', getloclist(0, {'context':1}).context)
Bram Moolenaar8f77c5a2017-04-30 14:21:00 +02002189 endif
Bram Moolenaar6e62da32017-05-28 08:16:25 +02002190
2191 " Test for changing the context of previous quickfix lists
2192 call g:Xsetlist([], 'f')
2193 Xexpr "One"
2194 Xexpr "Two"
2195 Xexpr "Three"
Bram Moolenaar55b69262017-08-13 13:42:01 +02002196 call g:Xsetlist([], 'r', {'context' : [1], 'nr' : 1})
2197 call g:Xsetlist([], 'a', {'context' : [2], 'nr' : 2})
Bram Moolenaar6e62da32017-05-28 08:16:25 +02002198 " Also, check for setting the context using quickfix list number zero.
Bram Moolenaar55b69262017-08-13 13:42:01 +02002199 call g:Xsetlist([], 'r', {'context' : [3], 'nr' : 0})
Bram Moolenaar6e62da32017-05-28 08:16:25 +02002200 call test_garbagecollect_now()
2201 let l = g:Xgetlist({'nr' : 1, 'context' : 1})
2202 call assert_equal([1], l.context)
2203 let l = g:Xgetlist({'nr' : 2, 'context' : 1})
2204 call assert_equal([2], l.context)
2205 let l = g:Xgetlist({'nr' : 3, 'context' : 1})
2206 call assert_equal([3], l.context)
2207
2208 " Test for changing the context through reference and for garbage
2209 " collection of quickfix context
2210 let l = ["red"]
2211 call g:Xsetlist([], ' ', {'context' : l})
2212 call add(l, "blue")
2213 let x = g:Xgetlist({'context' : 1})
2214 call add(x.context, "green")
2215 call assert_equal(["red", "blue", "green"], l)
2216 call assert_equal(["red", "blue", "green"], x.context)
2217 unlet l
2218 call test_garbagecollect_now()
2219 let m = g:Xgetlist({'context' : 1})
2220 call assert_equal(["red", "blue", "green"], m.context)
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002221
2222 " Test for setting/getting items
2223 Xexpr ""
2224 let qfprev = g:Xgetlist({'nr':0})
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02002225 let s = g:Xsetlist([], ' ', {'title':'Green',
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002226 \ 'items' : [{'filename':'F1', 'lnum':10}]})
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02002227 call assert_equal(0, s)
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002228 let qfcur = g:Xgetlist({'nr':0})
2229 call assert_true(qfcur.nr == qfprev.nr + 1)
2230 let l = g:Xgetlist({'items':1})
2231 call assert_equal('F1', bufname(l.items[0].bufnr))
2232 call assert_equal(10, l.items[0].lnum)
2233 call g:Xsetlist([], 'a', {'items' : [{'filename':'F2', 'lnum':20},
2234 \ {'filename':'F2', 'lnum':30}]})
2235 let l = g:Xgetlist({'items':1})
2236 call assert_equal('F2', bufname(l.items[2].bufnr))
2237 call assert_equal(30, l.items[2].lnum)
2238 call g:Xsetlist([], 'r', {'items' : [{'filename':'F3', 'lnum':40}]})
2239 let l = g:Xgetlist({'items':1})
2240 call assert_equal('F3', bufname(l.items[0].bufnr))
2241 call assert_equal(40, l.items[0].lnum)
2242 call g:Xsetlist([], 'r', {'items' : []})
2243 let l = g:Xgetlist({'items':1})
2244 call assert_equal(0, len(l.items))
2245
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02002246 call g:Xsetlist([], 'r', {'title' : 'TestTitle'})
2247 call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]})
2248 call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]})
2249 call assert_equal('TestTitle', g:Xgetlist({'title' : 1}).title)
2250
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02002251 " Test for getting id of window associated with a location list window
2252 if a:cchar == 'l'
2253 only
2254 call assert_equal(0, g:Xgetlist({'all' : 1}).filewinid)
2255 let wid = win_getid()
2256 Xopen
2257 call assert_equal(wid, g:Xgetlist({'filewinid' : 1}).filewinid)
2258 wincmd w
2259 call assert_equal(0, g:Xgetlist({'filewinid' : 1}).filewinid)
2260 only
2261 endif
2262
Bram Moolenaarae338332017-08-11 20:25:26 +02002263 " The following used to crash Vim with address sanitizer
2264 call g:Xsetlist([], 'f')
2265 call g:Xsetlist([], 'a', {'items' : [{'filename':'F1', 'lnum':10}]})
2266 call assert_equal(10, g:Xgetlist({'items':1}).items[0].lnum)
2267
Bram Moolenaara2aa8a22018-04-24 13:55:00 +02002268 " Try setting the items using a string
2269 call assert_equal(-1, g:Xsetlist([], ' ', {'items' : 'Test'}))
2270
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002271 " Save and restore the quickfix stack
2272 call g:Xsetlist([], 'f')
2273 call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
2274 Xexpr "File1:10:Line1"
2275 Xexpr "File2:20:Line2"
2276 Xexpr "File3:30:Line3"
2277 let last_qf = g:Xgetlist({'nr':'$'}).nr
2278 call assert_equal(3, last_qf)
2279 let qstack = []
2280 for i in range(1, last_qf)
2281 let qstack = add(qstack, g:Xgetlist({'nr':i, 'all':1}))
2282 endfor
2283 call g:Xsetlist([], 'f')
2284 for i in range(len(qstack))
2285 call g:Xsetlist([], ' ', qstack[i])
2286 endfor
2287 call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
2288 call assert_equal(10, g:Xgetlist({'nr':1, 'items':1}).items[0].lnum)
2289 call assert_equal(20, g:Xgetlist({'nr':2, 'items':1}).items[0].lnum)
2290 call assert_equal(30, g:Xgetlist({'nr':3, 'items':1}).items[0].lnum)
2291 call g:Xsetlist([], 'f')
2292
2293 " Swap two quickfix lists
2294 Xexpr "File1:10:Line10"
2295 Xexpr "File2:20:Line20"
2296 Xexpr "File3:30:Line30"
2297 call g:Xsetlist([], 'r', {'nr':1,'title':'Colors','context':['Colors']})
2298 call g:Xsetlist([], 'r', {'nr':2,'title':'Fruits','context':['Fruits']})
2299 let l1=g:Xgetlist({'nr':1,'all':1})
2300 let l2=g:Xgetlist({'nr':2,'all':1})
Bram Moolenaara539f4f2017-08-30 20:33:55 +02002301 let save_id = l1.id
2302 let l1.id=l2.id
2303 let l2.id=save_id
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002304 call g:Xsetlist([], 'r', l1)
2305 call g:Xsetlist([], 'r', l2)
2306 let newl1=g:Xgetlist({'nr':1,'all':1})
2307 let newl2=g:Xgetlist({'nr':2,'all':1})
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02002308 call assert_equal('Fruits', newl1.title)
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002309 call assert_equal(['Fruits'], newl1.context)
2310 call assert_equal('Line20', newl1.items[0].text)
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02002311 call assert_equal('Colors', newl2.title)
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002312 call assert_equal(['Colors'], newl2.context)
2313 call assert_equal('Line10', newl2.items[0].text)
2314 call g:Xsetlist([], 'f')
Bram Moolenaaree85df32017-03-19 14:19:50 +01002315endfunc
Bram Moolenaard823fa92016-08-12 16:29:27 +02002316
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002317func Test_qf_property()
Bram Moolenaard823fa92016-08-12 16:29:27 +02002318 call Xproperty_tests('c')
2319 call Xproperty_tests('l')
Bram Moolenaaree85df32017-03-19 14:19:50 +01002320endfunc
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002321
Bram Moolenaar5b69c222019-01-11 14:50:06 +01002322" Test for setting the current index in the location/quickfix list
2323func Xtest_setqfidx(cchar)
2324 call s:setup_commands(a:cchar)
2325
2326 Xgetexpr "F1:10:1:Line1\nF2:20:2:Line2\nF3:30:3:Line3"
2327 Xgetexpr "F4:10:1:Line1\nF5:20:2:Line2\nF6:30:3:Line3"
2328 Xgetexpr "F7:10:1:Line1\nF8:20:2:Line2\nF9:30:3:Line3"
2329
2330 call g:Xsetlist([], 'a', {'nr' : 3, 'idx' : 2})
2331 call g:Xsetlist([], 'a', {'nr' : 2, 'idx' : 2})
2332 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 3})
2333 Xolder 2
2334 Xopen
2335 call assert_equal(3, line('.'))
2336 Xnewer
2337 call assert_equal(2, line('.'))
2338 Xnewer
2339 call assert_equal(2, line('.'))
2340 " Update the current index with the quickfix window open
2341 wincmd w
2342 call g:Xsetlist([], 'a', {'nr' : 3, 'idx' : 3})
2343 Xopen
2344 call assert_equal(3, line('.'))
2345 Xclose
2346
2347 " Set the current index to the last entry
2348 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : '$'})
2349 call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
2350 " A large value should set the index to the last index
2351 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 1})
2352 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 999})
2353 call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
2354 " Invalid index values
2355 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : -1})
2356 call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
2357 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 0})
2358 call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
2359 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 'xx'})
2360 call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
2361 call assert_fails("call g:Xsetlist([], 'a', {'nr':1, 'idx':[]})", 'E745:')
2362
2363 call g:Xsetlist([], 'f')
2364 new | only
2365endfunc
2366
2367func Test_setqfidx()
2368 call Xtest_setqfidx('c')
2369 call Xtest_setqfidx('l')
2370endfunc
2371
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002372" Tests for the QuickFixCmdPre/QuickFixCmdPost autocommands
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002373func QfAutoCmdHandler(loc, cmd)
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002374 call add(g:acmds, a:loc . a:cmd)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002375endfunc
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002376
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002377func Test_Autocmd()
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002378 autocmd QuickFixCmdPre * call QfAutoCmdHandler('pre', expand('<amatch>'))
2379 autocmd QuickFixCmdPost * call QfAutoCmdHandler('post', expand('<amatch>'))
2380
2381 let g:acmds = []
2382 cexpr "F1:10:Line 10"
2383 caddexpr "F1:20:Line 20"
2384 cgetexpr "F1:30:Line 30"
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002385 cexpr ""
2386 caddexpr ""
2387 cgetexpr ""
2388 silent! cexpr non_existing_func()
2389 silent! caddexpr non_existing_func()
2390 silent! cgetexpr non_existing_func()
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002391 let l = ['precexpr',
2392 \ 'postcexpr',
2393 \ 'precaddexpr',
2394 \ 'postcaddexpr',
2395 \ 'precgetexpr',
2396 \ 'postcgetexpr',
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002397 \ 'precexpr',
2398 \ 'postcexpr',
2399 \ 'precaddexpr',
2400 \ 'postcaddexpr',
2401 \ 'precgetexpr',
2402 \ 'postcgetexpr',
2403 \ 'precexpr',
2404 \ 'precaddexpr',
2405 \ 'precgetexpr']
2406 call assert_equal(l, g:acmds)
2407
2408 let g:acmds = []
2409 enew! | call append(0, "F2:10:Line 10")
2410 cbuffer!
2411 enew! | call append(0, "F2:20:Line 20")
2412 cgetbuffer
2413 enew! | call append(0, "F2:30:Line 30")
2414 caddbuffer
2415 new
2416 let bnum = bufnr('%')
2417 bunload
2418 exe 'silent! cbuffer! ' . bnum
2419 exe 'silent! cgetbuffer ' . bnum
2420 exe 'silent! caddbuffer ' . bnum
2421 enew!
2422 let l = ['precbuffer',
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002423 \ 'postcbuffer',
2424 \ 'precgetbuffer',
2425 \ 'postcgetbuffer',
2426 \ 'precaddbuffer',
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002427 \ 'postcaddbuffer',
2428 \ 'precbuffer',
2429 \ 'precgetbuffer',
2430 \ 'precaddbuffer']
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002431 call assert_equal(l, g:acmds)
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002432
2433 call writefile(['Xtest:1:Line1'], 'Xtest')
2434 call writefile([], 'Xempty')
2435 let g:acmds = []
2436 cfile Xtest
2437 caddfile Xtest
2438 cgetfile Xtest
2439 cfile Xempty
2440 caddfile Xempty
2441 cgetfile Xempty
2442 silent! cfile do_not_exist
2443 silent! caddfile do_not_exist
2444 silent! cgetfile do_not_exist
2445 let l = ['precfile',
2446 \ 'postcfile',
2447 \ 'precaddfile',
2448 \ 'postcaddfile',
2449 \ 'precgetfile',
2450 \ 'postcgetfile',
2451 \ 'precfile',
2452 \ 'postcfile',
2453 \ 'precaddfile',
2454 \ 'postcaddfile',
2455 \ 'precgetfile',
2456 \ 'postcgetfile',
2457 \ 'precfile',
2458 \ 'postcfile',
2459 \ 'precaddfile',
2460 \ 'postcaddfile',
2461 \ 'precgetfile',
2462 \ 'postcgetfile']
2463 call assert_equal(l, g:acmds)
2464
2465 let g:acmds = []
2466 helpgrep quickfix
2467 silent! helpgrep non_existing_help_topic
2468 vimgrep test Xtest
2469 vimgrepadd test Xtest
2470 silent! vimgrep non_existing_test Xtest
2471 silent! vimgrepadd non_existing_test Xtest
2472 set makeprg=
2473 silent! make
2474 set makeprg&
2475 let l = ['prehelpgrep',
2476 \ 'posthelpgrep',
2477 \ 'prehelpgrep',
2478 \ 'posthelpgrep',
2479 \ 'previmgrep',
2480 \ 'postvimgrep',
2481 \ 'previmgrepadd',
2482 \ 'postvimgrepadd',
2483 \ 'previmgrep',
2484 \ 'postvimgrep',
2485 \ 'previmgrepadd',
2486 \ 'postvimgrepadd',
2487 \ 'premake',
2488 \ 'postmake']
2489 call assert_equal(l, g:acmds)
2490
2491 if has('unix')
2492 " Run this test only on Unix-like systems. The grepprg may not be set on
2493 " non-Unix systems.
2494 " The following lines are used for the grep test. Don't remove.
2495 " Grep_Autocmd_Text: Match 1
2496 " GrepAdd_Autocmd_Text: Match 2
2497 let g:acmds = []
2498 silent grep Grep_Autocmd_Text test_quickfix.vim
2499 silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim
2500 silent grep abc123def Xtest
2501 silent grepadd abc123def Xtest
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +01002502 set grepprg=internal
2503 silent grep Grep_Autocmd_Text test_quickfix.vim
2504 silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim
2505 silent lgrep Grep_Autocmd_Text test_quickfix.vim
2506 silent lgrepadd GrepAdd_Autocmd_Text test_quickfix.vim
2507 set grepprg&vim
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002508 let l = ['pregrep',
2509 \ 'postgrep',
2510 \ 'pregrepadd',
2511 \ 'postgrepadd',
2512 \ 'pregrep',
2513 \ 'postgrep',
2514 \ 'pregrepadd',
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +01002515 \ 'postgrepadd',
2516 \ 'pregrep',
2517 \ 'postgrep',
2518 \ 'pregrepadd',
2519 \ 'postgrepadd',
2520 \ 'prelgrep',
2521 \ 'postlgrep',
2522 \ 'prelgrepadd',
2523 \ 'postlgrepadd']
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002524 call assert_equal(l, g:acmds)
2525 endif
2526
2527 call delete('Xtest')
2528 call delete('Xempty')
Bram Moolenaarb254af32017-12-18 19:48:58 +01002529 au! QuickFixCmdPre
2530 au! QuickFixCmdPost
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002531endfunc
Bram Moolenaar21662be2016-11-06 14:46:44 +01002532
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002533func Test_Autocmd_Exception()
Bram Moolenaar21662be2016-11-06 14:46:44 +01002534 set efm=%m
2535 lgetexpr '?'
2536
2537 try
2538 call DoesNotExit()
2539 catch
2540 lgetexpr '1'
2541 finally
2542 lgetexpr '1'
2543 endtry
2544
2545 call assert_equal('1', getloclist(0)[0].text)
2546
2547 set efm&vim
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002548endfunc
Bram Moolenaar63bed3d2016-11-12 15:36:54 +01002549
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002550func Test_caddbuffer_wrong()
2551 " This used to cause a memory access in freed memory.
Bram Moolenaar63bed3d2016-11-12 15:36:54 +01002552 let save_efm = &efm
2553 set efm=%EEEE%m,%WWWW,%+CCCC%>%#,%GGGG%.#
2554 cgetexpr ['WWWW', 'EEEE', 'CCCC']
2555 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002556 caddbuffer
Bram Moolenaar63bed3d2016-11-12 15:36:54 +01002557 bwipe!
2558endfunc
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002559
2560func Test_caddexpr_wrong()
2561 " This used to cause a memory access in freed memory.
2562 cbuffer
2563 cbuffer
2564 copen
2565 let save_efm = &efm
2566 set efm=%
2567 call assert_fails('caddexpr ""', 'E376:')
2568 let &efm = save_efm
2569endfunc
Bram Moolenaar7618e002016-11-13 15:09:26 +01002570
2571func Test_dirstack_cleanup()
2572 " This used to cause a memory access in freed memory.
2573 let save_efm = &efm
2574 lexpr '0'
2575 lopen
2576 fun X(c)
2577 let save_efm=&efm
2578 set efm=%D%f
2579 if a:c == 'c'
2580 caddexpr '::'
2581 else
2582 laddexpr ':0:0'
2583 endif
2584 let &efm=save_efm
2585 endfun
2586 call X('c')
2587 call X('l')
2588 call setqflist([], 'r')
2589 caddbuffer
2590 let &efm = save_efm
2591endfunc
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01002592
2593" Tests for jumping to entries from the location list window and quickfix
2594" window
2595func Test_cwindow_jump()
2596 set efm=%f%%%l%%%m
2597 lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2598 lopen | only
2599 lfirst
2600 call assert_true(winnr('$') == 2)
2601 call assert_true(winnr() == 1)
2602 " Location list for the new window should be set
2603 call assert_true(getloclist(0)[2].text == 'Line 30')
2604
2605 " Open a scratch buffer
2606 " Open a new window and create a location list
2607 " Open the location list window and close the other window
2608 " Jump to an entry.
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01002609 " Should create a new window and jump to the entry. The scratch buffer
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01002610 " should not be used.
2611 enew | only
2612 set buftype=nofile
2613 below new
2614 lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2615 lopen
2616 2wincmd c
2617 lnext
2618 call assert_true(winnr('$') == 3)
2619 call assert_true(winnr() == 2)
2620
2621 " Open two windows with two different location lists
2622 " Open the location list window and close the previous window
2623 " Jump to an entry in the location list window
2624 " Should open the file in the first window and not set the location list.
2625 enew | only
2626 lgetexpr ["F1%5%Line 5"]
2627 below new
2628 lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2629 lopen
2630 2wincmd c
2631 lnext
2632 call assert_true(winnr() == 1)
2633 call assert_true(getloclist(0)[0].text == 'Line 5')
2634
2635 enew | only
2636 cgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2637 copen
2638 cnext
2639 call assert_true(winnr('$') == 2)
2640 call assert_true(winnr() == 1)
2641
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01002642 " open the quickfix buffer in two windows and jump to an entry. Should open
2643 " the file in the first quickfix window.
2644 enew | only
2645 copen
2646 let bnum = bufnr('')
2647 exe 'sbuffer ' . bnum
2648 wincmd b
2649 cfirst
2650 call assert_equal(2, winnr())
2651 call assert_equal('F1', bufname(''))
2652 enew | only
2653 exe 'sb' bnum
2654 exe 'botright sb' bnum
2655 wincmd t
2656 clast
2657 call assert_equal(2, winnr())
2658 call assert_equal('quickfix', getwinvar(1, '&buftype'))
2659 call assert_equal('quickfix', getwinvar(3, '&buftype'))
2660
Bram Moolenaar4b96df52020-01-26 22:00:26 +01002661 " Jumping to a file from the location list window should find a usable
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +01002662 " window by wrapping around the window list.
2663 enew | only
2664 call setloclist(0, [], 'f')
2665 new | new
2666 lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2667 lopen
2668 1close
2669 call assert_equal(0, getloclist(3, {'id' : 0}).id)
2670 lnext
2671 call assert_equal(3, winnr())
2672 call assert_equal(getloclist(1, {'id' : 0}).id, getloclist(3, {'id' : 0}).id)
2673
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01002674 enew | only
2675 set efm&vim
2676endfunc
Bram Moolenaaree85df32017-03-19 14:19:50 +01002677
Bram Moolenaare00fdf32019-09-15 19:09:42 +02002678func Test_cwindow_highlight()
2679 CheckScreendump
2680
2681 let lines =<< trim END
2682 set t_u7=
2683 call setline(1, ['some', 'text', 'with', 'matches'])
2684 write XCwindow
2685 vimgrep e XCwindow
2686 redraw
2687 cwindow 4
2688 END
2689 call writefile(lines, 'XtestCwindow')
2690 let buf = RunVimInTerminal('-S XtestCwindow', #{rows: 12})
2691 call VerifyScreenDump(buf, 'Test_quickfix_cwindow_1', {})
2692
2693 call term_sendkeys(buf, ":cnext\<CR>")
2694 call VerifyScreenDump(buf, 'Test_quickfix_cwindow_2', {})
2695
2696 " clean up
2697 call StopVimInTerminal(buf)
2698 call delete('XtestCwindow')
2699 call delete('XCwindow')
2700endfunc
2701
Bram Moolenaaree85df32017-03-19 14:19:50 +01002702func XvimgrepTests(cchar)
2703 call s:setup_commands(a:cchar)
2704
2705 call writefile(['Editor:VIM vim',
2706 \ 'Editor:Emacs EmAcS',
2707 \ 'Editor:Notepad NOTEPAD'], 'Xtestfile1')
2708 call writefile(['Linux', 'MacOS', 'MS-Windows'], 'Xtestfile2')
2709
2710 " Error cases
2711 call assert_fails('Xvimgrep /abc *', 'E682:')
2712
2713 let @/=''
2714 call assert_fails('Xvimgrep // *', 'E35:')
2715
2716 call assert_fails('Xvimgrep abc', 'E683:')
2717 call assert_fails('Xvimgrep a1b2c3 Xtestfile1', 'E480:')
2718 call assert_fails('Xvimgrep pat Xa1b2c3', 'E480:')
2719
2720 Xexpr ""
2721 Xvimgrepadd Notepad Xtestfile1
2722 Xvimgrepadd MacOS Xtestfile2
2723 let l = g:Xgetlist()
2724 call assert_equal(2, len(l))
2725 call assert_equal('Editor:Notepad NOTEPAD', l[0].text)
2726
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01002727 10Xvimgrep #\cvim#g Xtestfile?
Bram Moolenaaree85df32017-03-19 14:19:50 +01002728 let l = g:Xgetlist()
2729 call assert_equal(2, len(l))
2730 call assert_equal(8, l[0].col)
2731 call assert_equal(12, l[1].col)
2732
2733 1Xvimgrep ?Editor? Xtestfile*
2734 let l = g:Xgetlist()
2735 call assert_equal(1, len(l))
2736 call assert_equal('Editor:VIM vim', l[0].text)
2737
2738 edit +3 Xtestfile2
2739 Xvimgrep +\cemacs+j Xtestfile1
2740 let l = g:Xgetlist()
2741 call assert_equal('Xtestfile2', bufname(''))
2742 call assert_equal('Editor:Emacs EmAcS', l[0].text)
2743
Bram Moolenaar2225ebb2018-04-24 15:48:11 +02002744 " Test for unloading a buffer after vimgrep searched the buffer
2745 %bwipe
2746 Xvimgrep /Editor/j Xtestfile*
2747 call assert_equal(0, getbufinfo('Xtestfile1')[0].loaded)
2748 call assert_equal([], getbufinfo('Xtestfile2'))
2749
Bram Moolenaaree85df32017-03-19 14:19:50 +01002750 call delete('Xtestfile1')
2751 call delete('Xtestfile2')
2752endfunc
2753
2754" Tests for the :vimgrep command
2755func Test_vimgrep()
2756 call XvimgrepTests('c')
2757 call XvimgrepTests('l')
2758endfunc
Bram Moolenaar69f40be2017-04-02 15:15:49 +02002759
Bram Moolenaar1c299432018-10-28 14:36:09 +01002760" Test for incsearch highlighting of the :vimgrep pattern
2761" This test used to cause "E315: ml_get: invalid lnum" errors.
2762func Test_vimgrep_incsearch()
2763 enew
2764 set incsearch
2765 call test_override("char_avail", 1)
2766
2767 call feedkeys(":2vimgrep assert test_quickfix.vim test_cdo.vim\<CR>", "ntx")
2768 let l = getqflist()
2769 call assert_equal(2, len(l))
2770
2771 call test_override("ALL", 0)
2772 set noincsearch
2773endfunc
2774
Bram Moolenaar9f6277b2020-02-11 22:04:02 +01002775" Test vimgrep with the last search pattern not set
2776func Test_vimgrep_with_no_last_search_pat()
2777 let lines =<< trim [SCRIPT]
2778 call assert_fails('vimgrep // *', 'E35:')
2779 call writefile(v:errors, 'Xresult')
2780 qall!
2781 [SCRIPT]
2782 call writefile(lines, 'Xscript')
2783 if RunVim([], [], '--clean -S Xscript')
2784 call assert_equal([], readfile('Xresult'))
2785 endif
2786 call delete('Xscript')
2787 call delete('Xresult')
2788endfunc
2789
Bram Moolenaar69f40be2017-04-02 15:15:49 +02002790func XfreeTests(cchar)
2791 call s:setup_commands(a:cchar)
2792
2793 enew | only
2794
2795 " Deleting the quickfix stack should work even When the current list is
2796 " somewhere in the middle of the stack
2797 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2798 Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
2799 Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
2800 Xolder
2801 call g:Xsetlist([], 'f')
2802 call assert_equal(0, len(g:Xgetlist()))
2803
2804 " After deleting the stack, adding a new list should create a stack with a
2805 " single list.
2806 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2807 call assert_equal(1, g:Xgetlist({'all':1}).nr)
2808
2809 " Deleting the stack from a quickfix window should update/clear the
2810 " quickfix/location list window.
2811 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2812 Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
2813 Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
2814 Xolder
2815 Xwindow
2816 call g:Xsetlist([], 'f')
2817 call assert_equal(2, winnr('$'))
2818 call assert_equal(1, line('$'))
2819 Xclose
2820
2821 " Deleting the stack from a non-quickfix window should update/clear the
2822 " quickfix/location list window.
2823 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2824 Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
2825 Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
2826 Xolder
2827 Xwindow
2828 wincmd p
2829 call g:Xsetlist([], 'f')
2830 call assert_equal(0, len(g:Xgetlist()))
2831 wincmd p
2832 call assert_equal(2, winnr('$'))
2833 call assert_equal(1, line('$'))
2834
2835 " After deleting the location list stack, if the location list window is
2836 " opened, then a new location list should be created. So opening the
2837 " location list window again should not create a new window.
2838 if a:cchar == 'l'
2839 lexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2840 wincmd p
2841 lopen
2842 call assert_equal(2, winnr('$'))
2843 endif
2844 Xclose
2845endfunc
2846
Bram Moolenaar74240d32017-12-10 15:26:15 +01002847" Tests for the quickfix free functionality
Bram Moolenaar69f40be2017-04-02 15:15:49 +02002848func Test_qf_free()
2849 call XfreeTests('c')
2850 call XfreeTests('l')
2851endfunc
Bram Moolenaar6e62da32017-05-28 08:16:25 +02002852
2853" Test for buffer overflow when parsing lines and adding new entries to
2854" the quickfix list.
2855func Test_bufoverflow()
2856 set efm=%f:%l:%m
2857 cgetexpr ['File1:100:' . repeat('x', 1025)]
2858
2859 set efm=%+GCompiler:\ %.%#,%f:%l:%m
2860 cgetexpr ['Compiler: ' . repeat('a', 1015), 'File1:10:Hello World']
2861
2862 set efm=%DEntering\ directory\ %f,%f:%l:%m
2863 cgetexpr ['Entering directory ' . repeat('a', 1006),
2864 \ 'File1:10:Hello World']
2865 set efm&vim
2866endfunc
2867
Bram Moolenaar875feea2017-06-11 16:07:51 +02002868" Tests for getting the quickfix stack size
2869func XsizeTests(cchar)
2870 call s:setup_commands(a:cchar)
2871
2872 call g:Xsetlist([], 'f')
2873 call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
Bram Moolenaara6d48492017-12-12 22:45:31 +01002874 call assert_equal('', g:Xgetlist({'nr':'$', 'all':1}).title)
2875 call assert_equal(0, g:Xgetlist({'nr':0}).nr)
Bram Moolenaar875feea2017-06-11 16:07:51 +02002876
2877 Xexpr "File1:10:Line1"
2878 Xexpr "File2:20:Line2"
2879 Xexpr "File3:30:Line3"
2880 Xolder | Xolder
2881 call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
2882 call g:Xsetlist([], 'f')
2883
2884 Xexpr "File1:10:Line1"
2885 Xexpr "File2:20:Line2"
2886 Xexpr "File3:30:Line3"
2887 Xolder | Xolder
2888 call g:Xsetlist([], 'a', {'nr':'$', 'title':'Compiler'})
2889 call assert_equal('Compiler', g:Xgetlist({'nr':3, 'all':1}).title)
2890endfunc
2891
2892func Test_Qf_Size()
2893 call XsizeTests('c')
2894 call XsizeTests('l')
2895endfunc
Bram Moolenaar18141832017-06-25 21:17:25 +02002896
Bram Moolenaar9c4feff2017-06-28 22:26:54 +02002897func Test_cclose_from_copen()
2898 augroup QF_Test
2899 au!
2900 au FileType qf :call assert_fails(':cclose', 'E788')
2901 augroup END
2902 copen
2903 augroup QF_Test
2904 au!
2905 augroup END
2906 augroup! QF_Test
2907endfunc
2908
Bram Moolenaar18141832017-06-25 21:17:25 +02002909func Test_cclose_in_autocmd()
2910 " Problem is only triggered if "starting" is zero, so that the OptionsSet
2911 " event will be triggered.
2912 call test_override('starting', 1)
2913 augroup QF_Test
2914 au!
2915 au FileType qf :call assert_fails(':cclose', 'E788')
2916 augroup END
2917 copen
2918 augroup QF_Test
2919 au!
2920 augroup END
2921 augroup! QF_Test
2922 call test_override('starting', 0)
2923endfunc
Bram Moolenaar9c4feff2017-06-28 22:26:54 +02002924
Bram Moolenaar379fb762018-08-30 15:58:28 +02002925" Check that ":file" without an argument is possible even when "curbuf_lock"
2926" is set.
2927func Test_file_from_copen()
2928 " Works without argument.
2929 augroup QF_Test
2930 au!
2931 au FileType qf file
2932 augroup END
2933 copen
2934
2935 augroup QF_Test
2936 au!
2937 augroup END
2938 cclose
2939
2940 " Fails with argument.
2941 augroup QF_Test
2942 au!
2943 au FileType qf call assert_fails(':file foo', 'E788')
2944 augroup END
2945 copen
2946 augroup QF_Test
2947 au!
2948 augroup END
2949 cclose
2950
2951 augroup! QF_Test
Bram Moolenaar6a0cc912019-10-26 16:48:44 +02002952endfunc
Bram Moolenaar379fb762018-08-30 15:58:28 +02002953
Bram Moolenaar9c4feff2017-06-28 22:26:54 +02002954func Test_resize_from_copen()
2955 augroup QF_Test
2956 au!
2957 au FileType qf resize 5
2958 augroup END
2959 try
2960 " This should succeed without any exception. No other buffers are
2961 " involved in the autocmd.
2962 copen
2963 finally
2964 augroup QF_Test
2965 au!
2966 augroup END
2967 augroup! QF_Test
2968 endtry
2969endfunc
Bram Moolenaara8788f42017-07-19 17:06:20 +02002970
2971" Tests for the quickfix buffer b:changedtick variable
2972func Xchangedtick_tests(cchar)
2973 call s:setup_commands(a:cchar)
2974
2975 new | only
2976
2977 Xexpr "" | Xexpr "" | Xexpr ""
2978
2979 Xopen
2980 Xolder
2981 Xolder
2982 Xaddexpr "F1:10:Line10"
2983 Xaddexpr "F2:20:Line20"
2984 call g:Xsetlist([{"filename":"F3", "lnum":30, "text":"Line30"}], 'a')
2985 call g:Xsetlist([], 'f')
2986 call assert_equal(8, getbufvar('%', 'changedtick'))
2987 Xclose
2988endfunc
2989
2990func Test_changedtick()
Bram Moolenaarae338332017-08-11 20:25:26 +02002991 call Xchangedtick_tests('c')
2992 call Xchangedtick_tests('l')
2993endfunc
2994
2995" Tests for parsing an expression using setqflist()
2996func Xsetexpr_tests(cchar)
2997 call s:setup_commands(a:cchar)
2998
2999 let t = ["File1:10:Line10", "File1:20:Line20"]
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003000 call g:Xsetlist([], ' ', {'lines' : t})
3001 call g:Xsetlist([], 'a', {'lines' : ["File1:30:Line30"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02003002
3003 let l = g:Xgetlist()
3004 call assert_equal(3, len(l))
3005 call assert_equal(20, l[1].lnum)
3006 call assert_equal('Line30', l[2].text)
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003007 call g:Xsetlist([], 'r', {'lines' : ["File2:5:Line5"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02003008 let l = g:Xgetlist()
3009 call assert_equal(1, len(l))
3010 call assert_equal('Line5', l[0].text)
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003011 call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : 10}))
3012 call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : "F1:10:L10"}))
Bram Moolenaarae338332017-08-11 20:25:26 +02003013
3014 call g:Xsetlist([], 'f')
3015 " Add entries to multiple lists
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003016 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:10:Line10"]})
3017 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:20:Line20"]})
3018 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:15:Line15"]})
3019 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:25:Line25"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02003020 call assert_equal('Line15', g:Xgetlist({'nr':1, 'items':1}).items[1].text)
3021 call assert_equal('Line25', g:Xgetlist({'nr':2, 'items':1}).items[1].text)
Bram Moolenaar36538222017-09-02 19:51:44 +02003022
3023 " Adding entries using a custom efm
3024 set efm&
3025 call g:Xsetlist([], ' ', {'efm' : '%f#%l#%m',
3026 \ 'lines' : ["F1#10#L10", "F2#20#L20"]})
3027 call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
3028 call g:Xsetlist([], 'a', {'efm' : '%f#%l#%m', 'lines' : ["F3:30:L30"]})
3029 call assert_equal('F3:30:L30', g:Xgetlist({'items':1}).items[2].text)
3030 call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
3031 call assert_equal(-1, g:Xsetlist([], 'a', {'efm' : [],
3032 \ 'lines' : ['F1:10:L10']}))
Bram Moolenaarae338332017-08-11 20:25:26 +02003033endfunc
3034
3035func Test_setexpr()
3036 call Xsetexpr_tests('c')
3037 call Xsetexpr_tests('l')
3038endfunc
3039
3040" Tests for per quickfix/location list directory stack
3041func Xmultidirstack_tests(cchar)
3042 call s:setup_commands(a:cchar)
3043
3044 call g:Xsetlist([], 'f')
3045 Xexpr "" | Xexpr ""
3046
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003047 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["Entering dir 'Xone/a'"]})
3048 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["Entering dir 'Xtwo/a'"]})
3049 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["one.txt:3:one one one"]})
3050 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["two.txt:5:two two two"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02003051
3052 let l1 = g:Xgetlist({'nr':1, 'items':1})
3053 let l2 = g:Xgetlist({'nr':2, 'items':1})
3054 call assert_equal('Xone/a/one.txt', bufname(l1.items[1].bufnr))
3055 call assert_equal(3, l1.items[1].lnum)
3056 call assert_equal('Xtwo/a/two.txt', bufname(l2.items[1].bufnr))
3057 call assert_equal(5, l2.items[1].lnum)
3058endfunc
3059
3060func Test_multidirstack()
3061 call mkdir('Xone/a', 'p')
3062 call mkdir('Xtwo/a', 'p')
3063 let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
3064 call writefile(lines, 'Xone/a/one.txt')
3065 call writefile(lines, 'Xtwo/a/two.txt')
3066 let save_efm = &efm
3067 set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
3068
3069 call Xmultidirstack_tests('c')
3070 call Xmultidirstack_tests('l')
3071
3072 let &efm = save_efm
3073 call delete('Xone', 'rf')
3074 call delete('Xtwo', 'rf')
3075endfunc
3076
3077" Tests for per quickfix/location list file stack
3078func Xmultifilestack_tests(cchar)
3079 call s:setup_commands(a:cchar)
3080
3081 call g:Xsetlist([], 'f')
3082 Xexpr "" | Xexpr ""
3083
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003084 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["[one.txt]"]})
3085 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["[two.txt]"]})
3086 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["(3,5) one one one"]})
3087 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["(5,9) two two two"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02003088
3089 let l1 = g:Xgetlist({'nr':1, 'items':1})
3090 let l2 = g:Xgetlist({'nr':2, 'items':1})
3091 call assert_equal('one.txt', bufname(l1.items[1].bufnr))
3092 call assert_equal(3, l1.items[1].lnum)
3093 call assert_equal('two.txt', bufname(l2.items[1].bufnr))
3094 call assert_equal(5, l2.items[1].lnum)
Bram Moolenaare333e792018-04-08 13:27:39 +02003095
3096 " Test for start of a new error line in the same line where a previous
3097 " error line ends with a file stack.
3098 let efm_val = 'Error\ l%l\ in\ %f,'
3099 let efm_val .= '%-P%>(%f%r,Error\ l%l\ in\ %m,%-Q)%r'
3100 let l = g:Xgetlist({'lines' : [
3101 \ '(one.txt',
3102 \ 'Error l4 in one.txt',
3103 \ ') (two.txt',
3104 \ 'Error l6 in two.txt',
3105 \ ')',
3106 \ 'Error l8 in one.txt'
3107 \ ], 'efm' : efm_val})
3108 call assert_equal(3, len(l.items))
3109 call assert_equal('one.txt', bufname(l.items[0].bufnr))
3110 call assert_equal(4, l.items[0].lnum)
3111 call assert_equal('one.txt', l.items[0].text)
3112 call assert_equal('two.txt', bufname(l.items[1].bufnr))
3113 call assert_equal(6, l.items[1].lnum)
3114 call assert_equal('two.txt', l.items[1].text)
3115 call assert_equal('one.txt', bufname(l.items[2].bufnr))
3116 call assert_equal(8, l.items[2].lnum)
3117 call assert_equal('', l.items[2].text)
Bram Moolenaarae338332017-08-11 20:25:26 +02003118endfunc
3119
3120func Test_multifilestack()
3121 let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
3122 call writefile(lines, 'one.txt')
3123 call writefile(lines, 'two.txt')
3124 let save_efm = &efm
3125 set efm=%+P[%f],(%l\\,%c)\ %m,%-Q
3126
3127 call Xmultifilestack_tests('c')
3128 call Xmultifilestack_tests('l')
3129
3130 let &efm = save_efm
3131 call delete('one.txt')
3132 call delete('two.txt')
3133endfunc
3134
3135" Tests for per buffer 'efm' setting
3136func Test_perbuf_efm()
3137 call writefile(["File1-10-Line10"], 'one.txt')
3138 call writefile(["File2#20#Line20"], 'two.txt')
3139 set efm=%f#%l#%m
3140 new | only
3141 new
3142 setlocal efm=%f-%l-%m
3143 cfile one.txt
3144 wincmd w
3145 caddfile two.txt
3146
3147 let l = getqflist()
3148 call assert_equal(10, l[0].lnum)
3149 call assert_equal('Line20', l[1].text)
3150
3151 set efm&
3152 new | only
3153 call delete('one.txt')
3154 call delete('two.txt')
Bram Moolenaara8788f42017-07-19 17:06:20 +02003155endfunc
Bram Moolenaard28cc3f2017-07-27 22:03:50 +02003156
3157" Open multiple help windows using ":lhelpgrep
3158" This test used to crash Vim
3159func Test_Multi_LL_Help()
3160 new | only
3161 lhelpgrep window
3162 lopen
3163 e#
3164 lhelpgrep buffer
3165 call assert_equal(3, winnr('$'))
3166 call assert_true(len(getloclist(1)) != 0)
3167 call assert_true(len(getloclist(2)) != 0)
3168 new | only
3169endfunc
Bram Moolenaar55b69262017-08-13 13:42:01 +02003170
3171" Tests for adding new quickfix lists using setqflist()
3172func XaddQf_tests(cchar)
3173 call s:setup_commands(a:cchar)
3174
3175 " Create a new list using ' ' for action
3176 call g:Xsetlist([], 'f')
3177 call g:Xsetlist([], ' ', {'title' : 'Test1'})
3178 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3179 call assert_equal(1, l.nr)
3180 call assert_equal('Test1', l.title)
3181
3182 " Create a new list using ' ' for action and '$' for 'nr'
3183 call g:Xsetlist([], 'f')
3184 call g:Xsetlist([], ' ', {'title' : 'Test2', 'nr' : '$'})
3185 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3186 call assert_equal(1, l.nr)
3187 call assert_equal('Test2', l.title)
3188
3189 " Create a new list using 'a' for action
3190 call g:Xsetlist([], 'f')
3191 call g:Xsetlist([], 'a', {'title' : 'Test3'})
3192 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3193 call assert_equal(1, l.nr)
3194 call assert_equal('Test3', l.title)
3195
3196 " Create a new list using 'a' for action and '$' for 'nr'
3197 call g:Xsetlist([], 'f')
3198 call g:Xsetlist([], 'a', {'title' : 'Test3', 'nr' : '$'})
3199 call g:Xsetlist([], 'a', {'title' : 'Test4'})
3200 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3201 call assert_equal(1, l.nr)
3202 call assert_equal('Test4', l.title)
3203
3204 " Adding a quickfix list should remove all the lists following the current
3205 " list.
3206 Xexpr "" | Xexpr "" | Xexpr ""
3207 silent! 10Xolder
3208 call g:Xsetlist([], ' ', {'title' : 'Test5'})
3209 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3210 call assert_equal(2, l.nr)
3211 call assert_equal('Test5', l.title)
3212
3213 " Add a quickfix list using '$' as the list number.
3214 let lastqf = g:Xgetlist({'nr':'$'}).nr
3215 silent! 99Xolder
3216 call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test6'})
3217 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3218 call assert_equal(lastqf + 1, l.nr)
3219 call assert_equal('Test6', l.title)
3220
3221 " Add a quickfix list using 'nr' set to one more than the quickfix
3222 " list size.
3223 let lastqf = g:Xgetlist({'nr':'$'}).nr
3224 silent! 99Xolder
3225 call g:Xsetlist([], ' ', {'nr' : lastqf + 1, 'title' : 'Test7'})
3226 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3227 call assert_equal(lastqf + 1, l.nr)
3228 call assert_equal('Test7', l.title)
3229
3230 " Add a quickfix list to a stack with 10 lists using 'nr' set to '$'
3231 exe repeat('Xexpr "" |', 9) . 'Xexpr ""'
3232 silent! 99Xolder
3233 call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test8'})
3234 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3235 call assert_equal(10, l.nr)
3236 call assert_equal('Test8', l.title)
3237
3238 " Add a quickfix list using 'nr' set to a value greater than 10
3239 call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 12, 'title' : 'Test9'}))
3240
3241 " Try adding a quickfix list with 'nr' set to a value greater than the
3242 " quickfix list size but less than 10.
3243 call g:Xsetlist([], 'f')
3244 Xexpr "" | Xexpr "" | Xexpr ""
3245 silent! 99Xolder
3246 call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 8, 'title' : 'Test10'}))
3247
3248 " Add a quickfix list using 'nr' set to a some string or list
3249 call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : [1,2], 'title' : 'Test11'}))
3250endfunc
3251
3252func Test_add_qf()
3253 call XaddQf_tests('c')
3254 call XaddQf_tests('l')
3255endfunc
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02003256
3257" Test for getting the quickfix list items from some text without modifying
3258" the quickfix stack
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003259func XgetListFromLines(cchar)
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02003260 call s:setup_commands(a:cchar)
3261 call g:Xsetlist([], 'f')
3262
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003263 let l = g:Xgetlist({'lines' : ["File2:20:Line20", "File2:30:Line30"]}).items
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02003264 call assert_equal(2, len(l))
3265 call assert_equal(30, l[1].lnum)
3266
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003267 call assert_equal({}, g:Xgetlist({'lines' : 10}))
3268 call assert_equal({}, g:Xgetlist({'lines' : 'File1:10:Line10'}))
3269 call assert_equal([], g:Xgetlist({'lines' : []}).items)
3270 call assert_equal([], g:Xgetlist({'lines' : [10, 20]}).items)
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02003271
Bram Moolenaar36538222017-09-02 19:51:44 +02003272 " Parse text using a custom efm
3273 set efm&
3274 let l = g:Xgetlist({'lines':['File3#30#Line30'], 'efm' : '%f#%l#%m'}).items
3275 call assert_equal('Line30', l[0].text)
3276 let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : '%f-%l-%m'}).items
3277 call assert_equal('File3:30:Line30', l[0].text)
3278 let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : [1,2]})
3279 call assert_equal({}, l)
3280 call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':'%2'})", 'E376:')
3281 call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':''})", 'E378:')
3282
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02003283 " Make sure that the quickfix stack is not modified
3284 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
3285endfunc
3286
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003287func Test_get_list_from_lines()
3288 call XgetListFromLines('c')
3289 call XgetListFromLines('l')
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02003290endfunc
Bram Moolenaara539f4f2017-08-30 20:33:55 +02003291
3292" Tests for the quickfix list id
3293func Xqfid_tests(cchar)
3294 call s:setup_commands(a:cchar)
3295
3296 call g:Xsetlist([], 'f')
Bram Moolenaara6d48492017-12-12 22:45:31 +01003297 call assert_equal(0, g:Xgetlist({'id':0}).id)
Bram Moolenaara539f4f2017-08-30 20:33:55 +02003298 Xexpr ''
3299 let start_id = g:Xgetlist({'id' : 0}).id
3300 Xexpr '' | Xexpr ''
3301 Xolder
3302 call assert_equal(start_id, g:Xgetlist({'id':0, 'nr':1}).id)
3303 call assert_equal(start_id + 1, g:Xgetlist({'id':0, 'nr':0}).id)
3304 call assert_equal(start_id + 2, g:Xgetlist({'id':0, 'nr':'$'}).id)
Bram Moolenaara6d48492017-12-12 22:45:31 +01003305 call assert_equal(0, g:Xgetlist({'id':0, 'nr':99}).id)
Bram Moolenaara539f4f2017-08-30 20:33:55 +02003306 call assert_equal(2, g:Xgetlist({'id':start_id + 1, 'nr':0}).nr)
Bram Moolenaara6d48492017-12-12 22:45:31 +01003307 call assert_equal(0, g:Xgetlist({'id':99, 'nr':0}).id)
3308 call assert_equal(0, g:Xgetlist({'id':"abc", 'nr':0}).id)
Bram Moolenaara539f4f2017-08-30 20:33:55 +02003309
3310 call g:Xsetlist([], 'a', {'id':start_id, 'context':[1,2]})
3311 call assert_equal([1,2], g:Xgetlist({'nr':1, 'context':1}).context)
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003312 call g:Xsetlist([], 'a', {'id':start_id+1, 'lines':['F1:10:L10']})
Bram Moolenaara539f4f2017-08-30 20:33:55 +02003313 call assert_equal('L10', g:Xgetlist({'nr':2, 'items':1}).items[0].text)
3314 call assert_equal(-1, g:Xsetlist([], 'a', {'id':999, 'title':'Vim'}))
3315 call assert_equal(-1, g:Xsetlist([], 'a', {'id':'abc', 'title':'Vim'}))
3316
3317 let qfid = g:Xgetlist({'id':0, 'nr':0})
3318 call g:Xsetlist([], 'f')
Bram Moolenaara6d48492017-12-12 22:45:31 +01003319 call assert_equal(0, g:Xgetlist({'id':qfid, 'nr':0}).id)
Bram Moolenaara539f4f2017-08-30 20:33:55 +02003320endfunc
3321
3322func Test_qf_id()
3323 call Xqfid_tests('c')
3324 call Xqfid_tests('l')
3325endfunc
Bram Moolenaar74240d32017-12-10 15:26:15 +01003326
3327func Xqfjump_tests(cchar)
3328 call s:setup_commands(a:cchar)
3329
3330 call writefile(["Line1\tFoo", "Line2"], 'F1')
3331 call writefile(["Line1\tBar", "Line2"], 'F2')
3332 call writefile(["Line1\tBaz", "Line2"], 'F3')
3333
3334 call g:Xsetlist([], 'f')
3335
3336 " Tests for
3337 " Jumping to a line using a pattern
3338 " Jumping to a column greater than the last column in a line
3339 " Jumping to a line greater than the last line in the file
3340 let l = []
3341 for i in range(1, 7)
3342 call add(l, {})
3343 endfor
3344 let l[0].filename='F1'
3345 let l[0].pattern='Line1'
3346 let l[1].filename='F2'
3347 let l[1].pattern='Line1'
3348 let l[2].filename='F3'
3349 let l[2].pattern='Line1'
3350 let l[3].filename='F3'
3351 let l[3].lnum=1
3352 let l[3].col=9
3353 let l[3].vcol=1
3354 let l[4].filename='F3'
3355 let l[4].lnum=99
3356 let l[5].filename='F3'
3357 let l[5].lnum=1
3358 let l[5].col=99
3359 let l[5].vcol=1
3360 let l[6].filename='F3'
3361 let l[6].pattern='abcxyz'
3362
3363 call g:Xsetlist([], ' ', {'items' : l})
3364 Xopen | only
3365 2Xnext
3366 call assert_equal(3, g:Xgetlist({'idx' : 0}).idx)
3367 call assert_equal('F3', bufname('%'))
3368 Xnext
3369 call assert_equal(7, col('.'))
3370 Xnext
3371 call assert_equal(2, line('.'))
3372 Xnext
3373 call assert_equal(9, col('.'))
3374 2
3375 Xnext
3376 call assert_equal(2, line('.'))
3377
3378 if a:cchar == 'l'
3379 " When jumping to a location list entry in the location list window and
3380 " no usable windows are available, then a new window should be opened.
3381 enew! | new | only
3382 call g:Xsetlist([], 'f')
3383 setlocal buftype=nofile
3384 new
3385 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']})
3386 Xopen
3387 let winid = win_getid()
3388 wincmd p
3389 close
3390 call win_gotoid(winid)
3391 Xnext
3392 call assert_equal(3, winnr('$'))
3393 call assert_equal(1, winnr())
3394 call assert_equal(2, line('.'))
3395
3396 " When jumping to an entry in the location list window and the window
3397 " associated with the location list is not present and a window containing
3398 " the file is already present, then that window should be used.
3399 close
3400 belowright new
3401 call g:Xsetlist([], 'f')
3402 edit F3
3403 call win_gotoid(winid)
3404 Xlast
3405 call assert_equal(3, winnr())
3406 call assert_equal(6, g:Xgetlist({'size' : 1}).size)
3407 call assert_equal(winid, g:Xgetlist({'winid' : 1}).winid)
3408 endif
3409
3410 " Cleanup
3411 enew!
3412 new | only
3413
3414 call delete('F1')
3415 call delete('F2')
3416 call delete('F3')
3417endfunc
3418
3419func Test_qfjump()
3420 call Xqfjump_tests('c')
3421 call Xqfjump_tests('l')
3422endfunc
Bram Moolenaara6d48492017-12-12 22:45:31 +01003423
3424" Tests for the getqflist() and getloclist() functions when the list is not
3425" present or is empty
3426func Xgetlist_empty_tests(cchar)
3427 call s:setup_commands(a:cchar)
3428
3429 " Empty quickfix stack
3430 call g:Xsetlist([], 'f')
3431 call assert_equal('', g:Xgetlist({'context' : 0}).context)
3432 call assert_equal(0, g:Xgetlist({'id' : 0}).id)
3433 call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
3434 call assert_equal([], g:Xgetlist({'items' : 0}).items)
3435 call assert_equal(0, g:Xgetlist({'nr' : 0}).nr)
3436 call assert_equal(0, g:Xgetlist({'size' : 0}).size)
3437 call assert_equal('', g:Xgetlist({'title' : 0}).title)
3438 call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
Bram Moolenaarb254af32017-12-18 19:48:58 +01003439 call assert_equal(0, g:Xgetlist({'changedtick' : 0}).changedtick)
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003440 if a:cchar == 'c'
3441 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003442 \ 'items' : [], 'nr' : 0, 'size' : 0, 'qfbufnr' : 0,
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003443 \ 'title' : '', 'winid' : 0, 'changedtick': 0},
3444 \ g:Xgetlist({'all' : 0}))
3445 else
3446 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
3447 \ 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '',
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003448 \ 'winid' : 0, 'changedtick': 0, 'filewinid' : 0,
3449 \ 'qfbufnr' : 0},
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003450 \ g:Xgetlist({'all' : 0}))
3451 endif
Bram Moolenaara6d48492017-12-12 22:45:31 +01003452
Bram Moolenaar2ec364e2018-01-27 11:52:13 +01003453 " Quickfix window with empty stack
3454 silent! Xopen
3455 let qfwinid = (a:cchar == 'c') ? win_getid() : 0
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003456 let qfbufnr = (a:cchar == 'c') ? bufnr('') : 0
Bram Moolenaar2ec364e2018-01-27 11:52:13 +01003457 call assert_equal(qfwinid, g:Xgetlist({'winid' : 0}).winid)
3458 Xclose
3459
Bram Moolenaara6d48492017-12-12 22:45:31 +01003460 " Empty quickfix list
3461 Xexpr ""
3462 call assert_equal('', g:Xgetlist({'context' : 0}).context)
3463 call assert_notequal(0, g:Xgetlist({'id' : 0}).id)
3464 call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
3465 call assert_equal([], g:Xgetlist({'items' : 0}).items)
3466 call assert_notequal(0, g:Xgetlist({'nr' : 0}).nr)
3467 call assert_equal(0, g:Xgetlist({'size' : 0}).size)
3468 call assert_notequal('', g:Xgetlist({'title' : 0}).title)
3469 call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
Bram Moolenaarb254af32017-12-18 19:48:58 +01003470 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
Bram Moolenaara6d48492017-12-12 22:45:31 +01003471
3472 let qfid = g:Xgetlist({'id' : 0}).id
3473 call g:Xsetlist([], 'f')
3474
3475 " Non-existing quickfix identifier
3476 call assert_equal('', g:Xgetlist({'id' : qfid, 'context' : 0}).context)
3477 call assert_equal(0, g:Xgetlist({'id' : qfid}).id)
3478 call assert_equal(0, g:Xgetlist({'id' : qfid, 'idx' : 0}).idx)
3479 call assert_equal([], g:Xgetlist({'id' : qfid, 'items' : 0}).items)
3480 call assert_equal(0, g:Xgetlist({'id' : qfid, 'nr' : 0}).nr)
3481 call assert_equal(0, g:Xgetlist({'id' : qfid, 'size' : 0}).size)
3482 call assert_equal('', g:Xgetlist({'id' : qfid, 'title' : 0}).title)
3483 call assert_equal(0, g:Xgetlist({'id' : qfid, 'winid' : 0}).winid)
Bram Moolenaarb254af32017-12-18 19:48:58 +01003484 call assert_equal(0, g:Xgetlist({'id' : qfid, 'changedtick' : 0}).changedtick)
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003485 if a:cchar == 'c'
3486 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3487 \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003488 \ 'qfbufnr' : qfbufnr,
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003489 \ 'changedtick' : 0}, g:Xgetlist({'id' : qfid, 'all' : 0}))
3490 else
3491 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3492 \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003493 \ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0},
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003494 \ g:Xgetlist({'id' : qfid, 'all' : 0}))
3495 endif
Bram Moolenaara6d48492017-12-12 22:45:31 +01003496
3497 " Non-existing quickfix list number
3498 call assert_equal('', g:Xgetlist({'nr' : 5, 'context' : 0}).context)
3499 call assert_equal(0, g:Xgetlist({'nr' : 5}).nr)
3500 call assert_equal(0, g:Xgetlist({'nr' : 5, 'idx' : 0}).idx)
3501 call assert_equal([], g:Xgetlist({'nr' : 5, 'items' : 0}).items)
3502 call assert_equal(0, g:Xgetlist({'nr' : 5, 'id' : 0}).id)
3503 call assert_equal(0, g:Xgetlist({'nr' : 5, 'size' : 0}).size)
3504 call assert_equal('', g:Xgetlist({'nr' : 5, 'title' : 0}).title)
3505 call assert_equal(0, g:Xgetlist({'nr' : 5, 'winid' : 0}).winid)
Bram Moolenaarb254af32017-12-18 19:48:58 +01003506 call assert_equal(0, g:Xgetlist({'nr' : 5, 'changedtick' : 0}).changedtick)
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003507 if a:cchar == 'c'
3508 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3509 \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003510 \ 'changedtick' : 0, 'qfbufnr' : qfbufnr},
3511 \ g:Xgetlist({'nr' : 5, 'all' : 0}))
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003512 else
3513 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3514 \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003515 \ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0},
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003516 \ g:Xgetlist({'nr' : 5, 'all' : 0}))
3517 endif
Bram Moolenaara6d48492017-12-12 22:45:31 +01003518endfunc
3519
3520func Test_getqflist()
3521 call Xgetlist_empty_tests('c')
3522 call Xgetlist_empty_tests('l')
3523endfunc
Bram Moolenaarb254af32017-12-18 19:48:58 +01003524
Bram Moolenaara0ca7d02017-12-19 10:22:19 +01003525func Test_getqflist_invalid_nr()
3526 " The following commands used to crash Vim
3527 cexpr ""
3528 call getqflist({'nr' : $XXX_DOES_NOT_EXIST_XXX})
3529
3530 " Cleanup
3531 call setqflist([], 'r')
3532endfunc
3533
Bram Moolenaarb254af32017-12-18 19:48:58 +01003534" Tests for the quickfix/location list changedtick
3535func Xqftick_tests(cchar)
3536 call s:setup_commands(a:cchar)
3537
3538 call g:Xsetlist([], 'f')
3539
3540 Xexpr "F1:10:Line10"
3541 let qfid = g:Xgetlist({'id' : 0}).id
3542 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3543 Xaddexpr "F2:20:Line20\nF2:21:Line21"
3544 call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3545 call g:Xsetlist([], 'a', {'lines' : ["F3:30:Line30", "F3:31:Line31"]})
3546 call assert_equal(3, g:Xgetlist({'changedtick' : 0}).changedtick)
3547 call g:Xsetlist([], 'r', {'lines' : ["F4:40:Line40"]})
3548 call assert_equal(4, g:Xgetlist({'changedtick' : 0}).changedtick)
3549 call g:Xsetlist([], 'a', {'title' : 'New Title'})
3550 call assert_equal(5, g:Xgetlist({'changedtick' : 0}).changedtick)
3551
3552 enew!
3553 call append(0, ["F5:50:L50", "F6:60:L60"])
3554 Xaddbuffer
3555 call assert_equal(6, g:Xgetlist({'changedtick' : 0}).changedtick)
3556 enew!
3557
3558 call g:Xsetlist([], 'a', {'context' : {'bus' : 'pci'}})
3559 call assert_equal(7, g:Xgetlist({'changedtick' : 0}).changedtick)
3560 call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3561 \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'a')
3562 call assert_equal(8, g:Xgetlist({'changedtick' : 0}).changedtick)
3563 call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3564 \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], ' ')
3565 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3566 call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3567 \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'r')
3568 call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3569
3570 call writefile(["F8:80:L80", "F8:81:L81"], "Xone")
3571 Xfile Xone
3572 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3573 Xaddfile Xone
3574 call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3575
3576 " Test case for updating a non-current quickfix list
3577 call g:Xsetlist([], 'f')
3578 Xexpr "F1:1:L1"
3579 Xexpr "F2:2:L2"
3580 call g:Xsetlist([], 'a', {'nr' : 1, "lines" : ["F10:10:L10"]})
3581 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3582 call assert_equal(2, g:Xgetlist({'nr' : 1, 'changedtick' : 0}).changedtick)
3583
3584 call delete("Xone")
3585endfunc
3586
3587func Test_qf_tick()
3588 call Xqftick_tests('c')
3589 call Xqftick_tests('l')
3590endfunc
Bram Moolenaar12237442017-12-19 12:38:52 +01003591
Bram Moolenaarc631f2d2018-08-21 21:58:13 +02003592" Test helpgrep with lang specifier
3593func Xtest_helpgrep_with_lang_specifier(cchar)
3594 call s:setup_commands(a:cchar)
3595 Xhelpgrep Vim@en
3596 call assert_equal('help', &filetype)
3597 call assert_notequal(0, g:Xgetlist({'nr' : '$'}).nr)
3598 new | only
3599endfunc
3600
3601func Test_helpgrep_with_lang_specifier()
3602 call Xtest_helpgrep_with_lang_specifier('c')
3603 call Xtest_helpgrep_with_lang_specifier('l')
3604endfunc
3605
Bram Moolenaar12237442017-12-19 12:38:52 +01003606" The following test used to crash Vim.
3607" Open the location list window and close the regular window associated with
3608" the location list. When the garbage collection runs now, it incorrectly
3609" marks the location list context as not in use and frees the context.
3610func Test_ll_window_ctx()
3611 call setloclist(0, [], 'f')
3612 call setloclist(0, [], 'a', {'context' : []})
3613 lopen | only
3614 call test_garbagecollect_now()
3615 echo getloclist(0, {'context' : 1}).context
3616 enew | only
3617endfunc
3618
Bram Moolenaar14a4deb2017-12-19 16:48:55 +01003619" The following test used to crash vim
3620func Test_lfile_crash()
3621 sp Xtest
3622 au QuickFixCmdPre * bw
3623 call assert_fails('lfile', 'E40')
3624 au! QuickFixCmdPre
3625endfunc
Bram Moolenaar3c097222017-12-21 20:54:49 +01003626
3627" The following test used to crash vim
3628func Test_lbuffer_crash()
3629 sv Xtest
3630 augroup QF_Test
3631 au!
3632 au * * bw
3633 augroup END
3634 lbuffer
3635 augroup QF_Test
3636 au!
3637 augroup END
3638endfunc
3639
3640" The following test used to crash vim
3641func Test_lexpr_crash()
3642 augroup QF_Test
3643 au!
3644 au * * call setloclist(0, [], 'f')
3645 augroup END
3646 lexpr ""
3647 augroup QF_Test
3648 au!
3649 augroup END
Bram Moolenaar9f84ded2018-10-20 20:54:02 +02003650
Bram Moolenaar3c097222017-12-21 20:54:49 +01003651 enew | only
Bram Moolenaar9f84ded2018-10-20 20:54:02 +02003652 augroup QF_Test
3653 au!
3654 au BufNew * call setloclist(0, [], 'f')
3655 augroup END
3656 lexpr 'x:1:x'
3657 augroup QF_Test
3658 au!
3659 augroup END
3660
3661 enew | only
3662 lexpr ''
3663 lopen
3664 augroup QF_Test
3665 au!
3666 au FileType * call setloclist(0, [], 'f')
3667 augroup END
3668 lexpr ''
3669 augroup QF_Test
3670 au!
3671 augroup END
Bram Moolenaar3c097222017-12-21 20:54:49 +01003672endfunc
3673
3674" The following test used to crash Vim
3675func Test_lvimgrep_crash()
3676 sv Xtest
3677 augroup QF_Test
3678 au!
3679 au * * call setloclist(0, [], 'f')
3680 augroup END
3681 lvimgrep quickfix test_quickfix.vim
3682 augroup QF_Test
3683 au!
3684 augroup END
Bram Moolenaarb6f14802018-10-21 18:47:43 +02003685
3686 new | only
3687 augroup QF_Test
3688 au!
3689 au BufEnter * call setloclist(0, [], 'r')
3690 augroup END
3691 call assert_fails('lvimgrep Test_lvimgrep_crash *', 'E926:')
3692 augroup QF_Test
3693 au!
3694 augroup END
3695
Bram Moolenaar3c097222017-12-21 20:54:49 +01003696 enew | only
3697endfunc
Bram Moolenaarde046542017-12-26 13:53:11 +01003698
Bram Moolenaar2573af32020-03-14 17:21:34 +01003699func Test_lvimgrep_crash2()
3700 au BufNewFile x sfind
3701 call assert_fails('lvimgrep x x', 'E480:')
3702 call assert_fails('lvimgrep x x x', 'E480:')
3703
3704 au! BufNewFile
3705endfunc
3706
Bram Moolenaarde046542017-12-26 13:53:11 +01003707" Test for the position of the quickfix and location list window
3708func Test_qfwin_pos()
3709 " Open two windows
3710 new | only
3711 new
3712 cexpr ['F1:10:L10']
3713 copen
3714 " Quickfix window should be the bottom most window
3715 call assert_equal(3, winnr())
3716 close
3717 " Open at the very top
3718 wincmd t
3719 topleft copen
3720 call assert_equal(1, winnr())
3721 close
3722 " open left of the current window
3723 wincmd t
3724 below new
3725 leftabove copen
3726 call assert_equal(2, winnr())
3727 close
3728 " open right of the current window
3729 rightbelow copen
3730 call assert_equal(3, winnr())
3731 close
3732endfunc
Bram Moolenaare1bb8792018-04-06 22:58:23 +02003733
3734" Tests for quickfix/location lists changed by autocommands when
3735" :vimgrep/:lvimgrep commands are running.
3736func Test_vimgrep_autocmd()
3737 call setqflist([], 'f')
3738 call writefile(['stars'], 'Xtest1.txt')
3739 call writefile(['stars'], 'Xtest2.txt')
3740
3741 " Test 1:
3742 " When searching for a pattern using :vimgrep, if the quickfix list is
3743 " changed by an autocmd, the results should be added to the correct quickfix
3744 " list.
3745 autocmd BufRead Xtest2.txt cexpr '' | cexpr ''
3746 silent vimgrep stars Xtest*.txt
3747 call assert_equal(1, getqflist({'nr' : 0}).nr)
3748 call assert_equal(3, getqflist({'nr' : '$'}).nr)
3749 call assert_equal('Xtest2.txt', bufname(getqflist()[1].bufnr))
3750 au! BufRead Xtest2.txt
3751
3752 " Test 2:
3753 " When searching for a pattern using :vimgrep, if the quickfix list is
3754 " freed, then a error should be given.
3755 silent! %bwipe!
3756 call setqflist([], 'f')
3757 autocmd BufRead Xtest2.txt for i in range(10) | cexpr '' | endfor
3758 call assert_fails('vimgrep stars Xtest*.txt', 'E925:')
3759 au! BufRead Xtest2.txt
3760
3761 " Test 3:
3762 " When searching for a pattern using :lvimgrep, if the location list is
3763 " freed, then the command should error out.
3764 silent! %bwipe!
3765 let g:save_winid = win_getid()
3766 autocmd BufRead Xtest2.txt call setloclist(g:save_winid, [], 'f')
3767 call assert_fails('lvimgrep stars Xtest*.txt', 'E926:')
3768 au! BufRead Xtest2.txt
3769
3770 call delete('Xtest1.txt')
3771 call delete('Xtest2.txt')
3772 call setqflist([], 'f')
3773endfunc
Bram Moolenaar3b9474b2018-04-23 21:29:48 +02003774
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01003775" Test for an autocmd changing the current directory when running vimgrep
3776func Xvimgrep_autocmd_cd(cchar)
3777 call s:setup_commands(a:cchar)
3778
3779 %bwipe
3780 let save_cwd = getcwd()
3781
3782 augroup QF_Test
3783 au!
3784 autocmd BufRead * silent cd %:p:h
3785 augroup END
3786
3787 10Xvimgrep /vim/ Xdir/**
3788 let l = g:Xgetlist()
3789 call assert_equal('f1.txt', bufname(l[0].bufnr))
3790 call assert_equal('f2.txt', fnamemodify(bufname(l[2].bufnr), ':t'))
3791
3792 augroup QF_Test
3793 au!
3794 augroup END
3795
3796 exe 'cd ' . save_cwd
3797endfunc
3798
3799func Test_vimgrep_autocmd_cd()
3800 call mkdir('Xdir/a', 'p')
3801 call mkdir('Xdir/b', 'p')
3802 call writefile(['a_L1_vim', 'a_L2_vim'], 'Xdir/a/f1.txt')
3803 call writefile(['b_L1_vim', 'b_L2_vim'], 'Xdir/b/f2.txt')
3804 call Xvimgrep_autocmd_cd('c')
3805 call Xvimgrep_autocmd_cd('l')
3806 %bwipe
3807 call delete('Xdir', 'rf')
3808endfunc
3809
Bram Moolenaar3b9474b2018-04-23 21:29:48 +02003810" The following test used to crash Vim
3811func Test_lhelpgrep_autocmd()
3812 lhelpgrep quickfix
3813 autocmd QuickFixCmdPost * call setloclist(0, [], 'f')
3814 lhelpgrep buffer
3815 call assert_equal('help', &filetype)
3816 call assert_equal(0, getloclist(0, {'nr' : '$'}).nr)
3817 lhelpgrep tabpage
3818 call assert_equal('help', &filetype)
3819 call assert_equal(1, getloclist(0, {'nr' : '$'}).nr)
3820 au! QuickFixCmdPost
Bram Moolenaarb6f14802018-10-21 18:47:43 +02003821
3822 new | only
3823 augroup QF_Test
3824 au!
3825 au BufEnter * call setqflist([], 'f')
3826 augroup END
3827 call assert_fails('helpgrep quickfix', 'E925:')
3828 augroup QF_Test
3829 au! BufEnter
3830 augroup END
3831
3832 new | only
3833 augroup QF_Test
3834 au!
3835 au BufEnter * call setqflist([], 'r')
3836 augroup END
3837 call assert_fails('helpgrep quickfix', 'E925:')
3838 augroup QF_Test
3839 au! BufEnter
3840 augroup END
3841
3842 new | only
3843 augroup QF_Test
3844 au!
3845 au BufEnter * call setloclist(0, [], 'r')
3846 augroup END
3847 call assert_fails('lhelpgrep quickfix', 'E926:')
3848 augroup QF_Test
3849 au! BufEnter
3850 augroup END
3851
Bram Moolenaar3b9474b2018-04-23 21:29:48 +02003852 new | only
3853endfunc
Bram Moolenaara796d462018-05-01 14:30:36 +02003854
3855" Test for shortening/simplifying the file name when opening the
3856" quickfix window or when displaying the quickfix list
3857func Test_shorten_fname()
3858 if !has('unix')
3859 return
3860 endif
3861 %bwipe
3862 " Create a quickfix list with a absolute path filename
3863 let fname = getcwd() . '/test_quickfix.vim'
3864 call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'})
3865 call assert_equal(fname, bufname('test_quickfix.vim'))
3866 " Opening the quickfix window should simplify the file path
3867 cwindow
3868 call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
3869 cclose
3870 %bwipe
3871 " Create a quickfix list with a absolute path filename
3872 call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'})
3873 call assert_equal(fname, bufname('test_quickfix.vim'))
3874 " Displaying the quickfix list should simplify the file path
3875 silent! clist
3876 call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
3877endfunc
Bram Moolenaar8b62e312018-05-13 15:29:04 +02003878
3879" Quickfix title tests
3880" In the below tests, 'exe "cmd"' is used to invoke the quickfix commands.
3881" Otherwise due to indentation, the title is set with spaces at the beginning
3882" of the command.
3883func Test_qftitle()
3884 call writefile(["F1:1:Line1"], 'Xerr')
3885
3886 " :cexpr
3887 exe "cexpr readfile('Xerr')"
3888 call assert_equal(":cexpr readfile('Xerr')", getqflist({'title' : 1}).title)
3889
3890 " :cgetexpr
3891 exe "cgetexpr readfile('Xerr')"
3892 call assert_equal(":cgetexpr readfile('Xerr')",
3893 \ getqflist({'title' : 1}).title)
3894
3895 " :caddexpr
3896 call setqflist([], 'f')
3897 exe "caddexpr readfile('Xerr')"
3898 call assert_equal(":caddexpr readfile('Xerr')",
3899 \ getqflist({'title' : 1}).title)
3900
3901 " :cbuffer
3902 new Xerr
3903 exe "cbuffer"
3904 call assert_equal(':cbuffer (Xerr)', getqflist({'title' : 1}).title)
3905
3906 " :cgetbuffer
3907 edit Xerr
3908 exe "cgetbuffer"
3909 call assert_equal(':cgetbuffer (Xerr)', getqflist({'title' : 1}).title)
3910
3911 " :caddbuffer
3912 call setqflist([], 'f')
3913 edit Xerr
3914 exe "caddbuffer"
3915 call assert_equal(':caddbuffer (Xerr)', getqflist({'title' : 1}).title)
3916
3917 " :cfile
3918 exe "cfile Xerr"
3919 call assert_equal(':cfile Xerr', getqflist({'title' : 1}).title)
3920
3921 " :cgetfile
3922 exe "cgetfile Xerr"
3923 call assert_equal(':cgetfile Xerr', getqflist({'title' : 1}).title)
3924
3925 " :caddfile
3926 call setqflist([], 'f')
3927 exe "caddfile Xerr"
3928 call assert_equal(':caddfile Xerr', getqflist({'title' : 1}).title)
3929
3930 " :grep
3931 set grepprg=internal
3932 exe "grep F1 Xerr"
3933 call assert_equal(':grep F1 Xerr', getqflist({'title' : 1}).title)
3934
3935 " :grepadd
3936 call setqflist([], 'f')
3937 exe "grepadd F1 Xerr"
3938 call assert_equal(':grepadd F1 Xerr', getqflist({'title' : 1}).title)
3939 set grepprg&vim
3940
3941 " :vimgrep
3942 exe "vimgrep F1 Xerr"
3943 call assert_equal(':vimgrep F1 Xerr', getqflist({'title' : 1}).title)
3944
3945 " :vimgrepadd
3946 call setqflist([], 'f')
3947 exe "vimgrepadd F1 Xerr"
3948 call assert_equal(':vimgrepadd F1 Xerr', getqflist({'title' : 1}).title)
3949
3950 call setqflist(['F1:10:L10'], ' ')
3951 call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
3952
3953 call setqflist([], 'f')
3954 call setqflist(['F1:10:L10'], 'a')
3955 call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
3956
3957 call setqflist([], 'f')
3958 call setqflist(['F1:10:L10'], 'r')
3959 call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
3960
3961 close
3962 call delete('Xerr')
3963
3964 call setqflist([], ' ', {'title' : 'Errors'})
3965 copen
3966 call assert_equal('Errors', w:quickfix_title)
3967 call setqflist([], 'r', {'items' : [{'filename' : 'a.c', 'lnum' : 10}]})
3968 call assert_equal('Errors', w:quickfix_title)
3969 cclose
3970endfunc
Bram Moolenaar600323b2018-06-16 22:16:47 +02003971
3972func Test_lbuffer_with_bwipe()
3973 new
3974 new
3975 augroup nasty
3976 au * * bwipe
3977 augroup END
3978 lbuffer
3979 augroup nasty
3980 au!
3981 augroup END
3982endfunc
Bram Moolenaar0366c012018-06-18 20:52:13 +02003983
Bram Moolenaar531b9a32018-07-03 16:54:23 +02003984" Test for an autocmd freeing the quickfix/location list when cexpr/lexpr is
3985" running
3986func Xexpr_acmd_freelist(cchar)
3987 call s:setup_commands(a:cchar)
3988
Bram Moolenaar0366c012018-06-18 20:52:13 +02003989 " This was using freed memory.
3990 augroup nasty
Bram Moolenaar531b9a32018-07-03 16:54:23 +02003991 au * * call g:Xsetlist([], 'f')
Bram Moolenaar0366c012018-06-18 20:52:13 +02003992 augroup END
Bram Moolenaar531b9a32018-07-03 16:54:23 +02003993 Xexpr "x"
Bram Moolenaar0366c012018-06-18 20:52:13 +02003994 augroup nasty
3995 au!
3996 augroup END
3997endfunc
Bram Moolenaar531b9a32018-07-03 16:54:23 +02003998
3999func Test_cexpr_acmd_freelist()
4000 call Xexpr_acmd_freelist('c')
4001 call Xexpr_acmd_freelist('l')
4002endfunc
4003
4004" Test for commands that create a new quickfix/location list and jump to the
4005" first error automatically.
4006func Xjumpto_first_error_test(cchar)
4007 call s:setup_commands(a:cchar)
4008
4009 call s:create_test_file('Xtestfile1')
4010 call s:create_test_file('Xtestfile2')
4011 let l = ['Xtestfile1:2:Line2', 'Xtestfile2:4:Line4']
4012
4013 " Test for cexpr/lexpr
4014 enew
4015 Xexpr l
4016 call assert_equal('Xtestfile1', bufname(''))
4017 call assert_equal(2, line('.'))
4018
4019 " Test for cfile/lfile
4020 enew
4021 call writefile(l, 'Xerr')
4022 Xfile Xerr
4023 call assert_equal('Xtestfile1', bufname(''))
4024 call assert_equal(2, line('.'))
4025
4026 " Test for cbuffer/lbuffer
4027 edit Xerr
4028 Xbuffer
4029 call assert_equal('Xtestfile1', bufname(''))
4030 call assert_equal(2, line('.'))
4031
4032 call delete('Xerr')
4033 call delete('Xtestfile1')
4034 call delete('Xtestfile2')
4035endfunc
4036
4037func Test_jumpto_first_error()
4038 call Xjumpto_first_error_test('c')
4039 call Xjumpto_first_error_test('l')
4040endfunc
4041
4042" Test for a quickfix autocmd changing the quickfix/location list before
4043" jumping to the first error in the new list.
4044func Xautocmd_changelist(cchar)
4045 call s:setup_commands(a:cchar)
4046
4047 " Test for cfile/lfile
4048 call s:create_test_file('Xtestfile1')
4049 call s:create_test_file('Xtestfile2')
4050 Xexpr 'Xtestfile1:2:Line2'
4051 autocmd QuickFixCmdPost * Xolder
4052 call writefile(['Xtestfile2:4:Line4'], 'Xerr')
4053 Xfile Xerr
4054 call assert_equal('Xtestfile2', bufname(''))
4055 call assert_equal(4, line('.'))
4056 autocmd! QuickFixCmdPost
4057
4058 " Test for cbuffer/lbuffer
4059 call g:Xsetlist([], 'f')
4060 Xexpr 'Xtestfile1:2:Line2'
4061 autocmd QuickFixCmdPost * Xolder
4062 call writefile(['Xtestfile2:4:Line4'], 'Xerr')
4063 edit Xerr
4064 Xbuffer
4065 call assert_equal('Xtestfile2', bufname(''))
4066 call assert_equal(4, line('.'))
4067 autocmd! QuickFixCmdPost
4068
4069 " Test for cexpr/lexpr
4070 call g:Xsetlist([], 'f')
4071 Xexpr 'Xtestfile1:2:Line2'
4072 autocmd QuickFixCmdPost * Xolder
4073 Xexpr 'Xtestfile2:4:Line4'
4074 call assert_equal('Xtestfile2', bufname(''))
4075 call assert_equal(4, line('.'))
4076 autocmd! QuickFixCmdPost
4077
Bram Moolenaar851332e2018-07-03 19:16:00 +02004078 " The grepprg may not be set on non-Unix systems
4079 if has('unix')
4080 " Test for grep/lgrep
4081 call g:Xsetlist([], 'f')
4082 Xexpr 'Xtestfile1:2:Line2'
4083 autocmd QuickFixCmdPost * Xolder
4084 silent Xgrep Line5 Xtestfile2
4085 call assert_equal('Xtestfile2', bufname(''))
4086 call assert_equal(5, line('.'))
4087 autocmd! QuickFixCmdPost
4088 endif
Bram Moolenaar531b9a32018-07-03 16:54:23 +02004089
4090 " Test for vimgrep/lvimgrep
4091 call g:Xsetlist([], 'f')
4092 Xexpr 'Xtestfile1:2:Line2'
4093 autocmd QuickFixCmdPost * Xolder
4094 silent Xvimgrep Line5 Xtestfile2
4095 call assert_equal('Xtestfile2', bufname(''))
4096 call assert_equal(5, line('.'))
4097 autocmd! QuickFixCmdPost
4098
Bram Moolenaar3f347e42018-08-09 21:19:20 +02004099 " Test for autocommands clearing the quickfix list before jumping to the
4100 " first error. This should not result in an error
4101 autocmd QuickFixCmdPost * call g:Xsetlist([], 'r')
4102 let v:errmsg = ''
4103 " Test for cfile/lfile
4104 Xfile Xerr
4105 call assert_true(v:errmsg !~# 'E42:')
4106 " Test for cbuffer/lbuffer
4107 edit Xerr
4108 Xbuffer
4109 call assert_true(v:errmsg !~# 'E42:')
4110 " Test for cexpr/lexpr
4111 Xexpr 'Xtestfile2:4:Line4'
4112 call assert_true(v:errmsg !~# 'E42:')
4113 " Test for grep/lgrep
4114 " The grepprg may not be set on non-Unix systems
4115 if has('unix')
4116 silent Xgrep Line5 Xtestfile2
4117 call assert_true(v:errmsg !~# 'E42:')
4118 endif
4119 " Test for vimgrep/lvimgrep
4120 call assert_fails('silent Xvimgrep Line5 Xtestfile2', 'E480:')
4121 autocmd! QuickFixCmdPost
4122
Bram Moolenaar531b9a32018-07-03 16:54:23 +02004123 call delete('Xerr')
4124 call delete('Xtestfile1')
4125 call delete('Xtestfile2')
4126endfunc
4127
4128func Test_autocmd_changelist()
4129 call Xautocmd_changelist('c')
4130 call Xautocmd_changelist('l')
4131endfunc
Bram Moolenaar4cde86c2018-07-08 16:01:08 +02004132
4133" Tests for the ':filter /pat/ clist' command
4134func Test_filter_clist()
4135 cexpr ['Xfile1:10:10:Line 10', 'Xfile2:15:15:Line 15']
4136 call assert_equal([' 2 Xfile2:15 col 15: Line 15'],
4137 \ split(execute('filter /Line 15/ clist'), "\n"))
4138 call assert_equal([' 1 Xfile1:10 col 10: Line 10'],
4139 \ split(execute('filter /Xfile1/ clist'), "\n"))
4140 call assert_equal([], split(execute('filter /abc/ clist'), "\n"))
4141
4142 call setqflist([{'module' : 'abc', 'pattern' : 'pat1'},
4143 \ {'module' : 'pqr', 'pattern' : 'pat2'}], ' ')
4144 call assert_equal([' 2 pqr:pat2: '],
4145 \ split(execute('filter /pqr/ clist'), "\n"))
4146 call assert_equal([' 1 abc:pat1: '],
4147 \ split(execute('filter /pat1/ clist'), "\n"))
4148endfunc
Bram Moolenaar0a08c632018-07-25 22:36:52 +02004149
4150" Tests for the "CTRL-W <CR>" command.
4151func Xview_result_split_tests(cchar)
4152 call s:setup_commands(a:cchar)
4153
4154 " Test that "CTRL-W <CR>" in a qf/ll window fails with empty list.
4155 call g:Xsetlist([])
4156 Xopen
4157 let l:win_count = winnr('$')
4158 call assert_fails('execute "normal! \<C-W>\<CR>"', 'E42')
4159 call assert_equal(l:win_count, winnr('$'))
4160 Xclose
4161endfunc
4162
4163func Test_view_result_split()
4164 call Xview_result_split_tests('c')
4165 call Xview_result_split_tests('l')
4166endfunc
Bram Moolenaar2dfcef42018-08-15 22:29:51 +02004167
4168" Test that :cc sets curswant
4169func Test_curswant()
4170 helpgrep quickfix
4171 normal! llll
4172 1cc
4173 call assert_equal(getcurpos()[4], virtcol('.'))
4174 cclose | helpclose
4175endfunc
Bram Moolenaarb2443732018-11-11 22:50:27 +01004176
4177" Test for opening a file from the quickfix window using CTRL-W <Enter>
4178" doesn't leave an empty buffer around.
4179func Test_splitview()
4180 call s:create_test_file('Xtestfile1')
4181 call s:create_test_file('Xtestfile2')
4182 new | only
4183 let last_bufnr = bufnr('Test_sv_1', 1)
4184 let l = ['Xtestfile1:2:Line2', 'Xtestfile2:4:Line4']
4185 cgetexpr l
4186 copen
4187 let numbufs = len(getbufinfo())
4188 exe "normal \<C-W>\<CR>"
4189 copen
4190 exe "normal j\<C-W>\<CR>"
4191 " Make sure new empty buffers are not created
4192 call assert_equal(numbufs, len(getbufinfo()))
4193 " Creating a new buffer should use the next available buffer number
4194 call assert_equal(last_bufnr + 4, bufnr("Test_sv_2", 1))
4195 bwipe Test_sv_1
4196 bwipe Test_sv_2
4197 new | only
4198
4199 " When split opening files from location list window, make sure that two
4200 " windows doesn't refer to the same location list
4201 lgetexpr l
4202 let locid = getloclist(0, {'id' : 0}).id
4203 lopen
4204 exe "normal \<C-W>\<CR>"
4205 call assert_notequal(locid, getloclist(0, {'id' : 0}).id)
4206 call assert_equal(0, getloclist(0, {'winid' : 0}).winid)
4207 new | only
4208
4209 " When split opening files from a helpgrep location list window, a new help
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01004210 " window should be opened with a copy of the location list.
Bram Moolenaarb2443732018-11-11 22:50:27 +01004211 lhelpgrep window
4212 let locid = getloclist(0, {'id' : 0}).id
4213 lwindow
4214 exe "normal j\<C-W>\<CR>"
4215 call assert_notequal(locid, getloclist(0, {'id' : 0}).id)
4216 call assert_equal(0, getloclist(0, {'winid' : 0}).winid)
4217 new | only
4218
Bram Moolenaar406cd902020-02-18 21:54:41 +01004219 " Using :split or :vsplit from a quickfix window should behave like a :new
4220 " or a :vnew command
4221 copen
4222 split
4223 call assert_equal(3, winnr('$'))
4224 let l = getwininfo()
4225 call assert_equal([0, 0, 1], [l[0].quickfix, l[1].quickfix, l[2].quickfix])
4226 close
4227 copen
4228 vsplit
4229 let l = getwininfo()
4230 call assert_equal([0, 0, 1], [l[0].quickfix, l[1].quickfix, l[2].quickfix])
4231 new | only
4232
Bram Moolenaarb2443732018-11-11 22:50:27 +01004233 call delete('Xtestfile1')
4234 call delete('Xtestfile2')
4235endfunc
Bram Moolenaarc45eb772019-01-31 14:27:04 +01004236
4237" Test for parsing entries using visual screen column
4238func Test_viscol()
4239 enew
4240 call writefile(["Col1\tCol2\tCol3"], 'Xfile1')
4241 edit Xfile1
4242
4243 " Use byte offset for column number
4244 set efm&
4245 cexpr "Xfile1:1:5:XX\nXfile1:1:9:YY\nXfile1:1:20:ZZ"
4246 call assert_equal([5, 8], [col('.'), virtcol('.')])
4247 cnext
4248 call assert_equal([9, 12], [col('.'), virtcol('.')])
4249 cnext
4250 call assert_equal([14, 20], [col('.'), virtcol('.')])
4251
4252 " Use screen column offset for column number
4253 set efm=%f:%l:%v:%m
4254 cexpr "Xfile1:1:8:XX\nXfile1:1:12:YY\nXfile1:1:20:ZZ"
4255 call assert_equal([5, 8], [col('.'), virtcol('.')])
4256 cnext
4257 call assert_equal([9, 12], [col('.'), virtcol('.')])
4258 cnext
4259 call assert_equal([14, 20], [col('.'), virtcol('.')])
4260 cexpr "Xfile1:1:6:XX\nXfile1:1:15:YY\nXfile1:1:24:ZZ"
4261 call assert_equal([5, 8], [col('.'), virtcol('.')])
4262 cnext
4263 call assert_equal([10, 16], [col('.'), virtcol('.')])
4264 cnext
4265 call assert_equal([14, 20], [col('.'), virtcol('.')])
4266
4267 enew
4268 call writefile(["Col1\täü\töß\tCol4"], 'Xfile1')
4269
4270 " Use byte offset for column number
4271 set efm&
4272 cexpr "Xfile1:1:8:XX\nXfile1:1:11:YY\nXfile1:1:16:ZZ"
4273 call assert_equal([8, 10], [col('.'), virtcol('.')])
4274 cnext
4275 call assert_equal([11, 17], [col('.'), virtcol('.')])
4276 cnext
4277 call assert_equal([16, 25], [col('.'), virtcol('.')])
4278
4279 " Use screen column offset for column number
4280 set efm=%f:%l:%v:%m
4281 cexpr "Xfile1:1:10:XX\nXfile1:1:17:YY\nXfile1:1:25:ZZ"
4282 call assert_equal([8, 10], [col('.'), virtcol('.')])
4283 cnext
4284 call assert_equal([11, 17], [col('.'), virtcol('.')])
4285 cnext
4286 call assert_equal([16, 25], [col('.'), virtcol('.')])
4287
4288 enew | only
4289 set efm&
4290 call delete('Xfile1')
4291endfunc
Bram Moolenaaree8188f2019-02-05 21:23:04 +01004292
4293" Test for the quickfix window buffer
4294func Xqfbuf_test(cchar)
4295 call s:setup_commands(a:cchar)
4296
4297 " Quickfix buffer should be reused across closing and opening a quickfix
4298 " window
4299 Xexpr "F1:10:Line10"
4300 Xopen
4301 let qfbnum = bufnr('')
4302 Xclose
4303 " Even after the quickfix window is closed, the buffer should be loaded
4304 call assert_true(bufloaded(qfbnum))
Bram Moolenaar647e24b2019-03-17 16:39:46 +01004305 call assert_true(qfbnum, g:Xgetlist({'qfbufnr' : 0}).qfbufnr)
Bram Moolenaaree8188f2019-02-05 21:23:04 +01004306 Xopen
4307 " Buffer should be reused when opening the window again
4308 call assert_equal(qfbnum, bufnr(''))
4309 Xclose
4310
4311 if a:cchar == 'l'
4312 %bwipe
4313 " For a location list, when both the file window and the location list
4314 " window for the list are closed, then the buffer should be freed.
4315 new | only
4316 lexpr "F1:10:Line10"
4317 let wid = win_getid()
4318 lopen
4319 let qfbnum = bufnr('')
4320 call assert_match(qfbnum . ' %a- "\[Location List]"', execute('ls'))
4321 close
4322 " When the location list window is closed, the buffer name should not
4323 " change to 'Quickfix List'
Bram Moolenaar647e24b2019-03-17 16:39:46 +01004324 call assert_match(qfbnum . 'u h- "\[Location List]"', execute('ls!'))
Bram Moolenaaree8188f2019-02-05 21:23:04 +01004325 call assert_true(bufloaded(qfbnum))
4326
Bram Moolenaard82a81c2019-03-02 07:57:18 +01004327 " After deleting a location list buffer using ":bdelete", opening the
4328 " location list window should mark the buffer as a location list buffer.
4329 exe "bdelete " . qfbnum
4330 lopen
4331 call assert_equal("quickfix", &buftype)
4332 call assert_equal(1, getwininfo(win_getid(winnr()))[0].loclist)
4333 call assert_equal(wid, getloclist(0, {'filewinid' : 0}).filewinid)
4334 call assert_false(&swapfile)
4335 lclose
4336
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01004337 " When the location list is cleared for the window, the buffer should be
4338 " removed
4339 call setloclist(0, [], 'f')
4340 call assert_false(bufexists(qfbnum))
Bram Moolenaar647e24b2019-03-17 16:39:46 +01004341 call assert_equal(0, getloclist(0, {'qfbufnr' : 0}).qfbufnr)
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01004342
4343 " When the location list is freed with the location list window open, the
4344 " location list buffer should not be lost. It should be reused when the
4345 " location list is again populated.
4346 lexpr "F1:10:Line10"
4347 lopen
4348 let wid = win_getid()
4349 let qfbnum = bufnr('')
4350 wincmd p
4351 call setloclist(0, [], 'f')
4352 lexpr "F1:10:Line10"
4353 lopen
4354 call assert_equal(wid, win_getid())
4355 call assert_equal(qfbnum, bufnr(''))
4356 lclose
4357
4358 " When the window with the location list is closed, the buffer should be
4359 " removed
Bram Moolenaaree8188f2019-02-05 21:23:04 +01004360 new | only
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01004361 call assert_false(bufexists(qfbnum))
Bram Moolenaaree8188f2019-02-05 21:23:04 +01004362 endif
4363endfunc
4364
4365func Test_qfbuf()
4366 call Xqfbuf_test('c')
4367 call Xqfbuf_test('l')
4368endfunc
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01004369
4370" If there is an autocmd to use only one window, then opening the location
4371" list window used to crash Vim.
4372func Test_winonly_autocmd()
4373 call s:create_test_file('Xtest1')
4374 " Autocmd to show only one Vim window at a time
4375 autocmd WinEnter * only
4376 new
4377 " Load the location list
4378 lexpr "Xtest1:5:Line5\nXtest1:10:Line10\nXtest1:15:Line15"
4379 let loclistid = getloclist(0, {'id' : 0}).id
4380 " Open the location list window. Only this window will be shown and the file
4381 " window is closed.
4382 lopen
4383 call assert_equal(loclistid, getloclist(0, {'id' : 0}).id)
4384 " Jump to an entry in the location list and make sure that the cursor is
4385 " positioned correctly.
4386 ll 3
4387 call assert_equal(loclistid, getloclist(0, {'id' : 0}).id)
4388 call assert_equal('Xtest1', bufname(''))
4389 call assert_equal(15, line('.'))
4390 " Cleanup
4391 autocmd! WinEnter
4392 new | only
4393 call delete('Xtest1')
4394endfunc
Bram Moolenaar39803d82019-04-07 12:04:51 +02004395
4396" Test to make sure that an empty quickfix buffer is not reused for loading
4397" a normal buffer.
4398func Test_empty_qfbuf()
4399 enew | only
4400 call writefile(["Test"], 'Xfile1')
4401 call setqflist([], 'f')
4402 copen | only
4403 let qfbuf = bufnr('')
4404 edit Xfile1
4405 call assert_notequal(qfbuf, bufnr(''))
4406 enew
4407 call delete('Xfile1')
4408endfunc
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004409
4410" Test for the :cbelow, :cabove, :lbelow and :labove commands.
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004411" And for the :cafter, :cbefore, :lafter and :lbefore commands.
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004412func Xtest_below(cchar)
4413 call s:setup_commands(a:cchar)
4414
4415 " No quickfix/location list
4416 call assert_fails('Xbelow', 'E42:')
4417 call assert_fails('Xabove', 'E42:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004418 call assert_fails('Xbefore', 'E42:')
4419 call assert_fails('Xafter', 'E42:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004420
4421 " Empty quickfix/location list
4422 call g:Xsetlist([])
4423 call assert_fails('Xbelow', 'E42:')
4424 call assert_fails('Xabove', 'E42:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004425 call assert_fails('Xbefore', 'E42:')
4426 call assert_fails('Xafter', 'E42:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004427
4428 call s:create_test_file('X1')
4429 call s:create_test_file('X2')
4430 call s:create_test_file('X3')
4431 call s:create_test_file('X4')
4432
4433 " Invalid entries
4434 edit X1
4435 call g:Xsetlist(["E1", "E2"])
4436 call assert_fails('Xbelow', 'E42:')
4437 call assert_fails('Xabove', 'E42:')
4438 call assert_fails('3Xbelow', 'E42:')
4439 call assert_fails('4Xabove', 'E42:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004440 call assert_fails('Xbefore', 'E42:')
4441 call assert_fails('Xafter', 'E42:')
4442 call assert_fails('3Xbefore', 'E42:')
4443 call assert_fails('4Xafter', 'E42:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004444
4445 " Test the commands with various arguments
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004446 Xexpr ["X1:5:3:L5", "X2:5:2:L5", "X2:10:3:L10", "X2:15:4:L15", "X3:3:5:L3"]
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004447 edit +7 X2
4448 Xabove
4449 call assert_equal(['X2', 5], [bufname(''), line('.')])
4450 call assert_fails('Xabove', 'E553:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004451 normal 7G
4452 Xbefore
4453 call assert_equal(['X2', 5, 2], [bufname(''), line('.'), col('.')])
4454 call assert_fails('Xbefore', 'E553:')
4455
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004456 normal 2j
4457 Xbelow
4458 call assert_equal(['X2', 10], [bufname(''), line('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004459 normal 7G
4460 Xafter
4461 call assert_equal(['X2', 10, 3], [bufname(''), line('.'), col('.')])
4462
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004463 " Last error in this file
4464 Xbelow 99
4465 call assert_equal(['X2', 15], [bufname(''), line('.')])
4466 call assert_fails('Xbelow', 'E553:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004467 normal gg
4468 Xafter 99
4469 call assert_equal(['X2', 15, 4], [bufname(''), line('.'), col('.')])
4470 call assert_fails('Xafter', 'E553:')
4471
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004472 " First error in this file
4473 Xabove 99
4474 call assert_equal(['X2', 5], [bufname(''), line('.')])
4475 call assert_fails('Xabove', 'E553:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004476 normal G
4477 Xbefore 99
4478 call assert_equal(['X2', 5, 2], [bufname(''), line('.'), col('.')])
4479 call assert_fails('Xbefore', 'E553:')
4480
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004481 normal gg
4482 Xbelow 2
4483 call assert_equal(['X2', 10], [bufname(''), line('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004484 normal gg
4485 Xafter 2
4486 call assert_equal(['X2', 10, 3], [bufname(''), line('.'), col('.')])
4487
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004488 normal G
4489 Xabove 2
4490 call assert_equal(['X2', 10], [bufname(''), line('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004491 normal G
4492 Xbefore 2
4493 call assert_equal(['X2', 10, 3], [bufname(''), line('.'), col('.')])
4494
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004495 edit X4
4496 call assert_fails('Xabove', 'E42:')
4497 call assert_fails('Xbelow', 'E42:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004498 call assert_fails('Xbefore', 'E42:')
4499 call assert_fails('Xafter', 'E42:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004500 if a:cchar == 'l'
4501 " If a buffer has location list entries from some other window but not
4502 " from the current window, then the commands should fail.
4503 edit X1 | split | call setloclist(0, [], 'f')
4504 call assert_fails('Xabove', 'E776:')
4505 call assert_fails('Xbelow', 'E776:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004506 call assert_fails('Xbefore', 'E776:')
4507 call assert_fails('Xafter', 'E776:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004508 close
4509 endif
4510
4511 " Test for lines with multiple quickfix entries
4512 Xexpr ["X1:5:L5", "X2:5:1:L5_1", "X2:5:2:L5_2", "X2:5:3:L5_3",
4513 \ "X2:10:1:L10_1", "X2:10:2:L10_2", "X2:10:3:L10_3",
4514 \ "X2:15:1:L15_1", "X2:15:2:L15_2", "X2:15:3:L15_3", "X3:3:L3"]
4515 edit +1 X2
4516 Xbelow 2
4517 call assert_equal(['X2', 10, 1], [bufname(''), line('.'), col('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004518 normal 1G
4519 Xafter 2
4520 call assert_equal(['X2', 5, 2], [bufname(''), line('.'), col('.')])
4521
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004522 normal gg
4523 Xbelow 99
4524 call assert_equal(['X2', 15, 1], [bufname(''), line('.'), col('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004525 normal gg
4526 Xafter 99
4527 call assert_equal(['X2', 15, 3], [bufname(''), line('.'), col('.')])
4528
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004529 normal G
4530 Xabove 2
4531 call assert_equal(['X2', 10, 1], [bufname(''), line('.'), col('.')])
4532 normal G
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004533 Xbefore 2
4534 call assert_equal(['X2', 15, 2], [bufname(''), line('.'), col('.')])
4535
4536 normal G
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004537 Xabove 99
4538 call assert_equal(['X2', 5, 1], [bufname(''), line('.'), col('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004539 normal G
4540 Xbefore 99
4541 call assert_equal(['X2', 5, 1], [bufname(''), line('.'), col('.')])
4542
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004543 normal 10G
4544 Xabove
4545 call assert_equal(['X2', 5, 1], [bufname(''), line('.'), col('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004546 normal 10G$
4547 2Xbefore
4548 call assert_equal(['X2', 10, 2], [bufname(''), line('.'), col('.')])
4549
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004550 normal 10G
4551 Xbelow
4552 call assert_equal(['X2', 15, 1], [bufname(''), line('.'), col('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004553 normal 9G
4554 5Xafter
4555 call assert_equal(['X2', 15, 2], [bufname(''), line('.'), col('.')])
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004556
4557 " Invalid range
4558 if a:cchar == 'c'
Bram Moolenaar25190db2019-05-04 15:05:28 +02004559 call assert_fails('-2cbelow', 'E16:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004560 call assert_fails('-2cafter', 'E16:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004561 else
Bram Moolenaar25190db2019-05-04 15:05:28 +02004562 call assert_fails('-2lbelow', 'E16:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004563 call assert_fails('-2lafter', 'E16:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004564 endif
4565
4566 call delete('X1')
4567 call delete('X2')
4568 call delete('X3')
4569 call delete('X4')
4570endfunc
4571
4572func Test_cbelow()
4573 call Xtest_below('c')
4574 call Xtest_below('l')
4575endfunc
Bram Moolenaar25190db2019-05-04 15:05:28 +02004576
4577func Test_quickfix_count()
4578 let commands = [
4579 \ 'cNext',
4580 \ 'cNfile',
4581 \ 'cabove',
4582 \ 'cbelow',
4583 \ 'cfirst',
4584 \ 'clast',
4585 \ 'cnewer',
4586 \ 'cnext',
4587 \ 'cnfile',
4588 \ 'colder',
4589 \ 'cprevious',
4590 \ 'crewind',
4591 \
4592 \ 'lNext',
4593 \ 'lNfile',
4594 \ 'labove',
4595 \ 'lbelow',
4596 \ 'lfirst',
4597 \ 'llast',
4598 \ 'lnewer',
4599 \ 'lnext',
4600 \ 'lnfile',
4601 \ 'lolder',
4602 \ 'lprevious',
4603 \ 'lrewind',
4604 \ ]
4605 for cmd in commands
4606 call assert_fails('-1' .. cmd, 'E16:')
4607 call assert_fails('.' .. cmd, 'E16:')
4608 call assert_fails('%' .. cmd, 'E16:')
4609 call assert_fails('$' .. cmd, 'E16:')
4610 endfor
4611endfunc
Bram Moolenaar6a0cc912019-10-26 16:48:44 +02004612
4613" Test for aborting quickfix commands using QuickFixCmdPre
4614func Xtest_qfcmd_abort(cchar)
4615 call s:setup_commands(a:cchar)
4616
4617 call g:Xsetlist([], 'f')
4618
4619 " cexpr/lexpr
4620 let e = ''
4621 try
4622 Xexpr ["F1:10:Line10", "F2:20:Line20"]
4623 catch /.*/
4624 let e = v:exception
4625 endtry
4626 call assert_equal('AbortCmd', e)
4627 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
4628
4629 " cfile/lfile
4630 call writefile(["F1:10:Line10", "F2:20:Line20"], 'Xfile1')
4631 let e = ''
4632 try
4633 Xfile Xfile1
4634 catch /.*/
4635 let e = v:exception
4636 endtry
4637 call assert_equal('AbortCmd', e)
4638 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
4639 call delete('Xfile1')
4640
4641 " cgetbuffer/lgetbuffer
4642 enew!
4643 call append(0, ["F1:10:Line10", "F2:20:Line20"])
4644 let e = ''
4645 try
4646 Xgetbuffer
4647 catch /.*/
4648 let e = v:exception
4649 endtry
4650 call assert_equal('AbortCmd', e)
4651 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
4652 enew!
4653
4654 " vimgrep/lvimgrep
4655 let e = ''
4656 try
4657 Xvimgrep /func/ test_quickfix.vim
4658 catch /.*/
4659 let e = v:exception
4660 endtry
4661 call assert_equal('AbortCmd', e)
4662 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
4663
4664 " helpgrep/lhelpgrep
4665 let e = ''
4666 try
4667 Xhelpgrep quickfix
4668 catch /.*/
4669 let e = v:exception
4670 endtry
4671 call assert_equal('AbortCmd', e)
4672 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
4673
4674 " grep/lgrep
4675 if has('unix')
4676 let e = ''
4677 try
4678 silent Xgrep func test_quickfix.vim
4679 catch /.*/
4680 let e = v:exception
4681 endtry
4682 call assert_equal('AbortCmd', e)
4683 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
4684 endif
4685endfunc
4686
4687func Test_qfcmd_abort()
4688 augroup QF_Test
4689 au!
4690 autocmd QuickFixCmdPre * throw "AbortCmd"
4691 augroup END
4692
4693 call Xtest_qfcmd_abort('c')
4694 call Xtest_qfcmd_abort('l')
4695
4696 augroup QF_Test
4697 au!
4698 augroup END
4699endfunc
4700
Bram Moolenaard8a8c4c2019-11-16 21:04:57 +01004701" Test for using a file in one of the parent directories.
4702func Test_search_in_dirstack()
4703 call mkdir('Xtestdir/a/b/c', 'p')
4704 let save_cwd = getcwd()
4705 call writefile(["X1_L1", "X1_L2"], 'Xtestdir/Xfile1')
4706 call writefile(["X2_L1", "X2_L2"], 'Xtestdir/a/Xfile2')
4707 call writefile(["X3_L1", "X3_L2"], 'Xtestdir/a/b/Xfile3')
4708 call writefile(["X4_L1", "X4_L2"], 'Xtestdir/a/b/c/Xfile4')
4709
4710 let lines = "Entering dir Xtestdir\n" .
4711 \ "Entering dir a\n" .
4712 \ "Entering dir b\n" .
4713 \ "Xfile2:2:X2_L2\n" .
4714 \ "Leaving dir a\n" .
4715 \ "Xfile1:2:X1_L2\n" .
4716 \ "Xfile3:1:X3_L1\n" .
4717 \ "Entering dir c\n" .
4718 \ "Xfile4:2:X4_L2\n" .
Bram Moolenaar88a3e2b2019-12-06 21:11:39 +01004719 \ "Leaving dir c\n"
Bram Moolenaard8a8c4c2019-11-16 21:04:57 +01004720 set efm=%DEntering\ dir\ %f,%XLeaving\ dir\ %f,%f:%l:%m
Bram Moolenaar88a3e2b2019-12-06 21:11:39 +01004721 cexpr lines .. "Leaving dir Xtestdir|\n" | let next = 1
Bram Moolenaard8a8c4c2019-11-16 21:04:57 +01004722 call assert_equal(11, getqflist({'size' : 0}).size)
4723 call assert_equal(4, getqflist({'idx' : 0}).idx)
4724 call assert_equal('X2_L2', getline('.'))
Bram Moolenaar88a3e2b2019-12-06 21:11:39 +01004725 call assert_equal(1, next)
Bram Moolenaard8a8c4c2019-11-16 21:04:57 +01004726 cnext
4727 call assert_equal(6, getqflist({'idx' : 0}).idx)
4728 call assert_equal('X1_L2', getline('.'))
4729 cnext
4730 call assert_equal(7, getqflist({'idx' : 0}).idx)
4731 call assert_equal(1, line('$'))
4732 call assert_equal('', getline(1))
4733 cnext
4734 call assert_equal(9, getqflist({'idx' : 0}).idx)
4735 call assert_equal(1, line('$'))
4736 call assert_equal('', getline(1))
4737
4738 set efm&
4739 exe 'cd ' . save_cwd
4740 call delete('Xtestdir', 'rf')
4741endfunc
4742
Bram Moolenaar1860bde2020-01-06 21:47:21 +01004743" Test for :cquit
4744func Test_cquit()
4745 " Exit Vim with a non-zero value
4746 if RunVim([], ["cquit 7"], '')
4747 call assert_equal(7, v:shell_error)
4748 endif
4749
4750 if RunVim([], ["50cquit"], '')
4751 call assert_equal(50, v:shell_error)
4752 endif
4753
4754 " Exit Vim with default value
4755 if RunVim([], ["cquit"], '')
4756 call assert_equal(1, v:shell_error)
4757 endif
4758
4759 " Exit Vim with zero value
4760 if RunVim([], ["cquit 0"], '')
4761 call assert_equal(0, v:shell_error)
4762 endif
4763
4764 " Exit Vim with negative value
4765 call assert_fails('-3cquit', 'E16:')
4766endfunc
4767
Bram Moolenaar6a0cc912019-10-26 16:48:44 +02004768" vim: shiftwidth=2 sts=2 expandtab