1" Tests for 'packpath' and :packadd 2 3 4func SetUp() 5 let s:topdir = getcwd() . '/Xdir' 6 exe 'set packpath=' . s:topdir 7 let s:plugdir = s:topdir . '/pack/mine/opt/mytest' 8endfunc 9 10func TearDown() 11 call delete(s:topdir, 'rf') 12endfunc 13 14func Test_packadd() 15 if !exists('s:plugdir') 16 echomsg 'when running this test manually, call SetUp() first' 17 return 18 endif 19 20 call mkdir(s:plugdir . '/plugin/also', 'p') 21 call mkdir(s:plugdir . '/ftdetect', 'p') 22 call mkdir(s:plugdir . '/after', 'p') 23 set rtp& 24 let rtp = &rtp 25 filetype on 26 27 let rtp_entries = split(rtp, ',') 28 for entry in rtp_entries 29 if entry =~? '\<after\>' 30 let first_after_entry = entry 31 break 32 endif 33 endfor 34 35 exe 'split ' . s:plugdir . '/plugin/test.vim' 36 call setline(1, 'let g:plugin_works = 42') 37 wq 38 39 exe 'split ' . s:plugdir . '/plugin/also/loaded.vim' 40 call setline(1, 'let g:plugin_also_works = 77') 41 wq 42 43 exe 'split ' . s:plugdir . '/ftdetect/test.vim' 44 call setline(1, 'let g:ftdetect_works = 17') 45 wq 46 47 packadd mytest 48 49 call assert_equal(42, g:plugin_works) 50 call assert_equal(77, g:plugin_also_works) 51 call assert_equal(17, g:ftdetect_works) 52 call assert_true(len(&rtp) > len(rtp)) 53 call assert_match('/testdir/Xdir/pack/mine/opt/mytest\($\|,\)', &rtp) 54 55 let new_after = match(&rtp, '/testdir/Xdir/pack/mine/opt/mytest/after,') 56 let forwarded = substitute(first_after_entry, '\\', '[/\\\\]', 'g') 57 let old_after = match(&rtp, ',' . forwarded . '\>') 58 call assert_true(new_after > 0, 'rtp is ' . &rtp) 59 call assert_true(old_after > 0, 'match ' . forwarded . ' in ' . &rtp) 60 call assert_true(new_after < old_after, 'rtp is ' . &rtp) 61 62 " NOTE: '/.../opt/myte' forwardly matches with '/.../opt/mytest' 63 call mkdir(fnamemodify(s:plugdir, ':h') . '/myte', 'p') 64 let rtp = &rtp 65 packadd myte 66 67 " Check the path of 'myte' is added 68 call assert_true(len(&rtp) > len(rtp)) 69 call assert_match('/testdir/Xdir/pack/mine/opt/myte\($\|,\)', &rtp) 70 71 " Check exception 72 call assert_fails("packadd directorynotfound", 'E919:') 73 call assert_fails("packadd", 'E471:') 74endfunc 75 76func Test_packadd_start() 77 let plugdir = s:topdir . '/pack/mine/start/other' 78 call mkdir(plugdir . '/plugin', 'p') 79 set rtp& 80 let rtp = &rtp 81 filetype on 82 83 exe 'split ' . plugdir . '/plugin/test.vim' 84 call setline(1, 'let g:plugin_works = 24') 85 wq 86 87 packadd other 88 89 call assert_equal(24, g:plugin_works) 90 call assert_true(len(&rtp) > len(rtp)) 91 call assert_match('/testdir/Xdir/pack/mine/start/other\($\|,\)', &rtp) 92endfunc 93 94func Test_packadd_noload() 95 call mkdir(s:plugdir . '/plugin', 'p') 96 call mkdir(s:plugdir . '/syntax', 'p') 97 set rtp& 98 let rtp = &rtp 99 100 exe 'split ' . s:plugdir . '/plugin/test.vim' 101 call setline(1, 'let g:plugin_works = 42') 102 wq 103 let g:plugin_works = 0 104 105 packadd! mytest 106 107 call assert_true(len(&rtp) > len(rtp)) 108 call assert_match('testdir/Xdir/pack/mine/opt/mytest\($\|,\)', &rtp) 109 call assert_equal(0, g:plugin_works) 110 111 " check the path is not added twice 112 let new_rtp = &rtp 113 packadd! mytest 114 call assert_equal(new_rtp, &rtp) 115endfunc 116 117func Test_packadd_symlink_dir() 118 if !has('unix') 119 return 120 endif 121 let top2_dir = s:topdir . '/Xdir2' 122 let real_dir = s:topdir . '/Xsym' 123 call mkdir(real_dir, 'p') 124 exec "silent !ln -s Xsym" top2_dir 125 let &rtp = top2_dir . ',' . top2_dir . '/after' 126 let &packpath = &rtp 127 128 let s:plugdir = top2_dir . '/pack/mine/opt/mytest' 129 call mkdir(s:plugdir . '/plugin', 'p') 130 131 exe 'split ' . s:plugdir . '/plugin/test.vim' 132 call setline(1, 'let g:plugin_works = 44') 133 wq 134 let g:plugin_works = 0 135 136 packadd mytest 137 138 " Must have been inserted in the middle, not at the end 139 call assert_match('/pack/mine/opt/mytest,', &rtp) 140 call assert_equal(44, g:plugin_works) 141 142 " No change when doing it again. 143 let rtp_before = &rtp 144 packadd mytest 145 call assert_equal(rtp_before, &rtp) 146 147 set rtp& 148 let rtp = &rtp 149 exec "silent !rm" top2_dir 150endfunc 151 152func Test_packadd_symlink_dir2() 153 if !has('unix') 154 return 155 endif 156 let top2_dir = s:topdir . '/Xdir2' 157 let real_dir = s:topdir . '/Xsym/pack' 158 call mkdir(top2_dir, 'p') 159 call mkdir(real_dir, 'p') 160 let &rtp = top2_dir . ',' . top2_dir . '/after' 161 let &packpath = &rtp 162 163 exec "silent !ln -s ../Xsym/pack" top2_dir . '/pack' 164 let s:plugdir = top2_dir . '/pack/mine/opt/mytest' 165 call mkdir(s:plugdir . '/plugin', 'p') 166 167 exe 'split ' . s:plugdir . '/plugin/test.vim' 168 call setline(1, 'let g:plugin_works = 48') 169 wq 170 let g:plugin_works = 0 171 172 packadd mytest 173 174 " Must have been inserted in the middle, not at the end 175 call assert_match('/Xdir2/pack/mine/opt/mytest,', &rtp) 176 call assert_equal(48, g:plugin_works) 177 178 " No change when doing it again. 179 let rtp_before = &rtp 180 packadd mytest 181 call assert_equal(rtp_before, &rtp) 182 183 set rtp& 184 let rtp = &rtp 185 exec "silent !rm" top2_dir . '/pack' 186 exec "silent !rmdir" top2_dir 187endfunc 188 189" Check command-line completion for 'packadd' 190func Test_packadd_completion() 191 let optdir1 = &packpath . '/pack/mine/opt' 192 let optdir2 = &packpath . '/pack/candidate/opt' 193 194 call mkdir(optdir1 . '/pluginA', 'p') 195 call mkdir(optdir1 . '/pluginC', 'p') 196 call mkdir(optdir2 . '/pluginB', 'p') 197 call mkdir(optdir2 . '/pluginC', 'p') 198 199 let li = [] 200 call feedkeys(":packadd \<Tab>')\<C-B>call add(li, '\<CR>", 't') 201 call feedkeys(":packadd " . repeat("\<Tab>", 2) . "')\<C-B>call add(li, '\<CR>", 't') 202 call feedkeys(":packadd " . repeat("\<Tab>", 3) . "')\<C-B>call add(li, '\<CR>", 't') 203 call feedkeys(":packadd " . repeat("\<Tab>", 4) . "')\<C-B>call add(li, '\<CR>", 'tx') 204 call assert_equal("packadd pluginA", li[0]) 205 call assert_equal("packadd pluginB", li[1]) 206 call assert_equal("packadd pluginC", li[2]) 207 call assert_equal("packadd ", li[3]) 208endfunc 209 210func Test_packloadall() 211 " plugin foo with an autoload directory 212 let fooplugindir = &packpath . '/pack/mine/start/foo/plugin' 213 call mkdir(fooplugindir, 'p') 214 call writefile(['let g:plugin_foo_number = 1234', 215 \ 'let g:plugin_foo_auto = bbb#value', 216 \ 'let g:plugin_extra_auto = extra#value'], fooplugindir . '/bar.vim') 217 let fooautodir = &packpath . '/pack/mine/start/foo/autoload' 218 call mkdir(fooautodir, 'p') 219 call writefile(['let bar#value = 77'], fooautodir . '/bar.vim') 220 221 " plugin aaa with an autoload directory 222 let aaaplugindir = &packpath . '/pack/mine/start/aaa/plugin' 223 call mkdir(aaaplugindir, 'p') 224 call writefile(['let g:plugin_aaa_number = 333', 225 \ 'let g:plugin_aaa_auto = bar#value'], aaaplugindir . '/bbb.vim') 226 let aaaautodir = &packpath . '/pack/mine/start/aaa/autoload' 227 call mkdir(aaaautodir, 'p') 228 call writefile(['let bbb#value = 55'], aaaautodir . '/bbb.vim') 229 230 " plugin extra with only an autoload directory 231 let extraautodir = &packpath . '/pack/mine/start/extra/autoload' 232 call mkdir(extraautodir, 'p') 233 call writefile(['let extra#value = 99'], extraautodir . '/extra.vim') 234 235 packloadall 236 call assert_equal(1234, g:plugin_foo_number) 237 call assert_equal(55, g:plugin_foo_auto) 238 call assert_equal(99, g:plugin_extra_auto) 239 call assert_equal(333, g:plugin_aaa_number) 240 call assert_equal(77, g:plugin_aaa_auto) 241 242 " only works once 243 call writefile(['let g:plugin_bar_number = 4321'], fooplugindir . '/bar2.vim') 244 packloadall 245 call assert_false(exists('g:plugin_bar_number')) 246 247 " works when ! used 248 packloadall! 249 call assert_equal(4321, g:plugin_bar_number) 250endfunc 251 252func Test_helptags() 253 let docdir1 = &packpath . '/pack/mine/start/foo/doc' 254 let docdir2 = &packpath . '/pack/mine/start/bar/doc' 255 call mkdir(docdir1, 'p') 256 call mkdir(docdir2, 'p') 257 call writefile(['look here: *look-here*'], docdir1 . '/bar.txt') 258 call writefile(['look away: *look-away*'], docdir2 . '/foo.txt') 259 exe 'set rtp=' . &packpath . '/pack/mine/start/foo,' . &packpath . '/pack/mine/start/bar' 260 261 helptags ALL 262 263 let tags1 = readfile(docdir1 . '/tags') 264 call assert_match('look-here', tags1[0]) 265 let tags2 = readfile(docdir2 . '/tags') 266 call assert_match('look-away', tags2[0]) 267 268 call assert_fails('helptags abcxyz', 'E150:') 269endfunc 270 271func Test_colorscheme() 272 let colordirrun = &packpath . '/runtime/colors' 273 let colordirstart = &packpath . '/pack/mine/start/foo/colors' 274 let colordiropt = &packpath . '/pack/mine/opt/bar/colors' 275 call mkdir(colordirrun, 'p') 276 call mkdir(colordirstart, 'p') 277 call mkdir(colordiropt, 'p') 278 call writefile(['let g:found_one = 1'], colordirrun . '/one.vim') 279 call writefile(['let g:found_two = 1'], colordirstart . '/two.vim') 280 call writefile(['let g:found_three = 1'], colordiropt . '/three.vim') 281 exe 'set rtp=' . &packpath . '/runtime' 282 283 colorscheme one 284 call assert_equal(1, g:found_one) 285 colorscheme two 286 call assert_equal(1, g:found_two) 287 colorscheme three 288 call assert_equal(1, g:found_three) 289endfunc 290 291func Test_colorscheme_completion() 292 let colordirrun = &packpath . '/runtime/colors' 293 let colordirstart = &packpath . '/pack/mine/start/foo/colors' 294 let colordiropt = &packpath . '/pack/mine/opt/bar/colors' 295 call mkdir(colordirrun, 'p') 296 call mkdir(colordirstart, 'p') 297 call mkdir(colordiropt, 'p') 298 call writefile(['let g:found_one = 1'], colordirrun . '/one.vim') 299 call writefile(['let g:found_two = 1'], colordirstart . '/two.vim') 300 call writefile(['let g:found_three = 1'], colordiropt . '/three.vim') 301 exe 'set rtp=' . &packpath . '/runtime' 302 303 let li=[] 304 call feedkeys(":colorscheme " . repeat("\<Tab>", 1) . "')\<C-B>call add(li, '\<CR>", 't') 305 call feedkeys(":colorscheme " . repeat("\<Tab>", 2) . "')\<C-B>call add(li, '\<CR>", 't') 306 call feedkeys(":colorscheme " . repeat("\<Tab>", 3) . "')\<C-B>call add(li, '\<CR>", 't') 307 call feedkeys(":colorscheme " . repeat("\<Tab>", 4) . "')\<C-B>call add(li, '\<CR>", 'tx') 308 call assert_equal("colorscheme one", li[0]) 309 call assert_equal("colorscheme three", li[1]) 310 call assert_equal("colorscheme two", li[2]) 311 call assert_equal("colorscheme ", li[3]) 312endfunc 313 314func Test_runtime() 315 let rundir = &packpath . '/runtime/extra' 316 let startdir = &packpath . '/pack/mine/start/foo/extra' 317 let optdir = &packpath . '/pack/mine/opt/bar/extra' 318 call mkdir(rundir, 'p') 319 call mkdir(startdir, 'p') 320 call mkdir(optdir, 'p') 321 call writefile(['let g:sequence .= "run"'], rundir . '/bar.vim') 322 call writefile(['let g:sequence .= "start"'], startdir . '/bar.vim') 323 call writefile(['let g:sequence .= "foostart"'], startdir . '/foo.vim') 324 call writefile(['let g:sequence .= "opt"'], optdir . '/bar.vim') 325 call writefile(['let g:sequence .= "xxxopt"'], optdir . '/xxx.vim') 326 exe 'set rtp=' . &packpath . '/runtime' 327 328 let g:sequence = '' 329 runtime extra/bar.vim 330 call assert_equal('run', g:sequence) 331 let g:sequence = '' 332 runtime START extra/bar.vim 333 call assert_equal('start', g:sequence) 334 let g:sequence = '' 335 runtime OPT extra/bar.vim 336 call assert_equal('opt', g:sequence) 337 let g:sequence = '' 338 runtime PACK extra/bar.vim 339 call assert_equal('start', g:sequence) 340 let g:sequence = '' 341 runtime! PACK extra/bar.vim 342 call assert_equal('startopt', g:sequence) 343 let g:sequence = '' 344 runtime PACK extra/xxx.vim 345 call assert_equal('xxxopt', g:sequence) 346 347 let g:sequence = '' 348 runtime ALL extra/bar.vim 349 call assert_equal('run', g:sequence) 350 let g:sequence = '' 351 runtime ALL extra/foo.vim 352 call assert_equal('foostart', g:sequence) 353 let g:sequence = '' 354 runtime! ALL extra/xxx.vim 355 call assert_equal('xxxopt', g:sequence) 356 let g:sequence = '' 357 runtime! ALL extra/bar.vim 358 call assert_equal('runstartopt', g:sequence) 359endfunc 360 361" vim: shiftwidth=2 sts=2 expandtab 362