blob: 3f4574a1290a93880e498dc9d5bbfa10ce85e7b6 [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
487 call assert_fails('Xprev', 'E553')
488 call assert_fails('Xpfile', 'E553')
489 Xnfile
490 call assert_equal('Xqftestfile2', bufname('%'))
491 call assert_equal(10, line('.'))
492 Xpfile
493 call assert_equal('Xqftestfile1', bufname('%'))
494 call assert_equal(6, line('.'))
Bram Moolenaar74240d32017-12-10 15:26:15 +0100495 5Xcc
496 call assert_equal(5, g:Xgetlist({'idx':0}).idx)
497 2Xcc
498 call assert_equal(2, g:Xgetlist({'idx':0}).idx)
Bram Moolenaarf9ae1542019-11-18 22:02:16 +0100499 if a:cchar == 'c'
500 cc
501 else
502 ll
503 endif
504 call assert_equal(2, g:Xgetlist({'idx':0}).idx)
Bram Moolenaar74240d32017-12-10 15:26:15 +0100505 10Xcc
506 call assert_equal(6, g:Xgetlist({'idx':0}).idx)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200507 Xlast
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200508 Xprev
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200509 call assert_equal('Xqftestfile2', bufname('%'))
510 call assert_equal(11, line('.'))
511 call assert_fails('Xnext', 'E553')
512 call assert_fails('Xnfile', 'E553')
Bram Moolenaarf9ae1542019-11-18 22:02:16 +0100513 " To process the range using quickfix list entries, directly use the
514 " quickfix commands (don't use the user defined commands)
515 if a:cchar == 'c'
516 $cc
517 else
518 $ll
519 endif
520 call assert_equal(6, g:Xgetlist({'idx':0}).idx)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200521 Xrewind
522 call assert_equal('Xqftestfile1', bufname('%'))
523 call assert_equal(5, line('.'))
524
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200525 10Xnext
526 call assert_equal('Xqftestfile2', bufname('%'))
527 call assert_equal(11, line('.'))
528 10Xprev
529 call assert_equal('Xqftestfile1', bufname('%'))
530 call assert_equal(5, line('.'))
531
Bram Moolenaar74240d32017-12-10 15:26:15 +0100532 " Jumping to an error from the error window using cc command
533 Xgetexpr ['Xqftestfile1:5:Line5',
534 \ 'Xqftestfile1:6:Line6',
535 \ 'Xqftestfile2:10:Line10',
536 \ 'Xqftestfile2:11:Line11']
537 Xopen
538 10Xcc
539 call assert_equal(11, line('.'))
540 call assert_equal('Xqftestfile2', bufname('%'))
541
542 " Jumping to an error from the error window (when only the error window is
543 " present)
544 Xopen | only
545 Xlast 1
546 call assert_equal(5, line('.'))
547 call assert_equal('Xqftestfile1', bufname('%'))
548
Bram Moolenaaree85df32017-03-19 14:19:50 +0100549 Xexpr ""
550 call assert_fails('Xnext', 'E42:')
551
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200552 call delete('Xqftestfile1')
553 call delete('Xqftestfile2')
Bram Moolenaarfc2b2702017-09-15 22:43:07 +0200554
555 " Should be able to use next/prev with invalid entries
556 Xexpr ""
557 call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
558 call assert_equal(0, g:Xgetlist({'size' : 0}).size)
Bram Moolenaar88a3e2b2019-12-06 21:11:39 +0100559 Xaddexpr ['foo', 'bar', 'baz', 'quux', 'sh|moo']
Bram Moolenaarfc2b2702017-09-15 22:43:07 +0200560 call assert_equal(5, g:Xgetlist({'size' : 0}).size)
561 Xlast
562 call assert_equal(5, g:Xgetlist({'idx' : 0}).idx)
563 Xfirst
564 call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
565 2Xnext
566 call assert_equal(3, g:Xgetlist({'idx' : 0}).idx)
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100567endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200568
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100569func Test_browse()
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200570 call Xtest_browse('c')
571 call Xtest_browse('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100572endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +0200573
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100574func Test_nomem()
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200575 call test_alloc_fail(GetAllocId('qf_dirname_start'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100576 call assert_fails('vimgrep vim runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100577
Bram Moolenaarce90e362019-09-08 18:58:44 +0200578 call GetAllocId('qf_dirname_now')->test_alloc_fail(0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100579 call assert_fails('vimgrep vim runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100580
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200581 call test_alloc_fail(GetAllocId('qf_namebuf'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100582 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100583
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200584 call test_alloc_fail(GetAllocId('qf_errmsg'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100585 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100586
Bram Moolenaar8e8df252016-05-25 21:23:21 +0200587 call test_alloc_fail(GetAllocId('qf_pattern'), 0, 0)
Bram Moolenaara260b872016-01-15 20:48:22 +0100588 call assert_fails('cfile runtest.vim', 'E342:')
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100589
590endfunc
591
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100592func s:test_xhelpgrep(cchar)
Bram Moolenaar049cba92016-06-26 14:38:04 +0200593 call s:setup_commands(a:cchar)
594 Xhelpgrep quickfix
595 Xopen
596 if a:cchar == 'c'
597 let title_text = ':helpgrep quickfix'
598 else
599 let title_text = ':lhelpgrep quickfix'
600 endif
601 call assert_true(w:quickfix_title =~ title_text, w:quickfix_title)
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200602
603 " Jumping to a help topic should open the help window
604 only
605 Xnext
606 call assert_true(&buftype == 'help')
607 call assert_true(winnr('$') == 2)
608 " Jumping to the next match should reuse the help window
609 Xnext
610 call assert_true(&buftype == 'help')
611 call assert_true(winnr() == 1)
612 call assert_true(winnr('$') == 2)
613 " Jumping to the next match from the quickfix window should reuse the help
614 " window
615 Xopen
616 Xnext
617 call assert_true(&buftype == 'help')
618 call assert_true(winnr() == 1)
619 call assert_true(winnr('$') == 2)
620
Bram Moolenaar62ef7972016-01-19 14:51:54 +0100621 " This wipes out the buffer, make sure that doesn't cause trouble.
Bram Moolenaar049cba92016-06-26 14:38:04 +0200622 Xclose
Bram Moolenaaree85df32017-03-19 14:19:50 +0100623
Bram Moolenaarf9ae1542019-11-18 22:02:16 +0100624 " When the current window is vertically split, jumping to a help match
625 " should open the help window at the top.
626 only | enew
627 let w1 = win_getid()
628 vert new
629 let w2 = win_getid()
630 Xnext
631 let w3 = win_getid()
632 call assert_true(&buftype == 'help')
633 call assert_true(winnr() == 1)
Bram Moolenaara106e6c2019-11-24 22:13:58 +0100634 " See jump_to_help_window() for details
635 let w2_width = winwidth(w2)
636 if w2_width != &columns && w2_width < 80
637 call assert_equal(['col', [['leaf', w3],
638 \ ['row', [['leaf', w2], ['leaf', w1]]]]], winlayout())
639 else
640 call assert_equal(['row', [['col', [['leaf', w3], ['leaf', w2]]],
641 \ ['leaf', w1]]] , winlayout())
642 endif
Bram Moolenaarf9ae1542019-11-18 22:02:16 +0100643
644 new | only
645 set buftype=help
646 set modified
647 call assert_fails('Xnext', 'E37:')
648 set nomodified
649 new | only
650
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +0200651 if a:cchar == 'l'
652 " When a help window is present, running :lhelpgrep should reuse the
653 " help window and not the current window
654 new | only
655 call g:Xsetlist([], 'f')
656 help index.txt
657 wincmd w
658 lhelpgrep quickfix
659 call assert_equal(1, winnr())
660 call assert_notequal([], getloclist(1))
661 call assert_equal([], getloclist(2))
662 endif
663
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200664 new | only
665
Bram Moolenaaree85df32017-03-19 14:19:50 +0100666 " Search for non existing help string
667 call assert_fails('Xhelpgrep a1b2c3', 'E480:')
Bram Moolenaar108e7b42018-10-11 17:39:12 +0200668 " Invalid regular expression
669 call assert_fails('Xhelpgrep \@<!', 'E480:')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100670endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +0200671
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100672func Test_helpgrep()
Bram Moolenaar049cba92016-06-26 14:38:04 +0200673 call s:test_xhelpgrep('c')
Bram Moolenaarcf25fdb2016-08-03 21:04:53 +0200674 helpclose
Bram Moolenaar049cba92016-06-26 14:38:04 +0200675 call s:test_xhelpgrep('l')
Bram Moolenaar62ef7972016-01-19 14:51:54 +0100676endfunc
Bram Moolenaar75bdf6a2016-01-07 21:25:08 +0100677
Bram Moolenaar6920c722016-01-22 22:44:10 +0100678func Test_errortitle()
679 augroup QfBufWinEnter
680 au!
681 au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
682 augroup END
683 copen
684 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'')'}]
685 call setqflist(a)
686 call assert_equal(':setqflist()', g:a)
687 augroup QfBufWinEnter
688 au!
689 augroup END
690 augroup! QfBufWinEnter
691endfunc
Bram Moolenaare27dba42016-03-15 14:11:10 +0100692
Bram Moolenaar5584df62016-03-18 21:00:51 +0100693func Test_vimgreptitle()
694 augroup QfBufWinEnter
695 au!
696 au BufWinEnter * :let g:a=get(w:, 'quickfix_title', 'NONE')
697 augroup END
698 try
699 vimgrep /pattern/j file
700 catch /E480/
701 endtry
702 copen
703 call assert_equal(': vimgrep /pattern/j file', g:a)
704 augroup QfBufWinEnter
705 au!
706 augroup END
707 augroup! QfBufWinEnter
708endfunc
709
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100710func XqfTitleTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200711 call s:setup_commands(a:cchar)
Bram Moolenaare27dba42016-03-15 14:11:10 +0100712
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200713 Xgetexpr ['file:1:1:message']
714 let l = g:Xgetlist()
Bram Moolenaare27dba42016-03-15 14:11:10 +0100715 if a:cchar == 'c'
716 call setqflist(l, 'r')
717 else
718 call setloclist(0, l, 'r')
719 endif
720
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200721 Xopen
Bram Moolenaare27dba42016-03-15 14:11:10 +0100722 if a:cchar == 'c'
723 let title = ':setqflist()'
724 else
725 let title = ':setloclist()'
726 endif
727 call assert_equal(title, w:quickfix_title)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200728 Xclose
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100729endfunc
Bram Moolenaare27dba42016-03-15 14:11:10 +0100730
731" Tests for quickfix window's title
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100732func Test_qf_title()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +0200733 call XqfTitleTests('c')
734 call XqfTitleTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100735endfunc
Bram Moolenaare27dba42016-03-15 14:11:10 +0100736
737" Tests for 'errorformat'
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100738func Test_efm()
Bram Moolenaare27dba42016-03-15 14:11:10 +0100739 let save_efm = &efm
740 set efm=%EEEE%m,%WWWW%m,%+CCCC%.%#,%-GGGG%.%#
741 cgetexpr ['WWWW', 'EEEE', 'CCCC']
742 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
743 call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
744 cgetexpr ['WWWW', 'GGGG', 'EEEE', 'CCCC']
745 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
746 call assert_equal("[['W', 1], ['E^@CCCC', 1]]", l)
747 cgetexpr ['WWWW', 'GGGG', 'ZZZZ', 'EEEE', 'CCCC', 'YYYY']
748 let l = strtrans(string(map(getqflist(), '[v:val.text, v:val.valid]')))
749 call assert_equal("[['W', 1], ['ZZZZ', 0], ['E^@CCCC', 1], ['YYYY', 0]]", l)
750 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100751endfunc
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100752
753" This will test for problems in quickfix:
754" A. incorrectly copying location lists which caused the location list to show
755" a different name than the file that was actually being displayed.
756" B. not reusing the window for which the location list window is opened but
757" instead creating new windows.
758" C. make sure that the location list window is not reused instead of the
759" window it belongs to.
760"
761" Set up the test environment:
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100762func ReadTestProtocol(name)
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100763 let base = substitute(a:name, '\v^test://(.*)%(\.[^.]+)?', '\1', '')
764 let word = substitute(base, '\v(.*)\..*', '\1', '')
765
766 setl modifiable
767 setl noreadonly
768 setl noswapfile
769 setl bufhidden=delete
770 %del _
771 " For problem 2:
772 " 'buftype' has to be set to reproduce the constant opening of new windows
773 setl buftype=nofile
774
775 call setline(1, word)
776
777 setl nomodified
778 setl nomodifiable
779 setl readonly
780 exe 'doautocmd BufRead ' . substitute(a:name, '\v^test://(.*)', '\1', '')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100781endfunc
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100782
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100783func Test_locationlist()
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100784 enew
785
786 augroup testgroup
787 au!
788 autocmd BufReadCmd test://* call ReadTestProtocol(expand("<amatch>"))
789 augroup END
790
791 let words = [ "foo", "bar", "baz", "quux", "shmoo", "spam", "eggs" ]
792
793 let qflist = []
794 for word in words
795 call add(qflist, {'filename': 'test://' . word . '.txt', 'text': 'file ' . word . '.txt', })
796 " NOTE: problem 1:
797 " intentionally not setting 'lnum' so that the quickfix entries are not
798 " valid
Bram Moolenaaraad222c2019-09-06 22:46:09 +0200799 eval qflist->setloclist(0, ' ')
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100800 endfor
801
802 " Test A
803 lrewind
804 enew
805 lopen
Bram Moolenaar99895ea2017-04-20 22:44:47 +0200806 4lnext
Bram Moolenaar1ff2b642016-03-17 22:07:02 +0100807 vert split
808 wincmd L
809 lopen
810 wincmd p
811 lnext
812 let fileName = expand("%")
813 wincmd p
814 let locationListFileName = substitute(getline(line('.')), '\([^|]*\)|.*', '\1', '')
815 let fileName = substitute(fileName, '\\', '/', 'g')
816 let locationListFileName = substitute(locationListFileName, '\\', '/', 'g')
817 call assert_equal("test://bar.txt", fileName)
818 call assert_equal("test://bar.txt", locationListFileName)
819
820 wincmd n | only
821
822 " Test B:
823 lrewind
824 lopen
825 2
826 exe "normal \<CR>"
827 wincmd p
828 3
829 exe "normal \<CR>"
830 wincmd p
831 4
832 exe "normal \<CR>"
833 call assert_equal(2, winnr('$'))
834 wincmd n | only
835
836 " Test C:
837 lrewind
838 lopen
839 " Let's move the location list window to the top to check whether it (the
840 " first window found) will be reused when we try to open new windows:
841 wincmd K
842 2
843 exe "normal \<CR>"
844 wincmd p
845 3
846 exe "normal \<CR>"
847 wincmd p
848 4
849 exe "normal \<CR>"
850 1wincmd w
851 call assert_equal('quickfix', &buftype)
852 2wincmd w
853 let bufferName = expand("%")
854 let bufferName = substitute(bufferName, '\\', '/', 'g')
855 call assert_equal('test://quux.txt', bufferName)
856
857 wincmd n | only
858
859 augroup! testgroup
Bram Moolenaaree85df32017-03-19 14:19:50 +0100860endfunc
Bram Moolenaar0899d692016-03-19 13:35:03 +0100861
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100862func Test_locationlist_curwin_was_closed()
Bram Moolenaar0899d692016-03-19 13:35:03 +0100863 augroup testgroup
864 au!
Bram Moolenaard106e5b2016-04-21 19:38:07 +0200865 autocmd BufReadCmd test_curwin.txt call R(expand("<amatch>"))
Bram Moolenaar0899d692016-03-19 13:35:03 +0100866 augroup END
867
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100868 func! R(n)
Bram Moolenaar0899d692016-03-19 13:35:03 +0100869 quit
870 endfunc
871
872 new
873 let q = []
Bram Moolenaard106e5b2016-04-21 19:38:07 +0200874 call add(q, {'filename': 'test_curwin.txt' })
Bram Moolenaar0899d692016-03-19 13:35:03 +0100875 call setloclist(0, q)
876 call assert_fails('lrewind', 'E924:')
877
878 augroup! testgroup
Bram Moolenaaree85df32017-03-19 14:19:50 +0100879endfunc
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100880
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100881func Test_locationlist_cross_tab_jump()
Bram Moolenaar0a9046f2016-10-15 19:28:13 +0200882 call writefile(['loclistfoo'], 'loclistfoo')
883 call writefile(['loclistbar'], 'loclistbar')
884 set switchbuf=usetab
885
886 edit loclistfoo
887 tabedit loclistbar
888 silent lgrep loclistfoo loclist*
889 call assert_equal(1, tabpagenr())
890
891 enew | only | tabonly
892 set switchbuf&vim
893 call delete('loclistfoo')
894 call delete('loclistbar')
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100895endfunc
Bram Moolenaar0a9046f2016-10-15 19:28:13 +0200896
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100897" More tests for 'errorformat'
Bram Moolenaar2b946c92016-11-12 18:14:44 +0100898func Test_efm1()
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100899 if !has('unix')
900 " The 'errorformat' setting is different on non-Unix systems.
901 " This test works only on Unix-like systems.
902 return
903 endif
904
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200905 let l =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200906 "Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set.
907 "Xtestfile", line 6 col 19; this is an error
908 gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include version.c
909 Xtestfile:9: parse error before `asd'
910 make: *** [vim] Error 1
911 in file "Xtestfile" linenr 10: there is an error
912
913 2 returned
914 "Xtestfile", line 11 col 1; this is an error
915 "Xtestfile", line 12 col 2; this is another error
916 "Xtestfile", line 14:10; this is an error in column 10
917 =Xtestfile=, line 15:10; this is another error, but in vcol 10 this time
918 "Xtestfile", linenr 16: yet another problem
919 Error in "Xtestfile" at line 17:
920 x should be a dot
921 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17
922 ^
923 Error in "Xtestfile" at line 18:
924 x should be a dot
925 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18
926 .............^
927 Error in "Xtestfile" at line 19:
928 x should be a dot
929 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19
930 --------------^
931 Error in "Xtestfile" at line 20:
932 x should be a dot
933 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20
934 ^
935
936 Does anyone know what is the problem and how to correction it?
937 "Xtestfile", line 21 col 9: What is the title of the quickfix window?
938 "Xtestfile", line 22 col 9: What is the title of the quickfix window?
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200939 [DATA]
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100940
941 call writefile(l, 'Xerrorfile1')
942 call writefile(l[:-2], 'Xerrorfile2')
943
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200944 let m =<< [DATA]
945 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 2
946 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 3
947 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 4
948 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 5
949 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 6
950 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 7
951 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 8
952 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 9
953 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 10
954 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 11
955 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 12
956 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 13
957 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 14
958 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 15
959 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 16
960 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17
961 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18
962 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19
963 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20
964 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 21
965 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 22
966[DATA]
Bram Moolenaar7eba3d22016-03-19 22:54:09 +0100967 call writefile(m, 'Xtestfile')
968
969 let save_efm = &efm
970 set efm+==%f=\\,\ line\ %l%*\\D%v%*[^\ ]\ %m
971 set efm^=%AError\ in\ \"%f\"\ at\ line\ %l:,%Z%p^,%C%m
972
973 exe 'cf Xerrorfile2'
974 clast
975 copen
976 call assert_equal(':cf Xerrorfile2', w:quickfix_title)
977 wincmd p
978
979 exe 'cf Xerrorfile1'
980 call assert_equal([4, 12], [line('.'), col('.')])
981 cn
982 call assert_equal([6, 19], [line('.'), col('.')])
983 cn
984 call assert_equal([9, 2], [line('.'), col('.')])
985 cn
986 call assert_equal([10, 2], [line('.'), col('.')])
987 cn
988 call assert_equal([11, 1], [line('.'), col('.')])
989 cn
990 call assert_equal([12, 2], [line('.'), col('.')])
991 cn
992 call assert_equal([14, 10], [line('.'), col('.')])
993 cn
994 call assert_equal([15, 3, 10], [line('.'), col('.'), virtcol('.')])
995 cn
996 call assert_equal([16, 2], [line('.'), col('.')])
997 cn
998 call assert_equal([17, 6], [line('.'), col('.')])
999 cn
1000 call assert_equal([18, 7], [line('.'), col('.')])
1001 cn
1002 call assert_equal([19, 8], [line('.'), col('.')])
1003 cn
1004 call assert_equal([20, 9], [line('.'), col('.')])
1005 clast
1006 cprev
1007 cprev
1008 wincmd w
1009 call assert_equal(':cf Xerrorfile1', w:quickfix_title)
1010 wincmd p
1011
1012 let &efm = save_efm
1013 call delete('Xerrorfile1')
1014 call delete('Xerrorfile2')
1015 call delete('Xtestfile')
Bram Moolenaaree85df32017-03-19 14:19:50 +01001016endfunc
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001017
Bram Moolenaarab47c612016-06-14 22:02:26 +02001018" Test for quickfix directory stack support
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001019func s:dir_stack_tests(cchar)
Bram Moolenaar38df43b2016-06-20 21:41:12 +02001020 call s:setup_commands(a:cchar)
1021
Bram Moolenaarab47c612016-06-14 22:02:26 +02001022 let save_efm=&efm
1023 set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
1024
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001025 let lines = ["Entering dir 'dir1/a'",
1026 \ 'habits2.txt:1:Nine Healthy Habits',
1027 \ "Entering dir 'b'",
1028 \ 'habits3.txt:2:0 Hours of television',
1029 \ 'habits2.txt:7:5 Small meals',
1030 \ "Entering dir 'dir1/c'",
1031 \ 'habits4.txt:3:1 Hour of exercise',
1032 \ "Leaving dir 'dir1/c'",
1033 \ "Leaving dir 'dir1/a'",
1034 \ 'habits1.txt:4:2 Liters of water',
1035 \ "Entering dir 'dir2'",
1036 \ 'habits5.txt:5:3 Cups of hot green tea',
1037 \ "Leaving dir 'dir2'"
1038 \]
Bram Moolenaarab47c612016-06-14 22:02:26 +02001039
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001040 Xexpr ""
1041 for l in lines
1042 Xaddexpr l
1043 endfor
Bram Moolenaarab47c612016-06-14 22:02:26 +02001044
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001045 let qf = g:Xgetlist()
Bram Moolenaarab47c612016-06-14 22:02:26 +02001046
1047 call assert_equal('dir1/a/habits2.txt', bufname(qf[1].bufnr))
1048 call assert_equal(1, qf[1].lnum)
1049 call assert_equal('dir1/a/b/habits3.txt', bufname(qf[3].bufnr))
1050 call assert_equal(2, qf[3].lnum)
1051 call assert_equal('dir1/a/habits2.txt', bufname(qf[4].bufnr))
1052 call assert_equal(7, qf[4].lnum)
1053 call assert_equal('dir1/c/habits4.txt', bufname(qf[6].bufnr))
1054 call assert_equal(3, qf[6].lnum)
1055 call assert_equal('habits1.txt', bufname(qf[9].bufnr))
1056 call assert_equal(4, qf[9].lnum)
1057 call assert_equal('dir2/habits5.txt', bufname(qf[11].bufnr))
1058 call assert_equal(5, qf[11].lnum)
1059
1060 let &efm=save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001061endfunc
Bram Moolenaarab47c612016-06-14 22:02:26 +02001062
1063" Tests for %D and %X errorformat options
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001064func Test_efm_dirstack()
Bram Moolenaarab47c612016-06-14 22:02:26 +02001065 " Create the directory stack and files
1066 call mkdir('dir1')
1067 call mkdir('dir1/a')
1068 call mkdir('dir1/a/b')
1069 call mkdir('dir1/c')
1070 call mkdir('dir2')
1071
1072 let lines = ["Nine Healthy Habits",
1073 \ "0 Hours of television",
1074 \ "1 Hour of exercise",
1075 \ "2 Liters of water",
1076 \ "3 Cups of hot green tea",
1077 \ "4 Short mental breaks",
1078 \ "5 Small meals",
1079 \ "6 AM wake up time",
1080 \ "7 Minutes of laughter",
1081 \ "8 Hours of sleep (at least)",
1082 \ "9 PM end of the day and off to bed"
1083 \ ]
1084 call writefile(lines, 'habits1.txt')
1085 call writefile(lines, 'dir1/a/habits2.txt')
1086 call writefile(lines, 'dir1/a/b/habits3.txt')
1087 call writefile(lines, 'dir1/c/habits4.txt')
1088 call writefile(lines, 'dir2/habits5.txt')
1089
1090 call s:dir_stack_tests('c')
1091 call s:dir_stack_tests('l')
1092
1093 call delete('dir1', 'rf')
1094 call delete('dir2', 'rf')
1095 call delete('habits1.txt')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001096endfunc
Bram Moolenaarab47c612016-06-14 22:02:26 +02001097
Bram Moolenaar9b457942016-10-09 16:10:05 +02001098" Test for resync after continuing an ignored message
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001099func Xefm_ignore_continuations(cchar)
Bram Moolenaar9b457942016-10-09 16:10:05 +02001100 call s:setup_commands(a:cchar)
1101
1102 let save_efm = &efm
1103
1104 let &efm =
1105 \ '%Eerror %m %l,' .
1106 \ '%-Wignored %m %l,' .
1107 \ '%+Cmore ignored %m %l,' .
1108 \ '%Zignored end'
1109 Xgetexpr ['ignored warning 1', 'more ignored continuation 2', 'ignored end', 'error resync 4']
1110 let l = map(g:Xgetlist(), '[v:val.text, v:val.valid, v:val.lnum, v:val.type]')
1111 call assert_equal([['resync', 1, 4, 'E']], l)
1112
1113 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001114endfunc
Bram Moolenaar9b457942016-10-09 16:10:05 +02001115
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001116func Test_efm_ignore_continuations()
Bram Moolenaar9b457942016-10-09 16:10:05 +02001117 call Xefm_ignore_continuations('c')
1118 call Xefm_ignore_continuations('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001119endfunc
Bram Moolenaar9b457942016-10-09 16:10:05 +02001120
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001121" Tests for invalid error format specifies
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001122func Xinvalid_efm_Tests(cchar)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001123 call s:setup_commands(a:cchar)
1124
Bram Moolenaar049cba92016-06-26 14:38:04 +02001125 let save_efm = &efm
1126
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001127 set efm=%f:%l:%m,%f:%f:%l:%m
1128 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E372:')
1129
1130 set efm=%f:%l:%m,%f:%l:%r:%m
1131 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
1132
1133 set efm=%f:%l:%m,%O:%f:%l:%m
1134 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E373:')
1135
1136 set efm=%f:%l:%m,%f:%l:%*[^a-z
1137 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E374:')
1138
1139 set efm=%f:%l:%m,%f:%l:%*c
1140 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E375:')
1141
1142 set efm=%f:%l:%m,%L%M%N
1143 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E376:')
1144
1145 set efm=%f:%l:%m,%f:%l:%m:%R
1146 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E377:')
1147
Bram Moolenaar70077dd2019-11-24 12:12:42 +01001148 " Invalid regular expression
1149 set efm=%\\%%k
1150 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E867:')
1151
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001152 set efm=
1153 call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E378:')
1154
1155 set efm=%DEntering\ dir\ abc,%f:%l:%m
1156 call assert_fails('Xexpr ["Entering dir abc", "abc.txt:1:Hello world"]', 'E379:')
1157
1158 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001159endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001160
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001161func Test_invalid_efm()
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001162 call Xinvalid_efm_Tests('c')
1163 call Xinvalid_efm_Tests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001164endfunc
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001165
1166" TODO:
1167" Add tests for the following formats in 'errorformat'
1168" %r %O
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001169func Test_efm2()
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001170 let save_efm = &efm
Bram Moolenaar049cba92016-06-26 14:38:04 +02001171
1172 " Test for %s format in efm
1173 set efm=%f:%s
1174 cexpr 'Xtestfile:Line search text'
Bram Moolenaar049cba92016-06-26 14:38:04 +02001175 let l = getqflist()
Bram Moolenaar70077dd2019-11-24 12:12:42 +01001176 call assert_equal('^\VLine search text\$', l[0].pattern)
1177 call assert_equal(0, l[0].lnum)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001178
Bram Moolenaaree85df32017-03-19 14:19:50 +01001179 let l = split(execute('clist', ''), "\n")
1180 call assert_equal([' 1 Xtestfile:^\VLine search text\$: '], l)
1181
Bram Moolenaar70077dd2019-11-24 12:12:42 +01001182 " Test for a long line
1183 cexpr 'Xtestfile:' . repeat('a', 1026)
1184 let l = getqflist()
1185 call assert_equal('^\V' . repeat('a', 1019) . '\$', l[0].pattern)
1186
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001187 " Test for %P, %Q and %t format specifiers
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001188 let lines =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001189 [Xtestfile1]
1190 (1,17) error: ';' missing
1191 (21,2) warning: variable 'z' not defined
1192 (67,3) error: end of file found before string ended
1193 --
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001194
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001195 [Xtestfile2]
1196 --
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001197
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001198 [Xtestfile3]
1199 NEW compiler v1.1
1200 (2,2) warning: variable 'x' not defined
1201 (67,3) warning: 's' already defined
1202 --
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001203 [DATA]
1204
Bram Moolenaaree85df32017-03-19 14:19:50 +01001205 set efm=%+P[%f]%r,(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%+Q--%r
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001206 " To exercise the push/pop file functionality in quickfix, the test files
1207 " need to be created.
1208 call writefile(['Line1'], 'Xtestfile1')
1209 call writefile(['Line2'], 'Xtestfile2')
1210 call writefile(['Line3'], 'Xtestfile3')
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001211 cexpr ""
1212 for l in lines
1213 caddexpr l
1214 endfor
Bram Moolenaar049cba92016-06-26 14:38:04 +02001215 let l = getqflist()
Bram Moolenaaree85df32017-03-19 14:19:50 +01001216 call assert_equal(12, len(l))
Bram Moolenaar049cba92016-06-26 14:38:04 +02001217 call assert_equal(21, l[2].lnum)
1218 call assert_equal(2, l[2].col)
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001219 call assert_equal('w', l[2].type)
1220 call assert_equal('e', l[3].type)
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001221 call delete('Xtestfile1')
1222 call delete('Xtestfile2')
1223 call delete('Xtestfile3')
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001224
Bram Moolenaar70077dd2019-11-24 12:12:42 +01001225 " Test for %P, %Q with non-existing files
1226 cexpr lines
1227 let l = getqflist()
1228 call assert_equal(14, len(l))
1229 call assert_equal('[Xtestfile1]', l[0].text)
1230 call assert_equal('[Xtestfile2]', l[6].text)
1231 call assert_equal('[Xtestfile3]', l[9].text)
1232
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001233 " Tests for %E, %C and %Z format specifiers
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001234 let lines =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001235 Error 275
1236 line 42
1237 column 3
1238 ' ' expected after '--'
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001239 [DATA]
1240
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001241 set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m
1242 cgetexpr lines
1243 let l = getqflist()
1244 call assert_equal(275, l[0].nr)
1245 call assert_equal(42, l[0].lnum)
1246 call assert_equal(3, l[0].col)
1247 call assert_equal('E', l[0].type)
1248 call assert_equal("\n' ' expected after '--'", l[0].text)
1249
1250 " Test for %>
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001251 let lines =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001252 Error in line 147 of foo.c:
1253 unknown variable 'i'
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001254 [DATA]
1255
Bram Moolenaar0fcc7c62016-07-02 21:22:52 +02001256 set efm=unknown\ variable\ %m,%E%>Error\ in\ line\ %l\ of\ %f:,%Z%m
1257 cgetexpr lines
1258 let l = getqflist()
1259 call assert_equal(147, l[0].lnum)
1260 call assert_equal('E', l[0].type)
1261 call assert_equal("\nunknown variable 'i'", l[0].text)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001262
Bram Moolenaare87e6dd2016-07-17 19:25:04 +02001263 " Test for %A, %C and other formats
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001264 let lines =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001265 ==============================================================
1266 FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest)
1267 --------------------------------------------------------------
1268 Traceback (most recent call last):
1269 File "unittests/dbfacadeTest.py", line 89, in testFoo
1270 self.assertEquals(34, dtid)
1271 File "/usr/lib/python2.2/unittest.py", line 286, in
1272 failUnlessEqual
1273 raise self.failureException, \\
Bram Moolenaar70077dd2019-11-24 12:12:42 +01001274 W:AssertionError: 34 != 33
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001275
1276 --------------------------------------------------------------
1277 Ran 27 tests in 0.063s
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001278 [DATA]
1279
Bram Moolenaar70077dd2019-11-24 12:12:42 +01001280 set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%t:%m
Bram Moolenaare87e6dd2016-07-17 19:25:04 +02001281 cgetexpr lines
1282 let l = getqflist()
1283 call assert_equal(8, len(l))
1284 call assert_equal(89, l[4].lnum)
1285 call assert_equal(1, l[4].valid)
1286 call assert_equal('unittests/dbfacadeTest.py', bufname(l[4].bufnr))
Bram Moolenaar70077dd2019-11-24 12:12:42 +01001287 call assert_equal('W', l[4].type)
Bram Moolenaare87e6dd2016-07-17 19:25:04 +02001288
Bram Moolenaard76ce852018-05-01 15:02:04 +02001289 " Test for %o
1290 set efm=%f(%o):%l\ %m
Bram Moolenaarbc7845d2018-05-01 16:26:48 +02001291 cgetexpr ['Xotestfile(Language.PureScript.Types):20 Error']
1292 call writefile(['Line1'], 'Xotestfile')
Bram Moolenaard76ce852018-05-01 15:02:04 +02001293 let l = getqflist()
1294 call assert_equal(1, len(l), string(l))
1295 call assert_equal('Language.PureScript.Types', l[0].module)
1296 copen
1297 call assert_equal('Language.PureScript.Types|20| Error', getline(1))
1298 call feedkeys("\<CR>", 'xn')
Bram Moolenaarbc7845d2018-05-01 16:26:48 +02001299 call assert_equal('Xotestfile', expand('%:t'))
Bram Moolenaard76ce852018-05-01 15:02:04 +02001300 cclose
1301 bd
Bram Moolenaarbc7845d2018-05-01 16:26:48 +02001302 call delete("Xotestfile")
Bram Moolenaard76ce852018-05-01 15:02:04 +02001303
Bram Moolenaar70077dd2019-11-24 12:12:42 +01001304 " Test for a long module name
1305 cexpr 'Xtest(' . repeat('m', 1026) . '):15 message'
1306 let l = getqflist()
1307 call assert_equal(repeat('m', 1024), l[0].module)
1308 call assert_equal(15, l[0].lnum)
1309 call assert_equal('message', l[0].text)
1310
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001311 " The following sequence of commands used to crash Vim
1312 set efm=%W%m
1313 cgetexpr ['msg1']
1314 let l = getqflist()
1315 call assert_equal(1, len(l), string(l))
1316 call assert_equal('msg1', l[0].text)
1317 set efm=%C%m
1318 lexpr 'msg2'
1319 let l = getloclist(0)
1320 call assert_equal(1, len(l), string(l))
1321 call assert_equal('msg2', l[0].text)
1322 lopen
1323 call setqflist([], 'r')
1324 caddbuf
1325 let l = getqflist()
1326 call assert_equal(1, len(l), string(l))
1327 call assert_equal('|| msg2', l[0].text)
1328
Bram Moolenaar78ddc062018-05-15 21:56:34 +02001329 " When matching error lines, case should be ignored. Test for this.
1330 set noignorecase
1331 let l=getqflist({'lines' : ['Xtest:FOO10:Line 20'], 'efm':'%f:foo%l:%m'})
1332 call assert_equal(10, l.items[0].lnum)
1333 call assert_equal('Line 20', l.items[0].text)
1334 set ignorecase&
1335
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001336 new | only
Bram Moolenaar049cba92016-06-26 14:38:04 +02001337 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001338endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001339
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001340func XquickfixChangedByAutocmd(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001341 call s:setup_commands(a:cchar)
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001342 if a:cchar == 'c'
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001343 let ErrorNr = 'E925'
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001344 func! ReadFunc()
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001345 colder
1346 cgetexpr []
1347 endfunc
1348 else
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001349 let ErrorNr = 'E926'
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001350 func! ReadFunc()
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001351 lolder
1352 lgetexpr []
1353 endfunc
1354 endif
1355
1356 augroup testgroup
1357 au!
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001358 autocmd BufReadCmd test_changed.txt call ReadFunc()
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001359 augroup END
1360
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001361 new | only
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001362 let words = [ "a", "b" ]
1363 let qflist = []
1364 for word in words
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001365 call add(qflist, {'filename': 'test_changed.txt'})
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001366 call g:Xsetlist(qflist, ' ')
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001367 endfor
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001368 call assert_fails('Xrewind', ErrorNr . ':')
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001369
1370 augroup! testgroup
1371endfunc
1372
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001373func Test_quickfix_was_changed_by_autocmd()
Bram Moolenaarffec3c52016-03-23 20:55:42 +01001374 call XquickfixChangedByAutocmd('c')
1375 call XquickfixChangedByAutocmd('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001376endfunc
Bram Moolenaar8b201792016-03-25 15:01:10 +01001377
1378func Test_caddbuffer_to_empty()
1379 helpgr quickfix
1380 call setqflist([], 'r')
1381 cad
Bram Moolenaarf68f1d72016-03-25 17:14:06 +01001382 try
1383 cn
1384 catch
1385 " number of matches is unknown
1386 call assert_true(v:exception =~ 'E553:')
1387 endtry
Bram Moolenaar8b201792016-03-25 15:01:10 +01001388 quit!
1389endfunc
Bram Moolenaar89c64d52016-03-27 18:44:40 +02001390
1391func Test_cgetexpr_works()
1392 " this must not crash Vim
1393 cgetexpr [$x]
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001394 lgetexpr [$x]
Bram Moolenaar89c64d52016-03-27 18:44:40 +02001395endfunc
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001396
1397" Tests for the setqflist() and setloclist() functions
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001398func SetXlistTests(cchar, bnum)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001399 call s:setup_commands(a:cchar)
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001400
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001401 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 1},
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001402 \ {'bufnr': a:bnum, 'lnum': 2}])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001403 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001404 call assert_equal(2, len(l))
1405 call assert_equal(2, l[1].lnum)
1406
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001407 Xnext
1408 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3}], 'a')
1409 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001410 call assert_equal(3, len(l))
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001411 Xnext
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001412 call assert_equal(3, line('.'))
1413
Bram Moolenaar2b2b8ae2016-05-24 19:59:51 +02001414 " Appending entries to the list should not change the cursor position
1415 " in the quickfix window
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001416 Xwindow
Bram Moolenaar2b2b8ae2016-05-24 19:59:51 +02001417 1
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001418 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 4},
Bram Moolenaar2b2b8ae2016-05-24 19:59:51 +02001419 \ {'bufnr': a:bnum, 'lnum': 5}], 'a')
1420 call assert_equal(1, line('.'))
1421 close
1422
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001423 call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3},
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001424 \ {'bufnr': a:bnum, 'lnum': 4},
1425 \ {'bufnr': a:bnum, 'lnum': 5}], 'r')
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001426 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001427 call assert_equal(3, len(l))
1428 call assert_equal(5, l[2].lnum)
1429
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001430 call g:Xsetlist([])
1431 let l = g:Xgetlist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001432 call assert_equal(0, len(l))
Bram Moolenaaree85df32017-03-19 14:19:50 +01001433
Bram Moolenaarf1d21c82017-04-22 21:20:46 +02001434 " Tests for setting the 'valid' flag
1435 call g:Xsetlist([{'bufnr':a:bnum, 'lnum':4, 'valid':0}])
1436 Xwindow
1437 call assert_equal(1, winnr('$'))
1438 let l = g:Xgetlist()
1439 call g:Xsetlist(l)
1440 call assert_equal(0, g:Xgetlist()[0].valid)
Bram Moolenaar9752c722018-12-22 16:49:34 +01001441 " Adding a non-valid entry should not mark the list as having valid entries
1442 call g:Xsetlist([{'bufnr':a:bnum, 'lnum':5, 'valid':0}], 'a')
1443 Xwindow
1444 call assert_equal(1, winnr('$'))
1445
1446 " :cnext/:cprev should still work even with invalid entries in the list
1447 let l = [{'bufnr' : a:bnum, 'lnum' : 1, 'text' : '1', 'valid' : 0},
1448 \ {'bufnr' : a:bnum, 'lnum' : 2, 'text' : '2', 'valid' : 0}]
1449 call g:Xsetlist(l)
1450 Xnext
1451 call assert_equal(2, g:Xgetlist({'idx' : 0}).idx)
1452 Xprev
1453 call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
1454 " :cnext/:cprev should still work after appending invalid entries to an
1455 " empty list
1456 call g:Xsetlist([])
1457 call g:Xsetlist(l, 'a')
1458 Xnext
1459 call assert_equal(2, g:Xgetlist({'idx' : 0}).idx)
1460 Xprev
1461 call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
1462
Bram Moolenaarf1d21c82017-04-22 21:20:46 +02001463 call g:Xsetlist([{'text':'Text1', 'valid':1}])
1464 Xwindow
1465 call assert_equal(2, winnr('$'))
1466 Xclose
1467 let save_efm = &efm
1468 set efm=%m
1469 Xgetexpr 'TestMessage'
1470 let l = g:Xgetlist()
1471 call g:Xsetlist(l)
1472 call assert_equal(1, g:Xgetlist()[0].valid)
1473 let &efm = save_efm
1474
Bram Moolenaaree85df32017-03-19 14:19:50 +01001475 " Error cases:
1476 " Refer to a non-existing buffer and pass a non-dictionary type
1477 call assert_fails("call g:Xsetlist([{'bufnr':998, 'lnum':4}," .
1478 \ " {'bufnr':999, 'lnum':5}])", 'E92:')
1479 call g:Xsetlist([[1, 2,3]])
1480 call assert_equal(0, len(g:Xgetlist()))
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001481endfunc
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001482
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001483func Test_setqflist()
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001484 new Xtestfile | only
1485 let bnum = bufnr('%')
1486 call setline(1, range(1,5))
1487
1488 call SetXlistTests('c', bnum)
1489 call SetXlistTests('l', bnum)
1490
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001491 enew!
Bram Moolenaarc1808d52016-04-18 20:04:00 +02001492 call delete('Xtestfile')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001493endfunc
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001494
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001495func Xlist_empty_middle(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001496 call s:setup_commands(a:cchar)
1497
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001498 " create three quickfix lists
Bram Moolenaaree85df32017-03-19 14:19:50 +01001499 let @/ = 'Test_'
1500 Xvimgrep // test_quickfix.vim
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001501 let testlen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001502 call assert_true(testlen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001503 Xvimgrep empty test_quickfix.vim
1504 call assert_true(len(g:Xgetlist()) > 0)
1505 Xvimgrep matches test_quickfix.vim
1506 let matchlen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001507 call assert_true(matchlen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001508 Xolder
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001509 " make the middle list empty
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001510 call g:Xsetlist([], 'r')
1511 call assert_true(len(g:Xgetlist()) == 0)
1512 Xolder
1513 call assert_equal(testlen, len(g:Xgetlist()))
1514 Xnewer
1515 Xnewer
1516 call assert_equal(matchlen, len(g:Xgetlist()))
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001517endfunc
1518
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001519func Test_setqflist_empty_middle()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001520 call Xlist_empty_middle('c')
1521 call Xlist_empty_middle('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001522endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001523
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001524func Xlist_empty_older(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001525 call s:setup_commands(a:cchar)
1526
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001527 " create three quickfix lists
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001528 Xvimgrep one test_quickfix.vim
1529 let onelen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001530 call assert_true(onelen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001531 Xvimgrep two test_quickfix.vim
1532 let twolen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001533 call assert_true(twolen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001534 Xvimgrep three test_quickfix.vim
1535 let threelen = len(g:Xgetlist())
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001536 call assert_true(threelen > 0)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001537 Xolder 2
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001538 " make the first list empty, check the others didn't change
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001539 call g:Xsetlist([], 'r')
1540 call assert_true(len(g:Xgetlist()) == 0)
1541 Xnewer
1542 call assert_equal(twolen, len(g:Xgetlist()))
1543 Xnewer
1544 call assert_equal(threelen, len(g:Xgetlist()))
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001545endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001546
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001547func Test_setqflist_empty_older()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001548 call Xlist_empty_older('c')
1549 call Xlist_empty_older('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001550endfunc
Bram Moolenaar1cee6932016-06-09 22:17:22 +02001551
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001552func XquickfixSetListWithAct(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001553 call s:setup_commands(a:cchar)
1554
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001555 let list1 = [{'filename': 'fnameA', 'text': 'A'},
1556 \ {'filename': 'fnameB', 'text': 'B'}]
1557 let list2 = [{'filename': 'fnameC', 'text': 'C'},
1558 \ {'filename': 'fnameD', 'text': 'D'},
1559 \ {'filename': 'fnameE', 'text': 'E'}]
1560
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01001561 " {action} is unspecified. Same as specifying ' '.
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001562 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001563 silent! Xnewer 99
1564 call g:Xsetlist(list1)
1565 call g:Xsetlist(list2)
1566 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001567 call assert_equal(3, len(li))
1568 call assert_equal('C', li[0]['text'])
1569 call assert_equal('D', li[1]['text'])
1570 call assert_equal('E', li[2]['text'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001571 silent! Xolder
1572 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001573 call assert_equal(2, len(li))
1574 call assert_equal('A', li[0]['text'])
1575 call assert_equal('B', li[1]['text'])
1576
1577 " {action} is specified ' '.
1578 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001579 silent! Xnewer 99
1580 call g:Xsetlist(list1)
1581 call g:Xsetlist(list2, ' ')
1582 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001583 call assert_equal(3, len(li))
1584 call assert_equal('C', li[0]['text'])
1585 call assert_equal('D', li[1]['text'])
1586 call assert_equal('E', li[2]['text'])
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001587 silent! Xolder
1588 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001589 call assert_equal(2, len(li))
1590 call assert_equal('A', li[0]['text'])
1591 call assert_equal('B', li[1]['text'])
1592
1593 " {action} is specified 'a'.
1594 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001595 silent! Xnewer 99
1596 call g:Xsetlist(list1)
1597 call g:Xsetlist(list2, 'a')
1598 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001599 call assert_equal(5, len(li))
1600 call assert_equal('A', li[0]['text'])
1601 call assert_equal('B', li[1]['text'])
1602 call assert_equal('C', li[2]['text'])
1603 call assert_equal('D', li[3]['text'])
1604 call assert_equal('E', li[4]['text'])
1605
1606 " {action} is specified 'r'.
1607 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001608 silent! Xnewer 99
1609 call g:Xsetlist(list1)
1610 call g:Xsetlist(list2, 'r')
1611 let li = g:Xgetlist()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001612 call assert_equal(3, len(li))
1613 call assert_equal('C', li[0]['text'])
1614 call assert_equal('D', li[1]['text'])
1615 call assert_equal('E', li[2]['text'])
1616
1617 " Test for wrong value.
1618 new | only
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001619 call assert_fails("call g:Xsetlist(0)", 'E714:')
1620 call assert_fails("call g:Xsetlist(list1, '')", 'E927:')
1621 call assert_fails("call g:Xsetlist(list1, 'aa')", 'E927:')
1622 call assert_fails("call g:Xsetlist(list1, ' a')", 'E927:')
1623 call assert_fails("call g:Xsetlist(list1, 0)", 'E928:')
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001624endfunc
1625
Bram Moolenaara0ca7d02017-12-19 10:22:19 +01001626func Test_setqflist_invalid_nr()
1627 " The following command used to crash Vim
Bram Moolenaaraad222c2019-09-06 22:46:09 +02001628 eval []->setqflist(' ', {'nr' : $XXX_DOES_NOT_EXIST})
Bram Moolenaara0ca7d02017-12-19 10:22:19 +01001629endfunc
1630
Bram Moolenaar99234f22020-02-10 22:56:54 +01001631func Test_setqflist_user_sets_buftype()
1632 call setqflist([{'text': 'foo'}, {'text': 'bar'}])
1633 set buftype=quickfix
1634 call setqflist([], 'a')
1635 enew
1636endfunc
1637
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001638func Test_quickfix_set_list_with_act()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001639 call XquickfixSetListWithAct('c')
1640 call XquickfixSetListWithAct('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001641endfunc
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001642
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001643func XLongLinesTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001644 let l = g:Xgetlist()
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001645
Bram Moolenaar049cba92016-06-26 14:38:04 +02001646 call assert_equal(4, len(l))
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001647 call assert_equal(1, l[0].lnum)
1648 call assert_equal(1, l[0].col)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001649 call assert_equal(1975, len(l[0].text))
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001650 call assert_equal(2, l[1].lnum)
1651 call assert_equal(1, l[1].col)
1652 call assert_equal(4070, len(l[1].text))
1653 call assert_equal(3, l[2].lnum)
1654 call assert_equal(1, l[2].col)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001655 call assert_equal(4070, len(l[2].text))
1656 call assert_equal(4, l[3].lnum)
1657 call assert_equal(1, l[3].col)
1658 call assert_equal(10, len(l[3].text))
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001659
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001660 call g:Xsetlist([], 'r')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001661endfunc
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001662
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001663func s:long_lines_tests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001664 call s:setup_commands(a:cchar)
1665
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001666 let testfile = 'samples/quickfix.txt'
1667
1668 " file
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001669 exe 'Xgetfile' testfile
1670 call XLongLinesTests(a:cchar)
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001671
1672 " list
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001673 Xexpr readfile(testfile)
1674 call XLongLinesTests(a:cchar)
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001675
1676 " string
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001677 Xexpr join(readfile(testfile), "\n")
1678 call XLongLinesTests(a:cchar)
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001679
1680 " buffer
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001681 exe 'edit' testfile
1682 exe 'Xbuffer' bufnr('%')
Bram Moolenaarf50df392016-06-21 21:33:34 +02001683 call XLongLinesTests(a:cchar)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001684endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001685
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001686func Test_long_lines()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001687 call s:long_lines_tests('c')
1688 call s:long_lines_tests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001689endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001690
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001691func s:create_test_file(filename)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001692 let l = []
1693 for i in range(1, 20)
1694 call add(l, 'Line' . i)
1695 endfor
1696 call writefile(l, a:filename)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001697endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001698
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001699func Test_switchbuf()
Bram Moolenaar9134f1e2019-11-29 20:26:13 +01001700 CheckNotBSD
Bram Moolenaar049cba92016-06-26 14:38:04 +02001701 call s:create_test_file('Xqftestfile1')
1702 call s:create_test_file('Xqftestfile2')
1703 call s:create_test_file('Xqftestfile3')
1704
1705 new | only
1706 edit Xqftestfile1
1707 let file1_winid = win_getid()
1708 new Xqftestfile2
1709 let file2_winid = win_getid()
1710 cgetexpr ['Xqftestfile1:5:Line5',
1711 \ 'Xqftestfile1:6:Line6',
1712 \ 'Xqftestfile2:10:Line10',
1713 \ 'Xqftestfile2:11:Line11',
1714 \ 'Xqftestfile3:15:Line15',
1715 \ 'Xqftestfile3:16:Line16']
1716
1717 new
1718 let winid = win_getid()
1719 cfirst | cnext
1720 call assert_equal(winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001721 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001722 call assert_equal(winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001723 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001724 call assert_equal(winid, win_getid())
Bram Moolenaar049cba92016-06-26 14:38:04 +02001725
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001726 " Test for 'switchbuf' set to search for files in windows in the current
1727 " tabpage and jump to an existing window (if present)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001728 set switchbuf=useopen
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001729 enew
Bram Moolenaar049cba92016-06-26 14:38:04 +02001730 cfirst | cnext
1731 call assert_equal(file1_winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001732 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001733 call assert_equal(file2_winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001734 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001735 call assert_equal(file2_winid, win_getid())
1736
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001737 " Test for 'switchbuf' set to search for files in tabpages and jump to an
1738 " existing tabpage (if present)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001739 enew | only
1740 set switchbuf=usetab
1741 tabedit Xqftestfile1
1742 tabedit Xqftestfile2
Bram Moolenaar74240d32017-12-10 15:26:15 +01001743 tabedit Xqftestfile3
Bram Moolenaar049cba92016-06-26 14:38:04 +02001744 tabfirst
1745 cfirst | cnext
1746 call assert_equal(2, tabpagenr())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001747 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001748 call assert_equal(3, tabpagenr())
Bram Moolenaar74240d32017-12-10 15:26:15 +01001749 6cnext
1750 call assert_equal(4, tabpagenr())
1751 2cpfile
1752 call assert_equal(2, tabpagenr())
1753 2cnfile
1754 call assert_equal(4, tabpagenr())
Bram Moolenaar049cba92016-06-26 14:38:04 +02001755 tabfirst | tabonly | enew
1756
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001757 " Test for 'switchbuf' set to open a new window for every file
Bram Moolenaar049cba92016-06-26 14:38:04 +02001758 set switchbuf=split
1759 cfirst | cnext
1760 call assert_equal(1, winnr('$'))
1761 cnext | cnext
1762 call assert_equal(2, winnr('$'))
1763 cnext | cnext
1764 call assert_equal(3, winnr('$'))
Bram Moolenaar049cba92016-06-26 14:38:04 +02001765
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001766 " Test for 'switchbuf' set to open a new tabpage for every file
Bram Moolenaar049cba92016-06-26 14:38:04 +02001767 set switchbuf=newtab
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001768 enew | only
Bram Moolenaar049cba92016-06-26 14:38:04 +02001769 cfirst | cnext
1770 call assert_equal(1, tabpagenr('$'))
1771 cnext | cnext
1772 call assert_equal(2, tabpagenr('$'))
1773 cnext | cnext
1774 call assert_equal(3, tabpagenr('$'))
1775 tabfirst | enew | tabonly | only
1776
Bram Moolenaar539aa6b2019-11-17 18:09:38 +01001777 set switchbuf=uselast
1778 split
1779 let last_winid = win_getid()
1780 copen
1781 exe "normal 1G\<CR>"
1782 call assert_equal(last_winid, win_getid())
1783 enew | only
1784
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001785 " With an empty 'switchbuf', jumping to a quickfix entry should open the
1786 " file in an existing window (if present)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001787 set switchbuf=
1788 edit Xqftestfile1
1789 let file1_winid = win_getid()
1790 new Xqftestfile2
1791 let file2_winid = win_getid()
1792 copen
1793 exe "normal 1G\<CR>"
1794 call assert_equal(file1_winid, win_getid())
1795 copen
1796 exe "normal 3G\<CR>"
1797 call assert_equal(file2_winid, win_getid())
1798 copen | only
1799 exe "normal 5G\<CR>"
1800 call assert_equal(2, winnr('$'))
1801 call assert_equal(1, bufwinnr('Xqftestfile3'))
1802
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001803 " If only quickfix window is open in the current tabpage, jumping to an
Bram Moolenaar1bc353b2019-09-01 14:45:28 +02001804 " entry with 'switchbuf' set to 'usetab' should search in other tabpages.
Bram Moolenaar049cba92016-06-26 14:38:04 +02001805 enew | only
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001806 set switchbuf=usetab
1807 tabedit Xqftestfile1
1808 tabedit Xqftestfile2
1809 tabedit Xqftestfile3
1810 tabfirst
1811 copen | only
1812 clast
1813 call assert_equal(4, tabpagenr())
1814 tabfirst | tabonly | enew | only
Bram Moolenaar049cba92016-06-26 14:38:04 +02001815
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001816 " Jumping to a file that is not present in any of the tabpages and the
1817 " current tabpage doesn't have any usable windows, should open it in a new
1818 " window in the current tabpage.
1819 copen | only
1820 cfirst
1821 call assert_equal(1, tabpagenr())
1822 call assert_equal('Xqftestfile1', bufname(''))
1823
1824 " If opening a file changes 'switchbuf', then the new value should be
1825 " retained.
1826 call writefile(["vim: switchbuf=split"], 'Xqftestfile1')
1827 enew | only
1828 set switchbuf&vim
1829 cexpr "Xqftestfile1:1:10"
1830 call assert_equal('split', &switchbuf)
1831 call writefile(["vim: switchbuf=usetab"], 'Xqftestfile1')
1832 enew | only
1833 set switchbuf=useopen
1834 cexpr "Xqftestfile1:1:10"
1835 call assert_equal('usetab', &switchbuf)
1836 call writefile(["vim: switchbuf&vim"], 'Xqftestfile1')
1837 enew | only
1838 set switchbuf=useopen
1839 cexpr "Xqftestfile1:1:10"
1840 call assert_equal('', &switchbuf)
1841
Bram Moolenaar049cba92016-06-26 14:38:04 +02001842 call delete('Xqftestfile1')
1843 call delete('Xqftestfile2')
1844 call delete('Xqftestfile3')
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001845 set switchbuf&vim
1846
1847 enew | only
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001848endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001849
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001850func Xadjust_qflnum(cchar)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001851 call s:setup_commands(a:cchar)
1852
1853 enew | only
1854
Bram Moolenaarc1542742016-07-20 21:44:37 +02001855 let fname = 'Xqftestfile' . a:cchar
1856 call s:create_test_file(fname)
1857 exe 'edit ' . fname
Bram Moolenaar049cba92016-06-26 14:38:04 +02001858
Bram Moolenaarc1542742016-07-20 21:44:37 +02001859 Xgetexpr [fname . ':5:Line5',
1860 \ fname . ':10:Line10',
1861 \ fname . ':15:Line15',
1862 \ fname . ':20:Line20']
Bram Moolenaar049cba92016-06-26 14:38:04 +02001863
1864 6,14delete
1865 call append(6, ['Buffer', 'Window'])
1866
1867 let l = g:Xgetlist()
Bram Moolenaar049cba92016-06-26 14:38:04 +02001868 call assert_equal(5, l[0].lnum)
1869 call assert_equal(6, l[2].lnum)
1870 call assert_equal(13, l[3].lnum)
1871
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001872 " If a file doesn't have any quickfix entries, then deleting lines in the
1873 " file should not update the quickfix list
1874 call g:Xsetlist([], 'f')
1875 1,2delete
1876 call assert_equal([], g:Xgetlist())
1877
Bram Moolenaar049cba92016-06-26 14:38:04 +02001878 enew!
Bram Moolenaarc1542742016-07-20 21:44:37 +02001879 call delete(fname)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001880endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001881
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001882func Test_adjust_lnum()
Bram Moolenaarc1542742016-07-20 21:44:37 +02001883 call setloclist(0, [])
Bram Moolenaar049cba92016-06-26 14:38:04 +02001884 call Xadjust_qflnum('c')
Bram Moolenaarc1542742016-07-20 21:44:37 +02001885 call setqflist([])
Bram Moolenaar049cba92016-06-26 14:38:04 +02001886 call Xadjust_qflnum('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001887endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001888
1889" Tests for the :grep/:lgrep and :grepadd/:lgrepadd commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001890func s:test_xgrep(cchar)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001891 call s:setup_commands(a:cchar)
1892
1893 " The following lines are used for the grep test. Don't remove.
1894 " Grep_Test_Text: Match 1
1895 " Grep_Test_Text: Match 2
1896 " GrepAdd_Test_Text: Match 1
1897 " GrepAdd_Test_Text: Match 2
1898 enew! | only
1899 set makeef&vim
1900 silent Xgrep Grep_Test_Text: test_quickfix.vim
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +01001901 call assert_true(len(g:Xgetlist()) == 5)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001902 Xopen
1903 call assert_true(w:quickfix_title =~ '^:grep')
1904 Xclose
1905 enew
1906 set makeef=Temp_File_##
1907 silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +01001908 call assert_true(len(g:Xgetlist()) == 9)
1909
1910 " Try with 'grepprg' set to 'internal'
1911 set grepprg=internal
1912 silent Xgrep Grep_Test_Text: test_quickfix.vim
1913 silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
1914 call assert_true(len(g:Xgetlist()) == 9)
1915 set grepprg&vim
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001916
1917 call writefile(['Vim'], 'XtestTempFile')
1918 set makeef=XtestTempFile
1919 silent Xgrep Grep_Test_Text: test_quickfix.vim
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +01001920 call assert_equal(5, len(g:Xgetlist()))
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001921 call assert_false(filereadable('XtestTempFile'))
1922 set makeef&vim
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001923endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001924
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001925func Test_grep()
Bram Moolenaar049cba92016-06-26 14:38:04 +02001926 if !has('unix')
1927 " The grepprg may not be set on non-Unix systems
1928 return
1929 endif
1930
1931 call s:test_xgrep('c')
1932 call s:test_xgrep('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001933endfunc
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001934
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001935func Test_two_windows()
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001936 " Use one 'errorformat' for two windows. Add an expression to each of them,
1937 " make sure they each keep their own state.
1938 set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
1939 call mkdir('Xone/a', 'p')
1940 call mkdir('Xtwo/a', 'p')
1941 let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
1942 call writefile(lines, 'Xone/a/one.txt')
1943 call writefile(lines, 'Xtwo/a/two.txt')
1944
1945 new one
1946 let one_id = win_getid()
1947 lexpr ""
1948 new two
1949 let two_id = win_getid()
1950 lexpr ""
1951
1952 laddexpr "Entering dir 'Xtwo/a'"
1953 call win_gotoid(one_id)
1954 laddexpr "Entering dir 'Xone/a'"
1955 call win_gotoid(two_id)
1956 laddexpr 'two.txt:5:two two two'
1957 call win_gotoid(one_id)
1958 laddexpr 'one.txt:3:one one one'
1959
1960 let loc_one = getloclist(one_id)
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001961 call assert_equal('Xone/a/one.txt', bufname(loc_one[1].bufnr))
1962 call assert_equal(3, loc_one[1].lnum)
1963
1964 let loc_two = getloclist(two_id)
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001965 call assert_equal('Xtwo/a/two.txt', bufname(loc_two[1].bufnr))
1966 call assert_equal(5, loc_two[1].lnum)
1967
1968 call win_gotoid(one_id)
1969 bwipe!
1970 call win_gotoid(two_id)
1971 bwipe!
1972 call delete('Xone', 'rf')
1973 call delete('Xtwo', 'rf')
1974endfunc
Bram Moolenaardcb17002016-07-07 18:58:59 +02001975
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001976func XbottomTests(cchar)
Bram Moolenaar537ef082016-07-09 17:56:19 +02001977 call s:setup_commands(a:cchar)
1978
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +02001979 " Calling lbottom without any errors should fail
1980 if a:cchar == 'l'
1981 call assert_fails('lbottom', 'E776:')
1982 endif
1983
Bram Moolenaar875feea2017-06-11 16:07:51 +02001984 call g:Xsetlist([{'filename': 'foo', 'lnum': 42}])
Bram Moolenaar537ef082016-07-09 17:56:19 +02001985 Xopen
Bram Moolenaardcb17002016-07-07 18:58:59 +02001986 let wid = win_getid()
1987 call assert_equal(1, line('.'))
1988 wincmd w
Bram Moolenaar875feea2017-06-11 16:07:51 +02001989 call g:Xsetlist([{'filename': 'var', 'lnum': 24}], 'a')
Bram Moolenaar537ef082016-07-09 17:56:19 +02001990 Xbottom
Bram Moolenaardcb17002016-07-07 18:58:59 +02001991 call win_gotoid(wid)
1992 call assert_equal(2, line('.'))
Bram Moolenaar537ef082016-07-09 17:56:19 +02001993 Xclose
Bram Moolenaardcb17002016-07-07 18:58:59 +02001994endfunc
Bram Moolenaar537ef082016-07-09 17:56:19 +02001995
1996" Tests for the :cbottom and :lbottom commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001997func Test_cbottom()
Bram Moolenaar537ef082016-07-09 17:56:19 +02001998 call XbottomTests('c')
1999 call XbottomTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002000endfunc
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02002001
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002002func HistoryTest(cchar)
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02002003 call s:setup_commands(a:cchar)
2004
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02002005 " clear all lists after the first one, then replace the first one.
2006 call g:Xsetlist([])
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +02002007 call assert_fails('Xolder 99', 'E380:')
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02002008 let entry = {'filename': 'foo', 'lnum': 42}
2009 call g:Xsetlist([entry], 'r')
2010 call g:Xsetlist([entry, entry])
2011 call g:Xsetlist([entry, entry, entry])
2012 let res = split(execute(a:cchar . 'hist'), "\n")
2013 call assert_equal(3, len(res))
2014 let common = 'errors :set' . (a:cchar == 'c' ? 'qf' : 'loc') . 'list()'
2015 call assert_equal(' error list 1 of 3; 1 ' . common, res[0])
2016 call assert_equal(' error list 2 of 3; 2 ' . common, res[1])
2017 call assert_equal('> error list 3 of 3; 3 ' . common, res[2])
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02002018
Bram Moolenaar8ffc7c82019-05-05 21:00:26 +02002019 " Test for changing the quickfix lists
2020 call assert_equal(3, g:Xgetlist({'nr' : 0}).nr)
2021 exe '1' . a:cchar . 'hist'
2022 call assert_equal(1, g:Xgetlist({'nr' : 0}).nr)
2023 exe '3' . a:cchar . 'hist'
2024 call assert_equal(3, g:Xgetlist({'nr' : 0}).nr)
2025 call assert_fails('-2' . a:cchar . 'hist', 'E16:')
2026 call assert_fails('4' . a:cchar . 'hist', 'E16:')
2027
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02002028 call g:Xsetlist([], 'f')
2029 let l = split(execute(a:cchar . 'hist'), "\n")
2030 call assert_equal('No entries', l[0])
Bram Moolenaar8ffc7c82019-05-05 21:00:26 +02002031 if a:cchar == 'c'
2032 call assert_fails('4chist', 'E16:')
2033 else
2034 call assert_fails('4lhist', 'E776:')
2035 endif
Bram Moolenaar5b69c222019-01-11 14:50:06 +01002036
2037 " An empty list should still show the stack history
2038 call g:Xsetlist([])
2039 let res = split(execute(a:cchar . 'hist'), "\n")
2040 call assert_equal('> error list 1 of 1; 0 ' . common, res[0])
2041
2042 call g:Xsetlist([], 'f')
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02002043endfunc
2044
2045func Test_history()
2046 call HistoryTest('c')
2047 call HistoryTest('l')
2048endfunc
Bram Moolenaar015102e2016-07-16 18:24:56 +02002049
2050func Test_duplicate_buf()
2051 " make sure we can get the highest buffer number
2052 edit DoesNotExist
2053 edit DoesNotExist2
2054 let last_buffer = bufnr("$")
2055
2056 " make sure only one buffer is created
2057 call writefile(['this one', 'that one'], 'Xgrepthis')
2058 vimgrep one Xgrepthis
2059 vimgrep one Xgrepthis
2060 call assert_equal(last_buffer + 1, bufnr("$"))
2061
2062 call delete('Xgrepthis')
2063endfunc
Bram Moolenaard823fa92016-08-12 16:29:27 +02002064
2065" Quickfix/Location list set/get properties tests
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002066func Xproperty_tests(cchar)
Bram Moolenaard823fa92016-08-12 16:29:27 +02002067 call s:setup_commands(a:cchar)
2068
2069 " Error cases
2070 call assert_fails('call g:Xgetlist(99)', 'E715:')
2071 call assert_fails('call g:Xsetlist(99)', 'E714:')
2072 call assert_fails('call g:Xsetlist([], "a", [])', 'E715:')
2073
2074 " Set and get the title
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +02002075 call g:Xsetlist([])
Bram Moolenaard823fa92016-08-12 16:29:27 +02002076 Xopen
2077 wincmd p
2078 call g:Xsetlist([{'filename':'foo', 'lnum':27}])
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02002079 let s = g:Xsetlist([], 'a', {'title' : 'Sample'})
2080 call assert_equal(0, s)
Bram Moolenaard823fa92016-08-12 16:29:27 +02002081 let d = g:Xgetlist({"title":1})
2082 call assert_equal('Sample', d.title)
Bram Moolenaara2aa8a22018-04-24 13:55:00 +02002083 " Try setting title to a non-string value
2084 call assert_equal(-1, g:Xsetlist([], 'a', {'title' : ['Test']}))
2085 call assert_equal('Sample', g:Xgetlist({"title":1}).title)
Bram Moolenaard823fa92016-08-12 16:29:27 +02002086
2087 Xopen
2088 call assert_equal('Sample', w:quickfix_title)
2089 Xclose
2090
Bram Moolenaar2b529bb2016-08-27 13:35:35 +02002091 " Tests for action argument
2092 silent! Xolder 999
2093 let qfnr = g:Xgetlist({'all':1}).nr
2094 call g:Xsetlist([], 'r', {'title' : 'N1'})
2095 call assert_equal('N1', g:Xgetlist({'all':1}).title)
2096 call g:Xsetlist([], ' ', {'title' : 'N2'})
2097 call assert_equal(qfnr + 1, g:Xgetlist({'all':1}).nr)
Bram Moolenaar890680c2016-09-27 21:28:56 +02002098
2099 let res = g:Xgetlist({'nr': 0})
2100 call assert_equal(qfnr + 1, res.nr)
2101 call assert_equal(['nr'], keys(res))
2102
Bram Moolenaar2b529bb2016-08-27 13:35:35 +02002103 call g:Xsetlist([], ' ', {'title' : 'N3'})
2104 call assert_equal('N2', g:Xgetlist({'nr':2, 'title':1}).title)
2105
Bram Moolenaaree85df32017-03-19 14:19:50 +01002106 " Changing the title of an earlier quickfix list
Bram Moolenaar55b69262017-08-13 13:42:01 +02002107 call g:Xsetlist([], 'r', {'title' : 'NewTitle', 'nr' : 2})
Bram Moolenaaree85df32017-03-19 14:19:50 +01002108 call assert_equal('NewTitle', g:Xgetlist({'nr':2, 'title':1}).title)
2109
2110 " Changing the title of an invalid quickfix list
2111 call assert_equal(-1, g:Xsetlist([], ' ',
2112 \ {'title' : 'SomeTitle', 'nr' : 99}))
2113 call assert_equal(-1, g:Xsetlist([], ' ',
2114 \ {'title' : 'SomeTitle', 'nr' : 'abc'}))
2115
2116 if a:cchar == 'c'
2117 copen
2118 call assert_equal({'winid':win_getid()}, getqflist({'winid':1}))
2119 cclose
2120 endif
2121
Bram Moolenaard823fa92016-08-12 16:29:27 +02002122 " Invalid arguments
2123 call assert_fails('call g:Xgetlist([])', 'E715')
2124 call assert_fails('call g:Xsetlist([], "a", [])', 'E715')
2125 let s = g:Xsetlist([], 'a', {'abc':1})
2126 call assert_equal(-1, s)
2127
2128 call assert_equal({}, g:Xgetlist({'abc':1}))
Bram Moolenaara6d48492017-12-12 22:45:31 +01002129 call assert_equal('', g:Xgetlist({'nr':99, 'title':1}).title)
2130 call assert_equal('', g:Xgetlist({'nr':[], 'title':1}).title)
Bram Moolenaard823fa92016-08-12 16:29:27 +02002131
2132 if a:cchar == 'l'
Bram Moolenaar890680c2016-09-27 21:28:56 +02002133 call assert_equal({}, getloclist(99, {'title': 1}))
Bram Moolenaard823fa92016-08-12 16:29:27 +02002134 endif
Bram Moolenaar8f77c5a2017-04-30 14:21:00 +02002135
2136 " Context related tests
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02002137 let s = g:Xsetlist([], 'a', {'context':[1,2,3]})
2138 call assert_equal(0, s)
Bram Moolenaar8f77c5a2017-04-30 14:21:00 +02002139 call test_garbagecollect_now()
2140 let d = g:Xgetlist({'context':1})
2141 call assert_equal([1,2,3], d.context)
2142 call g:Xsetlist([], 'a', {'context':{'color':'green'}})
2143 let d = g:Xgetlist({'context':1})
2144 call assert_equal({'color':'green'}, d.context)
2145 call g:Xsetlist([], 'a', {'context':"Context info"})
2146 let d = g:Xgetlist({'context':1})
2147 call assert_equal("Context info", d.context)
2148 call g:Xsetlist([], 'a', {'context':246})
2149 let d = g:Xgetlist({'context':1})
2150 call assert_equal(246, d.context)
2151 if a:cchar == 'l'
2152 " Test for copying context across two different location lists
2153 new | only
2154 let w1_id = win_getid()
2155 let l = [1]
2156 call setloclist(0, [], 'a', {'context':l})
2157 new
2158 let w2_id = win_getid()
2159 call add(l, 2)
2160 call assert_equal([1, 2], getloclist(w1_id, {'context':1}).context)
2161 call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
2162 unlet! l
2163 call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
2164 only
2165 call setloclist(0, [], 'f')
Bram Moolenaara6d48492017-12-12 22:45:31 +01002166 call assert_equal('', getloclist(0, {'context':1}).context)
Bram Moolenaar8f77c5a2017-04-30 14:21:00 +02002167 endif
Bram Moolenaar6e62da32017-05-28 08:16:25 +02002168
2169 " Test for changing the context of previous quickfix lists
2170 call g:Xsetlist([], 'f')
2171 Xexpr "One"
2172 Xexpr "Two"
2173 Xexpr "Three"
Bram Moolenaar55b69262017-08-13 13:42:01 +02002174 call g:Xsetlist([], 'r', {'context' : [1], 'nr' : 1})
2175 call g:Xsetlist([], 'a', {'context' : [2], 'nr' : 2})
Bram Moolenaar6e62da32017-05-28 08:16:25 +02002176 " Also, check for setting the context using quickfix list number zero.
Bram Moolenaar55b69262017-08-13 13:42:01 +02002177 call g:Xsetlist([], 'r', {'context' : [3], 'nr' : 0})
Bram Moolenaar6e62da32017-05-28 08:16:25 +02002178 call test_garbagecollect_now()
2179 let l = g:Xgetlist({'nr' : 1, 'context' : 1})
2180 call assert_equal([1], l.context)
2181 let l = g:Xgetlist({'nr' : 2, 'context' : 1})
2182 call assert_equal([2], l.context)
2183 let l = g:Xgetlist({'nr' : 3, 'context' : 1})
2184 call assert_equal([3], l.context)
2185
2186 " Test for changing the context through reference and for garbage
2187 " collection of quickfix context
2188 let l = ["red"]
2189 call g:Xsetlist([], ' ', {'context' : l})
2190 call add(l, "blue")
2191 let x = g:Xgetlist({'context' : 1})
2192 call add(x.context, "green")
2193 call assert_equal(["red", "blue", "green"], l)
2194 call assert_equal(["red", "blue", "green"], x.context)
2195 unlet l
2196 call test_garbagecollect_now()
2197 let m = g:Xgetlist({'context' : 1})
2198 call assert_equal(["red", "blue", "green"], m.context)
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002199
2200 " Test for setting/getting items
2201 Xexpr ""
2202 let qfprev = g:Xgetlist({'nr':0})
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02002203 let s = g:Xsetlist([], ' ', {'title':'Green',
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002204 \ 'items' : [{'filename':'F1', 'lnum':10}]})
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02002205 call assert_equal(0, s)
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002206 let qfcur = g:Xgetlist({'nr':0})
2207 call assert_true(qfcur.nr == qfprev.nr + 1)
2208 let l = g:Xgetlist({'items':1})
2209 call assert_equal('F1', bufname(l.items[0].bufnr))
2210 call assert_equal(10, l.items[0].lnum)
2211 call g:Xsetlist([], 'a', {'items' : [{'filename':'F2', 'lnum':20},
2212 \ {'filename':'F2', 'lnum':30}]})
2213 let l = g:Xgetlist({'items':1})
2214 call assert_equal('F2', bufname(l.items[2].bufnr))
2215 call assert_equal(30, l.items[2].lnum)
2216 call g:Xsetlist([], 'r', {'items' : [{'filename':'F3', 'lnum':40}]})
2217 let l = g:Xgetlist({'items':1})
2218 call assert_equal('F3', bufname(l.items[0].bufnr))
2219 call assert_equal(40, l.items[0].lnum)
2220 call g:Xsetlist([], 'r', {'items' : []})
2221 let l = g:Xgetlist({'items':1})
2222 call assert_equal(0, len(l.items))
2223
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02002224 call g:Xsetlist([], 'r', {'title' : 'TestTitle'})
2225 call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]})
2226 call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]})
2227 call assert_equal('TestTitle', g:Xgetlist({'title' : 1}).title)
2228
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02002229 " Test for getting id of window associated with a location list window
2230 if a:cchar == 'l'
2231 only
2232 call assert_equal(0, g:Xgetlist({'all' : 1}).filewinid)
2233 let wid = win_getid()
2234 Xopen
2235 call assert_equal(wid, g:Xgetlist({'filewinid' : 1}).filewinid)
2236 wincmd w
2237 call assert_equal(0, g:Xgetlist({'filewinid' : 1}).filewinid)
2238 only
2239 endif
2240
Bram Moolenaarae338332017-08-11 20:25:26 +02002241 " The following used to crash Vim with address sanitizer
2242 call g:Xsetlist([], 'f')
2243 call g:Xsetlist([], 'a', {'items' : [{'filename':'F1', 'lnum':10}]})
2244 call assert_equal(10, g:Xgetlist({'items':1}).items[0].lnum)
2245
Bram Moolenaara2aa8a22018-04-24 13:55:00 +02002246 " Try setting the items using a string
2247 call assert_equal(-1, g:Xsetlist([], ' ', {'items' : 'Test'}))
2248
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002249 " Save and restore the quickfix stack
2250 call g:Xsetlist([], 'f')
2251 call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
2252 Xexpr "File1:10:Line1"
2253 Xexpr "File2:20:Line2"
2254 Xexpr "File3:30:Line3"
2255 let last_qf = g:Xgetlist({'nr':'$'}).nr
2256 call assert_equal(3, last_qf)
2257 let qstack = []
2258 for i in range(1, last_qf)
2259 let qstack = add(qstack, g:Xgetlist({'nr':i, 'all':1}))
2260 endfor
2261 call g:Xsetlist([], 'f')
2262 for i in range(len(qstack))
2263 call g:Xsetlist([], ' ', qstack[i])
2264 endfor
2265 call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
2266 call assert_equal(10, g:Xgetlist({'nr':1, 'items':1}).items[0].lnum)
2267 call assert_equal(20, g:Xgetlist({'nr':2, 'items':1}).items[0].lnum)
2268 call assert_equal(30, g:Xgetlist({'nr':3, 'items':1}).items[0].lnum)
2269 call g:Xsetlist([], 'f')
2270
2271 " Swap two quickfix lists
2272 Xexpr "File1:10:Line10"
2273 Xexpr "File2:20:Line20"
2274 Xexpr "File3:30:Line30"
2275 call g:Xsetlist([], 'r', {'nr':1,'title':'Colors','context':['Colors']})
2276 call g:Xsetlist([], 'r', {'nr':2,'title':'Fruits','context':['Fruits']})
2277 let l1=g:Xgetlist({'nr':1,'all':1})
2278 let l2=g:Xgetlist({'nr':2,'all':1})
Bram Moolenaara539f4f2017-08-30 20:33:55 +02002279 let save_id = l1.id
2280 let l1.id=l2.id
2281 let l2.id=save_id
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002282 call g:Xsetlist([], 'r', l1)
2283 call g:Xsetlist([], 'r', l2)
2284 let newl1=g:Xgetlist({'nr':1,'all':1})
2285 let newl2=g:Xgetlist({'nr':2,'all':1})
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02002286 call assert_equal('Fruits', newl1.title)
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002287 call assert_equal(['Fruits'], newl1.context)
2288 call assert_equal('Line20', newl1.items[0].text)
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02002289 call assert_equal('Colors', newl2.title)
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002290 call assert_equal(['Colors'], newl2.context)
2291 call assert_equal('Line10', newl2.items[0].text)
2292 call g:Xsetlist([], 'f')
Bram Moolenaaree85df32017-03-19 14:19:50 +01002293endfunc
Bram Moolenaard823fa92016-08-12 16:29:27 +02002294
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002295func Test_qf_property()
Bram Moolenaard823fa92016-08-12 16:29:27 +02002296 call Xproperty_tests('c')
2297 call Xproperty_tests('l')
Bram Moolenaaree85df32017-03-19 14:19:50 +01002298endfunc
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002299
Bram Moolenaar5b69c222019-01-11 14:50:06 +01002300" Test for setting the current index in the location/quickfix list
2301func Xtest_setqfidx(cchar)
2302 call s:setup_commands(a:cchar)
2303
2304 Xgetexpr "F1:10:1:Line1\nF2:20:2:Line2\nF3:30:3:Line3"
2305 Xgetexpr "F4:10:1:Line1\nF5:20:2:Line2\nF6:30:3:Line3"
2306 Xgetexpr "F7:10:1:Line1\nF8:20:2:Line2\nF9:30:3:Line3"
2307
2308 call g:Xsetlist([], 'a', {'nr' : 3, 'idx' : 2})
2309 call g:Xsetlist([], 'a', {'nr' : 2, 'idx' : 2})
2310 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 3})
2311 Xolder 2
2312 Xopen
2313 call assert_equal(3, line('.'))
2314 Xnewer
2315 call assert_equal(2, line('.'))
2316 Xnewer
2317 call assert_equal(2, line('.'))
2318 " Update the current index with the quickfix window open
2319 wincmd w
2320 call g:Xsetlist([], 'a', {'nr' : 3, 'idx' : 3})
2321 Xopen
2322 call assert_equal(3, line('.'))
2323 Xclose
2324
2325 " Set the current index to the last entry
2326 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : '$'})
2327 call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
2328 " A large value should set the index to the last index
2329 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 1})
2330 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 999})
2331 call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
2332 " Invalid index values
2333 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : -1})
2334 call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
2335 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 0})
2336 call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
2337 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 'xx'})
2338 call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
2339 call assert_fails("call g:Xsetlist([], 'a', {'nr':1, 'idx':[]})", 'E745:')
2340
2341 call g:Xsetlist([], 'f')
2342 new | only
2343endfunc
2344
2345func Test_setqfidx()
2346 call Xtest_setqfidx('c')
2347 call Xtest_setqfidx('l')
2348endfunc
2349
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002350" Tests for the QuickFixCmdPre/QuickFixCmdPost autocommands
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002351func QfAutoCmdHandler(loc, cmd)
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002352 call add(g:acmds, a:loc . a:cmd)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002353endfunc
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002354
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002355func Test_Autocmd()
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002356 autocmd QuickFixCmdPre * call QfAutoCmdHandler('pre', expand('<amatch>'))
2357 autocmd QuickFixCmdPost * call QfAutoCmdHandler('post', expand('<amatch>'))
2358
2359 let g:acmds = []
2360 cexpr "F1:10:Line 10"
2361 caddexpr "F1:20:Line 20"
2362 cgetexpr "F1:30:Line 30"
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002363 cexpr ""
2364 caddexpr ""
2365 cgetexpr ""
2366 silent! cexpr non_existing_func()
2367 silent! caddexpr non_existing_func()
2368 silent! cgetexpr non_existing_func()
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002369 let l = ['precexpr',
2370 \ 'postcexpr',
2371 \ 'precaddexpr',
2372 \ 'postcaddexpr',
2373 \ 'precgetexpr',
2374 \ 'postcgetexpr',
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002375 \ 'precexpr',
2376 \ 'postcexpr',
2377 \ 'precaddexpr',
2378 \ 'postcaddexpr',
2379 \ 'precgetexpr',
2380 \ 'postcgetexpr',
2381 \ 'precexpr',
2382 \ 'precaddexpr',
2383 \ 'precgetexpr']
2384 call assert_equal(l, g:acmds)
2385
2386 let g:acmds = []
2387 enew! | call append(0, "F2:10:Line 10")
2388 cbuffer!
2389 enew! | call append(0, "F2:20:Line 20")
2390 cgetbuffer
2391 enew! | call append(0, "F2:30:Line 30")
2392 caddbuffer
2393 new
2394 let bnum = bufnr('%')
2395 bunload
2396 exe 'silent! cbuffer! ' . bnum
2397 exe 'silent! cgetbuffer ' . bnum
2398 exe 'silent! caddbuffer ' . bnum
2399 enew!
2400 let l = ['precbuffer',
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002401 \ 'postcbuffer',
2402 \ 'precgetbuffer',
2403 \ 'postcgetbuffer',
2404 \ 'precaddbuffer',
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002405 \ 'postcaddbuffer',
2406 \ 'precbuffer',
2407 \ 'precgetbuffer',
2408 \ 'precaddbuffer']
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002409 call assert_equal(l, g:acmds)
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002410
2411 call writefile(['Xtest:1:Line1'], 'Xtest')
2412 call writefile([], 'Xempty')
2413 let g:acmds = []
2414 cfile Xtest
2415 caddfile Xtest
2416 cgetfile Xtest
2417 cfile Xempty
2418 caddfile Xempty
2419 cgetfile Xempty
2420 silent! cfile do_not_exist
2421 silent! caddfile do_not_exist
2422 silent! cgetfile do_not_exist
2423 let l = ['precfile',
2424 \ 'postcfile',
2425 \ 'precaddfile',
2426 \ 'postcaddfile',
2427 \ 'precgetfile',
2428 \ 'postcgetfile',
2429 \ 'precfile',
2430 \ 'postcfile',
2431 \ 'precaddfile',
2432 \ 'postcaddfile',
2433 \ 'precgetfile',
2434 \ 'postcgetfile',
2435 \ 'precfile',
2436 \ 'postcfile',
2437 \ 'precaddfile',
2438 \ 'postcaddfile',
2439 \ 'precgetfile',
2440 \ 'postcgetfile']
2441 call assert_equal(l, g:acmds)
2442
2443 let g:acmds = []
2444 helpgrep quickfix
2445 silent! helpgrep non_existing_help_topic
2446 vimgrep test Xtest
2447 vimgrepadd test Xtest
2448 silent! vimgrep non_existing_test Xtest
2449 silent! vimgrepadd non_existing_test Xtest
2450 set makeprg=
2451 silent! make
2452 set makeprg&
2453 let l = ['prehelpgrep',
2454 \ 'posthelpgrep',
2455 \ 'prehelpgrep',
2456 \ 'posthelpgrep',
2457 \ 'previmgrep',
2458 \ 'postvimgrep',
2459 \ 'previmgrepadd',
2460 \ 'postvimgrepadd',
2461 \ 'previmgrep',
2462 \ 'postvimgrep',
2463 \ 'previmgrepadd',
2464 \ 'postvimgrepadd',
2465 \ 'premake',
2466 \ 'postmake']
2467 call assert_equal(l, g:acmds)
2468
2469 if has('unix')
2470 " Run this test only on Unix-like systems. The grepprg may not be set on
2471 " non-Unix systems.
2472 " The following lines are used for the grep test. Don't remove.
2473 " Grep_Autocmd_Text: Match 1
2474 " GrepAdd_Autocmd_Text: Match 2
2475 let g:acmds = []
2476 silent grep Grep_Autocmd_Text test_quickfix.vim
2477 silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim
2478 silent grep abc123def Xtest
2479 silent grepadd abc123def Xtest
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +01002480 set grepprg=internal
2481 silent grep Grep_Autocmd_Text test_quickfix.vim
2482 silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim
2483 silent lgrep Grep_Autocmd_Text test_quickfix.vim
2484 silent lgrepadd GrepAdd_Autocmd_Text test_quickfix.vim
2485 set grepprg&vim
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002486 let l = ['pregrep',
2487 \ 'postgrep',
2488 \ 'pregrepadd',
2489 \ 'postgrepadd',
2490 \ 'pregrep',
2491 \ 'postgrep',
2492 \ 'pregrepadd',
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +01002493 \ 'postgrepadd',
2494 \ 'pregrep',
2495 \ 'postgrep',
2496 \ 'pregrepadd',
2497 \ 'postgrepadd',
2498 \ 'prelgrep',
2499 \ 'postlgrep',
2500 \ 'prelgrepadd',
2501 \ 'postlgrepadd']
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002502 call assert_equal(l, g:acmds)
2503 endif
2504
2505 call delete('Xtest')
2506 call delete('Xempty')
Bram Moolenaarb254af32017-12-18 19:48:58 +01002507 au! QuickFixCmdPre
2508 au! QuickFixCmdPost
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002509endfunc
Bram Moolenaar21662be2016-11-06 14:46:44 +01002510
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002511func Test_Autocmd_Exception()
Bram Moolenaar21662be2016-11-06 14:46:44 +01002512 set efm=%m
2513 lgetexpr '?'
2514
2515 try
2516 call DoesNotExit()
2517 catch
2518 lgetexpr '1'
2519 finally
2520 lgetexpr '1'
2521 endtry
2522
2523 call assert_equal('1', getloclist(0)[0].text)
2524
2525 set efm&vim
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002526endfunc
Bram Moolenaar63bed3d2016-11-12 15:36:54 +01002527
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002528func Test_caddbuffer_wrong()
2529 " This used to cause a memory access in freed memory.
Bram Moolenaar63bed3d2016-11-12 15:36:54 +01002530 let save_efm = &efm
2531 set efm=%EEEE%m,%WWWW,%+CCCC%>%#,%GGGG%.#
2532 cgetexpr ['WWWW', 'EEEE', 'CCCC']
2533 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002534 caddbuffer
Bram Moolenaar63bed3d2016-11-12 15:36:54 +01002535 bwipe!
2536endfunc
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002537
2538func Test_caddexpr_wrong()
2539 " This used to cause a memory access in freed memory.
2540 cbuffer
2541 cbuffer
2542 copen
2543 let save_efm = &efm
2544 set efm=%
2545 call assert_fails('caddexpr ""', 'E376:')
2546 let &efm = save_efm
2547endfunc
Bram Moolenaar7618e002016-11-13 15:09:26 +01002548
2549func Test_dirstack_cleanup()
2550 " This used to cause a memory access in freed memory.
2551 let save_efm = &efm
2552 lexpr '0'
2553 lopen
2554 fun X(c)
2555 let save_efm=&efm
2556 set efm=%D%f
2557 if a:c == 'c'
2558 caddexpr '::'
2559 else
2560 laddexpr ':0:0'
2561 endif
2562 let &efm=save_efm
2563 endfun
2564 call X('c')
2565 call X('l')
2566 call setqflist([], 'r')
2567 caddbuffer
2568 let &efm = save_efm
2569endfunc
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01002570
2571" Tests for jumping to entries from the location list window and quickfix
2572" window
2573func Test_cwindow_jump()
2574 set efm=%f%%%l%%%m
2575 lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2576 lopen | only
2577 lfirst
2578 call assert_true(winnr('$') == 2)
2579 call assert_true(winnr() == 1)
2580 " Location list for the new window should be set
2581 call assert_true(getloclist(0)[2].text == 'Line 30')
2582
2583 " Open a scratch buffer
2584 " Open a new window and create a location list
2585 " Open the location list window and close the other window
2586 " Jump to an entry.
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01002587 " Should create a new window and jump to the entry. The scratch buffer
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01002588 " should not be used.
2589 enew | only
2590 set buftype=nofile
2591 below new
2592 lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2593 lopen
2594 2wincmd c
2595 lnext
2596 call assert_true(winnr('$') == 3)
2597 call assert_true(winnr() == 2)
2598
2599 " Open two windows with two different location lists
2600 " Open the location list window and close the previous window
2601 " Jump to an entry in the location list window
2602 " Should open the file in the first window and not set the location list.
2603 enew | only
2604 lgetexpr ["F1%5%Line 5"]
2605 below new
2606 lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2607 lopen
2608 2wincmd c
2609 lnext
2610 call assert_true(winnr() == 1)
2611 call assert_true(getloclist(0)[0].text == 'Line 5')
2612
2613 enew | only
2614 cgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2615 copen
2616 cnext
2617 call assert_true(winnr('$') == 2)
2618 call assert_true(winnr() == 1)
2619
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01002620 " open the quickfix buffer in two windows and jump to an entry. Should open
2621 " the file in the first quickfix window.
2622 enew | only
2623 copen
2624 let bnum = bufnr('')
2625 exe 'sbuffer ' . bnum
2626 wincmd b
2627 cfirst
2628 call assert_equal(2, winnr())
2629 call assert_equal('F1', bufname(''))
2630 enew | only
2631 exe 'sb' bnum
2632 exe 'botright sb' bnum
2633 wincmd t
2634 clast
2635 call assert_equal(2, winnr())
2636 call assert_equal('quickfix', getwinvar(1, '&buftype'))
2637 call assert_equal('quickfix', getwinvar(3, '&buftype'))
2638
Bram Moolenaar4b96df52020-01-26 22:00:26 +01002639 " Jumping to a file from the location list window should find a usable
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +01002640 " window by wrapping around the window list.
2641 enew | only
2642 call setloclist(0, [], 'f')
2643 new | new
2644 lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2645 lopen
2646 1close
2647 call assert_equal(0, getloclist(3, {'id' : 0}).id)
2648 lnext
2649 call assert_equal(3, winnr())
2650 call assert_equal(getloclist(1, {'id' : 0}).id, getloclist(3, {'id' : 0}).id)
2651
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01002652 enew | only
2653 set efm&vim
2654endfunc
Bram Moolenaaree85df32017-03-19 14:19:50 +01002655
Bram Moolenaare00fdf32019-09-15 19:09:42 +02002656func Test_cwindow_highlight()
2657 CheckScreendump
2658
2659 let lines =<< trim END
2660 set t_u7=
2661 call setline(1, ['some', 'text', 'with', 'matches'])
2662 write XCwindow
2663 vimgrep e XCwindow
2664 redraw
2665 cwindow 4
2666 END
2667 call writefile(lines, 'XtestCwindow')
2668 let buf = RunVimInTerminal('-S XtestCwindow', #{rows: 12})
2669 call VerifyScreenDump(buf, 'Test_quickfix_cwindow_1', {})
2670
2671 call term_sendkeys(buf, ":cnext\<CR>")
2672 call VerifyScreenDump(buf, 'Test_quickfix_cwindow_2', {})
2673
2674 " clean up
2675 call StopVimInTerminal(buf)
2676 call delete('XtestCwindow')
2677 call delete('XCwindow')
2678endfunc
2679
Bram Moolenaaree85df32017-03-19 14:19:50 +01002680func XvimgrepTests(cchar)
2681 call s:setup_commands(a:cchar)
2682
2683 call writefile(['Editor:VIM vim',
2684 \ 'Editor:Emacs EmAcS',
2685 \ 'Editor:Notepad NOTEPAD'], 'Xtestfile1')
2686 call writefile(['Linux', 'MacOS', 'MS-Windows'], 'Xtestfile2')
2687
2688 " Error cases
2689 call assert_fails('Xvimgrep /abc *', 'E682:')
2690
2691 let @/=''
2692 call assert_fails('Xvimgrep // *', 'E35:')
2693
2694 call assert_fails('Xvimgrep abc', 'E683:')
2695 call assert_fails('Xvimgrep a1b2c3 Xtestfile1', 'E480:')
2696 call assert_fails('Xvimgrep pat Xa1b2c3', 'E480:')
2697
2698 Xexpr ""
2699 Xvimgrepadd Notepad Xtestfile1
2700 Xvimgrepadd MacOS Xtestfile2
2701 let l = g:Xgetlist()
2702 call assert_equal(2, len(l))
2703 call assert_equal('Editor:Notepad NOTEPAD', l[0].text)
2704
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01002705 10Xvimgrep #\cvim#g Xtestfile?
Bram Moolenaaree85df32017-03-19 14:19:50 +01002706 let l = g:Xgetlist()
2707 call assert_equal(2, len(l))
2708 call assert_equal(8, l[0].col)
2709 call assert_equal(12, l[1].col)
2710
2711 1Xvimgrep ?Editor? Xtestfile*
2712 let l = g:Xgetlist()
2713 call assert_equal(1, len(l))
2714 call assert_equal('Editor:VIM vim', l[0].text)
2715
2716 edit +3 Xtestfile2
2717 Xvimgrep +\cemacs+j Xtestfile1
2718 let l = g:Xgetlist()
2719 call assert_equal('Xtestfile2', bufname(''))
2720 call assert_equal('Editor:Emacs EmAcS', l[0].text)
2721
Bram Moolenaar2225ebb2018-04-24 15:48:11 +02002722 " Test for unloading a buffer after vimgrep searched the buffer
2723 %bwipe
2724 Xvimgrep /Editor/j Xtestfile*
2725 call assert_equal(0, getbufinfo('Xtestfile1')[0].loaded)
2726 call assert_equal([], getbufinfo('Xtestfile2'))
2727
Bram Moolenaar07ada5f2020-02-05 20:38:22 +01002728 " Test with the last search pattern not set
2729 call test_clear_search_pat()
2730 call assert_fails('Xvimgrep // *', 'E35:')
2731
Bram Moolenaaree85df32017-03-19 14:19:50 +01002732 call delete('Xtestfile1')
2733 call delete('Xtestfile2')
2734endfunc
2735
2736" Tests for the :vimgrep command
2737func Test_vimgrep()
2738 call XvimgrepTests('c')
2739 call XvimgrepTests('l')
2740endfunc
Bram Moolenaar69f40be2017-04-02 15:15:49 +02002741
Bram Moolenaar1c299432018-10-28 14:36:09 +01002742" Test for incsearch highlighting of the :vimgrep pattern
2743" This test used to cause "E315: ml_get: invalid lnum" errors.
2744func Test_vimgrep_incsearch()
2745 enew
2746 set incsearch
2747 call test_override("char_avail", 1)
2748
2749 call feedkeys(":2vimgrep assert test_quickfix.vim test_cdo.vim\<CR>", "ntx")
2750 let l = getqflist()
2751 call assert_equal(2, len(l))
2752
2753 call test_override("ALL", 0)
2754 set noincsearch
2755endfunc
2756
Bram Moolenaar69f40be2017-04-02 15:15:49 +02002757func XfreeTests(cchar)
2758 call s:setup_commands(a:cchar)
2759
2760 enew | only
2761
2762 " Deleting the quickfix stack should work even When the current list is
2763 " somewhere in the middle of the stack
2764 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2765 Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
2766 Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
2767 Xolder
2768 call g:Xsetlist([], 'f')
2769 call assert_equal(0, len(g:Xgetlist()))
2770
2771 " After deleting the stack, adding a new list should create a stack with a
2772 " single list.
2773 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2774 call assert_equal(1, g:Xgetlist({'all':1}).nr)
2775
2776 " Deleting the stack from a quickfix window should update/clear the
2777 " quickfix/location list window.
2778 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2779 Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
2780 Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
2781 Xolder
2782 Xwindow
2783 call g:Xsetlist([], 'f')
2784 call assert_equal(2, winnr('$'))
2785 call assert_equal(1, line('$'))
2786 Xclose
2787
2788 " Deleting the stack from a non-quickfix window should update/clear the
2789 " quickfix/location list window.
2790 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2791 Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
2792 Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
2793 Xolder
2794 Xwindow
2795 wincmd p
2796 call g:Xsetlist([], 'f')
2797 call assert_equal(0, len(g:Xgetlist()))
2798 wincmd p
2799 call assert_equal(2, winnr('$'))
2800 call assert_equal(1, line('$'))
2801
2802 " After deleting the location list stack, if the location list window is
2803 " opened, then a new location list should be created. So opening the
2804 " location list window again should not create a new window.
2805 if a:cchar == 'l'
2806 lexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2807 wincmd p
2808 lopen
2809 call assert_equal(2, winnr('$'))
2810 endif
2811 Xclose
2812endfunc
2813
Bram Moolenaar74240d32017-12-10 15:26:15 +01002814" Tests for the quickfix free functionality
Bram Moolenaar69f40be2017-04-02 15:15:49 +02002815func Test_qf_free()
2816 call XfreeTests('c')
2817 call XfreeTests('l')
2818endfunc
Bram Moolenaar6e62da32017-05-28 08:16:25 +02002819
2820" Test for buffer overflow when parsing lines and adding new entries to
2821" the quickfix list.
2822func Test_bufoverflow()
2823 set efm=%f:%l:%m
2824 cgetexpr ['File1:100:' . repeat('x', 1025)]
2825
2826 set efm=%+GCompiler:\ %.%#,%f:%l:%m
2827 cgetexpr ['Compiler: ' . repeat('a', 1015), 'File1:10:Hello World']
2828
2829 set efm=%DEntering\ directory\ %f,%f:%l:%m
2830 cgetexpr ['Entering directory ' . repeat('a', 1006),
2831 \ 'File1:10:Hello World']
2832 set efm&vim
2833endfunc
2834
Bram Moolenaar875feea2017-06-11 16:07:51 +02002835" Tests for getting the quickfix stack size
2836func XsizeTests(cchar)
2837 call s:setup_commands(a:cchar)
2838
2839 call g:Xsetlist([], 'f')
2840 call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
Bram Moolenaara6d48492017-12-12 22:45:31 +01002841 call assert_equal('', g:Xgetlist({'nr':'$', 'all':1}).title)
2842 call assert_equal(0, g:Xgetlist({'nr':0}).nr)
Bram Moolenaar875feea2017-06-11 16:07:51 +02002843
2844 Xexpr "File1:10:Line1"
2845 Xexpr "File2:20:Line2"
2846 Xexpr "File3:30:Line3"
2847 Xolder | Xolder
2848 call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
2849 call g:Xsetlist([], 'f')
2850
2851 Xexpr "File1:10:Line1"
2852 Xexpr "File2:20:Line2"
2853 Xexpr "File3:30:Line3"
2854 Xolder | Xolder
2855 call g:Xsetlist([], 'a', {'nr':'$', 'title':'Compiler'})
2856 call assert_equal('Compiler', g:Xgetlist({'nr':3, 'all':1}).title)
2857endfunc
2858
2859func Test_Qf_Size()
2860 call XsizeTests('c')
2861 call XsizeTests('l')
2862endfunc
Bram Moolenaar18141832017-06-25 21:17:25 +02002863
Bram Moolenaar9c4feff2017-06-28 22:26:54 +02002864func Test_cclose_from_copen()
2865 augroup QF_Test
2866 au!
2867 au FileType qf :call assert_fails(':cclose', 'E788')
2868 augroup END
2869 copen
2870 augroup QF_Test
2871 au!
2872 augroup END
2873 augroup! QF_Test
2874endfunc
2875
Bram Moolenaar18141832017-06-25 21:17:25 +02002876func Test_cclose_in_autocmd()
2877 " Problem is only triggered if "starting" is zero, so that the OptionsSet
2878 " event will be triggered.
2879 call test_override('starting', 1)
2880 augroup QF_Test
2881 au!
2882 au FileType qf :call assert_fails(':cclose', 'E788')
2883 augroup END
2884 copen
2885 augroup QF_Test
2886 au!
2887 augroup END
2888 augroup! QF_Test
2889 call test_override('starting', 0)
2890endfunc
Bram Moolenaar9c4feff2017-06-28 22:26:54 +02002891
Bram Moolenaar379fb762018-08-30 15:58:28 +02002892" Check that ":file" without an argument is possible even when "curbuf_lock"
2893" is set.
2894func Test_file_from_copen()
2895 " Works without argument.
2896 augroup QF_Test
2897 au!
2898 au FileType qf file
2899 augroup END
2900 copen
2901
2902 augroup QF_Test
2903 au!
2904 augroup END
2905 cclose
2906
2907 " Fails with argument.
2908 augroup QF_Test
2909 au!
2910 au FileType qf call assert_fails(':file foo', 'E788')
2911 augroup END
2912 copen
2913 augroup QF_Test
2914 au!
2915 augroup END
2916 cclose
2917
2918 augroup! QF_Test
Bram Moolenaar6a0cc912019-10-26 16:48:44 +02002919endfunc
Bram Moolenaar379fb762018-08-30 15:58:28 +02002920
Bram Moolenaar9c4feff2017-06-28 22:26:54 +02002921func Test_resize_from_copen()
2922 augroup QF_Test
2923 au!
2924 au FileType qf resize 5
2925 augroup END
2926 try
2927 " This should succeed without any exception. No other buffers are
2928 " involved in the autocmd.
2929 copen
2930 finally
2931 augroup QF_Test
2932 au!
2933 augroup END
2934 augroup! QF_Test
2935 endtry
2936endfunc
Bram Moolenaara8788f42017-07-19 17:06:20 +02002937
2938" Tests for the quickfix buffer b:changedtick variable
2939func Xchangedtick_tests(cchar)
2940 call s:setup_commands(a:cchar)
2941
2942 new | only
2943
2944 Xexpr "" | Xexpr "" | Xexpr ""
2945
2946 Xopen
2947 Xolder
2948 Xolder
2949 Xaddexpr "F1:10:Line10"
2950 Xaddexpr "F2:20:Line20"
2951 call g:Xsetlist([{"filename":"F3", "lnum":30, "text":"Line30"}], 'a')
2952 call g:Xsetlist([], 'f')
2953 call assert_equal(8, getbufvar('%', 'changedtick'))
2954 Xclose
2955endfunc
2956
2957func Test_changedtick()
Bram Moolenaarae338332017-08-11 20:25:26 +02002958 call Xchangedtick_tests('c')
2959 call Xchangedtick_tests('l')
2960endfunc
2961
2962" Tests for parsing an expression using setqflist()
2963func Xsetexpr_tests(cchar)
2964 call s:setup_commands(a:cchar)
2965
2966 let t = ["File1:10:Line10", "File1:20:Line20"]
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002967 call g:Xsetlist([], ' ', {'lines' : t})
2968 call g:Xsetlist([], 'a', {'lines' : ["File1:30:Line30"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02002969
2970 let l = g:Xgetlist()
2971 call assert_equal(3, len(l))
2972 call assert_equal(20, l[1].lnum)
2973 call assert_equal('Line30', l[2].text)
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002974 call g:Xsetlist([], 'r', {'lines' : ["File2:5:Line5"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02002975 let l = g:Xgetlist()
2976 call assert_equal(1, len(l))
2977 call assert_equal('Line5', l[0].text)
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002978 call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : 10}))
2979 call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : "F1:10:L10"}))
Bram Moolenaarae338332017-08-11 20:25:26 +02002980
2981 call g:Xsetlist([], 'f')
2982 " Add entries to multiple lists
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002983 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:10:Line10"]})
2984 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:20:Line20"]})
2985 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:15:Line15"]})
2986 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:25:Line25"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02002987 call assert_equal('Line15', g:Xgetlist({'nr':1, 'items':1}).items[1].text)
2988 call assert_equal('Line25', g:Xgetlist({'nr':2, 'items':1}).items[1].text)
Bram Moolenaar36538222017-09-02 19:51:44 +02002989
2990 " Adding entries using a custom efm
2991 set efm&
2992 call g:Xsetlist([], ' ', {'efm' : '%f#%l#%m',
2993 \ 'lines' : ["F1#10#L10", "F2#20#L20"]})
2994 call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
2995 call g:Xsetlist([], 'a', {'efm' : '%f#%l#%m', 'lines' : ["F3:30:L30"]})
2996 call assert_equal('F3:30:L30', g:Xgetlist({'items':1}).items[2].text)
2997 call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
2998 call assert_equal(-1, g:Xsetlist([], 'a', {'efm' : [],
2999 \ 'lines' : ['F1:10:L10']}))
Bram Moolenaarae338332017-08-11 20:25:26 +02003000endfunc
3001
3002func Test_setexpr()
3003 call Xsetexpr_tests('c')
3004 call Xsetexpr_tests('l')
3005endfunc
3006
3007" Tests for per quickfix/location list directory stack
3008func Xmultidirstack_tests(cchar)
3009 call s:setup_commands(a:cchar)
3010
3011 call g:Xsetlist([], 'f')
3012 Xexpr "" | Xexpr ""
3013
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003014 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["Entering dir 'Xone/a'"]})
3015 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["Entering dir 'Xtwo/a'"]})
3016 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["one.txt:3:one one one"]})
3017 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["two.txt:5:two two two"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02003018
3019 let l1 = g:Xgetlist({'nr':1, 'items':1})
3020 let l2 = g:Xgetlist({'nr':2, 'items':1})
3021 call assert_equal('Xone/a/one.txt', bufname(l1.items[1].bufnr))
3022 call assert_equal(3, l1.items[1].lnum)
3023 call assert_equal('Xtwo/a/two.txt', bufname(l2.items[1].bufnr))
3024 call assert_equal(5, l2.items[1].lnum)
3025endfunc
3026
3027func Test_multidirstack()
3028 call mkdir('Xone/a', 'p')
3029 call mkdir('Xtwo/a', 'p')
3030 let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
3031 call writefile(lines, 'Xone/a/one.txt')
3032 call writefile(lines, 'Xtwo/a/two.txt')
3033 let save_efm = &efm
3034 set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
3035
3036 call Xmultidirstack_tests('c')
3037 call Xmultidirstack_tests('l')
3038
3039 let &efm = save_efm
3040 call delete('Xone', 'rf')
3041 call delete('Xtwo', 'rf')
3042endfunc
3043
3044" Tests for per quickfix/location list file stack
3045func Xmultifilestack_tests(cchar)
3046 call s:setup_commands(a:cchar)
3047
3048 call g:Xsetlist([], 'f')
3049 Xexpr "" | Xexpr ""
3050
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003051 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["[one.txt]"]})
3052 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["[two.txt]"]})
3053 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["(3,5) one one one"]})
3054 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["(5,9) two two two"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02003055
3056 let l1 = g:Xgetlist({'nr':1, 'items':1})
3057 let l2 = g:Xgetlist({'nr':2, 'items':1})
3058 call assert_equal('one.txt', bufname(l1.items[1].bufnr))
3059 call assert_equal(3, l1.items[1].lnum)
3060 call assert_equal('two.txt', bufname(l2.items[1].bufnr))
3061 call assert_equal(5, l2.items[1].lnum)
Bram Moolenaare333e792018-04-08 13:27:39 +02003062
3063 " Test for start of a new error line in the same line where a previous
3064 " error line ends with a file stack.
3065 let efm_val = 'Error\ l%l\ in\ %f,'
3066 let efm_val .= '%-P%>(%f%r,Error\ l%l\ in\ %m,%-Q)%r'
3067 let l = g:Xgetlist({'lines' : [
3068 \ '(one.txt',
3069 \ 'Error l4 in one.txt',
3070 \ ') (two.txt',
3071 \ 'Error l6 in two.txt',
3072 \ ')',
3073 \ 'Error l8 in one.txt'
3074 \ ], 'efm' : efm_val})
3075 call assert_equal(3, len(l.items))
3076 call assert_equal('one.txt', bufname(l.items[0].bufnr))
3077 call assert_equal(4, l.items[0].lnum)
3078 call assert_equal('one.txt', l.items[0].text)
3079 call assert_equal('two.txt', bufname(l.items[1].bufnr))
3080 call assert_equal(6, l.items[1].lnum)
3081 call assert_equal('two.txt', l.items[1].text)
3082 call assert_equal('one.txt', bufname(l.items[2].bufnr))
3083 call assert_equal(8, l.items[2].lnum)
3084 call assert_equal('', l.items[2].text)
Bram Moolenaarae338332017-08-11 20:25:26 +02003085endfunc
3086
3087func Test_multifilestack()
3088 let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
3089 call writefile(lines, 'one.txt')
3090 call writefile(lines, 'two.txt')
3091 let save_efm = &efm
3092 set efm=%+P[%f],(%l\\,%c)\ %m,%-Q
3093
3094 call Xmultifilestack_tests('c')
3095 call Xmultifilestack_tests('l')
3096
3097 let &efm = save_efm
3098 call delete('one.txt')
3099 call delete('two.txt')
3100endfunc
3101
3102" Tests for per buffer 'efm' setting
3103func Test_perbuf_efm()
3104 call writefile(["File1-10-Line10"], 'one.txt')
3105 call writefile(["File2#20#Line20"], 'two.txt')
3106 set efm=%f#%l#%m
3107 new | only
3108 new
3109 setlocal efm=%f-%l-%m
3110 cfile one.txt
3111 wincmd w
3112 caddfile two.txt
3113
3114 let l = getqflist()
3115 call assert_equal(10, l[0].lnum)
3116 call assert_equal('Line20', l[1].text)
3117
3118 set efm&
3119 new | only
3120 call delete('one.txt')
3121 call delete('two.txt')
Bram Moolenaara8788f42017-07-19 17:06:20 +02003122endfunc
Bram Moolenaard28cc3f2017-07-27 22:03:50 +02003123
3124" Open multiple help windows using ":lhelpgrep
3125" This test used to crash Vim
3126func Test_Multi_LL_Help()
3127 new | only
3128 lhelpgrep window
3129 lopen
3130 e#
3131 lhelpgrep buffer
3132 call assert_equal(3, winnr('$'))
3133 call assert_true(len(getloclist(1)) != 0)
3134 call assert_true(len(getloclist(2)) != 0)
3135 new | only
3136endfunc
Bram Moolenaar55b69262017-08-13 13:42:01 +02003137
3138" Tests for adding new quickfix lists using setqflist()
3139func XaddQf_tests(cchar)
3140 call s:setup_commands(a:cchar)
3141
3142 " Create a new list using ' ' for action
3143 call g:Xsetlist([], 'f')
3144 call g:Xsetlist([], ' ', {'title' : 'Test1'})
3145 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3146 call assert_equal(1, l.nr)
3147 call assert_equal('Test1', l.title)
3148
3149 " Create a new list using ' ' for action and '$' for 'nr'
3150 call g:Xsetlist([], 'f')
3151 call g:Xsetlist([], ' ', {'title' : 'Test2', 'nr' : '$'})
3152 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3153 call assert_equal(1, l.nr)
3154 call assert_equal('Test2', l.title)
3155
3156 " Create a new list using 'a' for action
3157 call g:Xsetlist([], 'f')
3158 call g:Xsetlist([], 'a', {'title' : 'Test3'})
3159 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3160 call assert_equal(1, l.nr)
3161 call assert_equal('Test3', l.title)
3162
3163 " Create a new list using 'a' for action and '$' for 'nr'
3164 call g:Xsetlist([], 'f')
3165 call g:Xsetlist([], 'a', {'title' : 'Test3', 'nr' : '$'})
3166 call g:Xsetlist([], 'a', {'title' : 'Test4'})
3167 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3168 call assert_equal(1, l.nr)
3169 call assert_equal('Test4', l.title)
3170
3171 " Adding a quickfix list should remove all the lists following the current
3172 " list.
3173 Xexpr "" | Xexpr "" | Xexpr ""
3174 silent! 10Xolder
3175 call g:Xsetlist([], ' ', {'title' : 'Test5'})
3176 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3177 call assert_equal(2, l.nr)
3178 call assert_equal('Test5', l.title)
3179
3180 " Add a quickfix list using '$' as the list number.
3181 let lastqf = g:Xgetlist({'nr':'$'}).nr
3182 silent! 99Xolder
3183 call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test6'})
3184 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3185 call assert_equal(lastqf + 1, l.nr)
3186 call assert_equal('Test6', l.title)
3187
3188 " Add a quickfix list using 'nr' set to one more than the quickfix
3189 " list size.
3190 let lastqf = g:Xgetlist({'nr':'$'}).nr
3191 silent! 99Xolder
3192 call g:Xsetlist([], ' ', {'nr' : lastqf + 1, 'title' : 'Test7'})
3193 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3194 call assert_equal(lastqf + 1, l.nr)
3195 call assert_equal('Test7', l.title)
3196
3197 " Add a quickfix list to a stack with 10 lists using 'nr' set to '$'
3198 exe repeat('Xexpr "" |', 9) . 'Xexpr ""'
3199 silent! 99Xolder
3200 call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test8'})
3201 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3202 call assert_equal(10, l.nr)
3203 call assert_equal('Test8', l.title)
3204
3205 " Add a quickfix list using 'nr' set to a value greater than 10
3206 call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 12, 'title' : 'Test9'}))
3207
3208 " Try adding a quickfix list with 'nr' set to a value greater than the
3209 " quickfix list size but less than 10.
3210 call g:Xsetlist([], 'f')
3211 Xexpr "" | Xexpr "" | Xexpr ""
3212 silent! 99Xolder
3213 call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 8, 'title' : 'Test10'}))
3214
3215 " Add a quickfix list using 'nr' set to a some string or list
3216 call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : [1,2], 'title' : 'Test11'}))
3217endfunc
3218
3219func Test_add_qf()
3220 call XaddQf_tests('c')
3221 call XaddQf_tests('l')
3222endfunc
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02003223
3224" Test for getting the quickfix list items from some text without modifying
3225" the quickfix stack
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003226func XgetListFromLines(cchar)
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02003227 call s:setup_commands(a:cchar)
3228 call g:Xsetlist([], 'f')
3229
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003230 let l = g:Xgetlist({'lines' : ["File2:20:Line20", "File2:30:Line30"]}).items
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02003231 call assert_equal(2, len(l))
3232 call assert_equal(30, l[1].lnum)
3233
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003234 call assert_equal({}, g:Xgetlist({'lines' : 10}))
3235 call assert_equal({}, g:Xgetlist({'lines' : 'File1:10:Line10'}))
3236 call assert_equal([], g:Xgetlist({'lines' : []}).items)
3237 call assert_equal([], g:Xgetlist({'lines' : [10, 20]}).items)
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02003238
Bram Moolenaar36538222017-09-02 19:51:44 +02003239 " Parse text using a custom efm
3240 set efm&
3241 let l = g:Xgetlist({'lines':['File3#30#Line30'], 'efm' : '%f#%l#%m'}).items
3242 call assert_equal('Line30', l[0].text)
3243 let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : '%f-%l-%m'}).items
3244 call assert_equal('File3:30:Line30', l[0].text)
3245 let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : [1,2]})
3246 call assert_equal({}, l)
3247 call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':'%2'})", 'E376:')
3248 call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':''})", 'E378:')
3249
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02003250 " Make sure that the quickfix stack is not modified
3251 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
3252endfunc
3253
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003254func Test_get_list_from_lines()
3255 call XgetListFromLines('c')
3256 call XgetListFromLines('l')
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02003257endfunc
Bram Moolenaara539f4f2017-08-30 20:33:55 +02003258
3259" Tests for the quickfix list id
3260func Xqfid_tests(cchar)
3261 call s:setup_commands(a:cchar)
3262
3263 call g:Xsetlist([], 'f')
Bram Moolenaara6d48492017-12-12 22:45:31 +01003264 call assert_equal(0, g:Xgetlist({'id':0}).id)
Bram Moolenaara539f4f2017-08-30 20:33:55 +02003265 Xexpr ''
3266 let start_id = g:Xgetlist({'id' : 0}).id
3267 Xexpr '' | Xexpr ''
3268 Xolder
3269 call assert_equal(start_id, g:Xgetlist({'id':0, 'nr':1}).id)
3270 call assert_equal(start_id + 1, g:Xgetlist({'id':0, 'nr':0}).id)
3271 call assert_equal(start_id + 2, g:Xgetlist({'id':0, 'nr':'$'}).id)
Bram Moolenaara6d48492017-12-12 22:45:31 +01003272 call assert_equal(0, g:Xgetlist({'id':0, 'nr':99}).id)
Bram Moolenaara539f4f2017-08-30 20:33:55 +02003273 call assert_equal(2, g:Xgetlist({'id':start_id + 1, 'nr':0}).nr)
Bram Moolenaara6d48492017-12-12 22:45:31 +01003274 call assert_equal(0, g:Xgetlist({'id':99, 'nr':0}).id)
3275 call assert_equal(0, g:Xgetlist({'id':"abc", 'nr':0}).id)
Bram Moolenaara539f4f2017-08-30 20:33:55 +02003276
3277 call g:Xsetlist([], 'a', {'id':start_id, 'context':[1,2]})
3278 call assert_equal([1,2], g:Xgetlist({'nr':1, 'context':1}).context)
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003279 call g:Xsetlist([], 'a', {'id':start_id+1, 'lines':['F1:10:L10']})
Bram Moolenaara539f4f2017-08-30 20:33:55 +02003280 call assert_equal('L10', g:Xgetlist({'nr':2, 'items':1}).items[0].text)
3281 call assert_equal(-1, g:Xsetlist([], 'a', {'id':999, 'title':'Vim'}))
3282 call assert_equal(-1, g:Xsetlist([], 'a', {'id':'abc', 'title':'Vim'}))
3283
3284 let qfid = g:Xgetlist({'id':0, 'nr':0})
3285 call g:Xsetlist([], 'f')
Bram Moolenaara6d48492017-12-12 22:45:31 +01003286 call assert_equal(0, g:Xgetlist({'id':qfid, 'nr':0}).id)
Bram Moolenaara539f4f2017-08-30 20:33:55 +02003287endfunc
3288
3289func Test_qf_id()
3290 call Xqfid_tests('c')
3291 call Xqfid_tests('l')
3292endfunc
Bram Moolenaar74240d32017-12-10 15:26:15 +01003293
3294func Xqfjump_tests(cchar)
3295 call s:setup_commands(a:cchar)
3296
3297 call writefile(["Line1\tFoo", "Line2"], 'F1')
3298 call writefile(["Line1\tBar", "Line2"], 'F2')
3299 call writefile(["Line1\tBaz", "Line2"], 'F3')
3300
3301 call g:Xsetlist([], 'f')
3302
3303 " Tests for
3304 " Jumping to a line using a pattern
3305 " Jumping to a column greater than the last column in a line
3306 " Jumping to a line greater than the last line in the file
3307 let l = []
3308 for i in range(1, 7)
3309 call add(l, {})
3310 endfor
3311 let l[0].filename='F1'
3312 let l[0].pattern='Line1'
3313 let l[1].filename='F2'
3314 let l[1].pattern='Line1'
3315 let l[2].filename='F3'
3316 let l[2].pattern='Line1'
3317 let l[3].filename='F3'
3318 let l[3].lnum=1
3319 let l[3].col=9
3320 let l[3].vcol=1
3321 let l[4].filename='F3'
3322 let l[4].lnum=99
3323 let l[5].filename='F3'
3324 let l[5].lnum=1
3325 let l[5].col=99
3326 let l[5].vcol=1
3327 let l[6].filename='F3'
3328 let l[6].pattern='abcxyz'
3329
3330 call g:Xsetlist([], ' ', {'items' : l})
3331 Xopen | only
3332 2Xnext
3333 call assert_equal(3, g:Xgetlist({'idx' : 0}).idx)
3334 call assert_equal('F3', bufname('%'))
3335 Xnext
3336 call assert_equal(7, col('.'))
3337 Xnext
3338 call assert_equal(2, line('.'))
3339 Xnext
3340 call assert_equal(9, col('.'))
3341 2
3342 Xnext
3343 call assert_equal(2, line('.'))
3344
3345 if a:cchar == 'l'
3346 " When jumping to a location list entry in the location list window and
3347 " no usable windows are available, then a new window should be opened.
3348 enew! | new | only
3349 call g:Xsetlist([], 'f')
3350 setlocal buftype=nofile
3351 new
3352 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']})
3353 Xopen
3354 let winid = win_getid()
3355 wincmd p
3356 close
3357 call win_gotoid(winid)
3358 Xnext
3359 call assert_equal(3, winnr('$'))
3360 call assert_equal(1, winnr())
3361 call assert_equal(2, line('.'))
3362
3363 " When jumping to an entry in the location list window and the window
3364 " associated with the location list is not present and a window containing
3365 " the file is already present, then that window should be used.
3366 close
3367 belowright new
3368 call g:Xsetlist([], 'f')
3369 edit F3
3370 call win_gotoid(winid)
3371 Xlast
3372 call assert_equal(3, winnr())
3373 call assert_equal(6, g:Xgetlist({'size' : 1}).size)
3374 call assert_equal(winid, g:Xgetlist({'winid' : 1}).winid)
3375 endif
3376
3377 " Cleanup
3378 enew!
3379 new | only
3380
3381 call delete('F1')
3382 call delete('F2')
3383 call delete('F3')
3384endfunc
3385
3386func Test_qfjump()
3387 call Xqfjump_tests('c')
3388 call Xqfjump_tests('l')
3389endfunc
Bram Moolenaara6d48492017-12-12 22:45:31 +01003390
3391" Tests for the getqflist() and getloclist() functions when the list is not
3392" present or is empty
3393func Xgetlist_empty_tests(cchar)
3394 call s:setup_commands(a:cchar)
3395
3396 " Empty quickfix stack
3397 call g:Xsetlist([], 'f')
3398 call assert_equal('', g:Xgetlist({'context' : 0}).context)
3399 call assert_equal(0, g:Xgetlist({'id' : 0}).id)
3400 call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
3401 call assert_equal([], g:Xgetlist({'items' : 0}).items)
3402 call assert_equal(0, g:Xgetlist({'nr' : 0}).nr)
3403 call assert_equal(0, g:Xgetlist({'size' : 0}).size)
3404 call assert_equal('', g:Xgetlist({'title' : 0}).title)
3405 call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
Bram Moolenaarb254af32017-12-18 19:48:58 +01003406 call assert_equal(0, g:Xgetlist({'changedtick' : 0}).changedtick)
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003407 if a:cchar == 'c'
3408 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003409 \ 'items' : [], 'nr' : 0, 'size' : 0, 'qfbufnr' : 0,
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003410 \ 'title' : '', 'winid' : 0, 'changedtick': 0},
3411 \ g:Xgetlist({'all' : 0}))
3412 else
3413 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
3414 \ 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '',
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003415 \ 'winid' : 0, 'changedtick': 0, 'filewinid' : 0,
3416 \ 'qfbufnr' : 0},
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003417 \ g:Xgetlist({'all' : 0}))
3418 endif
Bram Moolenaara6d48492017-12-12 22:45:31 +01003419
Bram Moolenaar2ec364e2018-01-27 11:52:13 +01003420 " Quickfix window with empty stack
3421 silent! Xopen
3422 let qfwinid = (a:cchar == 'c') ? win_getid() : 0
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003423 let qfbufnr = (a:cchar == 'c') ? bufnr('') : 0
Bram Moolenaar2ec364e2018-01-27 11:52:13 +01003424 call assert_equal(qfwinid, g:Xgetlist({'winid' : 0}).winid)
3425 Xclose
3426
Bram Moolenaara6d48492017-12-12 22:45:31 +01003427 " Empty quickfix list
3428 Xexpr ""
3429 call assert_equal('', g:Xgetlist({'context' : 0}).context)
3430 call assert_notequal(0, g:Xgetlist({'id' : 0}).id)
3431 call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
3432 call assert_equal([], g:Xgetlist({'items' : 0}).items)
3433 call assert_notequal(0, g:Xgetlist({'nr' : 0}).nr)
3434 call assert_equal(0, g:Xgetlist({'size' : 0}).size)
3435 call assert_notequal('', g:Xgetlist({'title' : 0}).title)
3436 call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
Bram Moolenaarb254af32017-12-18 19:48:58 +01003437 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
Bram Moolenaara6d48492017-12-12 22:45:31 +01003438
3439 let qfid = g:Xgetlist({'id' : 0}).id
3440 call g:Xsetlist([], 'f')
3441
3442 " Non-existing quickfix identifier
3443 call assert_equal('', g:Xgetlist({'id' : qfid, 'context' : 0}).context)
3444 call assert_equal(0, g:Xgetlist({'id' : qfid}).id)
3445 call assert_equal(0, g:Xgetlist({'id' : qfid, 'idx' : 0}).idx)
3446 call assert_equal([], g:Xgetlist({'id' : qfid, 'items' : 0}).items)
3447 call assert_equal(0, g:Xgetlist({'id' : qfid, 'nr' : 0}).nr)
3448 call assert_equal(0, g:Xgetlist({'id' : qfid, 'size' : 0}).size)
3449 call assert_equal('', g:Xgetlist({'id' : qfid, 'title' : 0}).title)
3450 call assert_equal(0, g:Xgetlist({'id' : qfid, 'winid' : 0}).winid)
Bram Moolenaarb254af32017-12-18 19:48:58 +01003451 call assert_equal(0, g:Xgetlist({'id' : qfid, 'changedtick' : 0}).changedtick)
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003452 if a:cchar == 'c'
3453 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3454 \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003455 \ 'qfbufnr' : qfbufnr,
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003456 \ 'changedtick' : 0}, g:Xgetlist({'id' : qfid, 'all' : 0}))
3457 else
3458 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3459 \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003460 \ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0},
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003461 \ g:Xgetlist({'id' : qfid, 'all' : 0}))
3462 endif
Bram Moolenaara6d48492017-12-12 22:45:31 +01003463
3464 " Non-existing quickfix list number
3465 call assert_equal('', g:Xgetlist({'nr' : 5, 'context' : 0}).context)
3466 call assert_equal(0, g:Xgetlist({'nr' : 5}).nr)
3467 call assert_equal(0, g:Xgetlist({'nr' : 5, 'idx' : 0}).idx)
3468 call assert_equal([], g:Xgetlist({'nr' : 5, 'items' : 0}).items)
3469 call assert_equal(0, g:Xgetlist({'nr' : 5, 'id' : 0}).id)
3470 call assert_equal(0, g:Xgetlist({'nr' : 5, 'size' : 0}).size)
3471 call assert_equal('', g:Xgetlist({'nr' : 5, 'title' : 0}).title)
3472 call assert_equal(0, g:Xgetlist({'nr' : 5, 'winid' : 0}).winid)
Bram Moolenaarb254af32017-12-18 19:48:58 +01003473 call assert_equal(0, g:Xgetlist({'nr' : 5, 'changedtick' : 0}).changedtick)
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003474 if a:cchar == 'c'
3475 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3476 \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003477 \ 'changedtick' : 0, 'qfbufnr' : qfbufnr},
3478 \ g:Xgetlist({'nr' : 5, 'all' : 0}))
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003479 else
3480 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3481 \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003482 \ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0},
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003483 \ g:Xgetlist({'nr' : 5, 'all' : 0}))
3484 endif
Bram Moolenaara6d48492017-12-12 22:45:31 +01003485endfunc
3486
3487func Test_getqflist()
3488 call Xgetlist_empty_tests('c')
3489 call Xgetlist_empty_tests('l')
3490endfunc
Bram Moolenaarb254af32017-12-18 19:48:58 +01003491
Bram Moolenaara0ca7d02017-12-19 10:22:19 +01003492func Test_getqflist_invalid_nr()
3493 " The following commands used to crash Vim
3494 cexpr ""
3495 call getqflist({'nr' : $XXX_DOES_NOT_EXIST_XXX})
3496
3497 " Cleanup
3498 call setqflist([], 'r')
3499endfunc
3500
Bram Moolenaarb254af32017-12-18 19:48:58 +01003501" Tests for the quickfix/location list changedtick
3502func Xqftick_tests(cchar)
3503 call s:setup_commands(a:cchar)
3504
3505 call g:Xsetlist([], 'f')
3506
3507 Xexpr "F1:10:Line10"
3508 let qfid = g:Xgetlist({'id' : 0}).id
3509 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3510 Xaddexpr "F2:20:Line20\nF2:21:Line21"
3511 call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3512 call g:Xsetlist([], 'a', {'lines' : ["F3:30:Line30", "F3:31:Line31"]})
3513 call assert_equal(3, g:Xgetlist({'changedtick' : 0}).changedtick)
3514 call g:Xsetlist([], 'r', {'lines' : ["F4:40:Line40"]})
3515 call assert_equal(4, g:Xgetlist({'changedtick' : 0}).changedtick)
3516 call g:Xsetlist([], 'a', {'title' : 'New Title'})
3517 call assert_equal(5, g:Xgetlist({'changedtick' : 0}).changedtick)
3518
3519 enew!
3520 call append(0, ["F5:50:L50", "F6:60:L60"])
3521 Xaddbuffer
3522 call assert_equal(6, g:Xgetlist({'changedtick' : 0}).changedtick)
3523 enew!
3524
3525 call g:Xsetlist([], 'a', {'context' : {'bus' : 'pci'}})
3526 call assert_equal(7, g:Xgetlist({'changedtick' : 0}).changedtick)
3527 call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3528 \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'a')
3529 call assert_equal(8, g:Xgetlist({'changedtick' : 0}).changedtick)
3530 call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3531 \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], ' ')
3532 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3533 call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3534 \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'r')
3535 call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3536
3537 call writefile(["F8:80:L80", "F8:81:L81"], "Xone")
3538 Xfile Xone
3539 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3540 Xaddfile Xone
3541 call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3542
3543 " Test case for updating a non-current quickfix list
3544 call g:Xsetlist([], 'f')
3545 Xexpr "F1:1:L1"
3546 Xexpr "F2:2:L2"
3547 call g:Xsetlist([], 'a', {'nr' : 1, "lines" : ["F10:10:L10"]})
3548 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3549 call assert_equal(2, g:Xgetlist({'nr' : 1, 'changedtick' : 0}).changedtick)
3550
3551 call delete("Xone")
3552endfunc
3553
3554func Test_qf_tick()
3555 call Xqftick_tests('c')
3556 call Xqftick_tests('l')
3557endfunc
Bram Moolenaar12237442017-12-19 12:38:52 +01003558
Bram Moolenaarc631f2d2018-08-21 21:58:13 +02003559" Test helpgrep with lang specifier
3560func Xtest_helpgrep_with_lang_specifier(cchar)
3561 call s:setup_commands(a:cchar)
3562 Xhelpgrep Vim@en
3563 call assert_equal('help', &filetype)
3564 call assert_notequal(0, g:Xgetlist({'nr' : '$'}).nr)
3565 new | only
3566endfunc
3567
3568func Test_helpgrep_with_lang_specifier()
3569 call Xtest_helpgrep_with_lang_specifier('c')
3570 call Xtest_helpgrep_with_lang_specifier('l')
3571endfunc
3572
Bram Moolenaar12237442017-12-19 12:38:52 +01003573" The following test used to crash Vim.
3574" Open the location list window and close the regular window associated with
3575" the location list. When the garbage collection runs now, it incorrectly
3576" marks the location list context as not in use and frees the context.
3577func Test_ll_window_ctx()
3578 call setloclist(0, [], 'f')
3579 call setloclist(0, [], 'a', {'context' : []})
3580 lopen | only
3581 call test_garbagecollect_now()
3582 echo getloclist(0, {'context' : 1}).context
3583 enew | only
3584endfunc
3585
Bram Moolenaar14a4deb2017-12-19 16:48:55 +01003586" The following test used to crash vim
3587func Test_lfile_crash()
3588 sp Xtest
3589 au QuickFixCmdPre * bw
3590 call assert_fails('lfile', 'E40')
3591 au! QuickFixCmdPre
3592endfunc
Bram Moolenaar3c097222017-12-21 20:54:49 +01003593
3594" The following test used to crash vim
3595func Test_lbuffer_crash()
3596 sv Xtest
3597 augroup QF_Test
3598 au!
3599 au * * bw
3600 augroup END
3601 lbuffer
3602 augroup QF_Test
3603 au!
3604 augroup END
3605endfunc
3606
3607" The following test used to crash vim
3608func Test_lexpr_crash()
3609 augroup QF_Test
3610 au!
3611 au * * call setloclist(0, [], 'f')
3612 augroup END
3613 lexpr ""
3614 augroup QF_Test
3615 au!
3616 augroup END
Bram Moolenaar9f84ded2018-10-20 20:54:02 +02003617
Bram Moolenaar3c097222017-12-21 20:54:49 +01003618 enew | only
Bram Moolenaar9f84ded2018-10-20 20:54:02 +02003619 augroup QF_Test
3620 au!
3621 au BufNew * call setloclist(0, [], 'f')
3622 augroup END
3623 lexpr 'x:1:x'
3624 augroup QF_Test
3625 au!
3626 augroup END
3627
3628 enew | only
3629 lexpr ''
3630 lopen
3631 augroup QF_Test
3632 au!
3633 au FileType * call setloclist(0, [], 'f')
3634 augroup END
3635 lexpr ''
3636 augroup QF_Test
3637 au!
3638 augroup END
Bram Moolenaar3c097222017-12-21 20:54:49 +01003639endfunc
3640
3641" The following test used to crash Vim
3642func Test_lvimgrep_crash()
3643 sv Xtest
3644 augroup QF_Test
3645 au!
3646 au * * call setloclist(0, [], 'f')
3647 augroup END
3648 lvimgrep quickfix test_quickfix.vim
3649 augroup QF_Test
3650 au!
3651 augroup END
Bram Moolenaarb6f14802018-10-21 18:47:43 +02003652
3653 new | only
3654 augroup QF_Test
3655 au!
3656 au BufEnter * call setloclist(0, [], 'r')
3657 augroup END
3658 call assert_fails('lvimgrep Test_lvimgrep_crash *', 'E926:')
3659 augroup QF_Test
3660 au!
3661 augroup END
3662
Bram Moolenaar3c097222017-12-21 20:54:49 +01003663 enew | only
3664endfunc
Bram Moolenaarde046542017-12-26 13:53:11 +01003665
3666" Test for the position of the quickfix and location list window
3667func Test_qfwin_pos()
3668 " Open two windows
3669 new | only
3670 new
3671 cexpr ['F1:10:L10']
3672 copen
3673 " Quickfix window should be the bottom most window
3674 call assert_equal(3, winnr())
3675 close
3676 " Open at the very top
3677 wincmd t
3678 topleft copen
3679 call assert_equal(1, winnr())
3680 close
3681 " open left of the current window
3682 wincmd t
3683 below new
3684 leftabove copen
3685 call assert_equal(2, winnr())
3686 close
3687 " open right of the current window
3688 rightbelow copen
3689 call assert_equal(3, winnr())
3690 close
3691endfunc
Bram Moolenaare1bb8792018-04-06 22:58:23 +02003692
3693" Tests for quickfix/location lists changed by autocommands when
3694" :vimgrep/:lvimgrep commands are running.
3695func Test_vimgrep_autocmd()
3696 call setqflist([], 'f')
3697 call writefile(['stars'], 'Xtest1.txt')
3698 call writefile(['stars'], 'Xtest2.txt')
3699
3700 " Test 1:
3701 " When searching for a pattern using :vimgrep, if the quickfix list is
3702 " changed by an autocmd, the results should be added to the correct quickfix
3703 " list.
3704 autocmd BufRead Xtest2.txt cexpr '' | cexpr ''
3705 silent vimgrep stars Xtest*.txt
3706 call assert_equal(1, getqflist({'nr' : 0}).nr)
3707 call assert_equal(3, getqflist({'nr' : '$'}).nr)
3708 call assert_equal('Xtest2.txt', bufname(getqflist()[1].bufnr))
3709 au! BufRead Xtest2.txt
3710
3711 " Test 2:
3712 " When searching for a pattern using :vimgrep, if the quickfix list is
3713 " freed, then a error should be given.
3714 silent! %bwipe!
3715 call setqflist([], 'f')
3716 autocmd BufRead Xtest2.txt for i in range(10) | cexpr '' | endfor
3717 call assert_fails('vimgrep stars Xtest*.txt', 'E925:')
3718 au! BufRead Xtest2.txt
3719
3720 " Test 3:
3721 " When searching for a pattern using :lvimgrep, if the location list is
3722 " freed, then the command should error out.
3723 silent! %bwipe!
3724 let g:save_winid = win_getid()
3725 autocmd BufRead Xtest2.txt call setloclist(g:save_winid, [], 'f')
3726 call assert_fails('lvimgrep stars Xtest*.txt', 'E926:')
3727 au! BufRead Xtest2.txt
3728
3729 call delete('Xtest1.txt')
3730 call delete('Xtest2.txt')
3731 call setqflist([], 'f')
3732endfunc
Bram Moolenaar3b9474b2018-04-23 21:29:48 +02003733
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01003734" Test for an autocmd changing the current directory when running vimgrep
3735func Xvimgrep_autocmd_cd(cchar)
3736 call s:setup_commands(a:cchar)
3737
3738 %bwipe
3739 let save_cwd = getcwd()
3740
3741 augroup QF_Test
3742 au!
3743 autocmd BufRead * silent cd %:p:h
3744 augroup END
3745
3746 10Xvimgrep /vim/ Xdir/**
3747 let l = g:Xgetlist()
3748 call assert_equal('f1.txt', bufname(l[0].bufnr))
3749 call assert_equal('f2.txt', fnamemodify(bufname(l[2].bufnr), ':t'))
3750
3751 augroup QF_Test
3752 au!
3753 augroup END
3754
3755 exe 'cd ' . save_cwd
3756endfunc
3757
3758func Test_vimgrep_autocmd_cd()
3759 call mkdir('Xdir/a', 'p')
3760 call mkdir('Xdir/b', 'p')
3761 call writefile(['a_L1_vim', 'a_L2_vim'], 'Xdir/a/f1.txt')
3762 call writefile(['b_L1_vim', 'b_L2_vim'], 'Xdir/b/f2.txt')
3763 call Xvimgrep_autocmd_cd('c')
3764 call Xvimgrep_autocmd_cd('l')
3765 %bwipe
3766 call delete('Xdir', 'rf')
3767endfunc
3768
Bram Moolenaar3b9474b2018-04-23 21:29:48 +02003769" The following test used to crash Vim
3770func Test_lhelpgrep_autocmd()
3771 lhelpgrep quickfix
3772 autocmd QuickFixCmdPost * call setloclist(0, [], 'f')
3773 lhelpgrep buffer
3774 call assert_equal('help', &filetype)
3775 call assert_equal(0, getloclist(0, {'nr' : '$'}).nr)
3776 lhelpgrep tabpage
3777 call assert_equal('help', &filetype)
3778 call assert_equal(1, getloclist(0, {'nr' : '$'}).nr)
3779 au! QuickFixCmdPost
Bram Moolenaarb6f14802018-10-21 18:47:43 +02003780
3781 new | only
3782 augroup QF_Test
3783 au!
3784 au BufEnter * call setqflist([], 'f')
3785 augroup END
3786 call assert_fails('helpgrep quickfix', 'E925:')
3787 augroup QF_Test
3788 au! BufEnter
3789 augroup END
3790
3791 new | only
3792 augroup QF_Test
3793 au!
3794 au BufEnter * call setqflist([], 'r')
3795 augroup END
3796 call assert_fails('helpgrep quickfix', 'E925:')
3797 augroup QF_Test
3798 au! BufEnter
3799 augroup END
3800
3801 new | only
3802 augroup QF_Test
3803 au!
3804 au BufEnter * call setloclist(0, [], 'r')
3805 augroup END
3806 call assert_fails('lhelpgrep quickfix', 'E926:')
3807 augroup QF_Test
3808 au! BufEnter
3809 augroup END
3810
Bram Moolenaar3b9474b2018-04-23 21:29:48 +02003811 new | only
3812endfunc
Bram Moolenaara796d462018-05-01 14:30:36 +02003813
3814" Test for shortening/simplifying the file name when opening the
3815" quickfix window or when displaying the quickfix list
3816func Test_shorten_fname()
3817 if !has('unix')
3818 return
3819 endif
3820 %bwipe
3821 " Create a quickfix list with a absolute path filename
3822 let fname = getcwd() . '/test_quickfix.vim'
3823 call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'})
3824 call assert_equal(fname, bufname('test_quickfix.vim'))
3825 " Opening the quickfix window should simplify the file path
3826 cwindow
3827 call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
3828 cclose
3829 %bwipe
3830 " Create a quickfix list with a absolute path filename
3831 call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'})
3832 call assert_equal(fname, bufname('test_quickfix.vim'))
3833 " Displaying the quickfix list should simplify the file path
3834 silent! clist
3835 call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
3836endfunc
Bram Moolenaar8b62e312018-05-13 15:29:04 +02003837
3838" Quickfix title tests
3839" In the below tests, 'exe "cmd"' is used to invoke the quickfix commands.
3840" Otherwise due to indentation, the title is set with spaces at the beginning
3841" of the command.
3842func Test_qftitle()
3843 call writefile(["F1:1:Line1"], 'Xerr')
3844
3845 " :cexpr
3846 exe "cexpr readfile('Xerr')"
3847 call assert_equal(":cexpr readfile('Xerr')", getqflist({'title' : 1}).title)
3848
3849 " :cgetexpr
3850 exe "cgetexpr readfile('Xerr')"
3851 call assert_equal(":cgetexpr readfile('Xerr')",
3852 \ getqflist({'title' : 1}).title)
3853
3854 " :caddexpr
3855 call setqflist([], 'f')
3856 exe "caddexpr readfile('Xerr')"
3857 call assert_equal(":caddexpr readfile('Xerr')",
3858 \ getqflist({'title' : 1}).title)
3859
3860 " :cbuffer
3861 new Xerr
3862 exe "cbuffer"
3863 call assert_equal(':cbuffer (Xerr)', getqflist({'title' : 1}).title)
3864
3865 " :cgetbuffer
3866 edit Xerr
3867 exe "cgetbuffer"
3868 call assert_equal(':cgetbuffer (Xerr)', getqflist({'title' : 1}).title)
3869
3870 " :caddbuffer
3871 call setqflist([], 'f')
3872 edit Xerr
3873 exe "caddbuffer"
3874 call assert_equal(':caddbuffer (Xerr)', getqflist({'title' : 1}).title)
3875
3876 " :cfile
3877 exe "cfile Xerr"
3878 call assert_equal(':cfile Xerr', getqflist({'title' : 1}).title)
3879
3880 " :cgetfile
3881 exe "cgetfile Xerr"
3882 call assert_equal(':cgetfile Xerr', getqflist({'title' : 1}).title)
3883
3884 " :caddfile
3885 call setqflist([], 'f')
3886 exe "caddfile Xerr"
3887 call assert_equal(':caddfile Xerr', getqflist({'title' : 1}).title)
3888
3889 " :grep
3890 set grepprg=internal
3891 exe "grep F1 Xerr"
3892 call assert_equal(':grep F1 Xerr', getqflist({'title' : 1}).title)
3893
3894 " :grepadd
3895 call setqflist([], 'f')
3896 exe "grepadd F1 Xerr"
3897 call assert_equal(':grepadd F1 Xerr', getqflist({'title' : 1}).title)
3898 set grepprg&vim
3899
3900 " :vimgrep
3901 exe "vimgrep F1 Xerr"
3902 call assert_equal(':vimgrep F1 Xerr', getqflist({'title' : 1}).title)
3903
3904 " :vimgrepadd
3905 call setqflist([], 'f')
3906 exe "vimgrepadd F1 Xerr"
3907 call assert_equal(':vimgrepadd F1 Xerr', getqflist({'title' : 1}).title)
3908
3909 call setqflist(['F1:10:L10'], ' ')
3910 call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
3911
3912 call setqflist([], 'f')
3913 call setqflist(['F1:10:L10'], 'a')
3914 call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
3915
3916 call setqflist([], 'f')
3917 call setqflist(['F1:10:L10'], 'r')
3918 call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
3919
3920 close
3921 call delete('Xerr')
3922
3923 call setqflist([], ' ', {'title' : 'Errors'})
3924 copen
3925 call assert_equal('Errors', w:quickfix_title)
3926 call setqflist([], 'r', {'items' : [{'filename' : 'a.c', 'lnum' : 10}]})
3927 call assert_equal('Errors', w:quickfix_title)
3928 cclose
3929endfunc
Bram Moolenaar600323b2018-06-16 22:16:47 +02003930
3931func Test_lbuffer_with_bwipe()
3932 new
3933 new
3934 augroup nasty
3935 au * * bwipe
3936 augroup END
3937 lbuffer
3938 augroup nasty
3939 au!
3940 augroup END
3941endfunc
Bram Moolenaar0366c012018-06-18 20:52:13 +02003942
Bram Moolenaar531b9a32018-07-03 16:54:23 +02003943" Test for an autocmd freeing the quickfix/location list when cexpr/lexpr is
3944" running
3945func Xexpr_acmd_freelist(cchar)
3946 call s:setup_commands(a:cchar)
3947
Bram Moolenaar0366c012018-06-18 20:52:13 +02003948 " This was using freed memory.
3949 augroup nasty
Bram Moolenaar531b9a32018-07-03 16:54:23 +02003950 au * * call g:Xsetlist([], 'f')
Bram Moolenaar0366c012018-06-18 20:52:13 +02003951 augroup END
Bram Moolenaar531b9a32018-07-03 16:54:23 +02003952 Xexpr "x"
Bram Moolenaar0366c012018-06-18 20:52:13 +02003953 augroup nasty
3954 au!
3955 augroup END
3956endfunc
Bram Moolenaar531b9a32018-07-03 16:54:23 +02003957
3958func Test_cexpr_acmd_freelist()
3959 call Xexpr_acmd_freelist('c')
3960 call Xexpr_acmd_freelist('l')
3961endfunc
3962
3963" Test for commands that create a new quickfix/location list and jump to the
3964" first error automatically.
3965func Xjumpto_first_error_test(cchar)
3966 call s:setup_commands(a:cchar)
3967
3968 call s:create_test_file('Xtestfile1')
3969 call s:create_test_file('Xtestfile2')
3970 let l = ['Xtestfile1:2:Line2', 'Xtestfile2:4:Line4']
3971
3972 " Test for cexpr/lexpr
3973 enew
3974 Xexpr l
3975 call assert_equal('Xtestfile1', bufname(''))
3976 call assert_equal(2, line('.'))
3977
3978 " Test for cfile/lfile
3979 enew
3980 call writefile(l, 'Xerr')
3981 Xfile Xerr
3982 call assert_equal('Xtestfile1', bufname(''))
3983 call assert_equal(2, line('.'))
3984
3985 " Test for cbuffer/lbuffer
3986 edit Xerr
3987 Xbuffer
3988 call assert_equal('Xtestfile1', bufname(''))
3989 call assert_equal(2, line('.'))
3990
3991 call delete('Xerr')
3992 call delete('Xtestfile1')
3993 call delete('Xtestfile2')
3994endfunc
3995
3996func Test_jumpto_first_error()
3997 call Xjumpto_first_error_test('c')
3998 call Xjumpto_first_error_test('l')
3999endfunc
4000
4001" Test for a quickfix autocmd changing the quickfix/location list before
4002" jumping to the first error in the new list.
4003func Xautocmd_changelist(cchar)
4004 call s:setup_commands(a:cchar)
4005
4006 " Test for cfile/lfile
4007 call s:create_test_file('Xtestfile1')
4008 call s:create_test_file('Xtestfile2')
4009 Xexpr 'Xtestfile1:2:Line2'
4010 autocmd QuickFixCmdPost * Xolder
4011 call writefile(['Xtestfile2:4:Line4'], 'Xerr')
4012 Xfile Xerr
4013 call assert_equal('Xtestfile2', bufname(''))
4014 call assert_equal(4, line('.'))
4015 autocmd! QuickFixCmdPost
4016
4017 " Test for cbuffer/lbuffer
4018 call g:Xsetlist([], 'f')
4019 Xexpr 'Xtestfile1:2:Line2'
4020 autocmd QuickFixCmdPost * Xolder
4021 call writefile(['Xtestfile2:4:Line4'], 'Xerr')
4022 edit Xerr
4023 Xbuffer
4024 call assert_equal('Xtestfile2', bufname(''))
4025 call assert_equal(4, line('.'))
4026 autocmd! QuickFixCmdPost
4027
4028 " Test for cexpr/lexpr
4029 call g:Xsetlist([], 'f')
4030 Xexpr 'Xtestfile1:2:Line2'
4031 autocmd QuickFixCmdPost * Xolder
4032 Xexpr 'Xtestfile2:4:Line4'
4033 call assert_equal('Xtestfile2', bufname(''))
4034 call assert_equal(4, line('.'))
4035 autocmd! QuickFixCmdPost
4036
Bram Moolenaar851332e2018-07-03 19:16:00 +02004037 " The grepprg may not be set on non-Unix systems
4038 if has('unix')
4039 " Test for grep/lgrep
4040 call g:Xsetlist([], 'f')
4041 Xexpr 'Xtestfile1:2:Line2'
4042 autocmd QuickFixCmdPost * Xolder
4043 silent Xgrep Line5 Xtestfile2
4044 call assert_equal('Xtestfile2', bufname(''))
4045 call assert_equal(5, line('.'))
4046 autocmd! QuickFixCmdPost
4047 endif
Bram Moolenaar531b9a32018-07-03 16:54:23 +02004048
4049 " Test for vimgrep/lvimgrep
4050 call g:Xsetlist([], 'f')
4051 Xexpr 'Xtestfile1:2:Line2'
4052 autocmd QuickFixCmdPost * Xolder
4053 silent Xvimgrep Line5 Xtestfile2
4054 call assert_equal('Xtestfile2', bufname(''))
4055 call assert_equal(5, line('.'))
4056 autocmd! QuickFixCmdPost
4057
Bram Moolenaar3f347e42018-08-09 21:19:20 +02004058 " Test for autocommands clearing the quickfix list before jumping to the
4059 " first error. This should not result in an error
4060 autocmd QuickFixCmdPost * call g:Xsetlist([], 'r')
4061 let v:errmsg = ''
4062 " Test for cfile/lfile
4063 Xfile Xerr
4064 call assert_true(v:errmsg !~# 'E42:')
4065 " Test for cbuffer/lbuffer
4066 edit Xerr
4067 Xbuffer
4068 call assert_true(v:errmsg !~# 'E42:')
4069 " Test for cexpr/lexpr
4070 Xexpr 'Xtestfile2:4:Line4'
4071 call assert_true(v:errmsg !~# 'E42:')
4072 " Test for grep/lgrep
4073 " The grepprg may not be set on non-Unix systems
4074 if has('unix')
4075 silent Xgrep Line5 Xtestfile2
4076 call assert_true(v:errmsg !~# 'E42:')
4077 endif
4078 " Test for vimgrep/lvimgrep
4079 call assert_fails('silent Xvimgrep Line5 Xtestfile2', 'E480:')
4080 autocmd! QuickFixCmdPost
4081
Bram Moolenaar531b9a32018-07-03 16:54:23 +02004082 call delete('Xerr')
4083 call delete('Xtestfile1')
4084 call delete('Xtestfile2')
4085endfunc
4086
4087func Test_autocmd_changelist()
4088 call Xautocmd_changelist('c')
4089 call Xautocmd_changelist('l')
4090endfunc
Bram Moolenaar4cde86c2018-07-08 16:01:08 +02004091
4092" Tests for the ':filter /pat/ clist' command
4093func Test_filter_clist()
4094 cexpr ['Xfile1:10:10:Line 10', 'Xfile2:15:15:Line 15']
4095 call assert_equal([' 2 Xfile2:15 col 15: Line 15'],
4096 \ split(execute('filter /Line 15/ clist'), "\n"))
4097 call assert_equal([' 1 Xfile1:10 col 10: Line 10'],
4098 \ split(execute('filter /Xfile1/ clist'), "\n"))
4099 call assert_equal([], split(execute('filter /abc/ clist'), "\n"))
4100
4101 call setqflist([{'module' : 'abc', 'pattern' : 'pat1'},
4102 \ {'module' : 'pqr', 'pattern' : 'pat2'}], ' ')
4103 call assert_equal([' 2 pqr:pat2: '],
4104 \ split(execute('filter /pqr/ clist'), "\n"))
4105 call assert_equal([' 1 abc:pat1: '],
4106 \ split(execute('filter /pat1/ clist'), "\n"))
4107endfunc
Bram Moolenaar0a08c632018-07-25 22:36:52 +02004108
4109" Tests for the "CTRL-W <CR>" command.
4110func Xview_result_split_tests(cchar)
4111 call s:setup_commands(a:cchar)
4112
4113 " Test that "CTRL-W <CR>" in a qf/ll window fails with empty list.
4114 call g:Xsetlist([])
4115 Xopen
4116 let l:win_count = winnr('$')
4117 call assert_fails('execute "normal! \<C-W>\<CR>"', 'E42')
4118 call assert_equal(l:win_count, winnr('$'))
4119 Xclose
4120endfunc
4121
4122func Test_view_result_split()
4123 call Xview_result_split_tests('c')
4124 call Xview_result_split_tests('l')
4125endfunc
Bram Moolenaar2dfcef42018-08-15 22:29:51 +02004126
4127" Test that :cc sets curswant
4128func Test_curswant()
4129 helpgrep quickfix
4130 normal! llll
4131 1cc
4132 call assert_equal(getcurpos()[4], virtcol('.'))
4133 cclose | helpclose
4134endfunc
Bram Moolenaarb2443732018-11-11 22:50:27 +01004135
4136" Test for opening a file from the quickfix window using CTRL-W <Enter>
4137" doesn't leave an empty buffer around.
4138func Test_splitview()
4139 call s:create_test_file('Xtestfile1')
4140 call s:create_test_file('Xtestfile2')
4141 new | only
4142 let last_bufnr = bufnr('Test_sv_1', 1)
4143 let l = ['Xtestfile1:2:Line2', 'Xtestfile2:4:Line4']
4144 cgetexpr l
4145 copen
4146 let numbufs = len(getbufinfo())
4147 exe "normal \<C-W>\<CR>"
4148 copen
4149 exe "normal j\<C-W>\<CR>"
4150 " Make sure new empty buffers are not created
4151 call assert_equal(numbufs, len(getbufinfo()))
4152 " Creating a new buffer should use the next available buffer number
4153 call assert_equal(last_bufnr + 4, bufnr("Test_sv_2", 1))
4154 bwipe Test_sv_1
4155 bwipe Test_sv_2
4156 new | only
4157
4158 " When split opening files from location list window, make sure that two
4159 " windows doesn't refer to the same location list
4160 lgetexpr l
4161 let locid = getloclist(0, {'id' : 0}).id
4162 lopen
4163 exe "normal \<C-W>\<CR>"
4164 call assert_notequal(locid, getloclist(0, {'id' : 0}).id)
4165 call assert_equal(0, getloclist(0, {'winid' : 0}).winid)
4166 new | only
4167
4168 " When split opening files from a helpgrep location list window, a new help
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01004169 " window should be opened with a copy of the location list.
Bram Moolenaarb2443732018-11-11 22:50:27 +01004170 lhelpgrep window
4171 let locid = getloclist(0, {'id' : 0}).id
4172 lwindow
4173 exe "normal j\<C-W>\<CR>"
4174 call assert_notequal(locid, getloclist(0, {'id' : 0}).id)
4175 call assert_equal(0, getloclist(0, {'winid' : 0}).winid)
4176 new | only
4177
4178 call delete('Xtestfile1')
4179 call delete('Xtestfile2')
4180endfunc
Bram Moolenaarc45eb772019-01-31 14:27:04 +01004181
4182" Test for parsing entries using visual screen column
4183func Test_viscol()
4184 enew
4185 call writefile(["Col1\tCol2\tCol3"], 'Xfile1')
4186 edit Xfile1
4187
4188 " Use byte offset for column number
4189 set efm&
4190 cexpr "Xfile1:1:5:XX\nXfile1:1:9:YY\nXfile1:1:20:ZZ"
4191 call assert_equal([5, 8], [col('.'), virtcol('.')])
4192 cnext
4193 call assert_equal([9, 12], [col('.'), virtcol('.')])
4194 cnext
4195 call assert_equal([14, 20], [col('.'), virtcol('.')])
4196
4197 " Use screen column offset for column number
4198 set efm=%f:%l:%v:%m
4199 cexpr "Xfile1:1:8:XX\nXfile1:1:12:YY\nXfile1:1:20:ZZ"
4200 call assert_equal([5, 8], [col('.'), virtcol('.')])
4201 cnext
4202 call assert_equal([9, 12], [col('.'), virtcol('.')])
4203 cnext
4204 call assert_equal([14, 20], [col('.'), virtcol('.')])
4205 cexpr "Xfile1:1:6:XX\nXfile1:1:15:YY\nXfile1:1:24:ZZ"
4206 call assert_equal([5, 8], [col('.'), virtcol('.')])
4207 cnext
4208 call assert_equal([10, 16], [col('.'), virtcol('.')])
4209 cnext
4210 call assert_equal([14, 20], [col('.'), virtcol('.')])
4211
4212 enew
4213 call writefile(["Col1\täü\töß\tCol4"], 'Xfile1')
4214
4215 " Use byte offset for column number
4216 set efm&
4217 cexpr "Xfile1:1:8:XX\nXfile1:1:11:YY\nXfile1:1:16:ZZ"
4218 call assert_equal([8, 10], [col('.'), virtcol('.')])
4219 cnext
4220 call assert_equal([11, 17], [col('.'), virtcol('.')])
4221 cnext
4222 call assert_equal([16, 25], [col('.'), virtcol('.')])
4223
4224 " Use screen column offset for column number
4225 set efm=%f:%l:%v:%m
4226 cexpr "Xfile1:1:10:XX\nXfile1:1:17:YY\nXfile1:1:25:ZZ"
4227 call assert_equal([8, 10], [col('.'), virtcol('.')])
4228 cnext
4229 call assert_equal([11, 17], [col('.'), virtcol('.')])
4230 cnext
4231 call assert_equal([16, 25], [col('.'), virtcol('.')])
4232
4233 enew | only
4234 set efm&
4235 call delete('Xfile1')
4236endfunc
Bram Moolenaaree8188f2019-02-05 21:23:04 +01004237
4238" Test for the quickfix window buffer
4239func Xqfbuf_test(cchar)
4240 call s:setup_commands(a:cchar)
4241
4242 " Quickfix buffer should be reused across closing and opening a quickfix
4243 " window
4244 Xexpr "F1:10:Line10"
4245 Xopen
4246 let qfbnum = bufnr('')
4247 Xclose
4248 " Even after the quickfix window is closed, the buffer should be loaded
4249 call assert_true(bufloaded(qfbnum))
Bram Moolenaar647e24b2019-03-17 16:39:46 +01004250 call assert_true(qfbnum, g:Xgetlist({'qfbufnr' : 0}).qfbufnr)
Bram Moolenaaree8188f2019-02-05 21:23:04 +01004251 Xopen
4252 " Buffer should be reused when opening the window again
4253 call assert_equal(qfbnum, bufnr(''))
4254 Xclose
4255
4256 if a:cchar == 'l'
4257 %bwipe
4258 " For a location list, when both the file window and the location list
4259 " window for the list are closed, then the buffer should be freed.
4260 new | only
4261 lexpr "F1:10:Line10"
4262 let wid = win_getid()
4263 lopen
4264 let qfbnum = bufnr('')
4265 call assert_match(qfbnum . ' %a- "\[Location List]"', execute('ls'))
4266 close
4267 " When the location list window is closed, the buffer name should not
4268 " change to 'Quickfix List'
Bram Moolenaar647e24b2019-03-17 16:39:46 +01004269 call assert_match(qfbnum . 'u h- "\[Location List]"', execute('ls!'))
Bram Moolenaaree8188f2019-02-05 21:23:04 +01004270 call assert_true(bufloaded(qfbnum))
4271
Bram Moolenaard82a81c2019-03-02 07:57:18 +01004272 " After deleting a location list buffer using ":bdelete", opening the
4273 " location list window should mark the buffer as a location list buffer.
4274 exe "bdelete " . qfbnum
4275 lopen
4276 call assert_equal("quickfix", &buftype)
4277 call assert_equal(1, getwininfo(win_getid(winnr()))[0].loclist)
4278 call assert_equal(wid, getloclist(0, {'filewinid' : 0}).filewinid)
4279 call assert_false(&swapfile)
4280 lclose
4281
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01004282 " When the location list is cleared for the window, the buffer should be
4283 " removed
4284 call setloclist(0, [], 'f')
4285 call assert_false(bufexists(qfbnum))
Bram Moolenaar647e24b2019-03-17 16:39:46 +01004286 call assert_equal(0, getloclist(0, {'qfbufnr' : 0}).qfbufnr)
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01004287
4288 " When the location list is freed with the location list window open, the
4289 " location list buffer should not be lost. It should be reused when the
4290 " location list is again populated.
4291 lexpr "F1:10:Line10"
4292 lopen
4293 let wid = win_getid()
4294 let qfbnum = bufnr('')
4295 wincmd p
4296 call setloclist(0, [], 'f')
4297 lexpr "F1:10:Line10"
4298 lopen
4299 call assert_equal(wid, win_getid())
4300 call assert_equal(qfbnum, bufnr(''))
4301 lclose
4302
4303 " When the window with the location list is closed, the buffer should be
4304 " removed
Bram Moolenaaree8188f2019-02-05 21:23:04 +01004305 new | only
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01004306 call assert_false(bufexists(qfbnum))
Bram Moolenaaree8188f2019-02-05 21:23:04 +01004307 endif
4308endfunc
4309
4310func Test_qfbuf()
4311 call Xqfbuf_test('c')
4312 call Xqfbuf_test('l')
4313endfunc
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01004314
4315" If there is an autocmd to use only one window, then opening the location
4316" list window used to crash Vim.
4317func Test_winonly_autocmd()
4318 call s:create_test_file('Xtest1')
4319 " Autocmd to show only one Vim window at a time
4320 autocmd WinEnter * only
4321 new
4322 " Load the location list
4323 lexpr "Xtest1:5:Line5\nXtest1:10:Line10\nXtest1:15:Line15"
4324 let loclistid = getloclist(0, {'id' : 0}).id
4325 " Open the location list window. Only this window will be shown and the file
4326 " window is closed.
4327 lopen
4328 call assert_equal(loclistid, getloclist(0, {'id' : 0}).id)
4329 " Jump to an entry in the location list and make sure that the cursor is
4330 " positioned correctly.
4331 ll 3
4332 call assert_equal(loclistid, getloclist(0, {'id' : 0}).id)
4333 call assert_equal('Xtest1', bufname(''))
4334 call assert_equal(15, line('.'))
4335 " Cleanup
4336 autocmd! WinEnter
4337 new | only
4338 call delete('Xtest1')
4339endfunc
Bram Moolenaar39803d82019-04-07 12:04:51 +02004340
4341" Test to make sure that an empty quickfix buffer is not reused for loading
4342" a normal buffer.
4343func Test_empty_qfbuf()
4344 enew | only
4345 call writefile(["Test"], 'Xfile1')
4346 call setqflist([], 'f')
4347 copen | only
4348 let qfbuf = bufnr('')
4349 edit Xfile1
4350 call assert_notequal(qfbuf, bufnr(''))
4351 enew
4352 call delete('Xfile1')
4353endfunc
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004354
4355" Test for the :cbelow, :cabove, :lbelow and :labove commands.
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004356" And for the :cafter, :cbefore, :lafter and :lbefore commands.
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004357func Xtest_below(cchar)
4358 call s:setup_commands(a:cchar)
4359
4360 " No quickfix/location list
4361 call assert_fails('Xbelow', 'E42:')
4362 call assert_fails('Xabove', 'E42:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004363 call assert_fails('Xbefore', 'E42:')
4364 call assert_fails('Xafter', 'E42:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004365
4366 " Empty quickfix/location list
4367 call g:Xsetlist([])
4368 call assert_fails('Xbelow', 'E42:')
4369 call assert_fails('Xabove', 'E42:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004370 call assert_fails('Xbefore', 'E42:')
4371 call assert_fails('Xafter', 'E42:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004372
4373 call s:create_test_file('X1')
4374 call s:create_test_file('X2')
4375 call s:create_test_file('X3')
4376 call s:create_test_file('X4')
4377
4378 " Invalid entries
4379 edit X1
4380 call g:Xsetlist(["E1", "E2"])
4381 call assert_fails('Xbelow', 'E42:')
4382 call assert_fails('Xabove', 'E42:')
4383 call assert_fails('3Xbelow', 'E42:')
4384 call assert_fails('4Xabove', 'E42:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004385 call assert_fails('Xbefore', 'E42:')
4386 call assert_fails('Xafter', 'E42:')
4387 call assert_fails('3Xbefore', 'E42:')
4388 call assert_fails('4Xafter', 'E42:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004389
4390 " Test the commands with various arguments
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004391 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 +02004392 edit +7 X2
4393 Xabove
4394 call assert_equal(['X2', 5], [bufname(''), line('.')])
4395 call assert_fails('Xabove', 'E553:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004396 normal 7G
4397 Xbefore
4398 call assert_equal(['X2', 5, 2], [bufname(''), line('.'), col('.')])
4399 call assert_fails('Xbefore', 'E553:')
4400
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004401 normal 2j
4402 Xbelow
4403 call assert_equal(['X2', 10], [bufname(''), line('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004404 normal 7G
4405 Xafter
4406 call assert_equal(['X2', 10, 3], [bufname(''), line('.'), col('.')])
4407
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004408 " Last error in this file
4409 Xbelow 99
4410 call assert_equal(['X2', 15], [bufname(''), line('.')])
4411 call assert_fails('Xbelow', 'E553:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004412 normal gg
4413 Xafter 99
4414 call assert_equal(['X2', 15, 4], [bufname(''), line('.'), col('.')])
4415 call assert_fails('Xafter', 'E553:')
4416
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004417 " First error in this file
4418 Xabove 99
4419 call assert_equal(['X2', 5], [bufname(''), line('.')])
4420 call assert_fails('Xabove', 'E553:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004421 normal G
4422 Xbefore 99
4423 call assert_equal(['X2', 5, 2], [bufname(''), line('.'), col('.')])
4424 call assert_fails('Xbefore', 'E553:')
4425
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004426 normal gg
4427 Xbelow 2
4428 call assert_equal(['X2', 10], [bufname(''), line('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004429 normal gg
4430 Xafter 2
4431 call assert_equal(['X2', 10, 3], [bufname(''), line('.'), col('.')])
4432
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004433 normal G
4434 Xabove 2
4435 call assert_equal(['X2', 10], [bufname(''), line('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004436 normal G
4437 Xbefore 2
4438 call assert_equal(['X2', 10, 3], [bufname(''), line('.'), col('.')])
4439
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004440 edit X4
4441 call assert_fails('Xabove', 'E42:')
4442 call assert_fails('Xbelow', 'E42:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004443 call assert_fails('Xbefore', 'E42:')
4444 call assert_fails('Xafter', 'E42:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004445 if a:cchar == 'l'
4446 " If a buffer has location list entries from some other window but not
4447 " from the current window, then the commands should fail.
4448 edit X1 | split | call setloclist(0, [], 'f')
4449 call assert_fails('Xabove', 'E776:')
4450 call assert_fails('Xbelow', 'E776:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004451 call assert_fails('Xbefore', 'E776:')
4452 call assert_fails('Xafter', 'E776:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004453 close
4454 endif
4455
4456 " Test for lines with multiple quickfix entries
4457 Xexpr ["X1:5:L5", "X2:5:1:L5_1", "X2:5:2:L5_2", "X2:5:3:L5_3",
4458 \ "X2:10:1:L10_1", "X2:10:2:L10_2", "X2:10:3:L10_3",
4459 \ "X2:15:1:L15_1", "X2:15:2:L15_2", "X2:15:3:L15_3", "X3:3:L3"]
4460 edit +1 X2
4461 Xbelow 2
4462 call assert_equal(['X2', 10, 1], [bufname(''), line('.'), col('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004463 normal 1G
4464 Xafter 2
4465 call assert_equal(['X2', 5, 2], [bufname(''), line('.'), col('.')])
4466
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004467 normal gg
4468 Xbelow 99
4469 call assert_equal(['X2', 15, 1], [bufname(''), line('.'), col('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004470 normal gg
4471 Xafter 99
4472 call assert_equal(['X2', 15, 3], [bufname(''), line('.'), col('.')])
4473
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004474 normal G
4475 Xabove 2
4476 call assert_equal(['X2', 10, 1], [bufname(''), line('.'), col('.')])
4477 normal G
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004478 Xbefore 2
4479 call assert_equal(['X2', 15, 2], [bufname(''), line('.'), col('.')])
4480
4481 normal G
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004482 Xabove 99
4483 call assert_equal(['X2', 5, 1], [bufname(''), line('.'), col('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004484 normal G
4485 Xbefore 99
4486 call assert_equal(['X2', 5, 1], [bufname(''), line('.'), col('.')])
4487
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004488 normal 10G
4489 Xabove
4490 call assert_equal(['X2', 5, 1], [bufname(''), line('.'), col('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004491 normal 10G$
4492 2Xbefore
4493 call assert_equal(['X2', 10, 2], [bufname(''), line('.'), col('.')])
4494
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004495 normal 10G
4496 Xbelow
4497 call assert_equal(['X2', 15, 1], [bufname(''), line('.'), col('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004498 normal 9G
4499 5Xafter
4500 call assert_equal(['X2', 15, 2], [bufname(''), line('.'), col('.')])
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004501
4502 " Invalid range
4503 if a:cchar == 'c'
Bram Moolenaar25190db2019-05-04 15:05:28 +02004504 call assert_fails('-2cbelow', 'E16:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004505 call assert_fails('-2cafter', 'E16:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004506 else
Bram Moolenaar25190db2019-05-04 15:05:28 +02004507 call assert_fails('-2lbelow', 'E16:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004508 call assert_fails('-2lafter', 'E16:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004509 endif
4510
4511 call delete('X1')
4512 call delete('X2')
4513 call delete('X3')
4514 call delete('X4')
4515endfunc
4516
4517func Test_cbelow()
4518 call Xtest_below('c')
4519 call Xtest_below('l')
4520endfunc
Bram Moolenaar25190db2019-05-04 15:05:28 +02004521
4522func Test_quickfix_count()
4523 let commands = [
4524 \ 'cNext',
4525 \ 'cNfile',
4526 \ 'cabove',
4527 \ 'cbelow',
4528 \ 'cfirst',
4529 \ 'clast',
4530 \ 'cnewer',
4531 \ 'cnext',
4532 \ 'cnfile',
4533 \ 'colder',
4534 \ 'cprevious',
4535 \ 'crewind',
4536 \
4537 \ 'lNext',
4538 \ 'lNfile',
4539 \ 'labove',
4540 \ 'lbelow',
4541 \ 'lfirst',
4542 \ 'llast',
4543 \ 'lnewer',
4544 \ 'lnext',
4545 \ 'lnfile',
4546 \ 'lolder',
4547 \ 'lprevious',
4548 \ 'lrewind',
4549 \ ]
4550 for cmd in commands
4551 call assert_fails('-1' .. cmd, 'E16:')
4552 call assert_fails('.' .. cmd, 'E16:')
4553 call assert_fails('%' .. cmd, 'E16:')
4554 call assert_fails('$' .. cmd, 'E16:')
4555 endfor
4556endfunc
Bram Moolenaar6a0cc912019-10-26 16:48:44 +02004557
4558" Test for aborting quickfix commands using QuickFixCmdPre
4559func Xtest_qfcmd_abort(cchar)
4560 call s:setup_commands(a:cchar)
4561
4562 call g:Xsetlist([], 'f')
4563
4564 " cexpr/lexpr
4565 let e = ''
4566 try
4567 Xexpr ["F1:10:Line10", "F2:20:Line20"]
4568 catch /.*/
4569 let e = v:exception
4570 endtry
4571 call assert_equal('AbortCmd', e)
4572 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
4573
4574 " cfile/lfile
4575 call writefile(["F1:10:Line10", "F2:20:Line20"], 'Xfile1')
4576 let e = ''
4577 try
4578 Xfile Xfile1
4579 catch /.*/
4580 let e = v:exception
4581 endtry
4582 call assert_equal('AbortCmd', e)
4583 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
4584 call delete('Xfile1')
4585
4586 " cgetbuffer/lgetbuffer
4587 enew!
4588 call append(0, ["F1:10:Line10", "F2:20:Line20"])
4589 let e = ''
4590 try
4591 Xgetbuffer
4592 catch /.*/
4593 let e = v:exception
4594 endtry
4595 call assert_equal('AbortCmd', e)
4596 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
4597 enew!
4598
4599 " vimgrep/lvimgrep
4600 let e = ''
4601 try
4602 Xvimgrep /func/ test_quickfix.vim
4603 catch /.*/
4604 let e = v:exception
4605 endtry
4606 call assert_equal('AbortCmd', e)
4607 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
4608
4609 " helpgrep/lhelpgrep
4610 let e = ''
4611 try
4612 Xhelpgrep quickfix
4613 catch /.*/
4614 let e = v:exception
4615 endtry
4616 call assert_equal('AbortCmd', e)
4617 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
4618
4619 " grep/lgrep
4620 if has('unix')
4621 let e = ''
4622 try
4623 silent Xgrep func test_quickfix.vim
4624 catch /.*/
4625 let e = v:exception
4626 endtry
4627 call assert_equal('AbortCmd', e)
4628 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
4629 endif
4630endfunc
4631
4632func Test_qfcmd_abort()
4633 augroup QF_Test
4634 au!
4635 autocmd QuickFixCmdPre * throw "AbortCmd"
4636 augroup END
4637
4638 call Xtest_qfcmd_abort('c')
4639 call Xtest_qfcmd_abort('l')
4640
4641 augroup QF_Test
4642 au!
4643 augroup END
4644endfunc
4645
Bram Moolenaard8a8c4c2019-11-16 21:04:57 +01004646" Test for using a file in one of the parent directories.
4647func Test_search_in_dirstack()
4648 call mkdir('Xtestdir/a/b/c', 'p')
4649 let save_cwd = getcwd()
4650 call writefile(["X1_L1", "X1_L2"], 'Xtestdir/Xfile1')
4651 call writefile(["X2_L1", "X2_L2"], 'Xtestdir/a/Xfile2')
4652 call writefile(["X3_L1", "X3_L2"], 'Xtestdir/a/b/Xfile3')
4653 call writefile(["X4_L1", "X4_L2"], 'Xtestdir/a/b/c/Xfile4')
4654
4655 let lines = "Entering dir Xtestdir\n" .
4656 \ "Entering dir a\n" .
4657 \ "Entering dir b\n" .
4658 \ "Xfile2:2:X2_L2\n" .
4659 \ "Leaving dir a\n" .
4660 \ "Xfile1:2:X1_L2\n" .
4661 \ "Xfile3:1:X3_L1\n" .
4662 \ "Entering dir c\n" .
4663 \ "Xfile4:2:X4_L2\n" .
Bram Moolenaar88a3e2b2019-12-06 21:11:39 +01004664 \ "Leaving dir c\n"
Bram Moolenaard8a8c4c2019-11-16 21:04:57 +01004665 set efm=%DEntering\ dir\ %f,%XLeaving\ dir\ %f,%f:%l:%m
Bram Moolenaar88a3e2b2019-12-06 21:11:39 +01004666 cexpr lines .. "Leaving dir Xtestdir|\n" | let next = 1
Bram Moolenaard8a8c4c2019-11-16 21:04:57 +01004667 call assert_equal(11, getqflist({'size' : 0}).size)
4668 call assert_equal(4, getqflist({'idx' : 0}).idx)
4669 call assert_equal('X2_L2', getline('.'))
Bram Moolenaar88a3e2b2019-12-06 21:11:39 +01004670 call assert_equal(1, next)
Bram Moolenaard8a8c4c2019-11-16 21:04:57 +01004671 cnext
4672 call assert_equal(6, getqflist({'idx' : 0}).idx)
4673 call assert_equal('X1_L2', getline('.'))
4674 cnext
4675 call assert_equal(7, getqflist({'idx' : 0}).idx)
4676 call assert_equal(1, line('$'))
4677 call assert_equal('', getline(1))
4678 cnext
4679 call assert_equal(9, getqflist({'idx' : 0}).idx)
4680 call assert_equal(1, line('$'))
4681 call assert_equal('', getline(1))
4682
4683 set efm&
4684 exe 'cd ' . save_cwd
4685 call delete('Xtestdir', 'rf')
4686endfunc
4687
Bram Moolenaar1860bde2020-01-06 21:47:21 +01004688" Test for :cquit
4689func Test_cquit()
4690 " Exit Vim with a non-zero value
4691 if RunVim([], ["cquit 7"], '')
4692 call assert_equal(7, v:shell_error)
4693 endif
4694
4695 if RunVim([], ["50cquit"], '')
4696 call assert_equal(50, v:shell_error)
4697 endif
4698
4699 " Exit Vim with default value
4700 if RunVim([], ["cquit"], '')
4701 call assert_equal(1, v:shell_error)
4702 endif
4703
4704 " Exit Vim with zero value
4705 if RunVim([], ["cquit 0"], '')
4706 call assert_equal(0, v:shell_error)
4707 endif
4708
4709 " Exit Vim with negative value
4710 call assert_fails('-3cquit', 'E16:')
4711endfunc
4712
Bram Moolenaar6a0cc912019-10-26 16:48:44 +02004713" vim: shiftwidth=2 sts=2 expandtab