1" Test findfile() and finddir() 2 3let s:files = [ 'Xdir1/foo', 4 \ 'Xdir1/bar', 5 \ 'Xdir1/Xdir2/foo', 6 \ 'Xdir1/Xdir2/foobar', 7 \ 'Xdir1/Xdir2/Xdir3/bar', 8 \ 'Xdir1/Xdir2/Xdir3/barfoo' ] 9 10func CreateFiles() 11 call mkdir('Xdir1/Xdir2/Xdir3/Xdir2', 'p') 12 for f in s:files 13 call writefile([], f) 14 endfor 15endfunc 16 17func CleanFiles() 18 " Safer to delete each file even if it's more verbose 19 " than doing a recursive delete('Xdir1', 'rf'). 20 for f in s:files 21 call delete(f) 22 endfor 23 24 call delete('Xdir1/Xdir2/Xdir3/Xdir2', 'd') 25 call delete('Xdir1/Xdir2/Xdir3', 'd') 26 call delete('Xdir1/Xdir2', 'd') 27 call delete('Xdir1', 'd') 28endfunc 29 30" Test findfile({name} [, {path} [, {count}]]) 31func Test_findfile() 32 let save_path = &path 33 let save_shellslash = &shellslash 34 let save_dir = getcwd() 35 set shellslash 36 call CreateFiles() 37 cd Xdir1 38 e Xdir2/foo 39 40 " With ,, in path, findfile() searches in current directory. 41 set path=,, 42 call assert_equal('foo', findfile('foo')) 43 call assert_equal('bar', findfile('bar')) 44 call assert_equal('', findfile('foobar')) 45 46 " Directories should not be found (finddir() finds them). 47 call assert_equal('', findfile('Xdir2')) 48 49 " With . in 'path', findfile() searches relatively to current file. 50 set path=. 51 call assert_equal('Xdir2/foo', findfile('foo')) 52 call assert_equal('', findfile('bar')) 53 call assert_equal('Xdir2/foobar', 'foobar'->findfile()) 54 55 " Empty {path} 2nd argument is the same as no 2nd argument. 56 call assert_equal('Xdir2/foo', findfile('foo', '')) 57 call assert_equal('', findfile('bar', '')) 58 59 " Test with * 60 call assert_equal('Xdir2/foo', findfile('foo', '*')) 61 call assert_equal('', findfile('bar', '*')) 62 call assert_equal('Xdir2/Xdir3/bar', findfile('bar', '*/*')) 63 call assert_equal('Xdir2/Xdir3/bar', findfile('bar', 'Xdir2/*')) 64 call assert_equal('Xdir2/Xdir3/bar', findfile('bar', 'Xdir*/Xdir3')) 65 call assert_equal('Xdir2/Xdir3/bar', findfile('bar', '*2/*3')) 66 67 " Test with ** 68 call assert_equal('bar', findfile('bar', '**')) 69 call assert_equal('Xdir2/Xdir3/bar', findfile('bar', '**/Xdir3')) 70 call assert_equal('Xdir2/Xdir3/bar', findfile('bar', 'Xdir2/**')) 71 72 call assert_equal('Xdir2/Xdir3/barfoo', findfile('barfoo', '**2')) 73 call assert_equal('', findfile('barfoo', '**1')) 74 call assert_equal('Xdir2/foobar', findfile('foobar', '**1')) 75 76 " Test with {count} 3rd argument. 77 call assert_equal('bar', findfile('bar', '**', 0)) 78 call assert_equal('bar', findfile('bar', '**', 1)) 79 call assert_equal('Xdir2/Xdir3/bar', findfile('bar', '**', 2)) 80 call assert_equal('', findfile('bar', '**', 3)) 81 call assert_equal(['bar', 'Xdir2/Xdir3/bar'], findfile('bar', '**', -1)) 82 83 " Test upwards search. 84 cd Xdir2/Xdir3 85 call assert_equal('bar', findfile('bar', ';')) 86 call assert_match('.*/Xdir1/Xdir2/foo', findfile('foo', ';')) 87 call assert_match('.*/Xdir1/Xdir2/foo', findfile('foo', ';', 1)) 88 call assert_match('.*/Xdir1/foo', findfile('foo', ';', 2)) 89 call assert_match('.*/Xdir1/foo', findfile('foo', ';', 2)) 90 call assert_match('.*/Xdir1/Xdir2/foo', findfile('foo', 'Xdir2;', 1)) 91 call assert_equal('', findfile('foo', 'Xdir2;', 2)) 92 93 " List l should have at least 2 values (possibly more if foo file 94 " happens to be found upwards above Xdir1). 95 let l = findfile('foo', ';', -1) 96 call assert_match('.*/Xdir1/Xdir2/foo', l[0]) 97 call assert_match('.*/Xdir1/foo', l[1]) 98 99 " Test upwards search with stop-directory. 100 cd Xdir2 101 let l = findfile('bar', ';' . save_dir . '/Xdir1/Xdir2/', -1) 102 call assert_equal(1, len(l)) 103 call assert_match('.*/Xdir1/Xdir2/Xdir3/bar', l[0]) 104 105 let l = findfile('bar', ';' . save_dir . '/Xdir1/', -1) 106 call assert_equal(2, len(l)) 107 call assert_match('.*/Xdir1/Xdir2/Xdir3/bar', l[0]) 108 call assert_match('.*/Xdir1/bar', l[1]) 109 110 " Test combined downwards and upwards search from Xdir2/. 111 cd ../.. 112 call assert_equal('Xdir3/bar', findfile('bar', '**;', 1)) 113 call assert_match('.*/Xdir1/bar', findfile('bar', '**;', 2)) 114 115 bwipe! 116 call chdir(save_dir) 117 call CleanFiles() 118 let &path = save_path 119 let &shellslash = save_shellslash 120endfunc 121 122func Test_findfile_error() 123 call assert_fails('call findfile([])', 'E730:') 124 call assert_fails('call findfile("x", [])', 'E730:') 125 call assert_fails('call findfile("x", "", [])', 'E745:') 126 call assert_fails('call findfile("x", "**x")', 'E343:') 127 call assert_fails('call findfile("x", repeat("x", 5000))', 'E854:') 128endfunc 129 130" Test finddir({name} [, {path} [, {count}]]) 131func Test_finddir() 132 let save_path = &path 133 let save_shellslash = &shellslash 134 let save_dir = getcwd() 135 set path=,, 136 call CreateFiles() 137 cd Xdir1 138 139 call assert_equal('Xdir2', finddir('Xdir2')) 140 call assert_equal('', 'Xdir3'->finddir()) 141 142 " Files should not be found (findfile() finds them). 143 call assert_equal('', finddir('foo')) 144 145 call assert_equal('Xdir2', finddir('Xdir2', '**')) 146 call assert_equal('Xdir2/Xdir3', finddir('Xdir3', '**')) 147 148 call assert_equal('Xdir2', finddir('Xdir2', '**', 1)) 149 call assert_equal('Xdir2/Xdir3/Xdir2', finddir('Xdir2', '**', 2)) 150 call assert_equal(['Xdir2', 151 \ 'Xdir2/Xdir3/Xdir2'], finddir('Xdir2', '**', -1)) 152 153 call assert_equal('Xdir2', finddir('Xdir2', '**1')) 154 call assert_equal('Xdir2', finddir('Xdir2', '**0')) 155 call assert_equal('Xdir2/Xdir3', finddir('Xdir3', '**1')) 156 call assert_equal('', finddir('Xdir3', '**0')) 157 158 " Test upwards dir search. 159 cd Xdir2/Xdir3 160 call assert_match('.*/Xdir1', finddir('Xdir1', ';')) 161 162 " Test upwards search with stop-directory. 163 call assert_match('.*/Xdir1', finddir('Xdir1', ';' . save_dir . '/')) 164 call assert_equal('', finddir('Xdir1', ';' . save_dir . '/Xdir1/')) 165 166 " Test combined downwards and upwards dir search from Xdir2/. 167 cd .. 168 call assert_match('.*/Xdir1', finddir('Xdir1', '**;', 1)) 169 call assert_equal('Xdir3/Xdir2', finddir('Xdir2', '**;', 1)) 170 call assert_match('.*/Xdir1/Xdir2', finddir('Xdir2', '**;', 2)) 171 call assert_equal('Xdir3', finddir('Xdir3', '**;', 1)) 172 173 call chdir(save_dir) 174 call CleanFiles() 175 let &path = save_path 176 let &shellslash = save_shellslash 177endfunc 178 179func Test_finddir_error() 180 call assert_fails('call finddir([])', 'E730:') 181 call assert_fails('call finddir("x", [])', 'E730:') 182 call assert_fails('call finddir("x", "", [])', 'E745:') 183 call assert_fails('call finddir("x", "**x")', 'E343:') 184 call assert_fails('call finddir("x", repeat("x", 5000))', 'E854:') 185endfunc 186 187" Test for the :find, :sfind and :tabfind commands 188func Test_find_cmd() 189 new 190 let save_path = &path 191 let save_dir = getcwd() 192 set path=.,./**/* 193 call CreateFiles() 194 cd Xdir1 195 196 " Test for :find 197 find foo 198 call assert_equal('foo', expand('%:.')) 199 2find foo 200 call assert_equal('Xdir2/foo', expand('%:.')) 201 call assert_fails('3find foo', 'E347:') 202 203 " Test for :sfind 204 enew 205 sfind barfoo 206 call assert_equal('Xdir2/Xdir3/barfoo', expand('%:.')) 207 call assert_equal(3, winnr('$')) 208 close 209 call assert_fails('sfind baz', 'E345:') 210 call assert_equal(2, winnr('$')) 211 212 " Test for :tabfind 213 enew 214 tabfind foobar 215 call assert_equal('Xdir2/foobar', expand('%:.')) 216 call assert_equal(2, tabpagenr('$')) 217 tabclose 218 call assert_fails('tabfind baz', 'E345:') 219 call assert_equal(1, tabpagenr('$')) 220 221 call chdir(save_dir) 222 call CleanFiles() 223 let &path = save_path 224 close 225 226 call assert_fails('find', 'E471:') 227 call assert_fails('sfind', 'E471:') 228 call assert_fails('tabfind', 'E471:') 229endfunc 230 231func Test_find_non_existing_path() 232 new 233 let save_path = &path 234 let save_dir = getcwd() 235 call mkdir('dir1/dir2', 'p') 236 call writefile([], 'dir1/file.txt') 237 call writefile([], 'dir1/dir2/base.txt') 238 call chdir('dir1/dir2') 239 e base.txt 240 set path=../include 241 242 call assert_fails(':find file.txt', 'E345:') 243 244 call chdir(save_dir) 245 bw! 246 call delete('dir1/dir2/base.txt', 'rf') 247 call delete('dir1/dir2', 'rf') 248 call delete('dir1/file.txt', 'rf') 249 call delete('dir1', 'rf') 250 let &path = save_path 251endfunc 252 253" vim: shiftwidth=2 sts=2 expandtab 254