blob: 79ad82d2d6fcd9adf20ee987f636db574d888319 [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 Moolenaar2b946c92016-11-12 18:14:44 +01001631func Test_quickfix_set_list_with_act()
Bram Moolenaard106e5b2016-04-21 19:38:07 +02001632 call XquickfixSetListWithAct('c')
1633 call XquickfixSetListWithAct('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001634endfunc
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001635
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001636func XLongLinesTests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001637 let l = g:Xgetlist()
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001638
Bram Moolenaar049cba92016-06-26 14:38:04 +02001639 call assert_equal(4, len(l))
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001640 call assert_equal(1, l[0].lnum)
1641 call assert_equal(1, l[0].col)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001642 call assert_equal(1975, len(l[0].text))
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001643 call assert_equal(2, l[1].lnum)
1644 call assert_equal(1, l[1].col)
1645 call assert_equal(4070, len(l[1].text))
1646 call assert_equal(3, l[2].lnum)
1647 call assert_equal(1, l[2].col)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001648 call assert_equal(4070, len(l[2].text))
1649 call assert_equal(4, l[3].lnum)
1650 call assert_equal(1, l[3].col)
1651 call assert_equal(10, len(l[3].text))
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001652
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001653 call g:Xsetlist([], 'r')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001654endfunc
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001655
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001656func s:long_lines_tests(cchar)
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001657 call s:setup_commands(a:cchar)
1658
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001659 let testfile = 'samples/quickfix.txt'
1660
1661 " file
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001662 exe 'Xgetfile' testfile
1663 call XLongLinesTests(a:cchar)
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001664
1665 " list
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001666 Xexpr readfile(testfile)
1667 call XLongLinesTests(a:cchar)
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001668
1669 " string
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001670 Xexpr join(readfile(testfile), "\n")
1671 call XLongLinesTests(a:cchar)
Bram Moolenaar6be8c8e2016-04-30 13:17:09 +02001672
1673 " buffer
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001674 exe 'edit' testfile
1675 exe 'Xbuffer' bufnr('%')
Bram Moolenaarf50df392016-06-21 21:33:34 +02001676 call XLongLinesTests(a:cchar)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001677endfunc
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001678
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001679func Test_long_lines()
Bram Moolenaar3ef5bf72016-06-15 22:41:31 +02001680 call s:long_lines_tests('c')
1681 call s:long_lines_tests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001682endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001683
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001684func s:create_test_file(filename)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001685 let l = []
1686 for i in range(1, 20)
1687 call add(l, 'Line' . i)
1688 endfor
1689 call writefile(l, a:filename)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001690endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001691
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001692func Test_switchbuf()
Bram Moolenaar9134f1e2019-11-29 20:26:13 +01001693 CheckNotBSD
Bram Moolenaar049cba92016-06-26 14:38:04 +02001694 call s:create_test_file('Xqftestfile1')
1695 call s:create_test_file('Xqftestfile2')
1696 call s:create_test_file('Xqftestfile3')
1697
1698 new | only
1699 edit Xqftestfile1
1700 let file1_winid = win_getid()
1701 new Xqftestfile2
1702 let file2_winid = win_getid()
1703 cgetexpr ['Xqftestfile1:5:Line5',
1704 \ 'Xqftestfile1:6:Line6',
1705 \ 'Xqftestfile2:10:Line10',
1706 \ 'Xqftestfile2:11:Line11',
1707 \ 'Xqftestfile3:15:Line15',
1708 \ 'Xqftestfile3:16:Line16']
1709
1710 new
1711 let winid = win_getid()
1712 cfirst | cnext
1713 call assert_equal(winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001714 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001715 call assert_equal(winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001716 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001717 call assert_equal(winid, win_getid())
Bram Moolenaar049cba92016-06-26 14:38:04 +02001718
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001719 " Test for 'switchbuf' set to search for files in windows in the current
1720 " tabpage and jump to an existing window (if present)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001721 set switchbuf=useopen
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001722 enew
Bram Moolenaar049cba92016-06-26 14:38:04 +02001723 cfirst | cnext
1724 call assert_equal(file1_winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001725 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001726 call assert_equal(file2_winid, win_getid())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001727 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001728 call assert_equal(file2_winid, win_getid())
1729
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001730 " Test for 'switchbuf' set to search for files in tabpages and jump to an
1731 " existing tabpage (if present)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001732 enew | only
1733 set switchbuf=usetab
1734 tabedit Xqftestfile1
1735 tabedit Xqftestfile2
Bram Moolenaar74240d32017-12-10 15:26:15 +01001736 tabedit Xqftestfile3
Bram Moolenaar049cba92016-06-26 14:38:04 +02001737 tabfirst
1738 cfirst | cnext
1739 call assert_equal(2, tabpagenr())
Bram Moolenaar99895ea2017-04-20 22:44:47 +02001740 2cnext
Bram Moolenaar049cba92016-06-26 14:38:04 +02001741 call assert_equal(3, tabpagenr())
Bram Moolenaar74240d32017-12-10 15:26:15 +01001742 6cnext
1743 call assert_equal(4, tabpagenr())
1744 2cpfile
1745 call assert_equal(2, tabpagenr())
1746 2cnfile
1747 call assert_equal(4, tabpagenr())
Bram Moolenaar049cba92016-06-26 14:38:04 +02001748 tabfirst | tabonly | enew
1749
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001750 " Test for 'switchbuf' set to open a new window for every file
Bram Moolenaar049cba92016-06-26 14:38:04 +02001751 set switchbuf=split
1752 cfirst | cnext
1753 call assert_equal(1, winnr('$'))
1754 cnext | cnext
1755 call assert_equal(2, winnr('$'))
1756 cnext | cnext
1757 call assert_equal(3, winnr('$'))
Bram Moolenaar049cba92016-06-26 14:38:04 +02001758
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001759 " Test for 'switchbuf' set to open a new tabpage for every file
Bram Moolenaar049cba92016-06-26 14:38:04 +02001760 set switchbuf=newtab
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001761 enew | only
Bram Moolenaar049cba92016-06-26 14:38:04 +02001762 cfirst | cnext
1763 call assert_equal(1, tabpagenr('$'))
1764 cnext | cnext
1765 call assert_equal(2, tabpagenr('$'))
1766 cnext | cnext
1767 call assert_equal(3, tabpagenr('$'))
1768 tabfirst | enew | tabonly | only
1769
Bram Moolenaar539aa6b2019-11-17 18:09:38 +01001770 set switchbuf=uselast
1771 split
1772 let last_winid = win_getid()
1773 copen
1774 exe "normal 1G\<CR>"
1775 call assert_equal(last_winid, win_getid())
1776 enew | only
1777
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001778 " With an empty 'switchbuf', jumping to a quickfix entry should open the
1779 " file in an existing window (if present)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001780 set switchbuf=
1781 edit Xqftestfile1
1782 let file1_winid = win_getid()
1783 new Xqftestfile2
1784 let file2_winid = win_getid()
1785 copen
1786 exe "normal 1G\<CR>"
1787 call assert_equal(file1_winid, win_getid())
1788 copen
1789 exe "normal 3G\<CR>"
1790 call assert_equal(file2_winid, win_getid())
1791 copen | only
1792 exe "normal 5G\<CR>"
1793 call assert_equal(2, winnr('$'))
1794 call assert_equal(1, bufwinnr('Xqftestfile3'))
1795
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001796 " If only quickfix window is open in the current tabpage, jumping to an
Bram Moolenaar1bc353b2019-09-01 14:45:28 +02001797 " entry with 'switchbuf' set to 'usetab' should search in other tabpages.
Bram Moolenaar049cba92016-06-26 14:38:04 +02001798 enew | only
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001799 set switchbuf=usetab
1800 tabedit Xqftestfile1
1801 tabedit Xqftestfile2
1802 tabedit Xqftestfile3
1803 tabfirst
1804 copen | only
1805 clast
1806 call assert_equal(4, tabpagenr())
1807 tabfirst | tabonly | enew | only
Bram Moolenaar049cba92016-06-26 14:38:04 +02001808
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001809 " Jumping to a file that is not present in any of the tabpages and the
1810 " current tabpage doesn't have any usable windows, should open it in a new
1811 " window in the current tabpage.
1812 copen | only
1813 cfirst
1814 call assert_equal(1, tabpagenr())
1815 call assert_equal('Xqftestfile1', bufname(''))
1816
1817 " If opening a file changes 'switchbuf', then the new value should be
1818 " retained.
1819 call writefile(["vim: switchbuf=split"], 'Xqftestfile1')
1820 enew | only
1821 set switchbuf&vim
1822 cexpr "Xqftestfile1:1:10"
1823 call assert_equal('split', &switchbuf)
1824 call writefile(["vim: switchbuf=usetab"], 'Xqftestfile1')
1825 enew | only
1826 set switchbuf=useopen
1827 cexpr "Xqftestfile1:1:10"
1828 call assert_equal('usetab', &switchbuf)
1829 call writefile(["vim: switchbuf&vim"], 'Xqftestfile1')
1830 enew | only
1831 set switchbuf=useopen
1832 cexpr "Xqftestfile1:1:10"
1833 call assert_equal('', &switchbuf)
1834
Bram Moolenaar049cba92016-06-26 14:38:04 +02001835 call delete('Xqftestfile1')
1836 call delete('Xqftestfile2')
1837 call delete('Xqftestfile3')
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01001838 set switchbuf&vim
1839
1840 enew | only
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001841endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001842
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001843func Xadjust_qflnum(cchar)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001844 call s:setup_commands(a:cchar)
1845
1846 enew | only
1847
Bram Moolenaarc1542742016-07-20 21:44:37 +02001848 let fname = 'Xqftestfile' . a:cchar
1849 call s:create_test_file(fname)
1850 exe 'edit ' . fname
Bram Moolenaar049cba92016-06-26 14:38:04 +02001851
Bram Moolenaarc1542742016-07-20 21:44:37 +02001852 Xgetexpr [fname . ':5:Line5',
1853 \ fname . ':10:Line10',
1854 \ fname . ':15:Line15',
1855 \ fname . ':20:Line20']
Bram Moolenaar049cba92016-06-26 14:38:04 +02001856
1857 6,14delete
1858 call append(6, ['Buffer', 'Window'])
1859
1860 let l = g:Xgetlist()
Bram Moolenaar049cba92016-06-26 14:38:04 +02001861 call assert_equal(5, l[0].lnum)
1862 call assert_equal(6, l[2].lnum)
1863 call assert_equal(13, l[3].lnum)
1864
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001865 " If a file doesn't have any quickfix entries, then deleting lines in the
1866 " file should not update the quickfix list
1867 call g:Xsetlist([], 'f')
1868 1,2delete
1869 call assert_equal([], g:Xgetlist())
1870
Bram Moolenaar049cba92016-06-26 14:38:04 +02001871 enew!
Bram Moolenaarc1542742016-07-20 21:44:37 +02001872 call delete(fname)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001873endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001874
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001875func Test_adjust_lnum()
Bram Moolenaarc1542742016-07-20 21:44:37 +02001876 call setloclist(0, [])
Bram Moolenaar049cba92016-06-26 14:38:04 +02001877 call Xadjust_qflnum('c')
Bram Moolenaarc1542742016-07-20 21:44:37 +02001878 call setqflist([])
Bram Moolenaar049cba92016-06-26 14:38:04 +02001879 call Xadjust_qflnum('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001880endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001881
1882" Tests for the :grep/:lgrep and :grepadd/:lgrepadd commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001883func s:test_xgrep(cchar)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001884 call s:setup_commands(a:cchar)
1885
1886 " The following lines are used for the grep test. Don't remove.
1887 " Grep_Test_Text: Match 1
1888 " Grep_Test_Text: Match 2
1889 " GrepAdd_Test_Text: Match 1
1890 " GrepAdd_Test_Text: Match 2
1891 enew! | only
1892 set makeef&vim
1893 silent Xgrep Grep_Test_Text: test_quickfix.vim
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +01001894 call assert_true(len(g:Xgetlist()) == 5)
Bram Moolenaar049cba92016-06-26 14:38:04 +02001895 Xopen
1896 call assert_true(w:quickfix_title =~ '^:grep')
1897 Xclose
1898 enew
1899 set makeef=Temp_File_##
1900 silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +01001901 call assert_true(len(g:Xgetlist()) == 9)
1902
1903 " Try with 'grepprg' set to 'internal'
1904 set grepprg=internal
1905 silent Xgrep Grep_Test_Text: test_quickfix.vim
1906 silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
1907 call assert_true(len(g:Xgetlist()) == 9)
1908 set grepprg&vim
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001909
1910 call writefile(['Vim'], 'XtestTempFile')
1911 set makeef=XtestTempFile
1912 silent Xgrep Grep_Test_Text: test_quickfix.vim
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +01001913 call assert_equal(5, len(g:Xgetlist()))
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01001914 call assert_false(filereadable('XtestTempFile'))
1915 set makeef&vim
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001916endfunc
Bram Moolenaar049cba92016-06-26 14:38:04 +02001917
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001918func Test_grep()
Bram Moolenaar049cba92016-06-26 14:38:04 +02001919 if !has('unix')
1920 " The grepprg may not be set on non-Unix systems
1921 return
1922 endif
1923
1924 call s:test_xgrep('c')
1925 call s:test_xgrep('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001926endfunc
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001927
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001928func Test_two_windows()
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001929 " Use one 'errorformat' for two windows. Add an expression to each of them,
1930 " make sure they each keep their own state.
1931 set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
1932 call mkdir('Xone/a', 'p')
1933 call mkdir('Xtwo/a', 'p')
1934 let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
1935 call writefile(lines, 'Xone/a/one.txt')
1936 call writefile(lines, 'Xtwo/a/two.txt')
1937
1938 new one
1939 let one_id = win_getid()
1940 lexpr ""
1941 new two
1942 let two_id = win_getid()
1943 lexpr ""
1944
1945 laddexpr "Entering dir 'Xtwo/a'"
1946 call win_gotoid(one_id)
1947 laddexpr "Entering dir 'Xone/a'"
1948 call win_gotoid(two_id)
1949 laddexpr 'two.txt:5:two two two'
1950 call win_gotoid(one_id)
1951 laddexpr 'one.txt:3:one one one'
1952
1953 let loc_one = getloclist(one_id)
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001954 call assert_equal('Xone/a/one.txt', bufname(loc_one[1].bufnr))
1955 call assert_equal(3, loc_one[1].lnum)
1956
1957 let loc_two = getloclist(two_id)
Bram Moolenaar361c8f02016-07-02 15:41:47 +02001958 call assert_equal('Xtwo/a/two.txt', bufname(loc_two[1].bufnr))
1959 call assert_equal(5, loc_two[1].lnum)
1960
1961 call win_gotoid(one_id)
1962 bwipe!
1963 call win_gotoid(two_id)
1964 bwipe!
1965 call delete('Xone', 'rf')
1966 call delete('Xtwo', 'rf')
1967endfunc
Bram Moolenaardcb17002016-07-07 18:58:59 +02001968
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001969func XbottomTests(cchar)
Bram Moolenaar537ef082016-07-09 17:56:19 +02001970 call s:setup_commands(a:cchar)
1971
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +02001972 " Calling lbottom without any errors should fail
1973 if a:cchar == 'l'
1974 call assert_fails('lbottom', 'E776:')
1975 endif
1976
Bram Moolenaar875feea2017-06-11 16:07:51 +02001977 call g:Xsetlist([{'filename': 'foo', 'lnum': 42}])
Bram Moolenaar537ef082016-07-09 17:56:19 +02001978 Xopen
Bram Moolenaardcb17002016-07-07 18:58:59 +02001979 let wid = win_getid()
1980 call assert_equal(1, line('.'))
1981 wincmd w
Bram Moolenaar875feea2017-06-11 16:07:51 +02001982 call g:Xsetlist([{'filename': 'var', 'lnum': 24}], 'a')
Bram Moolenaar537ef082016-07-09 17:56:19 +02001983 Xbottom
Bram Moolenaardcb17002016-07-07 18:58:59 +02001984 call win_gotoid(wid)
1985 call assert_equal(2, line('.'))
Bram Moolenaar537ef082016-07-09 17:56:19 +02001986 Xclose
Bram Moolenaardcb17002016-07-07 18:58:59 +02001987endfunc
Bram Moolenaar537ef082016-07-09 17:56:19 +02001988
1989" Tests for the :cbottom and :lbottom commands
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001990func Test_cbottom()
Bram Moolenaar537ef082016-07-09 17:56:19 +02001991 call XbottomTests('c')
1992 call XbottomTests('l')
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001993endfunc
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02001994
Bram Moolenaar2b946c92016-11-12 18:14:44 +01001995func HistoryTest(cchar)
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02001996 call s:setup_commands(a:cchar)
1997
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02001998 " clear all lists after the first one, then replace the first one.
1999 call g:Xsetlist([])
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +02002000 call assert_fails('Xolder 99', 'E380:')
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02002001 let entry = {'filename': 'foo', 'lnum': 42}
2002 call g:Xsetlist([entry], 'r')
2003 call g:Xsetlist([entry, entry])
2004 call g:Xsetlist([entry, entry, entry])
2005 let res = split(execute(a:cchar . 'hist'), "\n")
2006 call assert_equal(3, len(res))
2007 let common = 'errors :set' . (a:cchar == 'c' ? 'qf' : 'loc') . 'list()'
2008 call assert_equal(' error list 1 of 3; 1 ' . common, res[0])
2009 call assert_equal(' error list 2 of 3; 2 ' . common, res[1])
2010 call assert_equal('> error list 3 of 3; 3 ' . common, res[2])
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02002011
Bram Moolenaar8ffc7c82019-05-05 21:00:26 +02002012 " Test for changing the quickfix lists
2013 call assert_equal(3, g:Xgetlist({'nr' : 0}).nr)
2014 exe '1' . a:cchar . 'hist'
2015 call assert_equal(1, g:Xgetlist({'nr' : 0}).nr)
2016 exe '3' . a:cchar . 'hist'
2017 call assert_equal(3, g:Xgetlist({'nr' : 0}).nr)
2018 call assert_fails('-2' . a:cchar . 'hist', 'E16:')
2019 call assert_fails('4' . a:cchar . 'hist', 'E16:')
2020
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02002021 call g:Xsetlist([], 'f')
2022 let l = split(execute(a:cchar . 'hist'), "\n")
2023 call assert_equal('No entries', l[0])
Bram Moolenaar8ffc7c82019-05-05 21:00:26 +02002024 if a:cchar == 'c'
2025 call assert_fails('4chist', 'E16:')
2026 else
2027 call assert_fails('4lhist', 'E776:')
2028 endif
Bram Moolenaar5b69c222019-01-11 14:50:06 +01002029
2030 " An empty list should still show the stack history
2031 call g:Xsetlist([])
2032 let res = split(execute(a:cchar . 'hist'), "\n")
2033 call assert_equal('> error list 1 of 1; 0 ' . common, res[0])
2034
2035 call g:Xsetlist([], 'f')
Bram Moolenaarf6acffb2016-07-16 16:54:24 +02002036endfunc
2037
2038func Test_history()
2039 call HistoryTest('c')
2040 call HistoryTest('l')
2041endfunc
Bram Moolenaar015102e2016-07-16 18:24:56 +02002042
2043func Test_duplicate_buf()
2044 " make sure we can get the highest buffer number
2045 edit DoesNotExist
2046 edit DoesNotExist2
2047 let last_buffer = bufnr("$")
2048
2049 " make sure only one buffer is created
2050 call writefile(['this one', 'that one'], 'Xgrepthis')
2051 vimgrep one Xgrepthis
2052 vimgrep one Xgrepthis
2053 call assert_equal(last_buffer + 1, bufnr("$"))
2054
2055 call delete('Xgrepthis')
2056endfunc
Bram Moolenaard823fa92016-08-12 16:29:27 +02002057
2058" Quickfix/Location list set/get properties tests
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002059func Xproperty_tests(cchar)
Bram Moolenaard823fa92016-08-12 16:29:27 +02002060 call s:setup_commands(a:cchar)
2061
2062 " Error cases
2063 call assert_fails('call g:Xgetlist(99)', 'E715:')
2064 call assert_fails('call g:Xsetlist(99)', 'E714:')
2065 call assert_fails('call g:Xsetlist([], "a", [])', 'E715:')
2066
2067 " Set and get the title
Bram Moolenaarb6fa30c2017-03-29 14:19:25 +02002068 call g:Xsetlist([])
Bram Moolenaard823fa92016-08-12 16:29:27 +02002069 Xopen
2070 wincmd p
2071 call g:Xsetlist([{'filename':'foo', 'lnum':27}])
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02002072 let s = g:Xsetlist([], 'a', {'title' : 'Sample'})
2073 call assert_equal(0, s)
Bram Moolenaard823fa92016-08-12 16:29:27 +02002074 let d = g:Xgetlist({"title":1})
2075 call assert_equal('Sample', d.title)
Bram Moolenaara2aa8a22018-04-24 13:55:00 +02002076 " Try setting title to a non-string value
2077 call assert_equal(-1, g:Xsetlist([], 'a', {'title' : ['Test']}))
2078 call assert_equal('Sample', g:Xgetlist({"title":1}).title)
Bram Moolenaard823fa92016-08-12 16:29:27 +02002079
2080 Xopen
2081 call assert_equal('Sample', w:quickfix_title)
2082 Xclose
2083
Bram Moolenaar2b529bb2016-08-27 13:35:35 +02002084 " Tests for action argument
2085 silent! Xolder 999
2086 let qfnr = g:Xgetlist({'all':1}).nr
2087 call g:Xsetlist([], 'r', {'title' : 'N1'})
2088 call assert_equal('N1', g:Xgetlist({'all':1}).title)
2089 call g:Xsetlist([], ' ', {'title' : 'N2'})
2090 call assert_equal(qfnr + 1, g:Xgetlist({'all':1}).nr)
Bram Moolenaar890680c2016-09-27 21:28:56 +02002091
2092 let res = g:Xgetlist({'nr': 0})
2093 call assert_equal(qfnr + 1, res.nr)
2094 call assert_equal(['nr'], keys(res))
2095
Bram Moolenaar2b529bb2016-08-27 13:35:35 +02002096 call g:Xsetlist([], ' ', {'title' : 'N3'})
2097 call assert_equal('N2', g:Xgetlist({'nr':2, 'title':1}).title)
2098
Bram Moolenaaree85df32017-03-19 14:19:50 +01002099 " Changing the title of an earlier quickfix list
Bram Moolenaar55b69262017-08-13 13:42:01 +02002100 call g:Xsetlist([], 'r', {'title' : 'NewTitle', 'nr' : 2})
Bram Moolenaaree85df32017-03-19 14:19:50 +01002101 call assert_equal('NewTitle', g:Xgetlist({'nr':2, 'title':1}).title)
2102
2103 " Changing the title of an invalid quickfix list
2104 call assert_equal(-1, g:Xsetlist([], ' ',
2105 \ {'title' : 'SomeTitle', 'nr' : 99}))
2106 call assert_equal(-1, g:Xsetlist([], ' ',
2107 \ {'title' : 'SomeTitle', 'nr' : 'abc'}))
2108
2109 if a:cchar == 'c'
2110 copen
2111 call assert_equal({'winid':win_getid()}, getqflist({'winid':1}))
2112 cclose
2113 endif
2114
Bram Moolenaard823fa92016-08-12 16:29:27 +02002115 " Invalid arguments
2116 call assert_fails('call g:Xgetlist([])', 'E715')
2117 call assert_fails('call g:Xsetlist([], "a", [])', 'E715')
2118 let s = g:Xsetlist([], 'a', {'abc':1})
2119 call assert_equal(-1, s)
2120
2121 call assert_equal({}, g:Xgetlist({'abc':1}))
Bram Moolenaara6d48492017-12-12 22:45:31 +01002122 call assert_equal('', g:Xgetlist({'nr':99, 'title':1}).title)
2123 call assert_equal('', g:Xgetlist({'nr':[], 'title':1}).title)
Bram Moolenaard823fa92016-08-12 16:29:27 +02002124
2125 if a:cchar == 'l'
Bram Moolenaar890680c2016-09-27 21:28:56 +02002126 call assert_equal({}, getloclist(99, {'title': 1}))
Bram Moolenaard823fa92016-08-12 16:29:27 +02002127 endif
Bram Moolenaar8f77c5a2017-04-30 14:21:00 +02002128
2129 " Context related tests
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02002130 let s = g:Xsetlist([], 'a', {'context':[1,2,3]})
2131 call assert_equal(0, s)
Bram Moolenaar8f77c5a2017-04-30 14:21:00 +02002132 call test_garbagecollect_now()
2133 let d = g:Xgetlist({'context':1})
2134 call assert_equal([1,2,3], d.context)
2135 call g:Xsetlist([], 'a', {'context':{'color':'green'}})
2136 let d = g:Xgetlist({'context':1})
2137 call assert_equal({'color':'green'}, d.context)
2138 call g:Xsetlist([], 'a', {'context':"Context info"})
2139 let d = g:Xgetlist({'context':1})
2140 call assert_equal("Context info", d.context)
2141 call g:Xsetlist([], 'a', {'context':246})
2142 let d = g:Xgetlist({'context':1})
2143 call assert_equal(246, d.context)
2144 if a:cchar == 'l'
2145 " Test for copying context across two different location lists
2146 new | only
2147 let w1_id = win_getid()
2148 let l = [1]
2149 call setloclist(0, [], 'a', {'context':l})
2150 new
2151 let w2_id = win_getid()
2152 call add(l, 2)
2153 call assert_equal([1, 2], getloclist(w1_id, {'context':1}).context)
2154 call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
2155 unlet! l
2156 call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
2157 only
2158 call setloclist(0, [], 'f')
Bram Moolenaara6d48492017-12-12 22:45:31 +01002159 call assert_equal('', getloclist(0, {'context':1}).context)
Bram Moolenaar8f77c5a2017-04-30 14:21:00 +02002160 endif
Bram Moolenaar6e62da32017-05-28 08:16:25 +02002161
2162 " Test for changing the context of previous quickfix lists
2163 call g:Xsetlist([], 'f')
2164 Xexpr "One"
2165 Xexpr "Two"
2166 Xexpr "Three"
Bram Moolenaar55b69262017-08-13 13:42:01 +02002167 call g:Xsetlist([], 'r', {'context' : [1], 'nr' : 1})
2168 call g:Xsetlist([], 'a', {'context' : [2], 'nr' : 2})
Bram Moolenaar6e62da32017-05-28 08:16:25 +02002169 " Also, check for setting the context using quickfix list number zero.
Bram Moolenaar55b69262017-08-13 13:42:01 +02002170 call g:Xsetlist([], 'r', {'context' : [3], 'nr' : 0})
Bram Moolenaar6e62da32017-05-28 08:16:25 +02002171 call test_garbagecollect_now()
2172 let l = g:Xgetlist({'nr' : 1, 'context' : 1})
2173 call assert_equal([1], l.context)
2174 let l = g:Xgetlist({'nr' : 2, 'context' : 1})
2175 call assert_equal([2], l.context)
2176 let l = g:Xgetlist({'nr' : 3, 'context' : 1})
2177 call assert_equal([3], l.context)
2178
2179 " Test for changing the context through reference and for garbage
2180 " collection of quickfix context
2181 let l = ["red"]
2182 call g:Xsetlist([], ' ', {'context' : l})
2183 call add(l, "blue")
2184 let x = g:Xgetlist({'context' : 1})
2185 call add(x.context, "green")
2186 call assert_equal(["red", "blue", "green"], l)
2187 call assert_equal(["red", "blue", "green"], x.context)
2188 unlet l
2189 call test_garbagecollect_now()
2190 let m = g:Xgetlist({'context' : 1})
2191 call assert_equal(["red", "blue", "green"], m.context)
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002192
2193 " Test for setting/getting items
2194 Xexpr ""
2195 let qfprev = g:Xgetlist({'nr':0})
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02002196 let s = g:Xsetlist([], ' ', {'title':'Green',
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002197 \ 'items' : [{'filename':'F1', 'lnum':10}]})
Bram Moolenaar86f100dc2017-06-28 21:26:27 +02002198 call assert_equal(0, s)
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002199 let qfcur = g:Xgetlist({'nr':0})
2200 call assert_true(qfcur.nr == qfprev.nr + 1)
2201 let l = g:Xgetlist({'items':1})
2202 call assert_equal('F1', bufname(l.items[0].bufnr))
2203 call assert_equal(10, l.items[0].lnum)
2204 call g:Xsetlist([], 'a', {'items' : [{'filename':'F2', 'lnum':20},
2205 \ {'filename':'F2', 'lnum':30}]})
2206 let l = g:Xgetlist({'items':1})
2207 call assert_equal('F2', bufname(l.items[2].bufnr))
2208 call assert_equal(30, l.items[2].lnum)
2209 call g:Xsetlist([], 'r', {'items' : [{'filename':'F3', 'lnum':40}]})
2210 let l = g:Xgetlist({'items':1})
2211 call assert_equal('F3', bufname(l.items[0].bufnr))
2212 call assert_equal(40, l.items[0].lnum)
2213 call g:Xsetlist([], 'r', {'items' : []})
2214 let l = g:Xgetlist({'items':1})
2215 call assert_equal(0, len(l.items))
2216
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02002217 call g:Xsetlist([], 'r', {'title' : 'TestTitle'})
2218 call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]})
2219 call g:Xsetlist([], 'r', {'items' : [{'filename' : 'F1', 'lnum' : 10, 'text' : 'L10'}]})
2220 call assert_equal('TestTitle', g:Xgetlist({'title' : 1}).title)
2221
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02002222 " Test for getting id of window associated with a location list window
2223 if a:cchar == 'l'
2224 only
2225 call assert_equal(0, g:Xgetlist({'all' : 1}).filewinid)
2226 let wid = win_getid()
2227 Xopen
2228 call assert_equal(wid, g:Xgetlist({'filewinid' : 1}).filewinid)
2229 wincmd w
2230 call assert_equal(0, g:Xgetlist({'filewinid' : 1}).filewinid)
2231 only
2232 endif
2233
Bram Moolenaarae338332017-08-11 20:25:26 +02002234 " The following used to crash Vim with address sanitizer
2235 call g:Xsetlist([], 'f')
2236 call g:Xsetlist([], 'a', {'items' : [{'filename':'F1', 'lnum':10}]})
2237 call assert_equal(10, g:Xgetlist({'items':1}).items[0].lnum)
2238
Bram Moolenaara2aa8a22018-04-24 13:55:00 +02002239 " Try setting the items using a string
2240 call assert_equal(-1, g:Xsetlist([], ' ', {'items' : 'Test'}))
2241
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002242 " Save and restore the quickfix stack
2243 call g:Xsetlist([], 'f')
2244 call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
2245 Xexpr "File1:10:Line1"
2246 Xexpr "File2:20:Line2"
2247 Xexpr "File3:30:Line3"
2248 let last_qf = g:Xgetlist({'nr':'$'}).nr
2249 call assert_equal(3, last_qf)
2250 let qstack = []
2251 for i in range(1, last_qf)
2252 let qstack = add(qstack, g:Xgetlist({'nr':i, 'all':1}))
2253 endfor
2254 call g:Xsetlist([], 'f')
2255 for i in range(len(qstack))
2256 call g:Xsetlist([], ' ', qstack[i])
2257 endfor
2258 call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
2259 call assert_equal(10, g:Xgetlist({'nr':1, 'items':1}).items[0].lnum)
2260 call assert_equal(20, g:Xgetlist({'nr':2, 'items':1}).items[0].lnum)
2261 call assert_equal(30, g:Xgetlist({'nr':3, 'items':1}).items[0].lnum)
2262 call g:Xsetlist([], 'f')
2263
2264 " Swap two quickfix lists
2265 Xexpr "File1:10:Line10"
2266 Xexpr "File2:20:Line20"
2267 Xexpr "File3:30:Line30"
2268 call g:Xsetlist([], 'r', {'nr':1,'title':'Colors','context':['Colors']})
2269 call g:Xsetlist([], 'r', {'nr':2,'title':'Fruits','context':['Fruits']})
2270 let l1=g:Xgetlist({'nr':1,'all':1})
2271 let l2=g:Xgetlist({'nr':2,'all':1})
Bram Moolenaara539f4f2017-08-30 20:33:55 +02002272 let save_id = l1.id
2273 let l1.id=l2.id
2274 let l2.id=save_id
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002275 call g:Xsetlist([], 'r', l1)
2276 call g:Xsetlist([], 'r', l2)
2277 let newl1=g:Xgetlist({'nr':1,'all':1})
2278 let newl2=g:Xgetlist({'nr':2,'all':1})
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02002279 call assert_equal('Fruits', newl1.title)
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002280 call assert_equal(['Fruits'], newl1.context)
2281 call assert_equal('Line20', newl1.items[0].text)
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02002282 call assert_equal('Colors', newl2.title)
Bram Moolenaar6a8958d2017-06-22 21:33:20 +02002283 call assert_equal(['Colors'], newl2.context)
2284 call assert_equal('Line10', newl2.items[0].text)
2285 call g:Xsetlist([], 'f')
Bram Moolenaaree85df32017-03-19 14:19:50 +01002286endfunc
Bram Moolenaard823fa92016-08-12 16:29:27 +02002287
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002288func Test_qf_property()
Bram Moolenaard823fa92016-08-12 16:29:27 +02002289 call Xproperty_tests('c')
2290 call Xproperty_tests('l')
Bram Moolenaaree85df32017-03-19 14:19:50 +01002291endfunc
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002292
Bram Moolenaar5b69c222019-01-11 14:50:06 +01002293" Test for setting the current index in the location/quickfix list
2294func Xtest_setqfidx(cchar)
2295 call s:setup_commands(a:cchar)
2296
2297 Xgetexpr "F1:10:1:Line1\nF2:20:2:Line2\nF3:30:3:Line3"
2298 Xgetexpr "F4:10:1:Line1\nF5:20:2:Line2\nF6:30:3:Line3"
2299 Xgetexpr "F7:10:1:Line1\nF8:20:2:Line2\nF9:30:3:Line3"
2300
2301 call g:Xsetlist([], 'a', {'nr' : 3, 'idx' : 2})
2302 call g:Xsetlist([], 'a', {'nr' : 2, 'idx' : 2})
2303 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 3})
2304 Xolder 2
2305 Xopen
2306 call assert_equal(3, line('.'))
2307 Xnewer
2308 call assert_equal(2, line('.'))
2309 Xnewer
2310 call assert_equal(2, line('.'))
2311 " Update the current index with the quickfix window open
2312 wincmd w
2313 call g:Xsetlist([], 'a', {'nr' : 3, 'idx' : 3})
2314 Xopen
2315 call assert_equal(3, line('.'))
2316 Xclose
2317
2318 " Set the current index to the last entry
2319 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : '$'})
2320 call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
2321 " A large value should set the index to the last index
2322 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 1})
2323 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 999})
2324 call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
2325 " Invalid index values
2326 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : -1})
2327 call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
2328 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 0})
2329 call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
2330 call g:Xsetlist([], 'a', {'nr' : 1, 'idx' : 'xx'})
2331 call assert_equal(3, g:Xgetlist({'nr' : 1, 'idx' : 0}).idx)
2332 call assert_fails("call g:Xsetlist([], 'a', {'nr':1, 'idx':[]})", 'E745:')
2333
2334 call g:Xsetlist([], 'f')
2335 new | only
2336endfunc
2337
2338func Test_setqfidx()
2339 call Xtest_setqfidx('c')
2340 call Xtest_setqfidx('l')
2341endfunc
2342
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002343" Tests for the QuickFixCmdPre/QuickFixCmdPost autocommands
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002344func QfAutoCmdHandler(loc, cmd)
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002345 call add(g:acmds, a:loc . a:cmd)
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002346endfunc
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002347
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002348func Test_Autocmd()
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002349 autocmd QuickFixCmdPre * call QfAutoCmdHandler('pre', expand('<amatch>'))
2350 autocmd QuickFixCmdPost * call QfAutoCmdHandler('post', expand('<amatch>'))
2351
2352 let g:acmds = []
2353 cexpr "F1:10:Line 10"
2354 caddexpr "F1:20:Line 20"
2355 cgetexpr "F1:30:Line 30"
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002356 cexpr ""
2357 caddexpr ""
2358 cgetexpr ""
2359 silent! cexpr non_existing_func()
2360 silent! caddexpr non_existing_func()
2361 silent! cgetexpr non_existing_func()
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002362 let l = ['precexpr',
2363 \ 'postcexpr',
2364 \ 'precaddexpr',
2365 \ 'postcaddexpr',
2366 \ 'precgetexpr',
2367 \ 'postcgetexpr',
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002368 \ 'precexpr',
2369 \ 'postcexpr',
2370 \ 'precaddexpr',
2371 \ 'postcaddexpr',
2372 \ 'precgetexpr',
2373 \ 'postcgetexpr',
2374 \ 'precexpr',
2375 \ 'precaddexpr',
2376 \ 'precgetexpr']
2377 call assert_equal(l, g:acmds)
2378
2379 let g:acmds = []
2380 enew! | call append(0, "F2:10:Line 10")
2381 cbuffer!
2382 enew! | call append(0, "F2:20:Line 20")
2383 cgetbuffer
2384 enew! | call append(0, "F2:30:Line 30")
2385 caddbuffer
2386 new
2387 let bnum = bufnr('%')
2388 bunload
2389 exe 'silent! cbuffer! ' . bnum
2390 exe 'silent! cgetbuffer ' . bnum
2391 exe 'silent! caddbuffer ' . bnum
2392 enew!
2393 let l = ['precbuffer',
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002394 \ 'postcbuffer',
2395 \ 'precgetbuffer',
2396 \ 'postcgetbuffer',
2397 \ 'precaddbuffer',
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002398 \ 'postcaddbuffer',
2399 \ 'precbuffer',
2400 \ 'precgetbuffer',
2401 \ 'precaddbuffer']
Bram Moolenaar04c4ce62016-09-01 15:45:58 +02002402 call assert_equal(l, g:acmds)
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002403
2404 call writefile(['Xtest:1:Line1'], 'Xtest')
2405 call writefile([], 'Xempty')
2406 let g:acmds = []
2407 cfile Xtest
2408 caddfile Xtest
2409 cgetfile Xtest
2410 cfile Xempty
2411 caddfile Xempty
2412 cgetfile Xempty
2413 silent! cfile do_not_exist
2414 silent! caddfile do_not_exist
2415 silent! cgetfile do_not_exist
2416 let l = ['precfile',
2417 \ 'postcfile',
2418 \ 'precaddfile',
2419 \ 'postcaddfile',
2420 \ 'precgetfile',
2421 \ 'postcgetfile',
2422 \ 'precfile',
2423 \ 'postcfile',
2424 \ 'precaddfile',
2425 \ 'postcaddfile',
2426 \ 'precgetfile',
2427 \ 'postcgetfile',
2428 \ 'precfile',
2429 \ 'postcfile',
2430 \ 'precaddfile',
2431 \ 'postcaddfile',
2432 \ 'precgetfile',
2433 \ 'postcgetfile']
2434 call assert_equal(l, g:acmds)
2435
2436 let g:acmds = []
2437 helpgrep quickfix
2438 silent! helpgrep non_existing_help_topic
2439 vimgrep test Xtest
2440 vimgrepadd test Xtest
2441 silent! vimgrep non_existing_test Xtest
2442 silent! vimgrepadd non_existing_test Xtest
2443 set makeprg=
2444 silent! make
2445 set makeprg&
2446 let l = ['prehelpgrep',
2447 \ 'posthelpgrep',
2448 \ 'prehelpgrep',
2449 \ 'posthelpgrep',
2450 \ 'previmgrep',
2451 \ 'postvimgrep',
2452 \ 'previmgrepadd',
2453 \ 'postvimgrepadd',
2454 \ 'previmgrep',
2455 \ 'postvimgrep',
2456 \ 'previmgrepadd',
2457 \ 'postvimgrepadd',
2458 \ 'premake',
2459 \ 'postmake']
2460 call assert_equal(l, g:acmds)
2461
2462 if has('unix')
2463 " Run this test only on Unix-like systems. The grepprg may not be set on
2464 " non-Unix systems.
2465 " The following lines are used for the grep test. Don't remove.
2466 " Grep_Autocmd_Text: Match 1
2467 " GrepAdd_Autocmd_Text: Match 2
2468 let g:acmds = []
2469 silent grep Grep_Autocmd_Text test_quickfix.vim
2470 silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim
2471 silent grep abc123def Xtest
2472 silent grepadd abc123def Xtest
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +01002473 set grepprg=internal
2474 silent grep Grep_Autocmd_Text test_quickfix.vim
2475 silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim
2476 silent lgrep Grep_Autocmd_Text test_quickfix.vim
2477 silent lgrepadd GrepAdd_Autocmd_Text test_quickfix.vim
2478 set grepprg&vim
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002479 let l = ['pregrep',
2480 \ 'postgrep',
2481 \ 'pregrepadd',
2482 \ 'postgrepadd',
2483 \ 'pregrep',
2484 \ 'postgrep',
2485 \ 'pregrepadd',
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +01002486 \ 'postgrepadd',
2487 \ 'pregrep',
2488 \ 'postgrep',
2489 \ 'pregrepadd',
2490 \ 'postgrepadd',
2491 \ 'prelgrep',
2492 \ 'postlgrep',
2493 \ 'prelgrepadd',
2494 \ 'postlgrepadd']
Bram Moolenaar1ed22762017-11-28 18:03:44 +01002495 call assert_equal(l, g:acmds)
2496 endif
2497
2498 call delete('Xtest')
2499 call delete('Xempty')
Bram Moolenaarb254af32017-12-18 19:48:58 +01002500 au! QuickFixCmdPre
2501 au! QuickFixCmdPost
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002502endfunc
Bram Moolenaar21662be2016-11-06 14:46:44 +01002503
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002504func Test_Autocmd_Exception()
Bram Moolenaar21662be2016-11-06 14:46:44 +01002505 set efm=%m
2506 lgetexpr '?'
2507
2508 try
2509 call DoesNotExit()
2510 catch
2511 lgetexpr '1'
2512 finally
2513 lgetexpr '1'
2514 endtry
2515
2516 call assert_equal('1', getloclist(0)[0].text)
2517
2518 set efm&vim
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002519endfunc
Bram Moolenaar63bed3d2016-11-12 15:36:54 +01002520
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002521func Test_caddbuffer_wrong()
2522 " This used to cause a memory access in freed memory.
Bram Moolenaar63bed3d2016-11-12 15:36:54 +01002523 let save_efm = &efm
2524 set efm=%EEEE%m,%WWWW,%+CCCC%>%#,%GGGG%.#
2525 cgetexpr ['WWWW', 'EEEE', 'CCCC']
2526 let &efm = save_efm
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002527 caddbuffer
Bram Moolenaar63bed3d2016-11-12 15:36:54 +01002528 bwipe!
2529endfunc
Bram Moolenaar2b946c92016-11-12 18:14:44 +01002530
2531func Test_caddexpr_wrong()
2532 " This used to cause a memory access in freed memory.
2533 cbuffer
2534 cbuffer
2535 copen
2536 let save_efm = &efm
2537 set efm=%
2538 call assert_fails('caddexpr ""', 'E376:')
2539 let &efm = save_efm
2540endfunc
Bram Moolenaar7618e002016-11-13 15:09:26 +01002541
2542func Test_dirstack_cleanup()
2543 " This used to cause a memory access in freed memory.
2544 let save_efm = &efm
2545 lexpr '0'
2546 lopen
2547 fun X(c)
2548 let save_efm=&efm
2549 set efm=%D%f
2550 if a:c == 'c'
2551 caddexpr '::'
2552 else
2553 laddexpr ':0:0'
2554 endif
2555 let &efm=save_efm
2556 endfun
2557 call X('c')
2558 call X('l')
2559 call setqflist([], 'r')
2560 caddbuffer
2561 let &efm = save_efm
2562endfunc
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01002563
2564" Tests for jumping to entries from the location list window and quickfix
2565" window
2566func Test_cwindow_jump()
2567 set efm=%f%%%l%%%m
2568 lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2569 lopen | only
2570 lfirst
2571 call assert_true(winnr('$') == 2)
2572 call assert_true(winnr() == 1)
2573 " Location list for the new window should be set
2574 call assert_true(getloclist(0)[2].text == 'Line 30')
2575
2576 " Open a scratch buffer
2577 " Open a new window and create a location list
2578 " Open the location list window and close the other window
2579 " Jump to an entry.
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01002580 " Should create a new window and jump to the entry. The scratch buffer
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01002581 " should not be used.
2582 enew | only
2583 set buftype=nofile
2584 below new
2585 lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2586 lopen
2587 2wincmd c
2588 lnext
2589 call assert_true(winnr('$') == 3)
2590 call assert_true(winnr() == 2)
2591
2592 " Open two windows with two different location lists
2593 " Open the location list window and close the previous window
2594 " Jump to an entry in the location list window
2595 " Should open the file in the first window and not set the location list.
2596 enew | only
2597 lgetexpr ["F1%5%Line 5"]
2598 below new
2599 lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2600 lopen
2601 2wincmd c
2602 lnext
2603 call assert_true(winnr() == 1)
2604 call assert_true(getloclist(0)[0].text == 'Line 5')
2605
2606 enew | only
2607 cgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2608 copen
2609 cnext
2610 call assert_true(winnr('$') == 2)
2611 call assert_true(winnr() == 1)
2612
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01002613 " open the quickfix buffer in two windows and jump to an entry. Should open
2614 " the file in the first quickfix window.
2615 enew | only
2616 copen
2617 let bnum = bufnr('')
2618 exe 'sbuffer ' . bnum
2619 wincmd b
2620 cfirst
2621 call assert_equal(2, winnr())
2622 call assert_equal('F1', bufname(''))
2623 enew | only
2624 exe 'sb' bnum
2625 exe 'botright sb' bnum
2626 wincmd t
2627 clast
2628 call assert_equal(2, winnr())
2629 call assert_equal('quickfix', getwinvar(1, '&buftype'))
2630 call assert_equal('quickfix', getwinvar(3, '&buftype'))
2631
Bram Moolenaar4b96df52020-01-26 22:00:26 +01002632 " Jumping to a file from the location list window should find a usable
Bram Moolenaar15a7bdc2019-11-29 22:06:47 +01002633 " window by wrapping around the window list.
2634 enew | only
2635 call setloclist(0, [], 'f')
2636 new | new
2637 lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
2638 lopen
2639 1close
2640 call assert_equal(0, getloclist(3, {'id' : 0}).id)
2641 lnext
2642 call assert_equal(3, winnr())
2643 call assert_equal(getloclist(1, {'id' : 0}).id, getloclist(3, {'id' : 0}).id)
2644
Bram Moolenaar391b1dd2017-03-04 13:47:11 +01002645 enew | only
2646 set efm&vim
2647endfunc
Bram Moolenaaree85df32017-03-19 14:19:50 +01002648
Bram Moolenaare00fdf32019-09-15 19:09:42 +02002649func Test_cwindow_highlight()
2650 CheckScreendump
2651
2652 let lines =<< trim END
2653 set t_u7=
2654 call setline(1, ['some', 'text', 'with', 'matches'])
2655 write XCwindow
2656 vimgrep e XCwindow
2657 redraw
2658 cwindow 4
2659 END
2660 call writefile(lines, 'XtestCwindow')
2661 let buf = RunVimInTerminal('-S XtestCwindow', #{rows: 12})
2662 call VerifyScreenDump(buf, 'Test_quickfix_cwindow_1', {})
2663
2664 call term_sendkeys(buf, ":cnext\<CR>")
2665 call VerifyScreenDump(buf, 'Test_quickfix_cwindow_2', {})
2666
2667 " clean up
2668 call StopVimInTerminal(buf)
2669 call delete('XtestCwindow')
2670 call delete('XCwindow')
2671endfunc
2672
Bram Moolenaaree85df32017-03-19 14:19:50 +01002673func XvimgrepTests(cchar)
2674 call s:setup_commands(a:cchar)
2675
2676 call writefile(['Editor:VIM vim',
2677 \ 'Editor:Emacs EmAcS',
2678 \ 'Editor:Notepad NOTEPAD'], 'Xtestfile1')
2679 call writefile(['Linux', 'MacOS', 'MS-Windows'], 'Xtestfile2')
2680
2681 " Error cases
2682 call assert_fails('Xvimgrep /abc *', 'E682:')
2683
2684 let @/=''
2685 call assert_fails('Xvimgrep // *', 'E35:')
2686
2687 call assert_fails('Xvimgrep abc', 'E683:')
2688 call assert_fails('Xvimgrep a1b2c3 Xtestfile1', 'E480:')
2689 call assert_fails('Xvimgrep pat Xa1b2c3', 'E480:')
2690
2691 Xexpr ""
2692 Xvimgrepadd Notepad Xtestfile1
2693 Xvimgrepadd MacOS Xtestfile2
2694 let l = g:Xgetlist()
2695 call assert_equal(2, len(l))
2696 call assert_equal('Editor:Notepad NOTEPAD', l[0].text)
2697
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01002698 10Xvimgrep #\cvim#g Xtestfile?
Bram Moolenaaree85df32017-03-19 14:19:50 +01002699 let l = g:Xgetlist()
2700 call assert_equal(2, len(l))
2701 call assert_equal(8, l[0].col)
2702 call assert_equal(12, l[1].col)
2703
2704 1Xvimgrep ?Editor? Xtestfile*
2705 let l = g:Xgetlist()
2706 call assert_equal(1, len(l))
2707 call assert_equal('Editor:VIM vim', l[0].text)
2708
2709 edit +3 Xtestfile2
2710 Xvimgrep +\cemacs+j Xtestfile1
2711 let l = g:Xgetlist()
2712 call assert_equal('Xtestfile2', bufname(''))
2713 call assert_equal('Editor:Emacs EmAcS', l[0].text)
2714
Bram Moolenaar2225ebb2018-04-24 15:48:11 +02002715 " Test for unloading a buffer after vimgrep searched the buffer
2716 %bwipe
2717 Xvimgrep /Editor/j Xtestfile*
2718 call assert_equal(0, getbufinfo('Xtestfile1')[0].loaded)
2719 call assert_equal([], getbufinfo('Xtestfile2'))
2720
Bram Moolenaar07ada5f2020-02-05 20:38:22 +01002721 " Test with the last search pattern not set
2722 call test_clear_search_pat()
2723 call assert_fails('Xvimgrep // *', 'E35:')
2724
Bram Moolenaaree85df32017-03-19 14:19:50 +01002725 call delete('Xtestfile1')
2726 call delete('Xtestfile2')
2727endfunc
2728
2729" Tests for the :vimgrep command
2730func Test_vimgrep()
2731 call XvimgrepTests('c')
2732 call XvimgrepTests('l')
2733endfunc
Bram Moolenaar69f40be2017-04-02 15:15:49 +02002734
Bram Moolenaar1c299432018-10-28 14:36:09 +01002735" Test for incsearch highlighting of the :vimgrep pattern
2736" This test used to cause "E315: ml_get: invalid lnum" errors.
2737func Test_vimgrep_incsearch()
2738 enew
2739 set incsearch
2740 call test_override("char_avail", 1)
2741
2742 call feedkeys(":2vimgrep assert test_quickfix.vim test_cdo.vim\<CR>", "ntx")
2743 let l = getqflist()
2744 call assert_equal(2, len(l))
2745
2746 call test_override("ALL", 0)
2747 set noincsearch
2748endfunc
2749
Bram Moolenaar69f40be2017-04-02 15:15:49 +02002750func XfreeTests(cchar)
2751 call s:setup_commands(a:cchar)
2752
2753 enew | only
2754
2755 " Deleting the quickfix stack should work even When the current list is
2756 " somewhere in the middle of the stack
2757 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2758 Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
2759 Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
2760 Xolder
2761 call g:Xsetlist([], 'f')
2762 call assert_equal(0, len(g:Xgetlist()))
2763
2764 " After deleting the stack, adding a new list should create a stack with a
2765 " single list.
2766 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2767 call assert_equal(1, g:Xgetlist({'all':1}).nr)
2768
2769 " Deleting the stack from a quickfix window should update/clear the
2770 " quickfix/location list window.
2771 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2772 Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
2773 Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
2774 Xolder
2775 Xwindow
2776 call g:Xsetlist([], 'f')
2777 call assert_equal(2, winnr('$'))
2778 call assert_equal(1, line('$'))
2779 Xclose
2780
2781 " Deleting the stack from a non-quickfix window should update/clear the
2782 " quickfix/location list window.
2783 Xexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2784 Xexpr ['Xfile2:20:20:Line 20', 'Xfile2:25:25:Line 25']
2785 Xexpr ['Xfile3:30:30:Line 30', 'Xfile3:35:35:Line 35']
2786 Xolder
2787 Xwindow
2788 wincmd p
2789 call g:Xsetlist([], 'f')
2790 call assert_equal(0, len(g:Xgetlist()))
2791 wincmd p
2792 call assert_equal(2, winnr('$'))
2793 call assert_equal(1, line('$'))
2794
2795 " After deleting the location list stack, if the location list window is
2796 " opened, then a new location list should be created. So opening the
2797 " location list window again should not create a new window.
2798 if a:cchar == 'l'
2799 lexpr ['Xfile1:10:10:Line 10', 'Xfile1:15:15:Line 15']
2800 wincmd p
2801 lopen
2802 call assert_equal(2, winnr('$'))
2803 endif
2804 Xclose
2805endfunc
2806
Bram Moolenaar74240d32017-12-10 15:26:15 +01002807" Tests for the quickfix free functionality
Bram Moolenaar69f40be2017-04-02 15:15:49 +02002808func Test_qf_free()
2809 call XfreeTests('c')
2810 call XfreeTests('l')
2811endfunc
Bram Moolenaar6e62da32017-05-28 08:16:25 +02002812
2813" Test for buffer overflow when parsing lines and adding new entries to
2814" the quickfix list.
2815func Test_bufoverflow()
2816 set efm=%f:%l:%m
2817 cgetexpr ['File1:100:' . repeat('x', 1025)]
2818
2819 set efm=%+GCompiler:\ %.%#,%f:%l:%m
2820 cgetexpr ['Compiler: ' . repeat('a', 1015), 'File1:10:Hello World']
2821
2822 set efm=%DEntering\ directory\ %f,%f:%l:%m
2823 cgetexpr ['Entering directory ' . repeat('a', 1006),
2824 \ 'File1:10:Hello World']
2825 set efm&vim
2826endfunc
2827
Bram Moolenaar875feea2017-06-11 16:07:51 +02002828" Tests for getting the quickfix stack size
2829func XsizeTests(cchar)
2830 call s:setup_commands(a:cchar)
2831
2832 call g:Xsetlist([], 'f')
2833 call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
Bram Moolenaara6d48492017-12-12 22:45:31 +01002834 call assert_equal('', g:Xgetlist({'nr':'$', 'all':1}).title)
2835 call assert_equal(0, g:Xgetlist({'nr':0}).nr)
Bram Moolenaar875feea2017-06-11 16:07:51 +02002836
2837 Xexpr "File1:10:Line1"
2838 Xexpr "File2:20:Line2"
2839 Xexpr "File3:30:Line3"
2840 Xolder | Xolder
2841 call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
2842 call g:Xsetlist([], 'f')
2843
2844 Xexpr "File1:10:Line1"
2845 Xexpr "File2:20:Line2"
2846 Xexpr "File3:30:Line3"
2847 Xolder | Xolder
2848 call g:Xsetlist([], 'a', {'nr':'$', 'title':'Compiler'})
2849 call assert_equal('Compiler', g:Xgetlist({'nr':3, 'all':1}).title)
2850endfunc
2851
2852func Test_Qf_Size()
2853 call XsizeTests('c')
2854 call XsizeTests('l')
2855endfunc
Bram Moolenaar18141832017-06-25 21:17:25 +02002856
Bram Moolenaar9c4feff2017-06-28 22:26:54 +02002857func Test_cclose_from_copen()
2858 augroup QF_Test
2859 au!
2860 au FileType qf :call assert_fails(':cclose', 'E788')
2861 augroup END
2862 copen
2863 augroup QF_Test
2864 au!
2865 augroup END
2866 augroup! QF_Test
2867endfunc
2868
Bram Moolenaar18141832017-06-25 21:17:25 +02002869func Test_cclose_in_autocmd()
2870 " Problem is only triggered if "starting" is zero, so that the OptionsSet
2871 " event will be triggered.
2872 call test_override('starting', 1)
2873 augroup QF_Test
2874 au!
2875 au FileType qf :call assert_fails(':cclose', 'E788')
2876 augroup END
2877 copen
2878 augroup QF_Test
2879 au!
2880 augroup END
2881 augroup! QF_Test
2882 call test_override('starting', 0)
2883endfunc
Bram Moolenaar9c4feff2017-06-28 22:26:54 +02002884
Bram Moolenaar379fb762018-08-30 15:58:28 +02002885" Check that ":file" without an argument is possible even when "curbuf_lock"
2886" is set.
2887func Test_file_from_copen()
2888 " Works without argument.
2889 augroup QF_Test
2890 au!
2891 au FileType qf file
2892 augroup END
2893 copen
2894
2895 augroup QF_Test
2896 au!
2897 augroup END
2898 cclose
2899
2900 " Fails with argument.
2901 augroup QF_Test
2902 au!
2903 au FileType qf call assert_fails(':file foo', 'E788')
2904 augroup END
2905 copen
2906 augroup QF_Test
2907 au!
2908 augroup END
2909 cclose
2910
2911 augroup! QF_Test
Bram Moolenaar6a0cc912019-10-26 16:48:44 +02002912endfunc
Bram Moolenaar379fb762018-08-30 15:58:28 +02002913
Bram Moolenaar9c4feff2017-06-28 22:26:54 +02002914func Test_resize_from_copen()
2915 augroup QF_Test
2916 au!
2917 au FileType qf resize 5
2918 augroup END
2919 try
2920 " This should succeed without any exception. No other buffers are
2921 " involved in the autocmd.
2922 copen
2923 finally
2924 augroup QF_Test
2925 au!
2926 augroup END
2927 augroup! QF_Test
2928 endtry
2929endfunc
Bram Moolenaara8788f42017-07-19 17:06:20 +02002930
2931" Tests for the quickfix buffer b:changedtick variable
2932func Xchangedtick_tests(cchar)
2933 call s:setup_commands(a:cchar)
2934
2935 new | only
2936
2937 Xexpr "" | Xexpr "" | Xexpr ""
2938
2939 Xopen
2940 Xolder
2941 Xolder
2942 Xaddexpr "F1:10:Line10"
2943 Xaddexpr "F2:20:Line20"
2944 call g:Xsetlist([{"filename":"F3", "lnum":30, "text":"Line30"}], 'a')
2945 call g:Xsetlist([], 'f')
2946 call assert_equal(8, getbufvar('%', 'changedtick'))
2947 Xclose
2948endfunc
2949
2950func Test_changedtick()
Bram Moolenaarae338332017-08-11 20:25:26 +02002951 call Xchangedtick_tests('c')
2952 call Xchangedtick_tests('l')
2953endfunc
2954
2955" Tests for parsing an expression using setqflist()
2956func Xsetexpr_tests(cchar)
2957 call s:setup_commands(a:cchar)
2958
2959 let t = ["File1:10:Line10", "File1:20:Line20"]
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002960 call g:Xsetlist([], ' ', {'lines' : t})
2961 call g:Xsetlist([], 'a', {'lines' : ["File1:30:Line30"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02002962
2963 let l = g:Xgetlist()
2964 call assert_equal(3, len(l))
2965 call assert_equal(20, l[1].lnum)
2966 call assert_equal('Line30', l[2].text)
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002967 call g:Xsetlist([], 'r', {'lines' : ["File2:5:Line5"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02002968 let l = g:Xgetlist()
2969 call assert_equal(1, len(l))
2970 call assert_equal('Line5', l[0].text)
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002971 call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : 10}))
2972 call assert_equal(-1, g:Xsetlist([], 'a', {'lines' : "F1:10:L10"}))
Bram Moolenaarae338332017-08-11 20:25:26 +02002973
2974 call g:Xsetlist([], 'f')
2975 " Add entries to multiple lists
Bram Moolenaar2c809b72017-09-01 18:34:02 +02002976 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:10:Line10"]})
2977 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:20:Line20"]})
2978 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["File1:15:Line15"]})
2979 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["File2:25:Line25"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02002980 call assert_equal('Line15', g:Xgetlist({'nr':1, 'items':1}).items[1].text)
2981 call assert_equal('Line25', g:Xgetlist({'nr':2, 'items':1}).items[1].text)
Bram Moolenaar36538222017-09-02 19:51:44 +02002982
2983 " Adding entries using a custom efm
2984 set efm&
2985 call g:Xsetlist([], ' ', {'efm' : '%f#%l#%m',
2986 \ 'lines' : ["F1#10#L10", "F2#20#L20"]})
2987 call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
2988 call g:Xsetlist([], 'a', {'efm' : '%f#%l#%m', 'lines' : ["F3:30:L30"]})
2989 call assert_equal('F3:30:L30', g:Xgetlist({'items':1}).items[2].text)
2990 call assert_equal(20, g:Xgetlist({'items':1}).items[1].lnum)
2991 call assert_equal(-1, g:Xsetlist([], 'a', {'efm' : [],
2992 \ 'lines' : ['F1:10:L10']}))
Bram Moolenaarae338332017-08-11 20:25:26 +02002993endfunc
2994
2995func Test_setexpr()
2996 call Xsetexpr_tests('c')
2997 call Xsetexpr_tests('l')
2998endfunc
2999
3000" Tests for per quickfix/location list directory stack
3001func Xmultidirstack_tests(cchar)
3002 call s:setup_commands(a:cchar)
3003
3004 call g:Xsetlist([], 'f')
3005 Xexpr "" | Xexpr ""
3006
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003007 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["Entering dir 'Xone/a'"]})
3008 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["Entering dir 'Xtwo/a'"]})
3009 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["one.txt:3:one one one"]})
3010 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["two.txt:5:two two two"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02003011
3012 let l1 = g:Xgetlist({'nr':1, 'items':1})
3013 let l2 = g:Xgetlist({'nr':2, 'items':1})
3014 call assert_equal('Xone/a/one.txt', bufname(l1.items[1].bufnr))
3015 call assert_equal(3, l1.items[1].lnum)
3016 call assert_equal('Xtwo/a/two.txt', bufname(l2.items[1].bufnr))
3017 call assert_equal(5, l2.items[1].lnum)
3018endfunc
3019
3020func Test_multidirstack()
3021 call mkdir('Xone/a', 'p')
3022 call mkdir('Xtwo/a', 'p')
3023 let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
3024 call writefile(lines, 'Xone/a/one.txt')
3025 call writefile(lines, 'Xtwo/a/two.txt')
3026 let save_efm = &efm
3027 set efm=%DEntering\ dir\ '%f',%f:%l:%m,%XLeaving\ dir\ '%f'
3028
3029 call Xmultidirstack_tests('c')
3030 call Xmultidirstack_tests('l')
3031
3032 let &efm = save_efm
3033 call delete('Xone', 'rf')
3034 call delete('Xtwo', 'rf')
3035endfunc
3036
3037" Tests for per quickfix/location list file stack
3038func Xmultifilestack_tests(cchar)
3039 call s:setup_commands(a:cchar)
3040
3041 call g:Xsetlist([], 'f')
3042 Xexpr "" | Xexpr ""
3043
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003044 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["[one.txt]"]})
3045 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["[two.txt]"]})
3046 call g:Xsetlist([], 'a', {'nr' : 1, 'lines' : ["(3,5) one one one"]})
3047 call g:Xsetlist([], 'a', {'nr' : 2, 'lines' : ["(5,9) two two two"]})
Bram Moolenaarae338332017-08-11 20:25:26 +02003048
3049 let l1 = g:Xgetlist({'nr':1, 'items':1})
3050 let l2 = g:Xgetlist({'nr':2, 'items':1})
3051 call assert_equal('one.txt', bufname(l1.items[1].bufnr))
3052 call assert_equal(3, l1.items[1].lnum)
3053 call assert_equal('two.txt', bufname(l2.items[1].bufnr))
3054 call assert_equal(5, l2.items[1].lnum)
Bram Moolenaare333e792018-04-08 13:27:39 +02003055
3056 " Test for start of a new error line in the same line where a previous
3057 " error line ends with a file stack.
3058 let efm_val = 'Error\ l%l\ in\ %f,'
3059 let efm_val .= '%-P%>(%f%r,Error\ l%l\ in\ %m,%-Q)%r'
3060 let l = g:Xgetlist({'lines' : [
3061 \ '(one.txt',
3062 \ 'Error l4 in one.txt',
3063 \ ') (two.txt',
3064 \ 'Error l6 in two.txt',
3065 \ ')',
3066 \ 'Error l8 in one.txt'
3067 \ ], 'efm' : efm_val})
3068 call assert_equal(3, len(l.items))
3069 call assert_equal('one.txt', bufname(l.items[0].bufnr))
3070 call assert_equal(4, l.items[0].lnum)
3071 call assert_equal('one.txt', l.items[0].text)
3072 call assert_equal('two.txt', bufname(l.items[1].bufnr))
3073 call assert_equal(6, l.items[1].lnum)
3074 call assert_equal('two.txt', l.items[1].text)
3075 call assert_equal('one.txt', bufname(l.items[2].bufnr))
3076 call assert_equal(8, l.items[2].lnum)
3077 call assert_equal('', l.items[2].text)
Bram Moolenaarae338332017-08-11 20:25:26 +02003078endfunc
3079
3080func Test_multifilestack()
3081 let lines = ['1', '2', 'one one one', '4', 'two two two', '6', '7']
3082 call writefile(lines, 'one.txt')
3083 call writefile(lines, 'two.txt')
3084 let save_efm = &efm
3085 set efm=%+P[%f],(%l\\,%c)\ %m,%-Q
3086
3087 call Xmultifilestack_tests('c')
3088 call Xmultifilestack_tests('l')
3089
3090 let &efm = save_efm
3091 call delete('one.txt')
3092 call delete('two.txt')
3093endfunc
3094
3095" Tests for per buffer 'efm' setting
3096func Test_perbuf_efm()
3097 call writefile(["File1-10-Line10"], 'one.txt')
3098 call writefile(["File2#20#Line20"], 'two.txt')
3099 set efm=%f#%l#%m
3100 new | only
3101 new
3102 setlocal efm=%f-%l-%m
3103 cfile one.txt
3104 wincmd w
3105 caddfile two.txt
3106
3107 let l = getqflist()
3108 call assert_equal(10, l[0].lnum)
3109 call assert_equal('Line20', l[1].text)
3110
3111 set efm&
3112 new | only
3113 call delete('one.txt')
3114 call delete('two.txt')
Bram Moolenaara8788f42017-07-19 17:06:20 +02003115endfunc
Bram Moolenaard28cc3f2017-07-27 22:03:50 +02003116
3117" Open multiple help windows using ":lhelpgrep
3118" This test used to crash Vim
3119func Test_Multi_LL_Help()
3120 new | only
3121 lhelpgrep window
3122 lopen
3123 e#
3124 lhelpgrep buffer
3125 call assert_equal(3, winnr('$'))
3126 call assert_true(len(getloclist(1)) != 0)
3127 call assert_true(len(getloclist(2)) != 0)
3128 new | only
3129endfunc
Bram Moolenaar55b69262017-08-13 13:42:01 +02003130
3131" Tests for adding new quickfix lists using setqflist()
3132func XaddQf_tests(cchar)
3133 call s:setup_commands(a:cchar)
3134
3135 " Create a new list using ' ' for action
3136 call g:Xsetlist([], 'f')
3137 call g:Xsetlist([], ' ', {'title' : 'Test1'})
3138 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3139 call assert_equal(1, l.nr)
3140 call assert_equal('Test1', l.title)
3141
3142 " Create a new list using ' ' for action and '$' for 'nr'
3143 call g:Xsetlist([], 'f')
3144 call g:Xsetlist([], ' ', {'title' : 'Test2', 'nr' : '$'})
3145 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3146 call assert_equal(1, l.nr)
3147 call assert_equal('Test2', l.title)
3148
3149 " Create a new list using 'a' for action
3150 call g:Xsetlist([], 'f')
3151 call g:Xsetlist([], 'a', {'title' : 'Test3'})
3152 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3153 call assert_equal(1, l.nr)
3154 call assert_equal('Test3', l.title)
3155
3156 " Create a new list using 'a' for action and '$' for 'nr'
3157 call g:Xsetlist([], 'f')
3158 call g:Xsetlist([], 'a', {'title' : 'Test3', 'nr' : '$'})
3159 call g:Xsetlist([], 'a', {'title' : 'Test4'})
3160 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3161 call assert_equal(1, l.nr)
3162 call assert_equal('Test4', l.title)
3163
3164 " Adding a quickfix list should remove all the lists following the current
3165 " list.
3166 Xexpr "" | Xexpr "" | Xexpr ""
3167 silent! 10Xolder
3168 call g:Xsetlist([], ' ', {'title' : 'Test5'})
3169 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3170 call assert_equal(2, l.nr)
3171 call assert_equal('Test5', l.title)
3172
3173 " Add a quickfix list using '$' as the list number.
3174 let lastqf = g:Xgetlist({'nr':'$'}).nr
3175 silent! 99Xolder
3176 call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test6'})
3177 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3178 call assert_equal(lastqf + 1, l.nr)
3179 call assert_equal('Test6', l.title)
3180
3181 " Add a quickfix list using 'nr' set to one more than the quickfix
3182 " list size.
3183 let lastqf = g:Xgetlist({'nr':'$'}).nr
3184 silent! 99Xolder
3185 call g:Xsetlist([], ' ', {'nr' : lastqf + 1, 'title' : 'Test7'})
3186 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3187 call assert_equal(lastqf + 1, l.nr)
3188 call assert_equal('Test7', l.title)
3189
3190 " Add a quickfix list to a stack with 10 lists using 'nr' set to '$'
3191 exe repeat('Xexpr "" |', 9) . 'Xexpr ""'
3192 silent! 99Xolder
3193 call g:Xsetlist([], ' ', {'nr' : '$', 'title' : 'Test8'})
3194 let l = g:Xgetlist({'nr' : '$', 'all' : 1})
3195 call assert_equal(10, l.nr)
3196 call assert_equal('Test8', l.title)
3197
3198 " Add a quickfix list using 'nr' set to a value greater than 10
3199 call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 12, 'title' : 'Test9'}))
3200
3201 " Try adding a quickfix list with 'nr' set to a value greater than the
3202 " quickfix list size but less than 10.
3203 call g:Xsetlist([], 'f')
3204 Xexpr "" | Xexpr "" | Xexpr ""
3205 silent! 99Xolder
3206 call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : 8, 'title' : 'Test10'}))
3207
3208 " Add a quickfix list using 'nr' set to a some string or list
3209 call assert_equal(-1, g:Xsetlist([], ' ', {'nr' : [1,2], 'title' : 'Test11'}))
3210endfunc
3211
3212func Test_add_qf()
3213 call XaddQf_tests('c')
3214 call XaddQf_tests('l')
3215endfunc
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02003216
3217" Test for getting the quickfix list items from some text without modifying
3218" the quickfix stack
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003219func XgetListFromLines(cchar)
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02003220 call s:setup_commands(a:cchar)
3221 call g:Xsetlist([], 'f')
3222
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003223 let l = g:Xgetlist({'lines' : ["File2:20:Line20", "File2:30:Line30"]}).items
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02003224 call assert_equal(2, len(l))
3225 call assert_equal(30, l[1].lnum)
3226
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003227 call assert_equal({}, g:Xgetlist({'lines' : 10}))
3228 call assert_equal({}, g:Xgetlist({'lines' : 'File1:10:Line10'}))
3229 call assert_equal([], g:Xgetlist({'lines' : []}).items)
3230 call assert_equal([], g:Xgetlist({'lines' : [10, 20]}).items)
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02003231
Bram Moolenaar36538222017-09-02 19:51:44 +02003232 " Parse text using a custom efm
3233 set efm&
3234 let l = g:Xgetlist({'lines':['File3#30#Line30'], 'efm' : '%f#%l#%m'}).items
3235 call assert_equal('Line30', l[0].text)
3236 let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : '%f-%l-%m'}).items
3237 call assert_equal('File3:30:Line30', l[0].text)
3238 let l = g:Xgetlist({'lines':['File3:30:Line30'], 'efm' : [1,2]})
3239 call assert_equal({}, l)
3240 call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':'%2'})", 'E376:')
3241 call assert_fails("call g:Xgetlist({'lines':['abc'], 'efm':''})", 'E378:')
3242
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02003243 " Make sure that the quickfix stack is not modified
3244 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
3245endfunc
3246
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003247func Test_get_list_from_lines()
3248 call XgetListFromLines('c')
3249 call XgetListFromLines('l')
Bram Moolenaar7adf06f2017-08-27 15:23:41 +02003250endfunc
Bram Moolenaara539f4f2017-08-30 20:33:55 +02003251
3252" Tests for the quickfix list id
3253func Xqfid_tests(cchar)
3254 call s:setup_commands(a:cchar)
3255
3256 call g:Xsetlist([], 'f')
Bram Moolenaara6d48492017-12-12 22:45:31 +01003257 call assert_equal(0, g:Xgetlist({'id':0}).id)
Bram Moolenaara539f4f2017-08-30 20:33:55 +02003258 Xexpr ''
3259 let start_id = g:Xgetlist({'id' : 0}).id
3260 Xexpr '' | Xexpr ''
3261 Xolder
3262 call assert_equal(start_id, g:Xgetlist({'id':0, 'nr':1}).id)
3263 call assert_equal(start_id + 1, g:Xgetlist({'id':0, 'nr':0}).id)
3264 call assert_equal(start_id + 2, g:Xgetlist({'id':0, 'nr':'$'}).id)
Bram Moolenaara6d48492017-12-12 22:45:31 +01003265 call assert_equal(0, g:Xgetlist({'id':0, 'nr':99}).id)
Bram Moolenaara539f4f2017-08-30 20:33:55 +02003266 call assert_equal(2, g:Xgetlist({'id':start_id + 1, 'nr':0}).nr)
Bram Moolenaara6d48492017-12-12 22:45:31 +01003267 call assert_equal(0, g:Xgetlist({'id':99, 'nr':0}).id)
3268 call assert_equal(0, g:Xgetlist({'id':"abc", 'nr':0}).id)
Bram Moolenaara539f4f2017-08-30 20:33:55 +02003269
3270 call g:Xsetlist([], 'a', {'id':start_id, 'context':[1,2]})
3271 call assert_equal([1,2], g:Xgetlist({'nr':1, 'context':1}).context)
Bram Moolenaar2c809b72017-09-01 18:34:02 +02003272 call g:Xsetlist([], 'a', {'id':start_id+1, 'lines':['F1:10:L10']})
Bram Moolenaara539f4f2017-08-30 20:33:55 +02003273 call assert_equal('L10', g:Xgetlist({'nr':2, 'items':1}).items[0].text)
3274 call assert_equal(-1, g:Xsetlist([], 'a', {'id':999, 'title':'Vim'}))
3275 call assert_equal(-1, g:Xsetlist([], 'a', {'id':'abc', 'title':'Vim'}))
3276
3277 let qfid = g:Xgetlist({'id':0, 'nr':0})
3278 call g:Xsetlist([], 'f')
Bram Moolenaara6d48492017-12-12 22:45:31 +01003279 call assert_equal(0, g:Xgetlist({'id':qfid, 'nr':0}).id)
Bram Moolenaara539f4f2017-08-30 20:33:55 +02003280endfunc
3281
3282func Test_qf_id()
3283 call Xqfid_tests('c')
3284 call Xqfid_tests('l')
3285endfunc
Bram Moolenaar74240d32017-12-10 15:26:15 +01003286
3287func Xqfjump_tests(cchar)
3288 call s:setup_commands(a:cchar)
3289
3290 call writefile(["Line1\tFoo", "Line2"], 'F1')
3291 call writefile(["Line1\tBar", "Line2"], 'F2')
3292 call writefile(["Line1\tBaz", "Line2"], 'F3')
3293
3294 call g:Xsetlist([], 'f')
3295
3296 " Tests for
3297 " Jumping to a line using a pattern
3298 " Jumping to a column greater than the last column in a line
3299 " Jumping to a line greater than the last line in the file
3300 let l = []
3301 for i in range(1, 7)
3302 call add(l, {})
3303 endfor
3304 let l[0].filename='F1'
3305 let l[0].pattern='Line1'
3306 let l[1].filename='F2'
3307 let l[1].pattern='Line1'
3308 let l[2].filename='F3'
3309 let l[2].pattern='Line1'
3310 let l[3].filename='F3'
3311 let l[3].lnum=1
3312 let l[3].col=9
3313 let l[3].vcol=1
3314 let l[4].filename='F3'
3315 let l[4].lnum=99
3316 let l[5].filename='F3'
3317 let l[5].lnum=1
3318 let l[5].col=99
3319 let l[5].vcol=1
3320 let l[6].filename='F3'
3321 let l[6].pattern='abcxyz'
3322
3323 call g:Xsetlist([], ' ', {'items' : l})
3324 Xopen | only
3325 2Xnext
3326 call assert_equal(3, g:Xgetlist({'idx' : 0}).idx)
3327 call assert_equal('F3', bufname('%'))
3328 Xnext
3329 call assert_equal(7, col('.'))
3330 Xnext
3331 call assert_equal(2, line('.'))
3332 Xnext
3333 call assert_equal(9, col('.'))
3334 2
3335 Xnext
3336 call assert_equal(2, line('.'))
3337
3338 if a:cchar == 'l'
3339 " When jumping to a location list entry in the location list window and
3340 " no usable windows are available, then a new window should be opened.
3341 enew! | new | only
3342 call g:Xsetlist([], 'f')
3343 setlocal buftype=nofile
3344 new
3345 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']})
3346 Xopen
3347 let winid = win_getid()
3348 wincmd p
3349 close
3350 call win_gotoid(winid)
3351 Xnext
3352 call assert_equal(3, winnr('$'))
3353 call assert_equal(1, winnr())
3354 call assert_equal(2, line('.'))
3355
3356 " When jumping to an entry in the location list window and the window
3357 " associated with the location list is not present and a window containing
3358 " the file is already present, then that window should be used.
3359 close
3360 belowright new
3361 call g:Xsetlist([], 'f')
3362 edit F3
3363 call win_gotoid(winid)
3364 Xlast
3365 call assert_equal(3, winnr())
3366 call assert_equal(6, g:Xgetlist({'size' : 1}).size)
3367 call assert_equal(winid, g:Xgetlist({'winid' : 1}).winid)
3368 endif
3369
3370 " Cleanup
3371 enew!
3372 new | only
3373
3374 call delete('F1')
3375 call delete('F2')
3376 call delete('F3')
3377endfunc
3378
3379func Test_qfjump()
3380 call Xqfjump_tests('c')
3381 call Xqfjump_tests('l')
3382endfunc
Bram Moolenaara6d48492017-12-12 22:45:31 +01003383
3384" Tests for the getqflist() and getloclist() functions when the list is not
3385" present or is empty
3386func Xgetlist_empty_tests(cchar)
3387 call s:setup_commands(a:cchar)
3388
3389 " Empty quickfix stack
3390 call g:Xsetlist([], 'f')
3391 call assert_equal('', g:Xgetlist({'context' : 0}).context)
3392 call assert_equal(0, g:Xgetlist({'id' : 0}).id)
3393 call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
3394 call assert_equal([], g:Xgetlist({'items' : 0}).items)
3395 call assert_equal(0, g:Xgetlist({'nr' : 0}).nr)
3396 call assert_equal(0, g:Xgetlist({'size' : 0}).size)
3397 call assert_equal('', g:Xgetlist({'title' : 0}).title)
3398 call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
Bram Moolenaarb254af32017-12-18 19:48:58 +01003399 call assert_equal(0, g:Xgetlist({'changedtick' : 0}).changedtick)
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003400 if a:cchar == 'c'
3401 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003402 \ 'items' : [], 'nr' : 0, 'size' : 0, 'qfbufnr' : 0,
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003403 \ 'title' : '', 'winid' : 0, 'changedtick': 0},
3404 \ g:Xgetlist({'all' : 0}))
3405 else
3406 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
3407 \ 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '',
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003408 \ 'winid' : 0, 'changedtick': 0, 'filewinid' : 0,
3409 \ 'qfbufnr' : 0},
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003410 \ g:Xgetlist({'all' : 0}))
3411 endif
Bram Moolenaara6d48492017-12-12 22:45:31 +01003412
Bram Moolenaar2ec364e2018-01-27 11:52:13 +01003413 " Quickfix window with empty stack
3414 silent! Xopen
3415 let qfwinid = (a:cchar == 'c') ? win_getid() : 0
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003416 let qfbufnr = (a:cchar == 'c') ? bufnr('') : 0
Bram Moolenaar2ec364e2018-01-27 11:52:13 +01003417 call assert_equal(qfwinid, g:Xgetlist({'winid' : 0}).winid)
3418 Xclose
3419
Bram Moolenaara6d48492017-12-12 22:45:31 +01003420 " Empty quickfix list
3421 Xexpr ""
3422 call assert_equal('', g:Xgetlist({'context' : 0}).context)
3423 call assert_notequal(0, g:Xgetlist({'id' : 0}).id)
3424 call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
3425 call assert_equal([], g:Xgetlist({'items' : 0}).items)
3426 call assert_notequal(0, g:Xgetlist({'nr' : 0}).nr)
3427 call assert_equal(0, g:Xgetlist({'size' : 0}).size)
3428 call assert_notequal('', g:Xgetlist({'title' : 0}).title)
3429 call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
Bram Moolenaarb254af32017-12-18 19:48:58 +01003430 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
Bram Moolenaara6d48492017-12-12 22:45:31 +01003431
3432 let qfid = g:Xgetlist({'id' : 0}).id
3433 call g:Xsetlist([], 'f')
3434
3435 " Non-existing quickfix identifier
3436 call assert_equal('', g:Xgetlist({'id' : qfid, 'context' : 0}).context)
3437 call assert_equal(0, g:Xgetlist({'id' : qfid}).id)
3438 call assert_equal(0, g:Xgetlist({'id' : qfid, 'idx' : 0}).idx)
3439 call assert_equal([], g:Xgetlist({'id' : qfid, 'items' : 0}).items)
3440 call assert_equal(0, g:Xgetlist({'id' : qfid, 'nr' : 0}).nr)
3441 call assert_equal(0, g:Xgetlist({'id' : qfid, 'size' : 0}).size)
3442 call assert_equal('', g:Xgetlist({'id' : qfid, 'title' : 0}).title)
3443 call assert_equal(0, g:Xgetlist({'id' : qfid, 'winid' : 0}).winid)
Bram Moolenaarb254af32017-12-18 19:48:58 +01003444 call assert_equal(0, g:Xgetlist({'id' : qfid, 'changedtick' : 0}).changedtick)
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003445 if a:cchar == 'c'
3446 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3447 \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003448 \ 'qfbufnr' : qfbufnr,
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003449 \ 'changedtick' : 0}, g:Xgetlist({'id' : qfid, 'all' : 0}))
3450 else
3451 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3452 \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003453 \ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0},
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003454 \ g:Xgetlist({'id' : qfid, 'all' : 0}))
3455 endif
Bram Moolenaara6d48492017-12-12 22:45:31 +01003456
3457 " Non-existing quickfix list number
3458 call assert_equal('', g:Xgetlist({'nr' : 5, 'context' : 0}).context)
3459 call assert_equal(0, g:Xgetlist({'nr' : 5}).nr)
3460 call assert_equal(0, g:Xgetlist({'nr' : 5, 'idx' : 0}).idx)
3461 call assert_equal([], g:Xgetlist({'nr' : 5, 'items' : 0}).items)
3462 call assert_equal(0, g:Xgetlist({'nr' : 5, 'id' : 0}).id)
3463 call assert_equal(0, g:Xgetlist({'nr' : 5, 'size' : 0}).size)
3464 call assert_equal('', g:Xgetlist({'nr' : 5, 'title' : 0}).title)
3465 call assert_equal(0, g:Xgetlist({'nr' : 5, 'winid' : 0}).winid)
Bram Moolenaarb254af32017-12-18 19:48:58 +01003466 call assert_equal(0, g:Xgetlist({'nr' : 5, 'changedtick' : 0}).changedtick)
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003467 if a:cchar == 'c'
3468 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3469 \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003470 \ 'changedtick' : 0, 'qfbufnr' : qfbufnr},
3471 \ g:Xgetlist({'nr' : 5, 'all' : 0}))
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003472 else
3473 call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
3474 \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003475 \ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0},
Bram Moolenaarc9cc9c72018-09-02 15:18:42 +02003476 \ g:Xgetlist({'nr' : 5, 'all' : 0}))
3477 endif
Bram Moolenaara6d48492017-12-12 22:45:31 +01003478endfunc
3479
3480func Test_getqflist()
3481 call Xgetlist_empty_tests('c')
3482 call Xgetlist_empty_tests('l')
3483endfunc
Bram Moolenaarb254af32017-12-18 19:48:58 +01003484
Bram Moolenaara0ca7d02017-12-19 10:22:19 +01003485func Test_getqflist_invalid_nr()
3486 " The following commands used to crash Vim
3487 cexpr ""
3488 call getqflist({'nr' : $XXX_DOES_NOT_EXIST_XXX})
3489
3490 " Cleanup
3491 call setqflist([], 'r')
3492endfunc
3493
Bram Moolenaarb254af32017-12-18 19:48:58 +01003494" Tests for the quickfix/location list changedtick
3495func Xqftick_tests(cchar)
3496 call s:setup_commands(a:cchar)
3497
3498 call g:Xsetlist([], 'f')
3499
3500 Xexpr "F1:10:Line10"
3501 let qfid = g:Xgetlist({'id' : 0}).id
3502 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3503 Xaddexpr "F2:20:Line20\nF2:21:Line21"
3504 call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3505 call g:Xsetlist([], 'a', {'lines' : ["F3:30:Line30", "F3:31:Line31"]})
3506 call assert_equal(3, g:Xgetlist({'changedtick' : 0}).changedtick)
3507 call g:Xsetlist([], 'r', {'lines' : ["F4:40:Line40"]})
3508 call assert_equal(4, g:Xgetlist({'changedtick' : 0}).changedtick)
3509 call g:Xsetlist([], 'a', {'title' : 'New Title'})
3510 call assert_equal(5, g:Xgetlist({'changedtick' : 0}).changedtick)
3511
3512 enew!
3513 call append(0, ["F5:50:L50", "F6:60:L60"])
3514 Xaddbuffer
3515 call assert_equal(6, g:Xgetlist({'changedtick' : 0}).changedtick)
3516 enew!
3517
3518 call g:Xsetlist([], 'a', {'context' : {'bus' : 'pci'}})
3519 call assert_equal(7, g:Xgetlist({'changedtick' : 0}).changedtick)
3520 call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3521 \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'a')
3522 call assert_equal(8, g:Xgetlist({'changedtick' : 0}).changedtick)
3523 call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3524 \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], ' ')
3525 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3526 call g:Xsetlist([{'filename' : 'F7', 'lnum' : 10, 'text' : 'L7'},
3527 \ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'r')
3528 call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3529
3530 call writefile(["F8:80:L80", "F8:81:L81"], "Xone")
3531 Xfile Xone
3532 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3533 Xaddfile Xone
3534 call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
3535
3536 " Test case for updating a non-current quickfix list
3537 call g:Xsetlist([], 'f')
3538 Xexpr "F1:1:L1"
3539 Xexpr "F2:2:L2"
3540 call g:Xsetlist([], 'a', {'nr' : 1, "lines" : ["F10:10:L10"]})
3541 call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
3542 call assert_equal(2, g:Xgetlist({'nr' : 1, 'changedtick' : 0}).changedtick)
3543
3544 call delete("Xone")
3545endfunc
3546
3547func Test_qf_tick()
3548 call Xqftick_tests('c')
3549 call Xqftick_tests('l')
3550endfunc
Bram Moolenaar12237442017-12-19 12:38:52 +01003551
Bram Moolenaarc631f2d2018-08-21 21:58:13 +02003552" Test helpgrep with lang specifier
3553func Xtest_helpgrep_with_lang_specifier(cchar)
3554 call s:setup_commands(a:cchar)
3555 Xhelpgrep Vim@en
3556 call assert_equal('help', &filetype)
3557 call assert_notequal(0, g:Xgetlist({'nr' : '$'}).nr)
3558 new | only
3559endfunc
3560
3561func Test_helpgrep_with_lang_specifier()
3562 call Xtest_helpgrep_with_lang_specifier('c')
3563 call Xtest_helpgrep_with_lang_specifier('l')
3564endfunc
3565
Bram Moolenaar12237442017-12-19 12:38:52 +01003566" The following test used to crash Vim.
3567" Open the location list window and close the regular window associated with
3568" the location list. When the garbage collection runs now, it incorrectly
3569" marks the location list context as not in use and frees the context.
3570func Test_ll_window_ctx()
3571 call setloclist(0, [], 'f')
3572 call setloclist(0, [], 'a', {'context' : []})
3573 lopen | only
3574 call test_garbagecollect_now()
3575 echo getloclist(0, {'context' : 1}).context
3576 enew | only
3577endfunc
3578
Bram Moolenaar14a4deb2017-12-19 16:48:55 +01003579" The following test used to crash vim
3580func Test_lfile_crash()
3581 sp Xtest
3582 au QuickFixCmdPre * bw
3583 call assert_fails('lfile', 'E40')
3584 au! QuickFixCmdPre
3585endfunc
Bram Moolenaar3c097222017-12-21 20:54:49 +01003586
3587" The following test used to crash vim
3588func Test_lbuffer_crash()
3589 sv Xtest
3590 augroup QF_Test
3591 au!
3592 au * * bw
3593 augroup END
3594 lbuffer
3595 augroup QF_Test
3596 au!
3597 augroup END
3598endfunc
3599
3600" The following test used to crash vim
3601func Test_lexpr_crash()
3602 augroup QF_Test
3603 au!
3604 au * * call setloclist(0, [], 'f')
3605 augroup END
3606 lexpr ""
3607 augroup QF_Test
3608 au!
3609 augroup END
Bram Moolenaar9f84ded2018-10-20 20:54:02 +02003610
Bram Moolenaar3c097222017-12-21 20:54:49 +01003611 enew | only
Bram Moolenaar9f84ded2018-10-20 20:54:02 +02003612 augroup QF_Test
3613 au!
3614 au BufNew * call setloclist(0, [], 'f')
3615 augroup END
3616 lexpr 'x:1:x'
3617 augroup QF_Test
3618 au!
3619 augroup END
3620
3621 enew | only
3622 lexpr ''
3623 lopen
3624 augroup QF_Test
3625 au!
3626 au FileType * call setloclist(0, [], 'f')
3627 augroup END
3628 lexpr ''
3629 augroup QF_Test
3630 au!
3631 augroup END
Bram Moolenaar3c097222017-12-21 20:54:49 +01003632endfunc
3633
3634" The following test used to crash Vim
3635func Test_lvimgrep_crash()
3636 sv Xtest
3637 augroup QF_Test
3638 au!
3639 au * * call setloclist(0, [], 'f')
3640 augroup END
3641 lvimgrep quickfix test_quickfix.vim
3642 augroup QF_Test
3643 au!
3644 augroup END
Bram Moolenaarb6f14802018-10-21 18:47:43 +02003645
3646 new | only
3647 augroup QF_Test
3648 au!
3649 au BufEnter * call setloclist(0, [], 'r')
3650 augroup END
3651 call assert_fails('lvimgrep Test_lvimgrep_crash *', 'E926:')
3652 augroup QF_Test
3653 au!
3654 augroup END
3655
Bram Moolenaar3c097222017-12-21 20:54:49 +01003656 enew | only
3657endfunc
Bram Moolenaarde046542017-12-26 13:53:11 +01003658
3659" Test for the position of the quickfix and location list window
3660func Test_qfwin_pos()
3661 " Open two windows
3662 new | only
3663 new
3664 cexpr ['F1:10:L10']
3665 copen
3666 " Quickfix window should be the bottom most window
3667 call assert_equal(3, winnr())
3668 close
3669 " Open at the very top
3670 wincmd t
3671 topleft copen
3672 call assert_equal(1, winnr())
3673 close
3674 " open left of the current window
3675 wincmd t
3676 below new
3677 leftabove copen
3678 call assert_equal(2, winnr())
3679 close
3680 " open right of the current window
3681 rightbelow copen
3682 call assert_equal(3, winnr())
3683 close
3684endfunc
Bram Moolenaare1bb8792018-04-06 22:58:23 +02003685
3686" Tests for quickfix/location lists changed by autocommands when
3687" :vimgrep/:lvimgrep commands are running.
3688func Test_vimgrep_autocmd()
3689 call setqflist([], 'f')
3690 call writefile(['stars'], 'Xtest1.txt')
3691 call writefile(['stars'], 'Xtest2.txt')
3692
3693 " Test 1:
3694 " When searching for a pattern using :vimgrep, if the quickfix list is
3695 " changed by an autocmd, the results should be added to the correct quickfix
3696 " list.
3697 autocmd BufRead Xtest2.txt cexpr '' | cexpr ''
3698 silent vimgrep stars Xtest*.txt
3699 call assert_equal(1, getqflist({'nr' : 0}).nr)
3700 call assert_equal(3, getqflist({'nr' : '$'}).nr)
3701 call assert_equal('Xtest2.txt', bufname(getqflist()[1].bufnr))
3702 au! BufRead Xtest2.txt
3703
3704 " Test 2:
3705 " When searching for a pattern using :vimgrep, if the quickfix list is
3706 " freed, then a error should be given.
3707 silent! %bwipe!
3708 call setqflist([], 'f')
3709 autocmd BufRead Xtest2.txt for i in range(10) | cexpr '' | endfor
3710 call assert_fails('vimgrep stars Xtest*.txt', 'E925:')
3711 au! BufRead Xtest2.txt
3712
3713 " Test 3:
3714 " When searching for a pattern using :lvimgrep, if the location list is
3715 " freed, then the command should error out.
3716 silent! %bwipe!
3717 let g:save_winid = win_getid()
3718 autocmd BufRead Xtest2.txt call setloclist(g:save_winid, [], 'f')
3719 call assert_fails('lvimgrep stars Xtest*.txt', 'E926:')
3720 au! BufRead Xtest2.txt
3721
3722 call delete('Xtest1.txt')
3723 call delete('Xtest2.txt')
3724 call setqflist([], 'f')
3725endfunc
Bram Moolenaar3b9474b2018-04-23 21:29:48 +02003726
Bram Moolenaarf9ae1542019-11-18 22:02:16 +01003727" Test for an autocmd changing the current directory when running vimgrep
3728func Xvimgrep_autocmd_cd(cchar)
3729 call s:setup_commands(a:cchar)
3730
3731 %bwipe
3732 let save_cwd = getcwd()
3733
3734 augroup QF_Test
3735 au!
3736 autocmd BufRead * silent cd %:p:h
3737 augroup END
3738
3739 10Xvimgrep /vim/ Xdir/**
3740 let l = g:Xgetlist()
3741 call assert_equal('f1.txt', bufname(l[0].bufnr))
3742 call assert_equal('f2.txt', fnamemodify(bufname(l[2].bufnr), ':t'))
3743
3744 augroup QF_Test
3745 au!
3746 augroup END
3747
3748 exe 'cd ' . save_cwd
3749endfunc
3750
3751func Test_vimgrep_autocmd_cd()
3752 call mkdir('Xdir/a', 'p')
3753 call mkdir('Xdir/b', 'p')
3754 call writefile(['a_L1_vim', 'a_L2_vim'], 'Xdir/a/f1.txt')
3755 call writefile(['b_L1_vim', 'b_L2_vim'], 'Xdir/b/f2.txt')
3756 call Xvimgrep_autocmd_cd('c')
3757 call Xvimgrep_autocmd_cd('l')
3758 %bwipe
3759 call delete('Xdir', 'rf')
3760endfunc
3761
Bram Moolenaar3b9474b2018-04-23 21:29:48 +02003762" The following test used to crash Vim
3763func Test_lhelpgrep_autocmd()
3764 lhelpgrep quickfix
3765 autocmd QuickFixCmdPost * call setloclist(0, [], 'f')
3766 lhelpgrep buffer
3767 call assert_equal('help', &filetype)
3768 call assert_equal(0, getloclist(0, {'nr' : '$'}).nr)
3769 lhelpgrep tabpage
3770 call assert_equal('help', &filetype)
3771 call assert_equal(1, getloclist(0, {'nr' : '$'}).nr)
3772 au! QuickFixCmdPost
Bram Moolenaarb6f14802018-10-21 18:47:43 +02003773
3774 new | only
3775 augroup QF_Test
3776 au!
3777 au BufEnter * call setqflist([], 'f')
3778 augroup END
3779 call assert_fails('helpgrep quickfix', 'E925:')
3780 augroup QF_Test
3781 au! BufEnter
3782 augroup END
3783
3784 new | only
3785 augroup QF_Test
3786 au!
3787 au BufEnter * call setqflist([], 'r')
3788 augroup END
3789 call assert_fails('helpgrep quickfix', 'E925:')
3790 augroup QF_Test
3791 au! BufEnter
3792 augroup END
3793
3794 new | only
3795 augroup QF_Test
3796 au!
3797 au BufEnter * call setloclist(0, [], 'r')
3798 augroup END
3799 call assert_fails('lhelpgrep quickfix', 'E926:')
3800 augroup QF_Test
3801 au! BufEnter
3802 augroup END
3803
Bram Moolenaar3b9474b2018-04-23 21:29:48 +02003804 new | only
3805endfunc
Bram Moolenaara796d462018-05-01 14:30:36 +02003806
3807" Test for shortening/simplifying the file name when opening the
3808" quickfix window or when displaying the quickfix list
3809func Test_shorten_fname()
3810 if !has('unix')
3811 return
3812 endif
3813 %bwipe
3814 " Create a quickfix list with a absolute path filename
3815 let fname = getcwd() . '/test_quickfix.vim'
3816 call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'})
3817 call assert_equal(fname, bufname('test_quickfix.vim'))
3818 " Opening the quickfix window should simplify the file path
3819 cwindow
3820 call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
3821 cclose
3822 %bwipe
3823 " Create a quickfix list with a absolute path filename
3824 call setqflist([], ' ', {'lines':[fname . ":20:Line20"], 'efm':'%f:%l:%m'})
3825 call assert_equal(fname, bufname('test_quickfix.vim'))
3826 " Displaying the quickfix list should simplify the file path
3827 silent! clist
3828 call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
3829endfunc
Bram Moolenaar8b62e312018-05-13 15:29:04 +02003830
3831" Quickfix title tests
3832" In the below tests, 'exe "cmd"' is used to invoke the quickfix commands.
3833" Otherwise due to indentation, the title is set with spaces at the beginning
3834" of the command.
3835func Test_qftitle()
3836 call writefile(["F1:1:Line1"], 'Xerr')
3837
3838 " :cexpr
3839 exe "cexpr readfile('Xerr')"
3840 call assert_equal(":cexpr readfile('Xerr')", getqflist({'title' : 1}).title)
3841
3842 " :cgetexpr
3843 exe "cgetexpr readfile('Xerr')"
3844 call assert_equal(":cgetexpr readfile('Xerr')",
3845 \ getqflist({'title' : 1}).title)
3846
3847 " :caddexpr
3848 call setqflist([], 'f')
3849 exe "caddexpr readfile('Xerr')"
3850 call assert_equal(":caddexpr readfile('Xerr')",
3851 \ getqflist({'title' : 1}).title)
3852
3853 " :cbuffer
3854 new Xerr
3855 exe "cbuffer"
3856 call assert_equal(':cbuffer (Xerr)', getqflist({'title' : 1}).title)
3857
3858 " :cgetbuffer
3859 edit Xerr
3860 exe "cgetbuffer"
3861 call assert_equal(':cgetbuffer (Xerr)', getqflist({'title' : 1}).title)
3862
3863 " :caddbuffer
3864 call setqflist([], 'f')
3865 edit Xerr
3866 exe "caddbuffer"
3867 call assert_equal(':caddbuffer (Xerr)', getqflist({'title' : 1}).title)
3868
3869 " :cfile
3870 exe "cfile Xerr"
3871 call assert_equal(':cfile Xerr', getqflist({'title' : 1}).title)
3872
3873 " :cgetfile
3874 exe "cgetfile Xerr"
3875 call assert_equal(':cgetfile Xerr', getqflist({'title' : 1}).title)
3876
3877 " :caddfile
3878 call setqflist([], 'f')
3879 exe "caddfile Xerr"
3880 call assert_equal(':caddfile Xerr', getqflist({'title' : 1}).title)
3881
3882 " :grep
3883 set grepprg=internal
3884 exe "grep F1 Xerr"
3885 call assert_equal(':grep F1 Xerr', getqflist({'title' : 1}).title)
3886
3887 " :grepadd
3888 call setqflist([], 'f')
3889 exe "grepadd F1 Xerr"
3890 call assert_equal(':grepadd F1 Xerr', getqflist({'title' : 1}).title)
3891 set grepprg&vim
3892
3893 " :vimgrep
3894 exe "vimgrep F1 Xerr"
3895 call assert_equal(':vimgrep F1 Xerr', getqflist({'title' : 1}).title)
3896
3897 " :vimgrepadd
3898 call setqflist([], 'f')
3899 exe "vimgrepadd F1 Xerr"
3900 call assert_equal(':vimgrepadd F1 Xerr', getqflist({'title' : 1}).title)
3901
3902 call setqflist(['F1:10:L10'], ' ')
3903 call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
3904
3905 call setqflist([], 'f')
3906 call setqflist(['F1:10:L10'], 'a')
3907 call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
3908
3909 call setqflist([], 'f')
3910 call setqflist(['F1:10:L10'], 'r')
3911 call assert_equal(':setqflist()', getqflist({'title' : 1}).title)
3912
3913 close
3914 call delete('Xerr')
3915
3916 call setqflist([], ' ', {'title' : 'Errors'})
3917 copen
3918 call assert_equal('Errors', w:quickfix_title)
3919 call setqflist([], 'r', {'items' : [{'filename' : 'a.c', 'lnum' : 10}]})
3920 call assert_equal('Errors', w:quickfix_title)
3921 cclose
3922endfunc
Bram Moolenaar600323b2018-06-16 22:16:47 +02003923
3924func Test_lbuffer_with_bwipe()
3925 new
3926 new
3927 augroup nasty
3928 au * * bwipe
3929 augroup END
3930 lbuffer
3931 augroup nasty
3932 au!
3933 augroup END
3934endfunc
Bram Moolenaar0366c012018-06-18 20:52:13 +02003935
Bram Moolenaar531b9a32018-07-03 16:54:23 +02003936" Test for an autocmd freeing the quickfix/location list when cexpr/lexpr is
3937" running
3938func Xexpr_acmd_freelist(cchar)
3939 call s:setup_commands(a:cchar)
3940
Bram Moolenaar0366c012018-06-18 20:52:13 +02003941 " This was using freed memory.
3942 augroup nasty
Bram Moolenaar531b9a32018-07-03 16:54:23 +02003943 au * * call g:Xsetlist([], 'f')
Bram Moolenaar0366c012018-06-18 20:52:13 +02003944 augroup END
Bram Moolenaar531b9a32018-07-03 16:54:23 +02003945 Xexpr "x"
Bram Moolenaar0366c012018-06-18 20:52:13 +02003946 augroup nasty
3947 au!
3948 augroup END
3949endfunc
Bram Moolenaar531b9a32018-07-03 16:54:23 +02003950
3951func Test_cexpr_acmd_freelist()
3952 call Xexpr_acmd_freelist('c')
3953 call Xexpr_acmd_freelist('l')
3954endfunc
3955
3956" Test for commands that create a new quickfix/location list and jump to the
3957" first error automatically.
3958func Xjumpto_first_error_test(cchar)
3959 call s:setup_commands(a:cchar)
3960
3961 call s:create_test_file('Xtestfile1')
3962 call s:create_test_file('Xtestfile2')
3963 let l = ['Xtestfile1:2:Line2', 'Xtestfile2:4:Line4']
3964
3965 " Test for cexpr/lexpr
3966 enew
3967 Xexpr l
3968 call assert_equal('Xtestfile1', bufname(''))
3969 call assert_equal(2, line('.'))
3970
3971 " Test for cfile/lfile
3972 enew
3973 call writefile(l, 'Xerr')
3974 Xfile Xerr
3975 call assert_equal('Xtestfile1', bufname(''))
3976 call assert_equal(2, line('.'))
3977
3978 " Test for cbuffer/lbuffer
3979 edit Xerr
3980 Xbuffer
3981 call assert_equal('Xtestfile1', bufname(''))
3982 call assert_equal(2, line('.'))
3983
3984 call delete('Xerr')
3985 call delete('Xtestfile1')
3986 call delete('Xtestfile2')
3987endfunc
3988
3989func Test_jumpto_first_error()
3990 call Xjumpto_first_error_test('c')
3991 call Xjumpto_first_error_test('l')
3992endfunc
3993
3994" Test for a quickfix autocmd changing the quickfix/location list before
3995" jumping to the first error in the new list.
3996func Xautocmd_changelist(cchar)
3997 call s:setup_commands(a:cchar)
3998
3999 " Test for cfile/lfile
4000 call s:create_test_file('Xtestfile1')
4001 call s:create_test_file('Xtestfile2')
4002 Xexpr 'Xtestfile1:2:Line2'
4003 autocmd QuickFixCmdPost * Xolder
4004 call writefile(['Xtestfile2:4:Line4'], 'Xerr')
4005 Xfile Xerr
4006 call assert_equal('Xtestfile2', bufname(''))
4007 call assert_equal(4, line('.'))
4008 autocmd! QuickFixCmdPost
4009
4010 " Test for cbuffer/lbuffer
4011 call g:Xsetlist([], 'f')
4012 Xexpr 'Xtestfile1:2:Line2'
4013 autocmd QuickFixCmdPost * Xolder
4014 call writefile(['Xtestfile2:4:Line4'], 'Xerr')
4015 edit Xerr
4016 Xbuffer
4017 call assert_equal('Xtestfile2', bufname(''))
4018 call assert_equal(4, line('.'))
4019 autocmd! QuickFixCmdPost
4020
4021 " Test for cexpr/lexpr
4022 call g:Xsetlist([], 'f')
4023 Xexpr 'Xtestfile1:2:Line2'
4024 autocmd QuickFixCmdPost * Xolder
4025 Xexpr 'Xtestfile2:4:Line4'
4026 call assert_equal('Xtestfile2', bufname(''))
4027 call assert_equal(4, line('.'))
4028 autocmd! QuickFixCmdPost
4029
Bram Moolenaar851332e2018-07-03 19:16:00 +02004030 " The grepprg may not be set on non-Unix systems
4031 if has('unix')
4032 " Test for grep/lgrep
4033 call g:Xsetlist([], 'f')
4034 Xexpr 'Xtestfile1:2:Line2'
4035 autocmd QuickFixCmdPost * Xolder
4036 silent Xgrep Line5 Xtestfile2
4037 call assert_equal('Xtestfile2', bufname(''))
4038 call assert_equal(5, line('.'))
4039 autocmd! QuickFixCmdPost
4040 endif
Bram Moolenaar531b9a32018-07-03 16:54:23 +02004041
4042 " Test for vimgrep/lvimgrep
4043 call g:Xsetlist([], 'f')
4044 Xexpr 'Xtestfile1:2:Line2'
4045 autocmd QuickFixCmdPost * Xolder
4046 silent Xvimgrep Line5 Xtestfile2
4047 call assert_equal('Xtestfile2', bufname(''))
4048 call assert_equal(5, line('.'))
4049 autocmd! QuickFixCmdPost
4050
Bram Moolenaar3f347e42018-08-09 21:19:20 +02004051 " Test for autocommands clearing the quickfix list before jumping to the
4052 " first error. This should not result in an error
4053 autocmd QuickFixCmdPost * call g:Xsetlist([], 'r')
4054 let v:errmsg = ''
4055 " Test for cfile/lfile
4056 Xfile Xerr
4057 call assert_true(v:errmsg !~# 'E42:')
4058 " Test for cbuffer/lbuffer
4059 edit Xerr
4060 Xbuffer
4061 call assert_true(v:errmsg !~# 'E42:')
4062 " Test for cexpr/lexpr
4063 Xexpr 'Xtestfile2:4:Line4'
4064 call assert_true(v:errmsg !~# 'E42:')
4065 " Test for grep/lgrep
4066 " The grepprg may not be set on non-Unix systems
4067 if has('unix')
4068 silent Xgrep Line5 Xtestfile2
4069 call assert_true(v:errmsg !~# 'E42:')
4070 endif
4071 " Test for vimgrep/lvimgrep
4072 call assert_fails('silent Xvimgrep Line5 Xtestfile2', 'E480:')
4073 autocmd! QuickFixCmdPost
4074
Bram Moolenaar531b9a32018-07-03 16:54:23 +02004075 call delete('Xerr')
4076 call delete('Xtestfile1')
4077 call delete('Xtestfile2')
4078endfunc
4079
4080func Test_autocmd_changelist()
4081 call Xautocmd_changelist('c')
4082 call Xautocmd_changelist('l')
4083endfunc
Bram Moolenaar4cde86c2018-07-08 16:01:08 +02004084
4085" Tests for the ':filter /pat/ clist' command
4086func Test_filter_clist()
4087 cexpr ['Xfile1:10:10:Line 10', 'Xfile2:15:15:Line 15']
4088 call assert_equal([' 2 Xfile2:15 col 15: Line 15'],
4089 \ split(execute('filter /Line 15/ clist'), "\n"))
4090 call assert_equal([' 1 Xfile1:10 col 10: Line 10'],
4091 \ split(execute('filter /Xfile1/ clist'), "\n"))
4092 call assert_equal([], split(execute('filter /abc/ clist'), "\n"))
4093
4094 call setqflist([{'module' : 'abc', 'pattern' : 'pat1'},
4095 \ {'module' : 'pqr', 'pattern' : 'pat2'}], ' ')
4096 call assert_equal([' 2 pqr:pat2: '],
4097 \ split(execute('filter /pqr/ clist'), "\n"))
4098 call assert_equal([' 1 abc:pat1: '],
4099 \ split(execute('filter /pat1/ clist'), "\n"))
4100endfunc
Bram Moolenaar0a08c632018-07-25 22:36:52 +02004101
4102" Tests for the "CTRL-W <CR>" command.
4103func Xview_result_split_tests(cchar)
4104 call s:setup_commands(a:cchar)
4105
4106 " Test that "CTRL-W <CR>" in a qf/ll window fails with empty list.
4107 call g:Xsetlist([])
4108 Xopen
4109 let l:win_count = winnr('$')
4110 call assert_fails('execute "normal! \<C-W>\<CR>"', 'E42')
4111 call assert_equal(l:win_count, winnr('$'))
4112 Xclose
4113endfunc
4114
4115func Test_view_result_split()
4116 call Xview_result_split_tests('c')
4117 call Xview_result_split_tests('l')
4118endfunc
Bram Moolenaar2dfcef42018-08-15 22:29:51 +02004119
4120" Test that :cc sets curswant
4121func Test_curswant()
4122 helpgrep quickfix
4123 normal! llll
4124 1cc
4125 call assert_equal(getcurpos()[4], virtcol('.'))
4126 cclose | helpclose
4127endfunc
Bram Moolenaarb2443732018-11-11 22:50:27 +01004128
4129" Test for opening a file from the quickfix window using CTRL-W <Enter>
4130" doesn't leave an empty buffer around.
4131func Test_splitview()
4132 call s:create_test_file('Xtestfile1')
4133 call s:create_test_file('Xtestfile2')
4134 new | only
4135 let last_bufnr = bufnr('Test_sv_1', 1)
4136 let l = ['Xtestfile1:2:Line2', 'Xtestfile2:4:Line4']
4137 cgetexpr l
4138 copen
4139 let numbufs = len(getbufinfo())
4140 exe "normal \<C-W>\<CR>"
4141 copen
4142 exe "normal j\<C-W>\<CR>"
4143 " Make sure new empty buffers are not created
4144 call assert_equal(numbufs, len(getbufinfo()))
4145 " Creating a new buffer should use the next available buffer number
4146 call assert_equal(last_bufnr + 4, bufnr("Test_sv_2", 1))
4147 bwipe Test_sv_1
4148 bwipe Test_sv_2
4149 new | only
4150
4151 " When split opening files from location list window, make sure that two
4152 " windows doesn't refer to the same location list
4153 lgetexpr l
4154 let locid = getloclist(0, {'id' : 0}).id
4155 lopen
4156 exe "normal \<C-W>\<CR>"
4157 call assert_notequal(locid, getloclist(0, {'id' : 0}).id)
4158 call assert_equal(0, getloclist(0, {'winid' : 0}).winid)
4159 new | only
4160
4161 " When split opening files from a helpgrep location list window, a new help
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01004162 " window should be opened with a copy of the location list.
Bram Moolenaarb2443732018-11-11 22:50:27 +01004163 lhelpgrep window
4164 let locid = getloclist(0, {'id' : 0}).id
4165 lwindow
4166 exe "normal j\<C-W>\<CR>"
4167 call assert_notequal(locid, getloclist(0, {'id' : 0}).id)
4168 call assert_equal(0, getloclist(0, {'winid' : 0}).winid)
4169 new | only
4170
4171 call delete('Xtestfile1')
4172 call delete('Xtestfile2')
4173endfunc
Bram Moolenaarc45eb772019-01-31 14:27:04 +01004174
4175" Test for parsing entries using visual screen column
4176func Test_viscol()
4177 enew
4178 call writefile(["Col1\tCol2\tCol3"], 'Xfile1')
4179 edit Xfile1
4180
4181 " Use byte offset for column number
4182 set efm&
4183 cexpr "Xfile1:1:5:XX\nXfile1:1:9:YY\nXfile1:1:20:ZZ"
4184 call assert_equal([5, 8], [col('.'), virtcol('.')])
4185 cnext
4186 call assert_equal([9, 12], [col('.'), virtcol('.')])
4187 cnext
4188 call assert_equal([14, 20], [col('.'), virtcol('.')])
4189
4190 " Use screen column offset for column number
4191 set efm=%f:%l:%v:%m
4192 cexpr "Xfile1:1:8:XX\nXfile1:1:12:YY\nXfile1:1:20:ZZ"
4193 call assert_equal([5, 8], [col('.'), virtcol('.')])
4194 cnext
4195 call assert_equal([9, 12], [col('.'), virtcol('.')])
4196 cnext
4197 call assert_equal([14, 20], [col('.'), virtcol('.')])
4198 cexpr "Xfile1:1:6:XX\nXfile1:1:15:YY\nXfile1:1:24:ZZ"
4199 call assert_equal([5, 8], [col('.'), virtcol('.')])
4200 cnext
4201 call assert_equal([10, 16], [col('.'), virtcol('.')])
4202 cnext
4203 call assert_equal([14, 20], [col('.'), virtcol('.')])
4204
4205 enew
4206 call writefile(["Col1\täü\töß\tCol4"], 'Xfile1')
4207
4208 " Use byte offset for column number
4209 set efm&
4210 cexpr "Xfile1:1:8:XX\nXfile1:1:11:YY\nXfile1:1:16:ZZ"
4211 call assert_equal([8, 10], [col('.'), virtcol('.')])
4212 cnext
4213 call assert_equal([11, 17], [col('.'), virtcol('.')])
4214 cnext
4215 call assert_equal([16, 25], [col('.'), virtcol('.')])
4216
4217 " Use screen column offset for column number
4218 set efm=%f:%l:%v:%m
4219 cexpr "Xfile1:1:10:XX\nXfile1:1:17:YY\nXfile1:1:25:ZZ"
4220 call assert_equal([8, 10], [col('.'), virtcol('.')])
4221 cnext
4222 call assert_equal([11, 17], [col('.'), virtcol('.')])
4223 cnext
4224 call assert_equal([16, 25], [col('.'), virtcol('.')])
4225
4226 enew | only
4227 set efm&
4228 call delete('Xfile1')
4229endfunc
Bram Moolenaaree8188f2019-02-05 21:23:04 +01004230
4231" Test for the quickfix window buffer
4232func Xqfbuf_test(cchar)
4233 call s:setup_commands(a:cchar)
4234
4235 " Quickfix buffer should be reused across closing and opening a quickfix
4236 " window
4237 Xexpr "F1:10:Line10"
4238 Xopen
4239 let qfbnum = bufnr('')
4240 Xclose
4241 " Even after the quickfix window is closed, the buffer should be loaded
4242 call assert_true(bufloaded(qfbnum))
Bram Moolenaar647e24b2019-03-17 16:39:46 +01004243 call assert_true(qfbnum, g:Xgetlist({'qfbufnr' : 0}).qfbufnr)
Bram Moolenaaree8188f2019-02-05 21:23:04 +01004244 Xopen
4245 " Buffer should be reused when opening the window again
4246 call assert_equal(qfbnum, bufnr(''))
4247 Xclose
4248
4249 if a:cchar == 'l'
4250 %bwipe
4251 " For a location list, when both the file window and the location list
4252 " window for the list are closed, then the buffer should be freed.
4253 new | only
4254 lexpr "F1:10:Line10"
4255 let wid = win_getid()
4256 lopen
4257 let qfbnum = bufnr('')
4258 call assert_match(qfbnum . ' %a- "\[Location List]"', execute('ls'))
4259 close
4260 " When the location list window is closed, the buffer name should not
4261 " change to 'Quickfix List'
Bram Moolenaar647e24b2019-03-17 16:39:46 +01004262 call assert_match(qfbnum . 'u h- "\[Location List]"', execute('ls!'))
Bram Moolenaaree8188f2019-02-05 21:23:04 +01004263 call assert_true(bufloaded(qfbnum))
4264
Bram Moolenaard82a81c2019-03-02 07:57:18 +01004265 " After deleting a location list buffer using ":bdelete", opening the
4266 " location list window should mark the buffer as a location list buffer.
4267 exe "bdelete " . qfbnum
4268 lopen
4269 call assert_equal("quickfix", &buftype)
4270 call assert_equal(1, getwininfo(win_getid(winnr()))[0].loclist)
4271 call assert_equal(wid, getloclist(0, {'filewinid' : 0}).filewinid)
4272 call assert_false(&swapfile)
4273 lclose
4274
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01004275 " When the location list is cleared for the window, the buffer should be
4276 " removed
4277 call setloclist(0, [], 'f')
4278 call assert_false(bufexists(qfbnum))
Bram Moolenaar647e24b2019-03-17 16:39:46 +01004279 call assert_equal(0, getloclist(0, {'qfbufnr' : 0}).qfbufnr)
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01004280
4281 " When the location list is freed with the location list window open, the
4282 " location list buffer should not be lost. It should be reused when the
4283 " location list is again populated.
4284 lexpr "F1:10:Line10"
4285 lopen
4286 let wid = win_getid()
4287 let qfbnum = bufnr('')
4288 wincmd p
4289 call setloclist(0, [], 'f')
4290 lexpr "F1:10:Line10"
4291 lopen
4292 call assert_equal(wid, win_getid())
4293 call assert_equal(qfbnum, bufnr(''))
4294 lclose
4295
4296 " When the window with the location list is closed, the buffer should be
4297 " removed
Bram Moolenaaree8188f2019-02-05 21:23:04 +01004298 new | only
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01004299 call assert_false(bufexists(qfbnum))
Bram Moolenaaree8188f2019-02-05 21:23:04 +01004300 endif
4301endfunc
4302
4303func Test_qfbuf()
4304 call Xqfbuf_test('c')
4305 call Xqfbuf_test('l')
4306endfunc
Bram Moolenaareeb1b9c2019-02-10 22:59:04 +01004307
4308" If there is an autocmd to use only one window, then opening the location
4309" list window used to crash Vim.
4310func Test_winonly_autocmd()
4311 call s:create_test_file('Xtest1')
4312 " Autocmd to show only one Vim window at a time
4313 autocmd WinEnter * only
4314 new
4315 " Load the location list
4316 lexpr "Xtest1:5:Line5\nXtest1:10:Line10\nXtest1:15:Line15"
4317 let loclistid = getloclist(0, {'id' : 0}).id
4318 " Open the location list window. Only this window will be shown and the file
4319 " window is closed.
4320 lopen
4321 call assert_equal(loclistid, getloclist(0, {'id' : 0}).id)
4322 " Jump to an entry in the location list and make sure that the cursor is
4323 " positioned correctly.
4324 ll 3
4325 call assert_equal(loclistid, getloclist(0, {'id' : 0}).id)
4326 call assert_equal('Xtest1', bufname(''))
4327 call assert_equal(15, line('.'))
4328 " Cleanup
4329 autocmd! WinEnter
4330 new | only
4331 call delete('Xtest1')
4332endfunc
Bram Moolenaar39803d82019-04-07 12:04:51 +02004333
4334" Test to make sure that an empty quickfix buffer is not reused for loading
4335" a normal buffer.
4336func Test_empty_qfbuf()
4337 enew | only
4338 call writefile(["Test"], 'Xfile1')
4339 call setqflist([], 'f')
4340 copen | only
4341 let qfbuf = bufnr('')
4342 edit Xfile1
4343 call assert_notequal(qfbuf, bufnr(''))
4344 enew
4345 call delete('Xfile1')
4346endfunc
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004347
4348" Test for the :cbelow, :cabove, :lbelow and :labove commands.
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004349" And for the :cafter, :cbefore, :lafter and :lbefore commands.
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004350func Xtest_below(cchar)
4351 call s:setup_commands(a:cchar)
4352
4353 " No quickfix/location list
4354 call assert_fails('Xbelow', 'E42:')
4355 call assert_fails('Xabove', 'E42:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004356 call assert_fails('Xbefore', 'E42:')
4357 call assert_fails('Xafter', 'E42:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004358
4359 " Empty quickfix/location list
4360 call g:Xsetlist([])
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 call s:create_test_file('X1')
4367 call s:create_test_file('X2')
4368 call s:create_test_file('X3')
4369 call s:create_test_file('X4')
4370
4371 " Invalid entries
4372 edit X1
4373 call g:Xsetlist(["E1", "E2"])
4374 call assert_fails('Xbelow', 'E42:')
4375 call assert_fails('Xabove', 'E42:')
4376 call assert_fails('3Xbelow', 'E42:')
4377 call assert_fails('4Xabove', 'E42:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004378 call assert_fails('Xbefore', 'E42:')
4379 call assert_fails('Xafter', 'E42:')
4380 call assert_fails('3Xbefore', 'E42:')
4381 call assert_fails('4Xafter', 'E42:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004382
4383 " Test the commands with various arguments
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004384 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 +02004385 edit +7 X2
4386 Xabove
4387 call assert_equal(['X2', 5], [bufname(''), line('.')])
4388 call assert_fails('Xabove', 'E553:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004389 normal 7G
4390 Xbefore
4391 call assert_equal(['X2', 5, 2], [bufname(''), line('.'), col('.')])
4392 call assert_fails('Xbefore', 'E553:')
4393
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004394 normal 2j
4395 Xbelow
4396 call assert_equal(['X2', 10], [bufname(''), line('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004397 normal 7G
4398 Xafter
4399 call assert_equal(['X2', 10, 3], [bufname(''), line('.'), col('.')])
4400
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004401 " Last error in this file
4402 Xbelow 99
4403 call assert_equal(['X2', 15], [bufname(''), line('.')])
4404 call assert_fails('Xbelow', 'E553:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004405 normal gg
4406 Xafter 99
4407 call assert_equal(['X2', 15, 4], [bufname(''), line('.'), col('.')])
4408 call assert_fails('Xafter', 'E553:')
4409
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004410 " First error in this file
4411 Xabove 99
4412 call assert_equal(['X2', 5], [bufname(''), line('.')])
4413 call assert_fails('Xabove', 'E553:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004414 normal G
4415 Xbefore 99
4416 call assert_equal(['X2', 5, 2], [bufname(''), line('.'), col('.')])
4417 call assert_fails('Xbefore', 'E553:')
4418
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004419 normal gg
4420 Xbelow 2
4421 call assert_equal(['X2', 10], [bufname(''), line('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004422 normal gg
4423 Xafter 2
4424 call assert_equal(['X2', 10, 3], [bufname(''), line('.'), col('.')])
4425
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004426 normal G
4427 Xabove 2
4428 call assert_equal(['X2', 10], [bufname(''), line('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004429 normal G
4430 Xbefore 2
4431 call assert_equal(['X2', 10, 3], [bufname(''), line('.'), col('.')])
4432
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004433 edit X4
4434 call assert_fails('Xabove', 'E42:')
4435 call assert_fails('Xbelow', 'E42:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004436 call assert_fails('Xbefore', 'E42:')
4437 call assert_fails('Xafter', 'E42:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004438 if a:cchar == 'l'
4439 " If a buffer has location list entries from some other window but not
4440 " from the current window, then the commands should fail.
4441 edit X1 | split | call setloclist(0, [], 'f')
4442 call assert_fails('Xabove', 'E776:')
4443 call assert_fails('Xbelow', 'E776:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004444 call assert_fails('Xbefore', 'E776:')
4445 call assert_fails('Xafter', 'E776:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004446 close
4447 endif
4448
4449 " Test for lines with multiple quickfix entries
4450 Xexpr ["X1:5:L5", "X2:5:1:L5_1", "X2:5:2:L5_2", "X2:5:3:L5_3",
4451 \ "X2:10:1:L10_1", "X2:10:2:L10_2", "X2:10:3:L10_3",
4452 \ "X2:15:1:L15_1", "X2:15:2:L15_2", "X2:15:3:L15_3", "X3:3:L3"]
4453 edit +1 X2
4454 Xbelow 2
4455 call assert_equal(['X2', 10, 1], [bufname(''), line('.'), col('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004456 normal 1G
4457 Xafter 2
4458 call assert_equal(['X2', 5, 2], [bufname(''), line('.'), col('.')])
4459
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004460 normal gg
4461 Xbelow 99
4462 call assert_equal(['X2', 15, 1], [bufname(''), line('.'), col('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004463 normal gg
4464 Xafter 99
4465 call assert_equal(['X2', 15, 3], [bufname(''), line('.'), col('.')])
4466
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004467 normal G
4468 Xabove 2
4469 call assert_equal(['X2', 10, 1], [bufname(''), line('.'), col('.')])
4470 normal G
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004471 Xbefore 2
4472 call assert_equal(['X2', 15, 2], [bufname(''), line('.'), col('.')])
4473
4474 normal G
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004475 Xabove 99
4476 call assert_equal(['X2', 5, 1], [bufname(''), line('.'), col('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004477 normal G
4478 Xbefore 99
4479 call assert_equal(['X2', 5, 1], [bufname(''), line('.'), col('.')])
4480
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004481 normal 10G
4482 Xabove
4483 call assert_equal(['X2', 5, 1], [bufname(''), line('.'), col('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004484 normal 10G$
4485 2Xbefore
4486 call assert_equal(['X2', 10, 2], [bufname(''), line('.'), col('.')])
4487
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004488 normal 10G
4489 Xbelow
4490 call assert_equal(['X2', 15, 1], [bufname(''), line('.'), col('.')])
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004491 normal 9G
4492 5Xafter
4493 call assert_equal(['X2', 15, 2], [bufname(''), line('.'), col('.')])
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004494
4495 " Invalid range
4496 if a:cchar == 'c'
Bram Moolenaar25190db2019-05-04 15:05:28 +02004497 call assert_fails('-2cbelow', 'E16:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004498 call assert_fails('-2cafter', 'E16:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004499 else
Bram Moolenaar25190db2019-05-04 15:05:28 +02004500 call assert_fails('-2lbelow', 'E16:')
Bram Moolenaarcf6a55c2019-05-05 15:02:30 +02004501 call assert_fails('-2lafter', 'E16:')
Bram Moolenaar3ff33112019-05-03 21:56:35 +02004502 endif
4503
4504 call delete('X1')
4505 call delete('X2')
4506 call delete('X3')
4507 call delete('X4')
4508endfunc
4509
4510func Test_cbelow()
4511 call Xtest_below('c')
4512 call Xtest_below('l')
4513endfunc
Bram Moolenaar25190db2019-05-04 15:05:28 +02004514
4515func Test_quickfix_count()
4516 let commands = [
4517 \ 'cNext',
4518 \ 'cNfile',
4519 \ 'cabove',
4520 \ 'cbelow',
4521 \ 'cfirst',
4522 \ 'clast',
4523 \ 'cnewer',
4524 \ 'cnext',
4525 \ 'cnfile',
4526 \ 'colder',
4527 \ 'cprevious',
4528 \ 'crewind',
4529 \
4530 \ 'lNext',
4531 \ 'lNfile',
4532 \ 'labove',
4533 \ 'lbelow',
4534 \ 'lfirst',
4535 \ 'llast',
4536 \ 'lnewer',
4537 \ 'lnext',
4538 \ 'lnfile',
4539 \ 'lolder',
4540 \ 'lprevious',
4541 \ 'lrewind',
4542 \ ]
4543 for cmd in commands
4544 call assert_fails('-1' .. cmd, 'E16:')
4545 call assert_fails('.' .. cmd, 'E16:')
4546 call assert_fails('%' .. cmd, 'E16:')
4547 call assert_fails('$' .. cmd, 'E16:')
4548 endfor
4549endfunc
Bram Moolenaar6a0cc912019-10-26 16:48:44 +02004550
4551" Test for aborting quickfix commands using QuickFixCmdPre
4552func Xtest_qfcmd_abort(cchar)
4553 call s:setup_commands(a:cchar)
4554
4555 call g:Xsetlist([], 'f')
4556
4557 " cexpr/lexpr
4558 let e = ''
4559 try
4560 Xexpr ["F1:10:Line10", "F2:20:Line20"]
4561 catch /.*/
4562 let e = v:exception
4563 endtry
4564 call assert_equal('AbortCmd', e)
4565 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
4566
4567 " cfile/lfile
4568 call writefile(["F1:10:Line10", "F2:20:Line20"], 'Xfile1')
4569 let e = ''
4570 try
4571 Xfile Xfile1
4572 catch /.*/
4573 let e = v:exception
4574 endtry
4575 call assert_equal('AbortCmd', e)
4576 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
4577 call delete('Xfile1')
4578
4579 " cgetbuffer/lgetbuffer
4580 enew!
4581 call append(0, ["F1:10:Line10", "F2:20:Line20"])
4582 let e = ''
4583 try
4584 Xgetbuffer
4585 catch /.*/
4586 let e = v:exception
4587 endtry
4588 call assert_equal('AbortCmd', e)
4589 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
4590 enew!
4591
4592 " vimgrep/lvimgrep
4593 let e = ''
4594 try
4595 Xvimgrep /func/ test_quickfix.vim
4596 catch /.*/
4597 let e = v:exception
4598 endtry
4599 call assert_equal('AbortCmd', e)
4600 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
4601
4602 " helpgrep/lhelpgrep
4603 let e = ''
4604 try
4605 Xhelpgrep quickfix
4606 catch /.*/
4607 let e = v:exception
4608 endtry
4609 call assert_equal('AbortCmd', e)
4610 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
4611
4612 " grep/lgrep
4613 if has('unix')
4614 let e = ''
4615 try
4616 silent Xgrep func test_quickfix.vim
4617 catch /.*/
4618 let e = v:exception
4619 endtry
4620 call assert_equal('AbortCmd', e)
4621 call assert_equal(0, g:Xgetlist({'nr' : '$'}).nr)
4622 endif
4623endfunc
4624
4625func Test_qfcmd_abort()
4626 augroup QF_Test
4627 au!
4628 autocmd QuickFixCmdPre * throw "AbortCmd"
4629 augroup END
4630
4631 call Xtest_qfcmd_abort('c')
4632 call Xtest_qfcmd_abort('l')
4633
4634 augroup QF_Test
4635 au!
4636 augroup END
4637endfunc
4638
Bram Moolenaard8a8c4c2019-11-16 21:04:57 +01004639" Test for using a file in one of the parent directories.
4640func Test_search_in_dirstack()
4641 call mkdir('Xtestdir/a/b/c', 'p')
4642 let save_cwd = getcwd()
4643 call writefile(["X1_L1", "X1_L2"], 'Xtestdir/Xfile1')
4644 call writefile(["X2_L1", "X2_L2"], 'Xtestdir/a/Xfile2')
4645 call writefile(["X3_L1", "X3_L2"], 'Xtestdir/a/b/Xfile3')
4646 call writefile(["X4_L1", "X4_L2"], 'Xtestdir/a/b/c/Xfile4')
4647
4648 let lines = "Entering dir Xtestdir\n" .
4649 \ "Entering dir a\n" .
4650 \ "Entering dir b\n" .
4651 \ "Xfile2:2:X2_L2\n" .
4652 \ "Leaving dir a\n" .
4653 \ "Xfile1:2:X1_L2\n" .
4654 \ "Xfile3:1:X3_L1\n" .
4655 \ "Entering dir c\n" .
4656 \ "Xfile4:2:X4_L2\n" .
Bram Moolenaar88a3e2b2019-12-06 21:11:39 +01004657 \ "Leaving dir c\n"
Bram Moolenaard8a8c4c2019-11-16 21:04:57 +01004658 set efm=%DEntering\ dir\ %f,%XLeaving\ dir\ %f,%f:%l:%m
Bram Moolenaar88a3e2b2019-12-06 21:11:39 +01004659 cexpr lines .. "Leaving dir Xtestdir|\n" | let next = 1
Bram Moolenaard8a8c4c2019-11-16 21:04:57 +01004660 call assert_equal(11, getqflist({'size' : 0}).size)
4661 call assert_equal(4, getqflist({'idx' : 0}).idx)
4662 call assert_equal('X2_L2', getline('.'))
Bram Moolenaar88a3e2b2019-12-06 21:11:39 +01004663 call assert_equal(1, next)
Bram Moolenaard8a8c4c2019-11-16 21:04:57 +01004664 cnext
4665 call assert_equal(6, getqflist({'idx' : 0}).idx)
4666 call assert_equal('X1_L2', getline('.'))
4667 cnext
4668 call assert_equal(7, getqflist({'idx' : 0}).idx)
4669 call assert_equal(1, line('$'))
4670 call assert_equal('', getline(1))
4671 cnext
4672 call assert_equal(9, getqflist({'idx' : 0}).idx)
4673 call assert_equal(1, line('$'))
4674 call assert_equal('', getline(1))
4675
4676 set efm&
4677 exe 'cd ' . save_cwd
4678 call delete('Xtestdir', 'rf')
4679endfunc
4680
Bram Moolenaar1860bde2020-01-06 21:47:21 +01004681" Test for :cquit
4682func Test_cquit()
4683 " Exit Vim with a non-zero value
4684 if RunVim([], ["cquit 7"], '')
4685 call assert_equal(7, v:shell_error)
4686 endif
4687
4688 if RunVim([], ["50cquit"], '')
4689 call assert_equal(50, v:shell_error)
4690 endif
4691
4692 " Exit Vim with default value
4693 if RunVim([], ["cquit"], '')
4694 call assert_equal(1, v:shell_error)
4695 endif
4696
4697 " Exit Vim with zero value
4698 if RunVim([], ["cquit 0"], '')
4699 call assert_equal(0, v:shell_error)
4700 endif
4701
4702 " Exit Vim with negative value
4703 call assert_fails('-3cquit', 'E16:')
4704endfunc
4705
Bram Moolenaar6a0cc912019-10-26 16:48:44 +02004706" vim: shiftwidth=2 sts=2 expandtab